import * as React from "react" import { Outlet, Link, useLocation } from "react-router-dom" import { BarChart3, ClipboardList, Forward, Globe2, Inbox, LogOut, Mail, Mailbox, Settings, ShieldCheck, UserCog } from "lucide-react" import { useMe } from "@/hooks/use-me" import { useLogout } from "@/hooks/use-logout" import { AuthGuard } from "@/components/auth-guard" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { Avatar, AvatarFallback } from "@/components/ui/avatar" import { SystemVersionDialog } from "@/components/system-version-dialog" import { hasAnyPermission } from "@/lib/permissions" import type { PermissionKey } from "@/lib/api-types" import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarProvider, SidebarRail, SidebarTrigger, useSidebar, } from "@/components/ui/sidebar" const adminSections: { key: string; label: string; icon: React.ReactNode; permissions: PermissionKey[] }[] = [ { key: "overview", label: "数据总览", icon: , permissions: ["admin.overview.view"] }, { key: "users", label: "账号管理", icon: , permissions: ["admin.users.view"] }, { key: "permissionGroups", label: "权限配置", icon: , permissions: ["admin.permission_groups.view"] }, { key: "domains", label: "域名管理", icon: , permissions: ["admin.domains.view", "admin.dns.view"] }, { key: "mailboxes", label: "邮箱管理", icon: , permissions: ["admin.mailboxes.view"] }, { key: "aliases", label: "邮件转发", icon: , permissions: ["admin.aliases.view"] }, { key: "messages", label: "全部邮件", icon: , permissions: ["admin.messages.view"] }, { key: "sendAudit", label: "发送队列", icon: , permissions: ["admin.messages.view"] }, { key: "settings", label: "系统设置", icon: , permissions: ["admin.settings.view", "admin.templates.view"] }, ] export function ProtectedLayout() { return ( ) } function ProtectedContent() { const me = useMe() const location = useLocation() const logout = useLogout() const user = me.data!.user const isMailRoute = location.pathname === "/" || location.pathname.startsWith("/mail") const isProfileRoute = location.pathname.startsWith("/profile") const isAdminRoute = location.pathname.startsWith("/admin") const adminSection = new URLSearchParams(location.search).get("section") || "overview" const visibleAdminSections = adminSections.filter((item) => hasAnyPermission(user, item.permissions)) if (isMailRoute || isProfileRoute) { return } return (
NewSzxcn 邮箱
{isAdminRoute && }
{isAdminRoute && visibleAdminSections.length > 0 && ( )} {user.displayName.slice(0, 1).toUpperCase()}
{user.displayName} {user.email}
{user.role === "admin" ? "管理员" : "普通用户"}
{isAdminRoute ? visibleAdminSections.find((item) => item.key === adminSection)?.label || "系统管理" : "NewSzxcn 邮箱"}
) } function AdminSectionItems({ activeSection, sections }: { activeSection: string; sections: typeof adminSections }) { const { isMobile, setOpenMobile } = useSidebar() function closeMobile() { if (isMobile) setOpenMobile(false) } return sections.map((item) => ( {item.icon} {item.label} )) }