import { Menu, User } from "lucide-react" import { useEffect, useRef, useState, useSyncExternalStore } from "react" import { NavLink, useNavigate } from "react-router-dom" import { AUTH_EVENT, isAuthed } from "@/api/token" import ProductDropdown from "@/components/productDropdown" import ProfileOrLogin from "@/components/profileOrLogin" import Wrap from "@/components/wrap" import { useMediaQuery } from "@/lib/hooks/useMediaQuery" import { cn } from "@/lib/utils" import MobileMenu from "./_components/header/menu-mobile" export default function Header() { const navigate = useNavigate() const isWideDesktop = useMediaQuery("(min-width: 80rem)") const scroll = useSyncExternalStore( callback => { window.addEventListener("scroll", callback) return () => { window.removeEventListener("scroll", callback) } }, () => window.scrollY > 48, () => false, ) // 菜单状态 const [openMenu, setOpenMenu] = useState(false) const handleEnter = () => setOpenMenu(true) const handleLeave = () => setOpenMenu(false) // 移动端状态 const [mobileMenu, setMobileMenu] = useState(false) const [authed, setAuthed] = useState(isAuthed) useEffect(() => { const update = () => setAuthed(isAuthed()) window.addEventListener("focus", update) window.addEventListener(AUTH_EVENT, update) return () => { window.removeEventListener("focus", update) window.removeEventListener(AUTH_EVENT, update) } }, []) return (
{/* 桌面端登录/注册 */}
{/* 移动端:未登录显示用户图标+汉堡菜单,已登录仅显示汉堡菜单 */}
{!authed && ( )}
{/* 移动端左侧菜单栏 */} {mobileMenu && ( setMobileMenu(false)} /> )}
) } const NavItem = ({ to, children, }: { to: string children: React.ReactNode }) => ( {children} ) const MenuItem = ({ text, children, isOpen, onMouseEnter, onMouseLeave, }: { text: string children: React.ReactNode isOpen: boolean onMouseEnter: () => void onMouseLeave: () => void }) => { const timeoutRef = useRef(null) const handleMouseEnter = () => { if (timeoutRef.current) { clearTimeout(timeoutRef.current) timeoutRef.current = null } onMouseEnter() } const handleMouseLeave = () => { timeoutRef.current = setTimeout(() => { onMouseLeave() }, 150) } return (
  • {children}
  • ) }