refactor(ui): modulariza App.jsx y unifica branding y caché PWA
deploy-branch / deploy (push) Successful in 2m36s
deploy-branch / teardown (push) Skipped

- 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
This commit is contained in:
2026-08-05 19:07:00 +02:00
parent 28d066b5af
commit 257fb9c622
20 changed files with 674 additions and 360 deletions
+86
View File
@@ -0,0 +1,86 @@
// Categorías de negocio compartidas entre la web pública y el panel de administración.
// Centralizar esta lista evita que App.jsx y AdminPanel.jsx queden desincronizados.
export const CATEGORIAS = {
"Restauración": {
emoji: "🍽️",
color: "#8B0000",
bgLight: "#FFF0F0",
textColor: "#8B0000",
subcategorias: [
"Tapas y raciones", "Paella y arroces", "Pintxos", "Asador / Carne a la brasa",
"Mariscos y pescados", "Bocadillos y montaditos", "Menú del día", "Cocina vasca",
"Cocina catalana", "Cocina andaluza", "Cocina gallega", "Cocina madrileña",
"Cocina mediterránea", "Pizzería", "Hamburguesería", "Comida rápida",
"Cocina internacional", "Cafetería / Desayunos", "Heladería", "Pastelería",
],
},
"Pequeño comercio": {
emoji: "🛍️",
color: "#1A5276",
bgLight: "#EBF5FB",
textColor: "#1A5276",
subcategorias: [
"Alimentación / Ultramarinos", "Frutería", "Carnicería", "Pescadería", "Panadería",
"Farmacia", "Papelería / Librería", "Floristería", "Joyería / Relojería", "Zapatería",
"Ropa y moda", "Juguetería", "Ferretería", "Bazar / Todo a 100", "Estanco", "Quiosco",
"Óptica", "Ortopedia", "Tienda de mascotas", "Electrodomésticos",
],
},
"Peluquería y estética": {
emoji: "✂️",
color: "#76448A",
bgLight: "#F5EEF8",
textColor: "#76448A",
subcategorias: [
"Peluquería señora", "Peluquería caballero", "Peluquería unisex", "Barbería",
"Centro de estética", "Uñas / Manicura", "Depilación", "Masajes y spa",
"Tatuajes y piercings", "Centro de bronceado", "Micropigmentación",
],
},
"Servicios del hogar": {
emoji: "🔧",
color: "#1E8449",
bgLight: "#EAFAF1",
textColor: "#1E8449",
subcategorias: [
"Cerrajería", "Fontanería / Plomería", "Electricidad", "Reformas y construcción",
"Pintura", "Carpintería", "Cristalería", "Climatización / Aire acondicionado",
"Mudanzas", "Limpieza", "Jardinería", "Instalación solar", "Alarmas y seguridad",
"Reparación electrodomésticos",
],
},
"Otros": {
emoji: "📌",
color: "#784212",
bgLight: "#FDF2E9",
textColor: "#784212",
subcategorias: [
"Taller mecánico", "Lavado de coches", "Academia / Clases", "Gestoría / Asesoría",
"Inmobiliaria", "Agencia de viajes", "Fotografía", "Informática / Reparación móviles",
"Copistería / Imprenta", "Veterinaria", "Gimnasio / Fitness", "Centro médico / Clínica",
"Fisioterapia", "Psicología", "Lavandería", "Tintorería", "Otro",
],
},
};
export const NOMBRES_CATEGORIAS = Object.keys(CATEGORIAS);
export const COLORES_MAPA = NOMBRES_CATEGORIAS.reduce((acc, nombre) => {
acc[nombre] = CATEGORIAS[nombre].color;
return acc;
}, {});
// Categoría comodín usada cuando un local trae una categoría desconocida o vacía
// (por ejemplo, datos antiguos que ya no coinciden con el catálogo actual).
export const CATEGORIA_DESCONOCIDA = {
emoji: "📍",
color: "#6e6e73",
bgLight: "var(--color-background-secondary)",
textColor: "var(--color-text-secondary)",
subcategorias: [],
};
export function obtenerCategoria(nombre) {
return CATEGORIAS[nombre] || CATEGORIA_DESCONOCIDA;
}
+34
View File
@@ -0,0 +1,34 @@
// Provincias españolas y sus coordenadas aproximadas (capital de provincia),
// usadas como centro de referencia en el mapa cuando un local no trae lat/lng propios.
export const PROVINCIAS = [
"Álava", "Albacete", "Alicante", "Almería", "Asturias", "Ávila", "Badajoz", "Barcelona",
"Burgos", "Cáceres", "Cádiz", "Cantabria", "Castellón", "Ciudad Real", "Córdoba", "Cuenca",
"Gerona", "Granada", "Guadalajara", "Guipúzcoa", "Huelva", "Huesca", "Islas Baleares", "Jaén",
"La Coruña", "La Rioja", "Las Palmas", "León", "Lérida", "Lugo", "Madrid", "Málaga", "Murcia",
"Navarra", "Orense", "Palencia", "Pontevedra", "Salamanca", "Santa Cruz de Tenerife", "Segovia",
"Sevilla", "Soria", "Tarragona", "Teruel", "Toledo", "Valencia", "Valladolid", "Vizcaya",
"Zamora", "Zaragoza",
];
export const COORDS_PROVINCIAS = {
"Álava": [42.8467, -2.6726], "Albacete": [38.9942, -1.8585], "Alicante": [38.3452, -0.4815],
"Almería": [36.834, -2.4637], "Asturias": [43.3614, -5.8593], "Ávila": [40.6566, -4.6814],
"Badajoz": [38.8794, -6.9707], "Barcelona": [41.3851, 2.1734], "Burgos": [42.344, -3.6969],
"Cáceres": [39.4753, -6.3724], "Cádiz": [36.5271, -6.2886], "Cantabria": [43.4623, -3.8099],
"Castellón": [39.9864, -0.0513], "Ciudad Real": [38.9848, -3.9274], "Córdoba": [37.8882, -4.7794],
"Cuenca": [40.0704, -2.1374], "Gerona": [41.9794, 2.8214], "Granada": [37.1773, -3.5986],
"Guadalajara": [40.6328, -3.1614], "Guipúzcoa": [43.3183, -1.9812], "Huelva": [37.2614, -6.9447],
"Huesca": [42.1401, -0.4089], "Islas Baleares": [39.5696, 2.6502], "Jaén": [37.7796, -3.7849],
"La Coruña": [43.3623, -8.4115], "La Rioja": [42.4627, -2.4449], "Las Palmas": [28.1235, -15.4366],
"León": [42.5987, -5.5671], "Lérida": [41.6178, 0.62], "Lugo": [43.0097, -7.5567],
"Madrid": [40.4168, -3.7038], "Málaga": [36.7213, -4.4214], "Murcia": [37.9922, -1.1307],
"Navarra": [42.8169, -1.6432], "Orense": [42.3362, -7.8639], "Palencia": [42.0097, -4.5288],
"Pontevedra": [42.4333, -8.65], "Salamanca": [40.9701, -5.6635], "Santa Cruz de Tenerife": [28.4636, -16.2518],
"Segovia": [40.9429, -4.1088], "Sevilla": [37.3891, -5.9845], "Soria": [41.764, -2.464],
"Tarragona": [41.1189, 1.2445], "Teruel": [40.344, -1.1065], "Toledo": [39.8628, -4.0273],
"Valencia": [39.4699, -0.3763], "Valladolid": [41.6523, -4.7245], "Vizcaya": [43.263, -2.935],
"Zamora": [41.5034, -5.7446], "Zaragoza": [41.6488, -0.8891],
};
export const CENTRO_ESPANA = [40.4, -3.7];