'use client'; import { useState, useEffect, useCallback, useMemo } from 'react'; import Link from 'next/link'; import { usePathname, useRouter } from 'next/navigation'; import { ChevronDown, Menu, X, Globe, Phone, MessageCircle, Send, Search } from 'lucide-react'; import Logo from './Logo'; import { contactConfig } from '../../lib/useContact'; import { homeTranslations } from '../../lib/home-translations'; interface HeaderProps { language: string; setLanguage: (lang: string) => void; translations: any; locale?: string; } interface NavigationItem { path: string; label: string; hasSubmenu?: boolean; submenu?: { path: string; label: string; description?: string; }[]; } export default function Header({ language, setLanguage, translations, locale }: HeaderProps) { const pathname = usePathname(); const router = useRouter(); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const [isLanguageDropdownOpen, setIsLanguageDropdownOpen] = useState(false); const [activeSubmenu, setActiveSubmenu] = useState(null); const [mounted, setMounted] = useState(false); const [isScrolled, setIsScrolled] = useState(false); // 处理滚动效果 useEffect(() => { // 确保在客户端执行 if (typeof window === 'undefined') return; const handleScroll = () => { setIsScrolled(window.scrollY > 10); }; window.addEventListener('scroll', handleScroll); return () => window.removeEventListener('scroll', handleScroll); }, []); useEffect(() => { setMounted(true); }, []); // 获取当前locale const currentLocale = useMemo(() => { if (!mounted) return locale || 'zh-CN'; return locale || (pathname.startsWith('/en') ? 'en' : pathname.startsWith('/zh-TW') ? 'zh-TW' : 'zh-CN'); }, [mounted, locale, pathname]); // 同步语言状态 useEffect(() => { if (mounted && language !== currentLocale) { setLanguage(currentLocale); } }, [mounted, currentLocale, language, setLanguage]); // 获取当前翻译 const t = useMemo(() => { return translations || homeTranslations[currentLocale] || homeTranslations['zh-CN']; }, [translations, currentLocale]); // 获取路径(不含locale前缀) const pathWithoutLocale = useMemo(() => { if (!mounted) return '/'; return pathname.replace(/^\/(en|zh-TW|zh-CN)/, '') || '/'; }, [mounted, pathname]); // 导航项配置 const navigationItems: NavigationItem[] = useMemo(() => [ { path: '/', label: t.nav?.home || '首页' }, { path: '/products', label: t.nav?.products || '产品与服务', hasSubmenu: true, submenu: [ { path: '/products#cloud-server', label: '云服务器', description: '弹性可扩展的计算服务' }, { path: '/products#storage', label: '存储服务', description: '安全可靠的数据存储' }, { path: '/products#database', label: '数据库服务', description: '高性能托管数据库' }, { path: '/products#network', label: '网络服务', description: '全球网络加速服务' } ] }, { path: '/news', label: t.nav?.news || '新闻资讯' }, { path: '/support', label: t.nav?.support || '客户支持' }, { path: '/about', label: t.nav?.about || '关于我们' } ], [t.nav]); // 语言选项 const languageOptions = useMemo(() => [ { code: 'zh-CN', label: '简体中文', flag: '🇨🇳' }, { code: 'zh-TW', label: '繁體中文', flag: '🇹🇼' }, { code: 'en', label: 'English', flag: '🇺🇸' } ], []); // 检查是否为活跃路径 const isActive = useCallback((path: string) => { if (path === '/') return pathWithoutLocale === '/'; return pathWithoutLocale.startsWith(path); }, [pathWithoutLocale]); // 生成本地化路径 const getLocalizedPath = useCallback((path: string, targetLocale: string = currentLocale) => { return `/${targetLocale}${path}`; }, [currentLocale]); // 处理语言切换 const handleLanguageChange = useCallback((newLanguage: string) => { if (!mounted) return; setLanguage(newLanguage); setIsLanguageDropdownOpen(false); const newPath = getLocalizedPath(pathWithoutLocale, newLanguage); router.push(newPath); }, [mounted, setLanguage, pathWithoutLocale, router, getLocalizedPath]); // 切换移动菜单 const toggleMobileMenu = useCallback(() => { setIsMobileMenuOpen(prev => !prev); }, []); // 处理子菜单 const handleSubmenuEnter = useCallback((path: string) => { setActiveSubmenu(path); }, []); const handleSubmenuLeave = useCallback(() => { setActiveSubmenu(null); }, []); // 关闭所有菜单 const closeAllMenus = useCallback(() => { setIsMobileMenuOpen(false); setIsLanguageDropdownOpen(false); setActiveSubmenu(null); }, []); // 点击外部关闭菜单 useEffect(() => { const handleClickOutside = (event: MouseEvent) => { const target = event.target as Element; if (!target.closest('.header-menu')) { closeAllMenus(); } }; document.addEventListener('click', handleClickOutside); return () => document.removeEventListener('click', handleClickOutside); }, [closeAllMenus]); // 渲染桌面导航项 const renderDesktopNavItem = (item: NavigationItem) => { const isActiveItem = isActive(item.path); return (
item.hasSubmenu && handleSubmenuEnter(item.path)} onMouseLeave={() => item.hasSubmenu && handleSubmenuLeave()} > {item.label} {item.hasSubmenu && ( )} {isActiveItem && ( )} {/* 子菜单 */} {item.hasSubmenu && item.submenu && (
{item.submenu.map((subItem) => (
{subItem.label}
{subItem.description && (
{subItem.description}
)} ))}
)}
); }; // 渲染移动端导航项 const renderMobileNavItem = (item: NavigationItem) => { const isActiveItem = isActive(item.path); return (
{item.label} {isActiveItem && } {/* 移动端子菜单 */} {item.hasSubmenu && item.submenu && (
{item.submenu.map((subItem) => ( {subItem.label} ))}
)}
); }; return (
{/* Logo */} {/* 桌面端导航 */} {/* 桌面端右侧操作区 */}
{/* 联系方式 */} {/* 语言选择器 */}
{isLanguageDropdownOpen && (
{languageOptions.map((option) => ( ))}
)}
{/* 联系我们按钮 */} {t.nav?.contact || '联系我们'}
{/* 移动端菜单按钮 */}
{/* 移动端语言选择 */}
{isLanguageDropdownOpen && (
{languageOptions.map((option) => ( ))}
)}
{/* 汉堡菜单按钮 */}
{/* 移动端菜单 */}
{/* 移动端导航项 */}
{navigationItems.map(renderMobileNavItem)}
{/* 移动端联系我们按钮 */}
{t.nav?.contact || '联系我们'}
{/* 移动端联系方式 */}
); }