## Qué cambia
<!-- En una o dos frases. -->
## Por qué
<!-- Issue relacionado o motivación. -->
## Notas para el revisor
- [ ] La app arranca con `npm run dev`.
- [ ] No he añadido dependencias innecesarias.
- [ ] He seguido la estructura existente.
Añade la automatización de despliegue a esta rama (no la tenía):
- .gitea/workflows/deploy.yml: build + deploy on push, teardown on delete.
- scripts/lib/env.sh + deploy.sh + teardown.sh: lib OOP (Env + SystemdUnit/
NginxVhost/TlsCert) y entrypoints finos.
El código de la app NO se modifica. Traído path-scoped desde master (6cc326e).
Cada push a prototipo-yb01 publicará la app en prototipo-yb01.localesp.es.
- Mapeo campos en base de datos: ubicacion→provincia, telefono→subcategoria,
email→direccion, web→enlaceGoogleMaps y añadido puntuacion.
- Migración suave (ensureColumn) para añadir las nuevas columnas sin perder
datos existentes si la DB ya existía con el esquema antiguo.
- Actualización de rutas del servidor para guardar/leer los nuevos campos y
convertir el NULL a valor nulo por defecto en puntuacion.
- Soporte PWA: añadido meta tags (manifest, theme-color, apple-touch-icon) y
registro de service worker para instalación del app y shell offline.
El commit anterior (a3fd928) referenciaba /manifest.webmanifest,
/sw.js, /favicon-32.png y /apple-touch-icon.png en index.html y
main.jsx, pero los archivos no existían: el fallback SPA los servía
como index.html (200 text/html), así que la PWA no era instalable y
parecía que el desplegue no había actualizado.
Se añaden en public/ (Vite los copia a dist/ raíz):
- manifest.webmanifest: nombre, theme_color #8B0000, iconos any/maskable.
- sw.js: cache del shell con stale-while-revalidate (sirve cache al
instante y revalida en segundo plano) + network-first para /api/.
Versión de caché localesp-shell-v1.
- Iconos: favicon-32, apple-touch-icon (180), icon-192, icon-512 y
icon-512-maskable.
- Extrae App.jsx en módulos reutilizables: constants/ (categorias,
provincias), utils/geo, styles/shared, hooks/usePwaInstall y
components/ (StarRating, LocalCard, CampoUbicacion, BannerMovil,
CategoriaBadge)
- AdminPanel reutiliza constantes y componentes compartidos y corrige
la limpieza de suscripciones de Firebase al desmontar
- Añade logos de marca (logo-localesp.png + @2x) y regenera los iconos
PWA con tamaños menores
- sw.js: sube la caché del shell a v2 e incluye los nuevos iconos y logos
El objetivo de estos cambios es, por un lado, mantener los datos
actualizados y, por otro, mejorar la experiencia para quienes lo usan:
- Fiabilidad: los locales se pueden confirmar ("Sigue aquí") y
reportar (cerrado, datos incorrectos...), y se avisa de duplicados
antes de publicar, para que el contenido no se quede obsoleto ni
repetido.
- Usabilidad: autocompletado al proponer, favoritos, "cerca de mí",
compartir fichas, enlaces a Waze y una política de privacidad
visible, para que sea más sencillo aportar y encontrar locales.
- Añade sistema de avisos tipo snackbar (Toast.jsx + useToast.js) con
auto-cierre, animación de entrada y estilos info/éxito/error.
- LocalCard: feedback visual al añadir/quitar un local de favoritos.
- AdminPanel: sustituye los alert() por toasts al aprobar, rechazar,
eliminar locales, descartar avisos y guardar el filtro de palabras;
además saluda con un toast tras iniciar sesión o crear cuenta.
- App: el contenedor del mapa Leaflet queda siempre montado (oculto con
CSS) y se llama a invalidateSize() al volver a la pestaña de mapa;
así el mapa ya no se rompe al navegar entre vistas (antes obligaba
a recargar la página).
- Campo universal de ubicación (Google Maps/Waze/OSM/coordenadas/dirección)
sobre proveedores extensibles (src/utils/ubicacion) con resolver e inferencia
inversa Nominatim (nombre/provincia pre-rellenados, alias cooficiales)
- FAB flotante abajo a la derecha que abre la pasarela en un modal accesible
(Escape, foco contenido, responsive); sin descripción ni puntuación;
avisos de duplicado y filtro de palabras dentro del modal
- Aviso PWA reposicionado: tarjeta abajo a la izquierda en móvil,
botón compacto arriba a la izquierda en PC (no tapa el FAB)
- Suite de pruebas: 88 unitarias/componente (vitest + RTL, offline) y
10 de integración (supertest + SQLite :memory: y Nominatim real opt-in)
- CI: workflow de Gitea Actions con npm test + build en push/PR e
integración manual
- FAB y aviso PWA flanquean la columna central (720px): right/left
max(16px, calc((100vw - 720px)/2 + 16px)) para acompañar al contenido
en pantallas anchas sin pegarse al borde de la ventana
- FAB de 64px en PC (54 en móvil); PWA abajo a la izquierda en PC y móvil
- Nuevo BotonProponerArriba (solo PC): píldora "Proponer local" arriba a
la derecha, alineada al cuerpo, que abre la misma pasarela
- Mueve el cambio (36/36 tareas, 4/4 artefactos) a changes/archive/
- Crea las specs principales de boton-flotante-proponer-local,
pasarela-proponer-local y proveedores-ubicacion (con Purpose)
- vitest 4 traía vite 8 anidado con esbuild 0.28: el lockfile quedaba
incompleto para npm ci y el npm 10.8.2 del runner fallaba con
"Missing @esbuild/* from lock file" / EBADPLATFORM. vitest 3 usa el
vite 5 del proyecto como peer: sin árbol anidado, esbuild solo 0.21.5
- jsdom 30 exige Node >=22.22 (el runner tiene 20.20): bajado a jsdom 26
- tests.yml sobre el runner real (self-hosted, Node del sistema) en vez
de ubuntu-latest, que no existe como label
- aserciones de max()/calc() tolerantes a la serialización de jsdom 26
- Nuevo PasoDatosLocal con nombre, provincia y dirección (ahora editable)
en la misma pantalla, con aviso cuando vienen de la inferencia
- El wizard pasa de 6 a 5 pasos: Ubicación → Datos del local → Categoría
→ Tipo específico → Resumen
- Eliminados PasoNombre y PasoProvincia (absorbidos)
- Spec principal actualizada al nuevo orden de pantallas
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Qué cambia
Por qué
Notas para el revisor
npm run dev.El objetivo de estos cambios es, por un lado, mantener los datos actualizados y, por otro, mejorar la experiencia para quienes lo usan: - Fiabilidad: los locales se pueden confirmar ("Sigue aquí") y reportar (cerrado, datos incorrectos...), y se avisa de duplicados antes de publicar, para que el contenido no se quede obsoleto ni repetido. - Usabilidad: autocompletado al proponer, favoritos, "cerca de mí", compartir fichas, enlaces a Waze y una política de privacidad visible, para que sea más sencillo aportar y encontrar locales.View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.