import React, { useEffect, useMemo, useState } from "react" import { useNavigate } from "react-router" import { App, Avatar, Breadcrumb, Dropdown, Layout, Menu, type MenuProps, message, Space, } from "antd" import { DownOutlined } from "@ant-design/icons" import { ApplicationLogo } from "@/components/icon" import { useAppDispatch, useAppSelector } from "@/store" import { useAntBreadcrumbs } from "@/hooks" import { logout } from "@/store/auth-slice" import { MenuApi } from "@/api" import axios, { type AxiosError } from "axios" import type { TreeNode } from "@/types/tree" import type { MenuItem } from "@/types/entity" import { AppUtils } from "@/utils" import type { GeneralErrorResponse } from "@/types/web/response" const { Header, Footer, Sider, Content } = Layout type AntMenuItem = Required["items"][number] function transformMenuData(nodes: TreeNode[]): AntMenuItem[] { if (!nodes || nodes.length === 0) { return [] } return nodes .sort((a, b) => a.item.sort - b.item.sort) .map((node) => { const { item, children } = node const hasChildren = children && children.length > 0 const menuItem: AntMenuItem = { key: item.code, label: item.name, } if (hasChildren) { // Append children return { ...menuItem, children: transformMenuData(children) } } return menuItem }) } export default function DashboardLayout({ children }: { children: React.ReactNode }) { const { modal, message } = App.useApp() const user = useAppSelector((store) => store.auth.user!) const dispatch = useAppDispatch() const breadcrumbItems = useAntBreadcrumbs() const navigate = useNavigate() const onLogout = ({ key }: { key: string }) => { if (key == "logout") { modal.confirm({ title: "确定要注销吗?", okText: "确定", cancelText: "取消", onOk: () => { dispatch(logout()) void navigate("/login") }, maskClosable: false, keyboard: false, }) } } const [menuItems, setMenuItems] = useState([]) useEffect(() => { MenuApi.fetchMenuTree() .then((response) => { setMenuItems(transformMenuData(response)) }) .catch((error: unknown) => { console.log(error) const errorMessage = axios.isAxiosError(error) && error.response?.data.message ? error.response?.data.message : "无法读取菜单数据" void message.error({ content: errorMessage, }) }) }, []) const dropDownMenuItems: MenuProps["items"] = [ { key: "logout", danger: true, label: "注销", }, ] const appTitle = useMemo(() => AppUtils.getAppTitle(), []) return (
{appTitle}
{user.fullName}
{ console.log(`key = ${key}`) switch (key) { case "user-mgmt": void navigate("/users") break case "role-mgmt": void navigate("/roles") break case "menu-mgmt": void navigate("/menus") break } }} /> {children} ) }