"use client" import * as React from "react" import Link from "next/link" import { usePathname } from "next/navigation" import { ChevronRight } from "lucide-react" import { useTranslations } from "next-intl" import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "@/shared/components/ui/collapsible" import { ScrollArea } from "@/shared/components/ui/scroll-area" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/shared/components/ui/tooltip" import { cn } from "@/shared/lib/utils" import { usePermission } from "@/shared/hooks" import { UnreadMessageBadge } from "@/modules/messaging/components/unread-message-badge" import { useSidebar } from "./sidebar-provider" import { NAV_CONFIG, Role } from "../config/navigation" interface AppSidebarProps { mode?: "mobile" | "desktop" } export function AppSidebar({ mode }: AppSidebarProps) { const { expanded, toggleSidebar, isMobile } = useSidebar() const pathname = usePathname() const { permissions, hasRole } = usePermission() const tNav = useTranslations("nav") const tCommon = useTranslations("common") // 自动检测当前角色(优先级 admin > student > parent > teacher) // 注意:grade_head / teaching_head 统一归入 teacher,因为 teacher 导航已通过 // 权限点(GRADE_MANAGE 等)动态显示班主任专属功能,无需切换角色。 function detectAutoRole(): Role { if (hasRole("admin")) return "admin" if (hasRole("student")) return "student" if (hasRole("parent")) return "parent" return "teacher" } const effectiveRole: Role = detectAutoRole() const allNavItems = NAV_CONFIG[effectiveRole] ?? NAV_CONFIG.teacher ?? [] // Filter nav items by permission const navItems = allNavItems.filter((item) => { if (!item.permission) return true return permissions.includes(item.permission) }).map((item) => ({ ...item, items: item.items?.filter((subItem) => { if (!subItem.permission) return true return permissions.includes(subItem.permission) }), })) // Ensure consistent state for hydration if (!expanded && mode === 'mobile') return null return (
{/* Sidebar Header */}
{expanded || isMobile ? (
NE
Next_Edu ) : (
NE
)}
{/* Navigation */} {/* Sidebar Footer */}
{!isMobile && ( )}
) } AppSidebar.displayName = "AppSidebar"