import { useEffect, useMemo, useState } from "react"; import { Check, Clock3, Copy, Gift, X } from "lucide-react"; import { Button } from "@/components/ui/button"; import { CUPON_PENDIENTE_KEY, PROMOCION_OCULTA_KEY, PROMOCION_VISTA_KEY, fechaLocalHoy, obtenerPromocionActiva, type PromocionActiva, } from "@/lib/promocionesService"; function tiempoRestante(fin: string) { const diferencia = Math.max(0, new Date(fin).getTime() - Date.now()); const horas = Math.floor(diferencia / 3_600_000); const minutos = Math.floor((diferencia % 3_600_000) / 60_000); const segundos = Math.floor((diferencia % 60_000) / 1000); return { horas, minutos, segundos }; } export function PromocionFlashModal() { const [promocion, setPromocion] = useState(null); const [abierta, setAbierta] = useState(false); const [noMostrar, setNoMostrar] = useState(false); const [copiado, setCopiado] = useState(false); const [ahora, setAhora] = useState(Date.now()); useEffect(() => { let vigente = true; const hoy = fechaLocalHoy(); if ( window.localStorage.getItem(PROMOCION_OCULTA_KEY) === hoy || window.sessionStorage.getItem(PROMOCION_VISTA_KEY) === hoy ) return; obtenerPromocionActiva().then((resultado) => { if (!vigente) return; setPromocion(resultado); setAbierta(true); }); return () => { vigente = false; }; }, []); useEffect(() => { if (!abierta) return; const intervalo = window.setInterval(() => setAhora(Date.now()), 1000); return () => window.clearInterval(intervalo); }, [abierta]); const restante = useMemo( () => (promocion ? tiempoRestante(promocion.terminaEn) : { horas: 0, minutos: 0, segundos: 0 }), [promocion, ahora], ); const cerrar = () => { if (noMostrar) window.localStorage.setItem(PROMOCION_OCULTA_KEY, fechaLocalHoy()); window.sessionStorage.setItem(PROMOCION_VISTA_KEY, fechaLocalHoy()); setAbierta(false); }; const copiar = async () => { if (!promocion) return; try { await navigator.clipboard.writeText(promocion.codigo); } catch { // El código sigue visible para copiarlo manualmente si el navegador bloquea el portapapeles. } setCopiado(true); window.setTimeout(() => setCopiado(false), 1600); }; const aplicar = () => { if (!promocion) return; window.sessionStorage.setItem(CUPON_PENDIENTE_KEY, promocion.codigo); cerrar(); window.location.assign("/reserva"); }; if (!abierta || !promocion) return null; return (

Oferta flash

{promocion.titulo}

{promocion.descripcion}

La oferta termina en

{[ [restante.horas, "Horas"], [restante.minutos, "Min"], [restante.segundos, "Seg"], ].map(([valor, etiqueta]) => (

{String(valor).padStart(2, "0")}

{etiqueta}

))}

Tu código

{promocion.codigo}

); }