// C:\Development\Damjan Savic\Portfolio\src\components\LanguageSwitcher.tsx import React, { useRef, useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { Globe } from 'lucide-react'; import { motion, AnimatePresence } from 'framer-motion'; const LanguageSwitcher: React.FC = () => { const { i18n } = useTranslation(); const [isOpen, setIsOpen] = useState(false); const [isMobile, setIsMobile] = useState(false); 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 === i18n.language)?.name || 'Language'; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Escape') { setIsOpen(false); } }; const handleClickOutside = (e: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) { setIsOpen(false); } }; useEffect(() => { // Check if mobile on mount and resize 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 (
setIsOpen(!isOpen)} aria-expanded={isOpen} aria-haspopup="listbox" aria-label="Select language" > {isOpen && (
{languages.map((lang) => ( { i18n.changeLanguage(lang.code); setIsOpen(false); }} role="option" aria-selected={i18n.language === lang.code} > {lang.name} ))}
)}
); }; export default LanguageSwitcher;