Las plantillas solo llegaban a local en el bundle al abrir un proyecto
online. Ahora, al cargar la lista de proyectos con conexión, se prefetchan
TODAS las plantillas accesibles (GET /templates, antes sin usar) y se
guardan en local, para poder inspeccionar offline aunque el proyecto no se
haya abierto todavía. Tolerante a fallo: no bloquea la lista.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Elimina recordProgressUpdate (quedó huérfano al quitar la pestaña Fases;
el progreso se edita vía feature.update) y initialPull (redundante).
- ProjectsScreen: al abrir un proyecto siempre runSync — su fase de pull ya
resuelve snapshot (sin cursor) y delta (con cursor), y el outbox está vacío
la primera vez. Menos ramas, misma semántica.
- client.ts: AbortController con timeout (30s JSON / 120s multipart) y
NetworkError que distingue timeout de error de red genérico.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
GET /projects responde { "projects": [...] } (ProjectApiController@index),
pero normalize() solo contemplaba un array o { data } → siempre [].
Ahora normalize acepta {projects}/{data}/array, los tipos de listProjects
y getTemplates reflejan la envoltura real ({projects}/{templates}), y el
fallback offline loguea el motivo en vez de tragarse el error.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fase 0: config Android (package, permisos, orientación), eas.json (APK), deps
nativas (react-native-maps, image-picker, location), app.config.js para la key
de Google Maps por secreto EAS.
Fase 1: capa responsive (useLayout) + componente MasterDetail (dos paneles en
tablet, navegación en móvil).
Fase 2: pantallas funcionales — detalle de proyecto con secciones Fases/Features/
Incidencias, edición de progreso/estado, formulario de inspección dinámico
desde plantilla, incidencias maestro-detalle (checklist + comentarios), alta de
incidencia; gating por permisos Spatie.
Fase 3: fotos (cámara/galería) → cola de media, con miniaturas pendientes/sync.
Fase 4: mapa de features (Google Maps) con geometría GeoJSON y selección.
Fase 5: auto-sync (foreground/reconexión/intervalo, con candado) + reconciliación
de creaciones offline (id temporal negativo → server_id, remapeo de FKs hijas).
Fase 6: revisión de conflictos/errores del outbox, indicadores y APK preview.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Capa API tipada de los 8 endpoints, BD local espejo del bundle + outbox
(operaciones y media) + cursor de sync, motor runSync (PUSH /sync ->
PUSH /media -> PULL bundle?since) con idempotencia por uuid y last-write-wins,
mutaciones de alto nivel (write local + encolar), sesion con token en
SecureStore, conectividad NetInfo y UI minima (Login -> Proyectos -> Detalle).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>