'use client' import {createContext, ReactNode, useCallback, useContext, useEffect, useMemo, useRef, useState} from 'react' import Link from 'next/link' import Image from 'next/image' import {LinkItem, MenuItem} from './navs' import SolutionMenu from './solution' import ProductMenu from './product' import HelpMenu from './help' import Wrap from '@/components/wrap' import logo from '@/assets/logo.webp' import {Button} from '@/components/ui/button' import {useProfileStore} from '@/components/providers/StoreProvider' import UserCenter from '@/components/composites/user-center' export const HeaderContext = createContext<{ setMenu: (value: boolean) => void isMobile: boolean } | null>(null) export type ProviderProps = {} export default function Provider(props: ProviderProps) { // ====================== // 滚动条状态 // ====================== const [scroll, setScroll] = useState(false) // Changed to false for client-side rendering const handleScroll = useCallback(() => { setScroll(window.scrollY > 48) }, []) useEffect(() => { // Initialize scroll state on client setScroll(window.scrollY > 48) window.addEventListener('scroll', handleScroll) return () => { window.removeEventListener('scroll', handleScroll) } }, [handleScroll]) // ====================== // 菜单状态 // ====================== const [menu, setMenu] = useState(false) const [page, setPage] = useState(0) const menuRef = useRef(null) // 屏幕1024时 const [isMobile, setIsMobile] = useState(false) // 点击外部关闭菜单 useEffect(() => { const handleClickOutside = (e: MouseEvent | TouchEvent) => { if (menuRef.current && !menuRef.current.contains(e.target as Node)) { const target = e.target as HTMLElement // 排除所有交互元素 if (!target.closest('a, button, [role="button"], [role="tab"]')) { setMenu(false) } } } document.addEventListener('mousedown', handleClickOutside) document.addEventListener('touchstart', handleClickOutside) return () => { document.removeEventListener('mousedown', handleClickOutside) document.removeEventListener('touchstart', handleClickOutside) } }, []) const handleMenuEnter = (pageIndex: number) => { if (isMobile) { // 移动端: 点击切换当前菜单 if (menu && page === pageIndex) { // 添加关闭动画延迟 setTimeout(() => setMenu(false), 100) } else { setPage(pageIndex) // 先设置page,再设置menu为true setTimeout(() => setMenu(true), 0) } } else { // 桌面端: 悬停打开 setPage(pageIndex) setMenu(true) } } const handleMenuLeave = useCallback(() => { if (!isMobile) { // 桌面端: 添加延迟关闭以避免意外关闭 setMenu(false) } }, [isMobile]) const pages = useMemo(() => [ , , , ], []) // ====================== // 用户信息 // ====================== const profile = useProfileStore(store => store.profile) // ====================== // render // ====================== // 屏幕1024时响应式处理 useEffect(() => { const checkMobile = () => { const mobile = window.innerWidth <= 1024 setIsMobile(mobile) // 移除自动关闭菜单的逻辑,让交互逻辑处理菜单状态 } checkMobile() window.addEventListener('resize', checkMobile) return () => window.removeEventListener('resize', checkMobile) }, []) return (
{/* logo */} logo {/* 菜单 */}
{/* 登录 */}
{profile == undefined ? ( <> 登录 注册 ) : ( // // // ) }
{/* 下拉菜单 */}
!isMobile && setMenu(true)} onPointerLeave={() => !isMobile && setMenu(false)} > {pages[page]}
) }