"use client"; import { useState, useRef, useEffect } from "react"; import { useLocale } from 'next-intl'; import { useLocaleStore } from '@/stores/locale-store'; import { ChevronDown } from 'lucide-react'; import { cn } from '@/lib/utils'; import { flagComponents } from './flag-icons'; const languages = [ { value: 'cs', label: 'Česky' }, { value: 'en', label: 'English' }, { value: 'fr', label: 'Français' }, { value: 'ja', label: '日本語' }, { value: 'ko', label: '한국어' }, { value: 'es', label: 'Español' }, { value: 'it', label: 'Italiano' }, { value: 'de', label: 'Deutsch' }, { value: 'lv', label: 'Latviešu' }, { value: 'nl', label: 'Nederlands' }, { value: 'pl', label: 'Polski' }, { value: 'pt', label: 'Português' }, { value: 'ru', label: 'Русский' }, { value: 'tr', label: 'Türkçe' }, { value: 'uk', label: 'Українська' }, { value: 'zh', label: '简体中文' }, ]; function FlagIcon({ locale }: { locale: string }) { const Flag = flagComponents[locale]; if (!Flag) return null; return ; } export function LanguageSwitcher({ className }: { className?: string }) { const currentLocale = useLocale(); const setLocale = useLocaleStore((state) => state.setLocale); const [open, setOpen] = useState(false); const containerRef = useRef(null); const listRef = useRef(null); const current = languages.find((l) => l.value === currentLocale) ?? languages[0]; // Close on outside click useEffect(() => { if (!open) return; function handleClick(e: MouseEvent) { if (containerRef.current && !containerRef.current.contains(e.target as Node)) { setOpen(false); } } document.addEventListener("mousedown", handleClick); return () => document.removeEventListener("mousedown", handleClick); }, [open]); // Close on Escape useEffect(() => { if (!open) return; function handleKey(e: KeyboardEvent) { if (e.key === "Escape") setOpen(false); } document.addEventListener("keydown", handleKey); return () => document.removeEventListener("keydown", handleKey); }, [open]); return (
{open && (
    {languages.map((lang) => (
  • { setLocale(lang.value); setOpen(false); }} className={cn( "flex items-center gap-2 px-3 py-1.5 text-sm cursor-pointer transition-colors duration-100", lang.value === currentLocale ? "bg-accent text-accent-foreground font-medium" : "text-foreground hover:bg-accent/50" )} > {lang.label}
  • ))}
)}
); }