import { useEffect, useMemo, useRef, useState, type ReactElement } from "react"; import { observer } from "mobx-react-lite"; import { languageStore } from "@shared"; const LANGUAGES = ["ru", "zh", "en"] as const; type Language = (typeof LANGUAGES)[number]; type LanguageSelectorProps = { onBack?: () => void; isSidebarOpen?: boolean; }; const renderLanguageIcon = (lang: Language): ReactElement => { switch (lang) { case "ru": return ( ); case "zh": return ( ); case "en": default: return ( ); } }; const CollapsedIcon = () => ( ); const ArrowIcon = ({ rotation }: { rotation: number }) => ( ); const LanguageSelector = observer( ({ onBack, isSidebarOpen = true }: LanguageSelectorProps) => { const { language, setLanguage } = languageStore; const [isOpen, setIsOpen] = useState(false); const containerRef = useRef(null); useEffect(() => { if (!isOpen) { return; } const handleOutside = (event: PointerEvent) => { if ( containerRef.current && !containerRef.current.contains(event.target as Node) ) { setIsOpen(false); } }; document.addEventListener("pointerdown", handleOutside); return () => { document.removeEventListener("pointerdown", handleOutside); }; }, [isOpen]); const handleSelect = (code: Language) => { setLanguage(code); setIsOpen(false); }; const toggle = () => setIsOpen((prev) => !prev); const containerWidth = useMemo(() => { const BUTTON_SIZE = 56; const GAP = 8; const backWidth = onBack ? BUTTON_SIZE + GAP : 0; const toggleWidth = BUTTON_SIZE; const collapsedWidth = backWidth + toggleWidth + BUTTON_SIZE; const expandedWidth = backWidth + toggleWidth + LANGUAGES.length * BUTTON_SIZE + (LANGUAGES.length - 1) * GAP; return isOpen ? expandedWidth : collapsedWidth; }, [isOpen, onBack]); return (
{isOpen ? ( LANGUAGES.map((lang) => ( )) ) : (
)}
); } ); export default LanguageSelector;