import { useEffect, useMemo, useState } from 'react'; import { Outlet, useLocation, useNavigate } from 'react-router-dom'; import { Avatar, Breadcrumb, Drawer, Dropdown, Layout } from 'antd'; import type { MenuProps } from 'antd'; import { LockOutlined, LogoutOutlined, MenuFoldOutlined, MenuUnfoldOutlined, RightOutlined, UserOutlined, } from '@ant-design/icons'; import SidebarMenu from './SidebarMenu'; import PlatformSelector from './PlatformSelector'; import { getBreadcrumbItems } from './menuConfig'; import { useSession } from '@/services/session'; import './MainLayout.css'; const { Header, Sider, Content } = Layout; const MainLayout = () => { const [collapsed, setCollapsed] = useState(false); const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const [isMobile, setIsMobile] = useState(false); const [loggingOut, setLoggingOut] = useState(false); const location = useLocation(); const navigate = useNavigate(); const { session, logout } = useSession(); const breadcrumbItems = useMemo( () => getBreadcrumbItems(location.pathname).map((crumb) => ({ title: ( {crumb.icon} {crumb.label} ), })), [location.pathname] ); const userDisplayName = session ? (session.user.display_name ?? session.user.email) : ''; const userInitial = userDisplayName.charAt(0).toUpperCase(); const handleLogout = async () => { setLoggingOut(true); try { await logout(); } finally { setLoggingOut(false); navigate('/login', { replace: true }); } }; const handleUserMenuClick: MenuProps['onClick'] = ({ key }) => { if (key === 'profile') { navigate('/settings/profile'); } else if (key === 'password') { navigate('/settings/password'); } else if (key === 'logout') { void handleLogout(); } }; const userMenuItems: MenuProps['items'] = [ { key: 'profile', icon: , label: '修改资料' }, { key: 'password', icon: , label: '修改密码' }, { type: 'divider' }, { key: 'logout', icon: , label: loggingOut ? '退出中…' : '退出登录', disabled: loggingOut, }, ]; useEffect(() => { const checkMobile = () => { setIsMobile(window.innerWidth < 768); if (window.innerWidth >= 768) setMobileMenuOpen(false); }; checkMobile(); window.addEventListener('resize', checkMobile); return () => window.removeEventListener('resize', checkMobile); }, []); return ( {!isMobile && ( Atlas Kit A 商品工作台 )} {isMobile && ( setMobileMenuOpen(false)} open={mobileMenuOpen} styles={{ body: { padding: 0, background: 'var(--sider-bg)' } }} width={200} > setMobileMenuOpen(false)} /> )} {isMobile && ( setMobileMenuOpen(true)} /> )} {!isMobile && ( setCollapsed(!collapsed)} > {collapsed ? : } )} } items={breadcrumbItems} /> {session && ( {userInitial} {userDisplayName} )} ); }; export default MainLayout;