import { useState, useMemo } from 'react'; import { useNavigate, useLocation } from 'react-router'; import { Layout, Breadcrumb, Dropdown, Avatar, Switch, theme } from 'antd'; import type { MenuProps } from 'antd'; import { MenuFoldOutlined, MenuUnfoldOutlined, UserOutlined, LogoutOutlined, SettingOutlined, SunOutlined, MoonOutlined, GlobalOutlined, } from '@ant-design/icons'; import StyleSettings from './StyleSettings'; import { useTranslation } from 'react-i18next'; import { useAppStore } from '@/stores/useAppStore'; import { useAuthStore } from '@/stores/useAuthStore'; import { findBreadcrumb } from '@/router/dynamicRoutes'; const Header: React.FC = () => { const { t } = useTranslation('header'); const { token: themeToken } = theme.useToken(); const collapsed = useAppStore((s) => s.collapsed); const toggleCollapsed = useAppStore((s) => s.toggleCollapsed); const darkMode = useAppStore((s) => s.darkMode); const toggleDarkMode = useAppStore((s) => s.toggleDarkMode); const setLanguage = useAppStore((s) => s.setLanguage); const userInfo = useAuthStore((s) => s.userInfo); const menus = useAuthStore((s) => s.menus); const logout = useAuthStore((s) => s.logout); const navigate = useNavigate(); const location = useLocation(); const [styleOpen, setStyleOpen] = useState(false); const breadcrumbItems = useMemo( () => findBreadcrumb(location.pathname, menus), [location.pathname, menus], ); const langItems: MenuProps['items'] = [ { key: 'zh-CN', label: t('chinese'), onClick: () => setLanguage('zh-CN'), }, { key: 'en-US', label: t('english'), onClick: () => setLanguage('en-US'), }, ]; const userMenuItems: MenuProps['items'] = [ { key: 'profile', icon: , label: t('profile') }, { key: 'style', icon: , label: t('styleSettings') }, { type: 'divider' }, { key: 'logout', icon: , label: t('logout'), danger: true, }, ]; const handleMenuClick: MenuProps['onClick'] = async ({ key }) => { if (key === 'logout') { await logout(); navigate('/login', { replace: true }); } else if (key === 'style') { setStyleOpen(true); } else if (key === 'profile') { navigate('/profile'); } }; return ( {collapsed ? : } {t('language_indicator')} } unCheckedChildren={} checked={darkMode} onChange={toggleDarkMode} /> } src={userInfo?.avatar || undefined} size="small" /> {userInfo?.nickname || userInfo?.username} setStyleOpen(false)} /> ); }; export default Header;