'use client'; import { useRef, useState, useEffect } from 'react'; import { useRouter, usePathname } from 'next/navigation'; import { useLocale } from 'next-intl'; import { Globe } from 'lucide-react'; const LanguageSwitcher = () => { const locale = useLocale(); const router = useRouter(); const pathname = usePathname(); const [isOpen, setIsOpen] = useState(false); const [isMobile, setIsMobile] = useState(false); const [focusedIndex, setFocusedIndex] = useState(-1); const dropdownRef = useRef(null); const languages = [ { code: 'en', name: 'English' }, { code: 'de', name: 'Deutsch' }, { code: 'sr', name: 'Srpski' }, ]; const currentLanguage = languages.find(lang => lang.code === locale)?.name || 'Language'; const handleLanguageChange = (newLocale: string) => { // Replace the locale in the pathname const pathWithoutLocale = pathname.replace(/^\/(de|en|sr)/, ''); const newPath = `/${newLocale}${pathWithoutLocale || ''}`; router.push(newPath); setIsOpen(false); }; const handleKeyDown = (e: React.KeyboardEvent) => { if (!isOpen) return; switch (e.key) { case 'Escape': setIsOpen(false); setFocusedIndex(-1); break; case 'ArrowDown': e.preventDefault(); setFocusedIndex(prev => (prev + 1) % languages.length); break; case 'ArrowUp': e.preventDefault(); setFocusedIndex(prev => (prev - 1 + languages.length) % languages.length); break; case 'Enter': e.preventDefault(); if (focusedIndex >= 0) { handleLanguageChange(languages[focusedIndex].code); setFocusedIndex(-1); } break; } }; const handleClickOutside = (e: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) { setIsOpen(false); } }; useEffect(() => { const checkMobile = () => { setIsMobile(window.innerWidth < 768); }; checkMobile(); window.addEventListener('resize', checkMobile); document.addEventListener('mousedown', handleClickOutside); return () => { window.removeEventListener('resize', checkMobile); document.removeEventListener('mousedown', handleClickOutside); }; }, []); return (
= 0 ? `lang-option-${languages[focusedIndex].code}` : undefined} onKeyDown={handleKeyDown} >
{languages.map((lang, index) => ( ))}
); }; export default LanguageSwitcher;