import React, {useEffect, useState} from "react"; import {Button, ConfigProvider, Layout, Menu, type MenuProps, type ThemeConfig} from "antd"; import useGlobalStore from "@/stores/global"; import HeaderRightRender from "@/layout/HeaderRightRender"; import IconFont from "@/components/IconFont"; import {useTranslation} from "react-i18next"; import MenuRender from "@/layout/MenuRender.tsx"; import {MenuFoldOutlined, MenuUnfoldOutlined} from "@ant-design/icons"; import BreadcrumbRender from "@/layout/BreadcrumbRender.tsx"; import {useLayoutContext} from "@/layout/LayoutContext"; import useMobile from "@/hooks/useMobile"; import {useNavigate} from "react-router"; import {findMenuByKey} from "@/layout/utils.ts"; const {Header} = Layout; const HeaderRender: React.FC = () => { const {t} = useTranslation(); const isMobile = useMobile(); const navigate = useNavigate(); const logo = useGlobalStore(state => state.logo); const title = useGlobalStore(state => state.title); const layout = useGlobalStore(state => state.layout); const themeConfig = useGlobalStore(state => state.themeConfig); const { menus, parentKey, collapsed, setCollapsed, setParentKey, setSelectKey } = useLayoutContext(); const theme: ThemeConfig = { token: { colorTextBase: themeConfig.headerColor }, components: { Menu: { activeBarBorderWidth: 0, itemBg: 'transparent', } } } const [mixMenu, setMixMenu] = useState([]); useEffect(() => { setMixMenu(menus.filter(item => item.hidden).map(item => ({ label: item.local ? t(item.local) : item.name, icon: item.icon ? : false, key: item.key!, }))); }, [menus, t]); const onMenuChange = (key: string) => { const menu = findMenuByKey(menus, key); if(!menu || !menu.key) return; setParentKey(menu.key); if(menu.type === 'menu') { return; } setSelectKey([menu.key]); if(menu.type === 'route' && menu.link) { window.open(menu.path, '_blank'); return; } if(menu.type === 'route' && menu.path) { navigate(menu.path); return; } } return ( { isMobile ? (
logo {title}
) : (
logo {title} {/* 侧边栏开关 */} {layout !== 'top' && ( )} {/* 面包屑 */} {['columns', 'side'].includes(layout) && }
{/* 顶部菜单 */} { layout == 'top' && } {/* 混合布局模式下的顶部菜单 */} { layout == 'mix' && ( onMenuChange(info.key)} selectedKeys={[parentKey!]} /> )}
)}
) } export default HeaderRender;