import { useState, useEffect, useMemo } from 'react'; import { Outlet, useLocation, } from 'react-router'; import { Bell, Menu, User, ChevronDown } from 'lucide-react'; import { useAuth } from '../hooks/AuthProvider'; import { useMenu, type MenuItem } from '../menu'; import { getGlobalConfig } from '@/client/utils/utils'; import { Button } from '@/client/components/ui/button'; import { Input } from '@/client/components/ui/input'; import { Avatar, AvatarFallback, AvatarImage } from '@/client/components/ui/avatar'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from '@/client/components/ui/dropdown-menu'; import { Sheet, SheetContent, SheetHeader, SheetTitle } from '@/client/components/ui/sheet'; import { ScrollArea } from '@/client/components/ui/scroll-area'; import { cn } from '@/client/lib/utils'; import { Badge } from '@/client/components/ui/badge'; /** * 主布局组件 * 包含侧边栏、顶部导航和内容区域 */ export const MainLayout = () => { const { user } = useAuth(); const [showBackTop, setShowBackTop] = useState(false); const location = useLocation(); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); // 使用菜单hook const { menuItems, userMenuItems, collapsed, setCollapsed, handleMenuClick } = useMenu(); // 获取当前选中的菜单项 const selectedKey = useMemo(() => { const findSelectedKey = (items: MenuItem[]): string | null => { for (const item of items) { if (!item) continue; if (item.path === location.pathname) return item.key || null; if (item.children) { const childKey = findSelectedKey(item.children); if (childKey) return childKey; } } return null; }; return findSelectedKey(menuItems) || ''; }, [location.pathname, menuItems]); // 检测滚动位置,控制回到顶部按钮显示 useEffect(() => { const handleScroll = () => { setShowBackTop(window.pageYOffset > 300); }; window.addEventListener('scroll', handleScroll); return () => window.removeEventListener('scroll', handleScroll); }, []); // 回到顶部 const scrollToTop = () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }; // 应用名称 - 从CONFIG中获取或使用默认值 const appName = getGlobalConfig('APP_NAME') || '应用Starter'; // 侧边栏内容 const SidebarContent = () => (
{user?.nickname || user?.username}
{user?.email}