import { useState } from "react"; import CategoriaBadge from "./CategoriaBadge.jsx"; import StarRating from "./StarRating.jsx"; import ReportarLocal from "./ReportarLocal.jsx"; import Toast from "./Toast.jsx"; import useFavoritos from "../hooks/useFavoritos.js"; import useToast from "../hooks/useToast.js"; import { confirmarLocal } from "../firebase.js"; import { enlaceGoogleMapsDesdeLocal, enlaceWazeDesdeLocal, formatearDistancia } from "../utils/geo.js"; const MESES_PARA_CADUCAR = 6; function formatearFecha(fecha) { if (!fecha) return null; const date = new Date(fecha); if (Number.isNaN(date.getTime())) return null; return date.toLocaleDateString("es-ES", { day: "numeric", month: "long", year: "numeric" }); } function mesesDesde(fecha) { if (!fecha) return null; const date = new Date(fecha); if (Number.isNaN(date.getTime())) return null; return (Date.now() - date.getTime()) / (1000 * 60 * 60 * 24 * 30); } export default function LocalCard({ local, distanciaKm }) { const { esFavorito, alternarFavorito } = useFavoritos(); const { toast, mostrarToast } = useToast(); const [confirmando, setConfirmando] = useState(false); const [confirmado, setConfirmado] = useState(false); const [fechaConfirmacion, setFechaConfirmacion] = useState(local.fechaConfirmacion || local.fecha); const gmUrl = local.enlaceGoogleMaps || enlaceGoogleMapsDesdeLocal(local); const wazeUrl = enlaceWazeDesdeLocal(local); const fechaFormateada = formatearFecha(local.fecha); const meses = mesesDesde(fechaConfirmacion); const sinConfirmarReciente = meses != null && meses >= MESES_PARA_CADUCAR; const favorito = esFavorito(local.id); const handleConfirmar = async () => { setConfirmando(true); try { const res = await confirmarLocal(local.id); setFechaConfirmacion(res?.fechaConfirmacion || new Date().toISOString()); setConfirmado(true); } catch (e) { console.error(e); } setConfirmando(false); }; const handleAlternarFavorito = () => { const nuevoEstado = !favorito; alternarFavorito(local.id); mostrarToast(nuevoEstado ? "❤️ Añadido a favoritos" : "Quitado de favoritos", nuevoEstado ? "exito" : "info"); }; const compartir = async () => { const url = `${window.location.origin}${window.location.pathname}?local=${local.id}`; const texto = `${local.nombre}${local.provincia ? ` · ${local.provincia}` : ""}`; if (navigator.share) { try { await navigator.share({ title: local.nombre, text: texto, url }); } catch { /* usuario canceló */ } return; } try { await navigator.clipboard.writeText(url); window.open(`https://wa.me/?text=${encodeURIComponent(`${texto} ${url}`)}`, "_blank", "noopener,noreferrer"); } catch { window.open(`https://wa.me/?text=${encodeURIComponent(`${texto} ${url}`)}`, "_blank", "noopener,noreferrer"); } }; return (
{local.nombre}
{local.provincia} {distanciaKm != null && · {formatearDistancia(distanciaKm)}}
"{local.descripcion}"
)} {sinConfirmarReciente && !confirmado && (✅ Gracias por confirmar que sigue activo.
)}Publicado {fechaFormateada}
)}