'use client'; import { useState, useRef, useEffect } from 'react'; import { useLocale, useTranslations } from 'next-intl'; import { Link } from '../../i18n/routing'; import { GlobeAltIcon, ChevronDownIcon } from '@heroicons/react/24/outline'; type Locale = 'en' | 'de' | 'ru' | 'ka' | 'ar'; interface LanguageOption { code: Locale; name: string; } export function LanguageToggle() { const locale = useLocale() as Locale; const t = useTranslations('ui'); const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); const locales: Locale[] = ['en', 'de', 'ru', 'ka', 'ar']; const languageOptions: LanguageOption[] = locales.map((code) => ({ code, name: t(`languages.${code}`) })); const currentLanguage = languageOptions.find(lang => lang.code === locale) || languageOptions[0]; useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsOpen(false); } }; if (isOpen) { document.addEventListener('mousedown', handleClickOutside); } return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [isOpen]); useEffect(() => { const handleEscape = (event: KeyboardEvent) => { if (event.key === 'Escape') { setIsOpen(false); } }; if (isOpen) { document.addEventListener('keydown', handleEscape); } return () => { document.removeEventListener('keydown', handleEscape); }; }, [isOpen]); const toggleDropdown = () => { setIsOpen(!isOpen); }; return (
{isOpen && (
{languageOptions.map((option) => ( setIsOpen(false)} className={`w-full flex items-center gap-3 px-3 py-2 text-sm text-left hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors ${ locale === option.code ? 'bg-gray-100 dark:bg-gray-700 text-blue-600 dark:text-blue-400' : 'text-gray-700 dark:text-gray-300' }`} role="menuitem" > {option.name} {locale === option.code && (
)} ))}
)}
); }