# 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) 1. **`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 2. **`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 usa `getAllDrugs()` del ContentAdapter - Cambio: Protocolos obtenidos mediante `useProtocolAdapter()` (fallback automático) 3. **`src/pages/ViaAerea.tsx`** - Eliminado: `import { getProcedureById } from '@/data/procedures'` - Cambio: Protocolo obtenido mediante `useProtocolAdapter()` (fallback automático) 4. **`src/pages/Shock.tsx`** - Eliminado: `import { getProcedureById } from '@/data/procedures'` - Cambio: Protocolo obtenido mediante `useProtocolAdapter()` (fallback automático) 5. **`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')` ### Componentes (9) 1. **`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.ts` que abstrae la búsqueda usando ContentAdapter 2. **`src/views/formativo/GuideIndex.tsx`** - Eliminado: `import { getAllGuides } from '@/data/guides-index'` - Agregado: `import { getAllGuides } from '@/services/content-adapter'` 3. **`src/views/formativo/GuideViewer.tsx`** - Eliminado: `import { getGuideById } from '@/data/guides-index'` - Agregado: `import { getGuide } from '@/services/content-adapter'` - Cambio: `getGuideById(guia)` → `getGuide(guia)` 4. **`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)` 5. **`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)` 6. **`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 7. **`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 8. **`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 9. **`src/components/drugs/DrugCard.tsx`** - Cambio: `import { Drug } from '@/data/drugs'` → `import type { Drug } from '@/data/drugs'` - Nota: Solo importa tipos, no datos ## Servicios Creados/Actualizados ### Nuevo: `src/services/content-search.ts` Servicio que abstrae la búsqueda de contenido usando ContentAdapter: - `searchProcedures(query: string): Procedure[]` - Busca protocolos - `searchDrugs(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étodo `getGuideSection(guideId: string, numero: number)` - **`LocalContentAdapter`**: Implementado `getGuideSection()` que delega a `src/data/guides-index.ts` - **`ExternalContentAdapter`**: Implementado `getGuideSection()` 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` - `LocalContentAdapter` necesita acceder a los datos locales - `src/services/content-relations.ts` - Puede necesitar mapeos de `src/data/protocol-guide-manual-mapping.ts` ### 📝 Notas Técnicas 1. **Tipos vs Datos**: Los componentes que solo necesitan tipos (interfaces) ahora usan `import type`, lo cual es correcto y no rompe el aislamiento. 2. **Fallback Automático**: El `ContentAdapterFactory` decide automáticamente si usar `ExternalContentAdapter` (si hay Content Pack disponible) o `LocalContentAdapter` (fallback). 3. **Búsqueda Abstraída**: La búsqueda ahora pasa por `content-search.ts`, que internamente usa ContentAdapter, garantizando consistencia. 4. **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: ```bash # 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