7.3 KiB
FASE 1: AISLAMIENTO DE DATOS - COMPLETADA ✅
Objetivo
Desacoplar los componentes y páginas de los datos hardcodeados en src/data/*.ts, haciendo que todo el acceso a datos pase por el ContentAdapter, manteniendo compatibilidad total y garantizando fallback automático a datos locales.
Restricciones Cumplidas
- ✅ NO se modificó el contenido de
src/data/*.ts - ✅ NO se eliminaron ni movieron archivos existentes
- ✅ NO se cambiaron rutas
- ✅ NO se cambiaron componentes UI
- ✅ NO se tocó Service Worker ni lógica offline
- ✅ NO se introdujeron dependencias nuevas
Archivos Migrados
Páginas (5)
-
src/pages/Farmacos.tsx- Eliminado:
import { drugs } from '@/data/drugs' - Agregado:
import { getAllDrugs, useContentAdapter } from '@/services/content-adapter' - Cambio:
const allDrugs = getAllDrugs()en lugar de usar array directo - Indicador visual: Badge "Externo" cuando se usa Content Pack
- Eliminado:
-
src/pages/RCP.tsx- Eliminado:
import { getProcedureById } from '@/data/procedures' - Eliminado:
import { drugs, Drug } from '@/data/drugs' - Agregado:
import { getAllDrugs, getDrug, useProtocolAdapter } from '@/services/content-adapter' - Cambio:
findDrugByName()ahora usagetAllDrugs()del ContentAdapter - Cambio: Protocolos obtenidos mediante
useProtocolAdapter()(fallback automático)
- Eliminado:
-
src/pages/ViaAerea.tsx- Eliminado:
import { getProcedureById } from '@/data/procedures' - Cambio: Protocolo obtenido mediante
useProtocolAdapter()(fallback automático)
- Eliminado:
-
src/pages/Shock.tsx- Eliminado:
import { getProcedureById } from '@/data/procedures' - Cambio: Protocolo obtenido mediante
useProtocolAdapter()(fallback automático)
- Eliminado:
-
src/pages/SoporteVital.tsx- Eliminado:
import { procedures, getProceduresByCategory, Procedure } from '@/data/procedures' - Agregado:
import { getAllProtocols } from '@/services/content-adapter' - Cambio:
const soporteVitalProcedures = getAllProtocols().filter(p => p.category === 'soporte_vital')
- Eliminado:
Componentes (9)
-
src/components/layout/SearchModal.tsx- Eliminado:
import { searchProcedures, ... } from '@/data/procedures' - Eliminado:
import { searchDrugs, ... } from '@/data/drugs' - Agregado:
import { searchProcedures, searchDrugs } from '@/services/content-search' - Nota: Se creó nuevo servicio
content-search.tsque abstrae la búsqueda usando ContentAdapter
- Eliminado:
-
src/views/formativo/GuideIndex.tsx- Eliminado:
import { getAllGuides } from '@/data/guides-index' - Agregado:
import { getAllGuides } from '@/services/content-adapter'
- Eliminado:
-
src/views/formativo/GuideViewer.tsx- Eliminado:
import { getGuideById } from '@/data/guides-index' - Agregado:
import { getGuide } from '@/services/content-adapter' - Cambio:
getGuideById(guia)→getGuide(guia)
- Eliminado:
-
src/components/guide/GuideNavigation.tsx- Eliminado:
import { getGuideById, getGuideSection } from '@/data/guides-index' - Agregado:
import { getGuide, getGuideSection } from '@/services/content-adapter' - Cambio:
getGuideById(guideId)→getGuide(guideId)
- Eliminado:
-
src/views/formativo/GuideSectionViewer.tsx- Eliminado:
import { getGuideById, getGuideSection } from '@/data/guides-index' - Agregado:
import { getGuide, getGuideSection } from '@/services/content-adapter' - Cambio:
getGuideById(guia)→getGuide(guia)
- Eliminado:
-
src/components/guide/GuideHeader.tsx- Cambio:
import { Guide } from '@/data/guides-index'→import type { Guide } from '@/services/content-adapter' - Nota: Solo importa tipos, no datos
- Cambio:
-
src/components/guide/GuideCard.tsx- Cambio:
import { Guide } from '@/data/guides-index'→import type { Guide } from '@/services/content-adapter' - Nota: Solo importa tipos, no datos
- Cambio:
-
src/components/procedures/ProcedureCard.tsx- Cambio:
import { Procedure, Priority } from '@/data/procedures'→import type { Procedure, Priority } from '@/data/procedures' - Nota: Solo importa tipos, no datos
- Cambio:
-
src/components/drugs/DrugCard.tsx- Cambio:
import { Drug } from '@/data/drugs'→import type { Drug } from '@/data/drugs' - Nota: Solo importa tipos, no datos
- Cambio:
Servicios Creados/Actualizados
Nuevo: src/services/content-search.ts
Servicio que abstrae la búsqueda de contenido usando ContentAdapter:
searchProcedures(query: string): Procedure[]- Busca protocolossearchDrugs(query: string): Drug[]- Busca fármacos
Ambas funciones usan getAllProtocols() y getAllDrugs() del ContentAdapter, garantizando fallback automático.
Actualizado: src/services/content-adapter.ts
- Interfaz
ContentAdapter: Agregado métodogetGuideSection(guideId: string, numero: number) LocalContentAdapter: ImplementadogetGuideSection()que delega asrc/data/guides-index.tsExternalContentAdapter: ImplementadogetGuideSection()que busca en la guía obtenida- Funciones exportadas: Agregada
getGuideSection()como función helper
Resultados
✅ Logros
- 14 archivos migrados (5 páginas + 9 componentes)
- 0 imports directos de datos en componentes/páginas principales
- Fallback automático garantizado en todos los casos
- Compatibilidad total mantenida - app funciona exactamente igual
- Sin errores de linter
- Preparada para backend - lista para consumir datos desde base de datos
📊 Estadísticas
- Páginas migradas: 5/5 principales (100%)
- Componentes migrados: 9/9 principales (100%)
- Servicios creados: 1 nuevo (
content-search.ts) - Servicios actualizados: 1 (
content-adapter.ts)
🔒 Archivos que DEBEN seguir importando desde src/data/
Estos archivos son correctos y deben mantener sus imports:
src/services/content-adapter.ts-LocalContentAdapternecesita acceder a los datos localessrc/services/content-relations.ts- Puede necesitar mapeos desrc/data/protocol-guide-manual-mapping.ts
📝 Notas Técnicas
-
Tipos vs Datos: Los componentes que solo necesitan tipos (interfaces) ahora usan
import type, lo cual es correcto y no rompe el aislamiento. -
Fallback Automático: El
ContentAdapterFactorydecide automáticamente si usarExternalContentAdapter(si hay Content Pack disponible) oLocalContentAdapter(fallback). -
Búsqueda Abstraída: La búsqueda ahora pasa por
content-search.ts, que internamente usa ContentAdapter, garantizando consistencia. -
Guías: Se agregó soporte completo para
getGuideSection()en ambos adapters, permitiendo acceso a secciones individuales de guías.
Próximos Pasos (FASE 2+)
- Implementar backend y base de datos
- Generar Content Pack desde base de datos
- Panel de administración para gestionar contenido
- Migración de datos desde
src/data/a base de datos
Verificación
Para verificar que la migración fue exitosa:
# Buscar imports directos en componentes/páginas (debe estar vacío o solo tipos)
find src/pages src/components src/views -type f \( -name "*.ts" -o -name "*.tsx" \) \
-exec grep -l "from.*@/data/\|from.*\.\./data/" {} \; | \
grep -v "type.*from"
Fecha de completación: 2024 Estado: ✅ COMPLETADA Compatibilidad: 100% mantenida Preparación para FASE 2: ✅ Lista