import { useState } from 'react'; import { ProLayout, type MenuDataItem } from '@ant-design/pro-components'; import { Badge, Button, DatePicker, Dropdown, Space } from 'antd'; import { Outlet, useLocation, useNavigate } from 'react-router-dom'; import { useQuery } from '@tanstack/react-query'; import { IconBell, IconLogout, IconUser } from '@tabler/icons-react'; import dayjs from 'dayjs'; import { menuApi, type MenuResp } from '@/api/menu'; import { authApi } from '@/api/auth'; import { useAuthStore } from '@/stores/auth'; import { getMenuIcon } from '@/components/common/MenuIcon'; /** API 메뉴 트리 → ProLayout MenuDataItem */ function toProMenu(menus: MenuResp[]): MenuDataItem[] { return menus.map((m) => { const item: MenuDataItem = { name: m.menuName, path: m.menuPath ?? `/_grp/${m.menuCode}`, key: m.menuCode, icon: getMenuIcon(m.menuCode, m.menuPath), }; if (m.children?.length) item.children = toProMenu(m.children); return item; }); } export default function MainLayout() { const navigate = useNavigate(); const location = useLocation(); const auth = useAuthStore(); const [settleMonth, setSettleMonth] = useState(dayjs()); const { data: menus = [] } = useQuery({ queryKey: ['menu', 'my'], queryFn: menuApi.myMenus, }); const handleLogout = async () => { try { await authApi.logout(); } catch { /* ignore */ } localStorage.removeItem('accessToken'); localStorage.removeItem('refreshToken'); auth.clear(); navigate('/login'); }; return ( toProMenu(menus)} location={{ pathname: location.pathname }} menuItemRender={(item, dom) => (
item.path && !item.path.startsWith('/_grp/') && navigate(item.path)}> {dom}
)} breadcrumbRender={(routers = []) => routers} onMenuHeaderClick={() => navigate('/')} token={{ sider: { colorMenuBackground: '#ffffff', colorTextMenuSelected: '#185FA5', colorBgMenuItemSelected: '#E6F1FB', colorTextMenuItemHover: '#1677FF', }, header: { colorBgHeader: '#ffffff', colorHeaderTitle: '#185FA5', heightLayoutHeader: 56, }, bgLayout: '#f5f7fa', }} actionsRender={() => [ 정산월 d && setSettleMonth(d)} allowClear={false} format="YYYY-MM" size="small" style={{ width: 100 }} /> ,