import { useAuth } from "@/hooks/useAuth";
import { Avatar, AvatarFallback } from "@/components/ui/avatar";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import {
Sidebar,
SidebarContent,
SidebarFooter,
SidebarHeader,
SidebarInset,
SidebarMenu,
SidebarMenuButton,
SidebarMenuItem,
SidebarProvider,
SidebarTrigger,
useSidebar,
} from "@/components/ui/sidebar";
import { useIsMobile } from "@/hooks/useMobile";
import { LayoutDashboard, LogOut, PanelLeft, Users, Heart, ShieldCheck, Loader2, Settings, Home } from "lucide-react";
import { CSSProperties, useCallback, useEffect, useRef, useState } from "react";
import { useLocation } from "wouter";
import { DashboardLayoutSkeleton } from './DashboardLayoutSkeleton';
import { Button } from "./ui/button";
import { toast } from "sonner";
import { getErrorCopy } from "@/lib/i18n/errorMessages";
const menuItems = [
{ icon: Home, label: "返回首页", path: "/" },
{ icon: LayoutDashboard, label: "个人中心", path: "/dashboard" },
{ icon: Heart, label: "我的收藏", path: "/favorites" },
{ icon: Settings, label: "账号设置", path: "/settings" },
];
const adminMenuItems = [
{ icon: ShieldCheck, label: "管理后台", path: "/admin" },
];
const SIDEBAR_WIDTH_KEY = "sidebar-width";
const DEFAULT_WIDTH = 280;
const MIN_WIDTH = 200;
const MAX_WIDTH = 480;
export default function DashboardLayout({
children,
}: {
children: React.ReactNode;
}) {
const [, navigate] = useLocation();
const [isLoggingOut, setIsLoggingOut] = useState(false);
const [sidebarWidth, setSidebarWidth] = useState(() => {
const saved = localStorage.getItem(SIDEBAR_WIDTH_KEY);
return saved ? parseInt(saved, 10) : DEFAULT_WIDTH;
});
const { loading, user, logout } = useAuth();
const handleLogout = useCallback(async () => {
setIsLoggingOut(true);
try {
await logout();
toast.success("已退出登录");
navigate("/");
} catch (error: unknown) {
const { title, description } = getErrorCopy(error, { context: "auth.logout" });
toast.error(title, { description });
} finally {
setIsLoggingOut(false);
}
}, [logout, navigate]);
useEffect(() => {
localStorage.setItem(SIDEBAR_WIDTH_KEY, sidebarWidth.toString());
}, [sidebarWidth]);
if (loading) {
return
Access to this dashboard requires authentication. Continue to launch the login flow.