import React, { useEffect, useRef, useState } from 'react'; type Lang = { code: string; label: string }; interface LanguageSwitcherProps { value?: string; languages?: Lang[]; onChange?: (code: string) => void; } const DEFAULT_LANGUAGES: Lang[] = [ { code: 'EN', label: 'English' }, { code: 'NL', label: 'Nederlands' }, { code: 'FR', label: 'Français' }, { code: 'DE', label: 'Deutsch' } ]; const LanguageSwitcher: React.FC = ({ value = 'EN', languages = DEFAULT_LANGUAGES, onChange }) => { const [open, setOpen] = useState(false); const [current, setCurrent] = useState(value); const rootRef = useRef(null); const buttonRef = useRef(null); const menuId = 'language-switcher-menu'; // Keep in sync if parent controls value useEffect(() => setCurrent(value), [value]); // Close on outside click useEffect(() => { const onPointerDown = (e: PointerEvent) => { if (!open) return; const target = e.target as Node; if (rootRef.current && !rootRef.current.contains(target)) setOpen(false); }; window.addEventListener('pointerdown', onPointerDown); return () => window.removeEventListener('pointerdown', onPointerDown); }, [open]); // Close on ESC useEffect(() => { const onKeyDown = (e: KeyboardEvent) => { if (!open) return; if (e.key === 'Escape') { setOpen(false); buttonRef.current?.focus(); } }; window.addEventListener('keydown', onKeyDown); return () => window.removeEventListener('keydown', onKeyDown); }, [open]); const selectLang = (code: string) => { setCurrent(code); onChange?.(code); setOpen(false); buttonRef.current?.focus(); }; const onButtonKeyDown: React.KeyboardEventHandler = (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setOpen((v) => !v); } if (e.key === 'ArrowDown') { e.preventDefault(); setOpen(true); // focus first option next tick requestAnimationFrame(() => { rootRef.current?.querySelector('[role="menuitemradio"]')?.focus(); }); } }; const onMenuKeyDown: React.KeyboardEventHandler = (e) => { const items = Array.from(rootRef.current?.querySelectorAll('[role="menuitemradio"]') ?? []); if (!items.length) return; const idx = items.indexOf(document.activeElement as HTMLButtonElement); if (e.key === 'ArrowDown') { e.preventDefault(); items[(idx + 1 + items.length) % items.length].focus(); } else if (e.key === 'ArrowUp') { e.preventDefault(); items[(idx - 1 + items.length) % items.length].focus(); } else if (e.key === 'Home') { e.preventDefault(); items[0].focus(); } else if (e.key === 'End') { e.preventDefault(); items[items.length - 1].focus(); } }; return (
{/* */}
); }; export default LanguageSwitcher;