"use client"; import Image from "next/image"; import { useLocale } from "next-intl"; import { useRouter } from "next/navigation"; import { useTransition, useState, useRef, useEffect, useMemo } from "react"; import { Search } from "lucide-react"; const LOCALES: { code: string; label: string; lang: string }[] = [ { code: "nl", label: "Nederlands", lang: "nl" }, { code: "en", label: "English", lang: "en" }, { code: "de", label: "Deutsch", lang: "de" }, { code: "fr", label: "Français", lang: "fr" }, { code: "es", label: "Español", lang: "es" }, { code: "it", label: "Italiano", lang: "it" }, { code: "pt", label: "Português", lang: "pt" }, { code: "pl", label: "Polski", lang: "pl" }, { code: "sv", label: "Svenska", lang: "sv" }, { code: "tr", label: "Türkçe", lang: "tr" }, { code: "ro", label: "Română", lang: "ro" }, { code: "hu", label: "Magyar", lang: "hu" }, { code: "cs", label: "Čeština", lang: "cs" }, { code: "sk", label: "Slovenčina", lang: "sk" }, { code: "da", label: "Dansk", lang: "da" }, { code: "no", label: "Norsk", lang: "no" }, { code: "el", label: "Ελληνικά", lang: "el" }, { code: "bg", label: "Български", lang: "bg" }, { code: "hr", label: "Hrvatski", lang: "hr" }, { code: "sr", label: "Српски", lang: "sr" }, { code: "uk", label: "Українська", lang: "uk" }, { code: "ru", label: "Русский", lang: "ru" }, ]; export function LanguageSwitcher() { const locale = useLocale(); const router = useRouter(); const [pending, startTransition] = useTransition(); const [open, setOpen] = useState(false); const [search, setSearch] = useState(""); const ref = useRef(null); const current = LOCALES.find((l) => l.code === locale) ?? LOCALES[0]; const filtered = useMemo(() => { if (!search) return LOCALES; const q = search.toLowerCase(); return LOCALES.filter( (l) => l.label.toLowerCase().includes(q) || l.code.toLowerCase().includes(q) || l.lang.toLowerCase().includes(q), ); }, [search]); useEffect(() => { function handleClick(e: MouseEvent) { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false); } document.addEventListener("mousedown", handleClick); return () => document.removeEventListener("mousedown", handleClick); }, []); useEffect(() => { if (!open) setSearch(""); }, [open]); function switchLocale(code: string) { if (code === locale) return; document.cookie = `NEXT_LOCALE=${code};path=/;max-age=31536000;samesite=strict;secure`; startTransition(() => router.refresh()); setOpen(false); } return (
{open && (
setSearch(e.target.value)} className="flex-1 bg-transparent outline-none text-sm" style={{ border: "none", padding: 0, margin: 0 }} autoFocus />
{filtered.length === 0 && (

Geen talen gevonden

)} {filtered.map((l) => ( ))}
)}
); }