// ECO-PANNEAU.FR - _react/riverains/_riverains_newsletter.jsx const { useState, useEffect } = React; window.pano_RiverainNewsletterTab = ({ panneau, themeColor, showToast, isPreview = false }) => { // 1. - SÉCURITÉ ANTI-FUITE DE MÉMOIRE : Utilisation du Hook Global Zéro-Dette const { isMounted, safeFetch } = window.pano_useSafeFetch(); // 2. - Hooks et Composants const { openDialog } = window.pano_useUrlModal(); const { MailIcon, LoaderIcon, CheckCircleIcon, ArrowRightIcon } = window.pano_getIcons(); const { Button } = window.pano_getComponents(); // 3. - Détection du mode simulation (Aperçu Admin ou Panneau Démo) const isSimulated = isPreview || panneau?.id === 'demo-panneau' || new URLSearchParams(window.location.search).get('modal') === 'preview'; // 4. - États locaux const [email, setEmail] = useState(''); const [status, setStatus] = useState('idle'); // idle, requesting, verifying, success const [verifySession, setVerifySession] = useState(''); const [verifyCode, setVerifyCode] = useState(''); const [submitting, setSubmitting] = useState(false); // 5. - Actions métier const handleSubscribeRequest = async (e) => { e.preventDefault(); // Blocage de l'action si on est en mode aperçu if (isSimulated) { openDialog('demo_warning', 'chat'); return; } if (!email.trim() || !email.includes('@')) { if (showToast) showToast("Veuillez saisir une adresse e-mail valide.", "error"); return; } const d = await safeFetch('newsletter/subscribe_request', { body: { email: email.trim(), panneau_id: panneau.id }, setLoading: setSubmitting, successMessage: "Un code de vérification a été envoyé à votre adresse e-mail." }); if (!isMounted.current) return; // SÉCURITÉ : Coupe-circuit if (d && d.data && d.data.verify_session) { setVerifySession(d.data.verify_session); setStatus('verifying'); } }; const handleVerifyCode = async (e) => { e.preventDefault(); if (verifyCode.length !== 6) return; const d = await safeFetch('newsletter/subscribe_confirm', { body: { verify_session: verifySession, code: verifyCode }, setLoading: setSubmitting, successMessage: "Inscription confirmée avec succès !" }); if (!isMounted.current) return; // SÉCURITÉ : Coupe-circuit if (d) { setStatus('success'); } }; // 6. - Rendu UI if (status === 'success') { return (

Inscription validée !

Vous recevrez désormais les actualités et les informations importantes concernant ce chantier directement par e-mail.

); } if (status === 'verifying') { return (

Vérification de l'e-mail

Un code à 6 chiffres a été envoyé à {email}. Saisissez-le ci-dessous pour confirmer votre inscription.

setVerifyCode(e.target.value.replace(/\D/g, '').slice(0, 6))} className="w-full border-2 border-slate-200 rounded-xl p-3 text-center text-3xl tracking-[0.25em] font-black outline-none focus:border-slate-800 mb-4" placeholder="000000" autoFocus />
setStatus('idle')} className="mt-4 text-xs font-bold text-slate-400 hover:text-slate-600 transition cursor-pointer inline-block"> Annuler / Modifier l'e-mail
); } return (
{/* CALQUE INVISIBLE POUR BLOQUER LES INTERACTIONS EN MODE DÉMO */} {isSimulated && (
{ e.preventDefault(); e.stopPropagation(); openDialog('demo_warning', 'chat'); }} title="Inscription désactivée en mode aperçu" >
)}

Rester informé

Inscrivez-vous à la newsletter du chantier pour recevoir les alertes importantes (coupures de route, livraisons exceptionnelles, etc.) directement dans votre boîte mail.

setEmail(e.target.value)} required disabled={submitting} placeholder="Votre adresse e-mail" className="w-full border-2 rounded-xl p-3 text-sm outline-none transition border-slate-200 focus:border-slate-800 disabled:opacity-50" />

Votre e-mail ne sera utilisé que pour les communications relatives à ce chantier. Vous pourrez vous désinscrire à tout moment.

); }; /* EOF ========== [_react/riverains/_riverains_newsletter.jsx] */