import { useState, useEffect, useRef } from 'react'; export default function ExitIntentPopup() { const [show, setShow] = useState(false); const [email, setEmail] = useState(''); const [status, setStatus] = useState<'idle' | 'loading' | 'success' | 'error'>('idle'); const [message, setMessage] = useState(''); const shownRef = useRef(false); useEffect(() => { // Don't show if user already registered or dismissed if (localStorage.getItem('sp_exit_dismissed') || localStorage.getItem('sp_user')) return; // Desktop: mouse leaves viewport at top const handleMouseLeave = (e: MouseEvent) => { if (e.clientY <= 0 && !shownRef.current) { shownRef.current = true; setShow(true); } }; // Mobile: show after 45 seconds of browsing const mobileTimer = setTimeout(() => { if (window.innerWidth < 768 && !shownRef.current) { shownRef.current = true; setShow(true); } }, 45000); document.addEventListener('mouseleave', handleMouseLeave); return () => { document.removeEventListener('mouseleave', handleMouseLeave); clearTimeout(mobileTimer); }; }, []); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setStatus('loading'); try { const res = await fetch('/api/auth/register', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email }), }); const data = await res.json(); if (data.ok || data.error?.includes('al geregistreerd')) { setStatus('success'); setMessage('Check je inbox voor de bevestiging!'); localStorage.setItem('sp_exit_dismissed', '1'); } else { setStatus('error'); setMessage(data.error || 'Er ging iets mis'); } } catch { setStatus('error'); setMessage('Er ging iets mis, probeer het later opnieuw'); } }; const dismiss = () => { setShow(false); localStorage.setItem('sp_exit_dismissed', '1'); }; if (!show) return null; return (
{message}
Ontvang alerts wanneer je favoriete sneakers in prijs dalen. Gratis, geen spam.
Je kunt je altijd uitschrijven. We sturen max 2 mails per week.
> )}