"use client"; import { useState, useRef, useEffect } from "react"; import { useRouter } from "next/navigation"; import { LANGUAGES } from "@/i18n/config"; import type { Locale } from "@/i18n/config"; import { useLocale } from "next-intl"; import { persistLocale } from "@/shared/lib/persistLocale"; function CountryFlag({ emoji, alt }: { emoji: string; alt: string }) { const [error, setError] = useState(false); if (!emoji) return null; const chars = [...emoji]; const codePoints = chars.map((c) => c.codePointAt(0) || 0); const isRegional = codePoints.every((cp) => cp >= 127462 && cp <= 127487); if (!isRegional || codePoints.length !== 2 || error) { return {emoji}; } const countryCode = codePoints.map((cp) => String.fromCharCode(cp - 127462 + 97)).join(""); return ( {alt} setError(true)} /> ); } export default function LanguageSelector() { const locale = useLocale(); const router = useRouter(); const [open, setOpen] = useState(false); const ref = useRef(null); const currentLang = LANGUAGES.find((l) => l.code === locale) || LANGUAGES[0]; // Close dropdown on outside click useEffect(() => { const handler = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) { setOpen(false); } }; document.addEventListener("mousedown", handler); return () => document.removeEventListener("mousedown", handler); }, []); const handleSelect = (code: Locale) => { if (code === locale) { setOpen(false); return; } persistLocale(code); setOpen(false); router.refresh(); }; return (
{/* Trigger button */} {/* Dropdown */} {open && (
{LANGUAGES.map((lang) => ( ))}
)}
); }