import { useState, useEffect, useRef } from 'react'; const EU_SIZES = ['36', '37', '37.5', '38', '38.5', '39', '40', '40.5', '41', '42', '42.5', '43', '44', '44.5', '45', '46', '47', '48']; function getCookie(name: string): string | null { if (typeof document === 'undefined') return null; const match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)')); return match ? decodeURIComponent(match[1]) : null; } function setCookie(name: string, value: string, days = 365) { const expires = new Date(Date.now() + days * 864e5).toUTCString(); document.cookie = `${name}=${encodeURIComponent(value)};expires=${expires};path=/;SameSite=Lax`; } function deleteCookie(name: string) { document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/;SameSite=Lax`; } type SessionState = 'loading' | 'guest' | 'has-size' | 'advanced' | 'no-size'; export default function SizePicker() { const [sessionState, setSessionState] = useState('loading'); const [profileSize, setProfileSize] = useState(null); const [selectedSize, setSelectedSize] = useState(null); const [open, setOpen] = useState(false); const [hasAdvancedSizes, setHasAdvancedSizes] = useState(false); const [advancedOn, setAdvancedOn] = useState(false); const ref = useRef(null); // Load session + profile size on mount useEffect(() => { const getSession = (window as any).__spSession || (() => fetch('/api/auth/session').then(r => r.json())); getSession() .then((data: any) => { if (data.user?.has_advanced_sizes) { // Logged in with advanced sizes setHasAdvancedSizes(true); setAdvancedOn(data.user.advanced_size_mode === 'on'); setSessionState('advanced'); } else if (data.user?.shoe_size) { // Logged in with shoe_size (no advanced) setProfileSize(data.user.shoe_size); setSessionState('has-size'); // Auto-sync profile size to cookie setCookie('sp_size', data.user.shoe_size); setSelectedSize(data.user.shoe_size); } else if (data.user) { // Logged in but no shoe_size setSessionState('no-size'); } else { // Not logged in - use cookie setSessionState('guest'); const saved = getCookie('sp_size'); if (saved && EU_SIZES.includes(saved)) { setSelectedSize(saved); } } }) .catch(() => { // Fallback to guest mode setSessionState('guest'); const saved = getCookie('sp_size'); if (saved && EU_SIZES.includes(saved)) { setSelectedSize(saved); } }); }, []); // Close dropdown on outside click useEffect(() => { function handleClick(e: MouseEvent) { if (ref.current && !ref.current.contains(e.target as Node)) { setOpen(false); } } if (open) document.addEventListener('mousedown', handleClick); return () => document.removeEventListener('mousedown', handleClick); }, [open]); function pickSize(size: string | null) { setSelectedSize(size); setOpen(false); if (size) { setCookie('sp_size', size); } else { deleteCookie('sp_size'); } // Reload to apply filter server-side window.location.reload(); } function toggleAdvancedMode() { const newMode = advancedOn ? 'off' : 'on'; setAdvancedOn(!advancedOn); setCookie('sp_size_mode', newMode); // Reload to apply filter server-side window.location.reload(); } if (sessionState === 'loading') { return ( {open && (
Jouw maat {selectedSize && ( )}
{EU_SIZES.map((size) => ( ))}

Alle sneakers worden gefilterd op jouw maat

)} ); } // Logged in with size: show toggle if (sessionState === 'has-size') { return ( ); } // Advanced mode: toggle button with link to profile if (sessionState === 'advanced') { return (
); } // Logged in without size: show link to profile if (sessionState === 'no-size') { return ( Maat ); } return null; }