import { useState, useEffect, type FormEvent } from 'react'; import WatchlistItemCard, { type WatchlistItem } from './WatchlistItemCard'; import AdvancedSizesSection from './AdvancedSizesSection'; // ── Types ──────────────────────────────────────────────────────────────── interface UserProfile { id: string; email: string; first_name: string | null; last_name: string | null; shoe_size: string | null; gender_preference: string; alert_threshold_pct: number; alert_frequency: string; alert_day_of_week: string; notify_back_in_stock: boolean; notify_weekly_digest: boolean; notify_new_releases: boolean; paused_until: string | null; budget_max: number | null; email_verified: boolean; } // ── LoginForm ──────────────────────────────────────────────────────────── function LoginForm() { const [email, setEmail] = useState(''); const [loading, setLoading] = useState(false); const [message, setMessage] = useState(''); const handleSubmit = async (e: FormEvent) => { e.preventDefault(); setLoading(true); setMessage(''); 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) { setMessage('Check je email voor de bevestigingslink!'); } else if (data.error?.includes('al geregistreerd')) { const loginRes = await fetch('/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email }), }); const loginData = await loginRes.json(); setMessage(loginData.message || 'Check je email voor de inloglink!'); } else { setMessage(data.error || 'Er ging iets mis'); } } catch { setMessage('Er ging iets mis'); } setLoading(false); }; return (
Log in om je voorkeuren, watchlist en e-mailinstellingen te beheren.
{/* Google login */} Inloggen met GoogleVia e-mail ontvang je een magic link — geen wachtwoord nodig.
Stel je profiel in
Voeg je naam en maat toe voor gepersonaliseerde alerts.
Ontvang alleen alerts voor sneakers onder dit bedrag
Gebaseerd op je watchlist en gevolgde merken
{/* Brand preferences */}Gem. prijs
€{profile.preferred_price_range.avg}
Bereik
€{profile.preferred_price_range.min} – €{profile.preferred_price_range.max}
Je watchlist is nog leeg
Ontdek sneakers{filtered.length} sneaker{filtered.length !== 1 ? 's' : ''}
Geen sneakers gevonden met deze filters
E-mails gepauzeerd
Tot {pausedUntil!.toLocaleDateString('nl-NL', { day: 'numeric', month: 'long', year: 'numeric' })} . Watchlist-alerts komen nog steeds door.
Vanaf welk kortingspercentage wil je een melding?
{threshold}% — {thresholdLabels[threshold] || 'Goede deals'}
Wanneer wil je meldingen ontvangen?
Op welke dag wil je de wekelijkse digest ontvangen?
Ontvang directe browsernotificaties voor prijsdalingen op je watchlist items.
{pushEnabled ? '✓ Push notificaties actief' : 'Push notificaties'}
{pushEnabled ? 'Je ontvangt direct een melding bij prijsdalingen' : 'Inschakelen voor directe browsernotificaties'}
Pauzeer marketing e-mails tijdelijk. Watchlist-alerts blijven gewoon werken.