setOpen(false)} />
);
}
/* ===================== CLUB ATUKASA (membresía por teléfono) ===================== */
const DELIVERY_DISCOUNT = 100;
function readClub() {
try { return JSON.parse(localStorage.getItem("atukasa_club") || "null"); }
catch (e) { return null; }
}
function saveClub(data) {
localStorage.setItem("atukasa_club", JSON.stringify(data));
window.dispatchEvent(new Event("atukasa:club"));
}
function clearClub() {
localStorage.removeItem("atukasa_club");
window.dispatchEvent(new Event("atukasa:club"));
}
function useClub() {
const [user, setUser] = useState(readClub);
useEffect(() => {
const upd = () => setUser(readClub());
window.addEventListener("atukasa:club", upd);
return () => window.removeEventListener("atukasa:club", upd);
}, []);
return { user };
}
/* alias de compatibilidad */
const useLoyalty = () => { const { user } = useClub(); return { user, login: () => {}, logout: clearClub }; };
function LoyaltyChip({ user, onOpen }) {
if (user) {
return (
Delivery gratis
);
}
return (
);
}
function LoyaltyModal({ onClose }) {
const [phone, setPhone] = useState("");
const [checking, setChecking] = useState(false);
const [error, setError] = useState(null);
const [success, setSuccess] = useState(null);
useEffect(() => {
const onKey = (e) => e.key === "Escape" && onClose();
document.addEventListener("keydown", onKey);
return () => document.removeEventListener("keydown", onKey);
}, []);
const activate = async () => {
if (checking) return;
const digits = phone.replace(/\D/g, "");
if (digits.length < 10) { setError("Escribe el teléfono con el que hiciste tu pedido (10 dígitos)"); return; }
setChecking(true);
setError(null);
try {
const res = await fetch("/atukasa-club.php?phone=" + encodeURIComponent(digits));
const data = await res.json().catch(() => ({}));
if (data.member) {
saveClub({ name: data.name || "Miembro", phone: digits, since: Date.now() });
setSuccess(data.name || "Miembro");
setTimeout(onClose, 2600);
} else {
setError("Ese número aún no está en el Club. Únete marcando la casilla al confirmar tu próximo pedido. 🍣");
}
} catch (err) {
setError("No se pudo verificar ahora. Inténtalo de nuevo.");
} finally {
setChecking(false);
}
};
return (
e.stopPropagation()}>
{success ? (
🎉
¡Hola de nuevo, {success}!
Tu beneficio del Club está activo en este dispositivo. El delivery de RD$ {fmt(DELIVERY_DISCOUNT)} es gratis en tus pedidos.
Beneficio activo en tu carrito
) : (
Club Atukasa
Delivery gratis, siempre.
Únete al Club Atukasa y recibe ofertas exclusivas por WhatsApp + delivery gratis en la zona de cobertura de San Cristóbal.
−RD$ {fmt(DELIVERY_DISCOUNT)}en cada pedido, aplicado automáticamente
¿Cómo me uno? Marca la casilla "Únete al Club Atukasa" al confirmar tu pedido. Sin formularios, sin contraseñas.
¿Ya eres miembro?
Activa tu beneficio en este dispositivo con tu teléfono:
setPhone(e.target.value)} />
{error &&
{error}
}
Al unirte aceptas recibir ofertas y novedades de Atukasa Sushi por WhatsApp. Puedes salir del Club cuando quieras respondiendo "BAJA". Beneficio válido en zona de cobertura de San Cristóbal, no acumulable con otros cupones.
)}
);
}
/* ===================== INDICADOR DE SESIÓN (header) ===================== */
function AccountChip({ memberUser, onOpenLoyalty }) {
const read = () => {
try { return JSON.parse(localStorage.getItem("atukasa_customer") || "null"); }
catch (e) { return null; }
};
const [cust, setCust] = useState(read);
const [open, setOpen] = useState(false);
const ref = useRef(null);
useEffect(() => {
const upd = () => setCust(read());
window.addEventListener("atukasa:customer", upd);
return () => window.removeEventListener("atukasa:customer", upd);
}, []);
useEffect(() => {
if (!open) return;
const onDoc = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); };
const onKey = (e) => e.key === "Escape" && setOpen(false);
document.addEventListener("mousedown", onDoc);
document.addEventListener("keydown", onKey);
return () => { document.removeEventListener("mousedown", onDoc); document.removeEventListener("keydown", onKey); };
}, [open]);
const isClubMember = !!(memberUser && memberUser.name);
/* Sin membresía del Club → ícono genérico (aunque haya datos de autollenado) */
if (!isClubMember) {
return (
);
}
/* Miembro del Club → inicial en círculo rojo + popover con sus datos */
const initial = memberUser.name.trim().charAt(0).toUpperCase();
return (