152 lines
7.3 KiB
Markdown
152 lines
7.3 KiB
Markdown
# 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
|
|
|