refactor(ui): modulariza App.jsx y unifica branding y caché PWA
- 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:
@@ -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;
|
||||
}
|
||||
@@ -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];
|
||||
Reference in New Issue
Block a user