import React, { useEffect, useState } from 'react'; import LanguageSwitcher from '../components/LanguageSwitcher'; import Icon from '../../shared/components/icon'; import { NavbarProps, NavItem } from '../navbar/types'; import { getTranslations } from '../../shared/utils/localization-util'; const Navbar: React.FC = ({ currentPath, logo, onLogoClick, topLinks, items, language, languages, onLanguageChange, onSearch, member, onLogin, onLogout }) => { const [menuOpen, setMenuOpen] = useState(false); const [query, setQuery] = useState(''); const [activeMobileGroup, setActiveMobileGroup] = useState(); const translations = getTranslations(language.code ?? 'en-GB'); const normalizePath = (path: string) => path.replace(/\/+$/, ''); useEffect(() => { const onKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') { setMenuOpen(false); setActiveMobileGroup(''); } }; window.addEventListener('keydown', onKeyDown); return () => window.removeEventListener('keydown', onKeyDown); }, []); // Optional: when closing the burger menu, also close any open mobile dropdown group useEffect(() => { if (!menuOpen) setActiveMobileGroup(''); }, [menuOpen]); const onSearchSubmit = (e: React.FormEvent) => { e.preventDefault(); const q = query.trim(); if (!q) return; console.log('Search:', q); setMenuOpen(false); setActiveMobileGroup(''); onSearch(q); }; const toggleMobileGroup = (label: string) => { setActiveMobileGroup((current) => (current === label ? '' : label)); }; const isActive = (item: NavItem) => { return currentPath && normalizePath(currentPath) === normalizePath('/' + (item.href ?? '')); }; const renderNavItem = (item: NavItem) => { const hasDropdown = item.items?.length || item.categories?.length; if (!hasDropdown) { return ( {item.label} ); } return (
{item.label} {item.categories && (!item.items || item.items.length === 0) && } {item.items && (!item.categories || item.categories.length === 0) && (
{item.items.map((link) => ( ))}
)}
); }; const CategorizedDropdown: React.FC<{ item: NavItem }> = ({ item }) => { const [activeIndex, setActiveIndex] = useState(0); if (!item.categories) return null; const activeCategory = item.categories[activeIndex]; return (
{item.categories.map((cat, index) => ( ))}
{activeCategory.items.map((link) => ( ))}
); }; const renderMobileNavItem = (item: NavItem) => { const hasCategories = !!item.categories?.length; const hasItems = !!item.items?.length; const hasDropdown = hasCategories || hasItems; const isOpen = activeMobileGroup === item.label; if (!hasDropdown) { return ( {item.label} ); } return (
{ e.preventDefault(); toggleMobileGroup(item.label); }}> {item.label} {hasCategories && isOpen && (
{item.categories!.map((category, index) => ( ))}
{item.categories![0].items.map((link) => ( ))}
)} {hasItems && !hasCategories && isOpen && (
{item.items!.map((link) => (
{link.label}
))}
)}
); }; const handleLogout = (event: React.MouseEvent): void => { event.preventDefault(); if (onLogout) { onLogout(); } }; const handleLogin = (event: React.MouseEvent): void => { event.preventDefault(); if (onLogin) { onLogin(); } }; return ( <>
{member && ( {translations.LOGIN.WELCOME_X} {member.name} )} {member ? ( <> {onLogout && ( {translations.LOGIN.LOGOUT} )} ) : ( <> {onLogin && ( {translations.LOGIN.LOGIN} )} )} { console.log('Selected language:', lang); onLanguageChange(lang); }} /> {topLinks.map((link, index) => ( {link.label} ))}
); }; export default Navbar;