'use client'; import { useEffect, useRef, useState, useActionState } from 'react'; import { createPortal } from 'react-dom'; import { subscribeNewsletter, type SubscribeState } from '@/app/actions/subscribeNewsletter'; type Props = { isOpen: boolean; onClose: () => void; }; function EmailField({ inputRef }: { inputRef: React.RefObject }) { const base = 'w-full font-sans text-sm text-brand-brown bg-white/60 border border-brand-brown/12 rounded-lg px-4 py-3 placeholder:text-brand-brown/25 focus:outline-none focus:border-brand-brown/35 focus:bg-white/80 transition-colors duration-150'; return (
); } export function BlogSubFormModal({ isOpen, onClose }: Props) { const [mounted, setMounted] = useState(false); const [state, action, pending] = useActionState( subscribeNewsletter, null, ); const emailInputRef = useRef(null); const formRef = useRef(null); useEffect(() => setMounted(true), []); useEffect(() => { if (isOpen) { setTimeout(() => emailInputRef.current?.focus(), 50); document.body.style.overflow = 'hidden'; } else { document.body.style.overflow = ''; } return () => { document.body.style.overflow = ''; }; }, [isOpen]); useEffect(() => { const handleKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; if (isOpen) document.addEventListener('keydown', handleKey); return () => document.removeEventListener('keydown', handleKey); }, [isOpen, onClose]); useEffect(() => { if (!isOpen) formRef.current?.reset(); }, [isOpen]); if (!mounted || !isOpen) return null; return createPortal(

Ne ratez aucun article

Un mail à chaque nouvel article. Pas de spam, désabonnement en un clic.

{state?.success ? (
C'est noté !

Vous recevrez un email à chaque nouvel article.

) : (
{state?.error && (

{state.error}

)}
)}
, document.body, ); }