"use client" import { Home, Menu as MenuIcon, User, UserCheck, UserRoundPlus, X, } from "lucide-react" import { useEffect, useRef, useState } from "react" import NavLink from "@frontend/components/navigation/nav-link" import { cn } from "@frontend/lib/utils" import { t_languageSwitcherTitle, t_navHome, t_navLogin, t_navMainMenu, t_navMyProfile, t_navRegistration, } from "@shared/i18n/messages/t-navigation" import LanguageSwitcher from "@frontend/components/navigation/language-switcher" import useLocale from "@frontend/hooks/use-locale" import MyButton from "@frontend/components/user-input/my-button" import LogoutButton from "@frontend/components/auth/logout-button" import { useIsUserAuthenticated } from "@frontend/stores/user-store" import useRouteName from "@frontend/hooks/use-route-name" export default function Menu() { // Store const isAuthenticated = useIsUserAuthenticated() // Local state const [showMenu, setShowMenu] = useState(false) // Refs const menuRef = useRef(null) const triggerRef = useRef(null) // Utils const locale = useLocale() const routeName = useRouteName() useEffect(() => { const isTouchDevice = "ontouchstart" in window || navigator.maxTouchPoints > 0 const eventType = isTouchDevice ? "touchstart" : "mousedown" document.addEventListener(eventType, handleClickOutside) document.addEventListener("keydown", handleKeyPress) if (showMenu) { document.body.classList.add("overflow-hidden") } else { document.body.classList.remove("overflow-hidden") } return () => { document.removeEventListener(eventType, handleClickOutside) document.removeEventListener("keydown", handleKeyPress) document.body.classList.remove("overflow-hidden") } }, [showMenu]) return ( <>
{t_navMainMenu(locale)}
toggleMenu()} variant="icon" size="icon" >
setShowMenu(false)} > {t_navHome(locale)} {!isAuthenticated ? ( <> setShowMenu(false)} > {t_navLogin(locale)} setShowMenu(false)} > {t_navRegistration(locale)} ) : ( <> setShowMenu(false)} > {t_navMyProfile(locale)} )}
{t_languageSwitcherTitle(locale)}
toggleMenu()} variant="icon" size="icon" data-testid="menu-open" className="mr-[-8px]" > ) function toggleMenu() { setShowMenu(!showMenu) } function handleClickOutside(event: MouseEvent | TouchEvent) { const target = event.target as Node if ( menuRef.current && !menuRef.current.contains(target) && triggerRef.current && !triggerRef.current.contains(target) ) { setShowMenu(false) } } function handleKeyPress(event: KeyboardEvent) { if (event.key === "Escape") { setShowMenu(false) } } }