import { useState, useRef, useEffect } from "react"; import { ChevronDown, Globe } from "lucide-react"; import { cn } from "@/lib/utils"; import { motion } from "framer-motion"; import ReactCountryFlag from "react-country-flag"; export interface Language { code: string; name: string; flag?: string; } interface LanguageSelectProps { selectedCountry: string; onSelect: (country: string) => void; containerRef: React.RefObject; languages: Language[]; } function FlagPreloader({ languages }: { languages: Language[] }) { return (
{languages.map((language) => ( ))}
); } export function LanguageSelect({ selectedCountry, onSelect, containerRef, languages, }: LanguageSelectProps) { const [expanded, setExpanded] = useState(false); const [isTapping, setIsTapping] = useState(false); const [isClosing, setIsClosing] = useState(false); const collapsedHeight = "2.5rem"; const expandHeight = "12rem"; const buttonRef = useRef(null); const expand = () => { setIsTapping(true); setTimeout(() => setIsTapping(false), 600); setExpanded(true); buttonRef.current?.focus(); }; useEffect(() => { if (!expanded) return; const handleClickOutside = (event: MouseEvent) => { if ( buttonRef.current && !buttonRef.current.contains(event.target as Node) ) { setIsClosing(true); setTimeout(() => setIsClosing(false), 600); setExpanded(false); buttonRef.current?.blur(); } }; document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, [expanded]); const selectedLanguage = languages.find( (lang) => lang.code === selectedCountry ); const handleSelect = ({ code, e, }: { code: string; e: React.MouseEvent; }) => { e.stopPropagation(); e.preventDefault(); onSelect(code); setExpanded(false); }; return (
{!expanded ? (
{selectedCountry === "auto" ? ( ) : ( )} {selectedCountry === "auto" ? "Auto" : selectedLanguage?.name}
) : (
{languages.map((language) => ( ))}
)}
); } function LanguageButton({ language, onSelect, selectedCountry, }: { language: Language; onSelect: ({ code, e, }: { code: string; e: React.MouseEvent; }) => void; selectedCountry: string; }) { return ( ); }