"use client" import * as React from "react" import Link from "next/link" import { usePathname } from "next/navigation" import { ChevronRight } from "lucide-react" 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 { Permissions, type Permission } from "@/shared/types/permissions" 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() // Determine which role's nav config to use based on permissions let currentRole: Role = "teacher" if (permissions.includes(Permissions.SCHOOL_MANAGE)) { currentRole = "admin" } else if (permissions.includes(Permissions.HOMEWORK_SUBMIT) && !permissions.includes(Permissions.EXAM_CREATE)) { currentRole = "student" } else if (hasRole("parent")) { currentRole = "parent" } const allNavItems = NAV_CONFIG[currentRole] ?? NAV_CONFIG.teacher // Filter nav items by permission const navItems = allNavItems.filter((item) => { if (!item.permission) return true return permissions.includes(item.permission as Permission) }).map((item) => ({ ...item, items: item.items?.filter((subItem) => { if (!subItem.permission) return true return permissions.includes(subItem.permission as 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"