import type React from "react"; import { Link } from "@tanstack/react-router"; import { Building2, Cpu } from "lucide-react"; import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarMenu, SidebarMenuButton, SidebarMenuItem, } from "@/components/ui/sidebar"; import { cn } from "@/lib/utils"; import { appSidebarSection } from "@/types/app-sidebar"; import { PermissionEnum } from "@/types/permission"; import { useAuth } from "@/hooks/useAuth"; import { useMemo } from "react"; type SidebarItem = { title: string; url: string; code?: number; icon: React.ElementType; permissions?: PermissionEnum[]; }; type SidebarSection = { title: string; items: SidebarItem[]; }; export function AppSidebar() { const { hasPermission, acs } = useAuth(); // Check if user is admin (has ALLOW_ALL permission) const isAdmin = acs.includes(PermissionEnum.ALLOW_ALL); // Check if user has any of the required permissions const checkPermissions = (permissions?: PermissionEnum[]) => { // No permissions defined = show to everyone if (!permissions || permissions.length === 0) return true; // Item marked as ALLOW_ALL = show to everyone if (permissions.includes(PermissionEnum.ALLOW_ALL)) return true; // Admin users see everything if (isAdmin) return true; // Check if user has any of the required permissions return permissions.some((permission) => hasPermission(permission)); }; // Filter sidebar sections and items based on permissions const filteredNavMain = useMemo(() => { return appSidebarSection.navMain .map((section) => ({ ...section, items: section.items.filter((item) => checkPermissions(item.permissions)), })) .filter((section) => section.items.length > 0) as SidebarSection[]; // eslint-disable-next-line react-hooks/exhaustive-deps }, [acs]); return (
TTMT Computer Management v1.0.0
{filteredNavMain.map((section) => ( {section.title} {section.items.map((item) => ( {item.title} ))} ))}
© 2025 NAVIS Centre
); }