- config.ts: BASE_URL/ORIGIN dejan de ser constantes; ahora hay
setServerOrigin/getBaseUrl/getServerOrigin con normalizeServerUrl
(añade http:// si falta, quita barras finales y el sufijo /api/v1).
- client.ts: construye las URLs con getBaseUrl() en cada petición.
- session: signIn recibe la URL, la fija antes del login y la persiste
en SecureStore (clave server_url); se rehidrata al arrancar junto al token.
- LoginScreen: campo "Servidor" precargado con el último valor usado.
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>
- feature_types: nueva tabla local + tipo FeatureType + upsert en applyBundle
+ getFeatureTypes(); FeatureDetail muestra badge del tipo con su color.
- feature: columnas feature_type_id + is_active (migración BD v3);
feature.update acepta ambas; toggle "Activa" en el detalle con badge
"inactiva" cuando corresponde.
- templates: ahora catálogo global asignado por pivot — getTemplates() ya no
filtra por project_id (informativo); phase_id eliminado del tipo y del pick.
- Formulario de inspección: soporta fields[].group (secciones), question
(etiqueta principal), help (texto de ayuda) y required (validación al
guardar con aviso de campos faltantes).
- Bundle: tipa issue_tasks correctamente como IssueTask[].
- docs/: sincronizados openapi.yaml y MOBILE_APP_BRIEF.md v1.1 del backend.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- app.json: bundleIdentifier + buildNumber para iOS
- eas.json: perfiles iOS (development con simulador, preview ipa, production)
y appleId para submit
- app.config.js: inyección de GOOGLE_MAPS_IOS_KEY (opcional; por defecto
la app usa Apple Maps en iOS sin necesitar key)
- FeatureMap: MAP_PROVIDER = PROVIDER_GOOGLE en Android, PROVIDER_DEFAULT
(Apple Maps) en iOS; elimina dependencia de Google Maps key en iOS
Pendiente: generar /ios con 'npx expo prebuild --platform ios' desde macOS.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Elimina /android del .gitignore y committea el resultado de
expo prebuild --platform android (Gradle, AndroidManifest, MainActivity,
recursos de icono/splash). Android Studio puede abrirlo directamente
desde la carpeta android/ sin necesidad de ejecutar prebuild.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
expo prebuild actualiza los scripts a expo run:android / expo run:ios
para compilar el proyecto nativo directamente.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- FooterOverlay: franja oscura (logo izquierda, campos derecha) superpuesta
sobre la foto antes de encolarla; tamaños proporcionales a la resolución.
- MediaStrip: capta coordenadas GPS (expo-location) al abrir el picker,
estampa el footer con react-native-view-shot (view off-screen + onLoad),
y añade icono ⚙ → PhotoSettings. Fallback: usa foto original si el stamp falla.
- PhotoSettingsScreen (modal): toggle general, selector de logo cuadrado,
activar/desactivar/editar etiqueta de cada campo (proyecto, fecha, coords)
y añadir campos personalizados con etiqueta + valor estático.
- footerConfig: persiste en meta table (clave 'photo_footer_config').
- repositories: añade getProject(id).
- navigation: ruta PhotoSettings como modal.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Elimina la sección "Pendiente" del scaffold inicial (ya todo implementado)
y la sustituye por tabla de estado con referencia a cada archivo, más la
lista real de próximos pasos (Maps key, test en dispositivo, background sync).
También añade .idea/ al .gitignore.
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>