'use client' import Link from 'next/link' import { useEffect, useState } from 'react' import { usePathname } from 'next/navigation' import { HugeiconsIcon } from '@hugeicons/react' import { ChevronRightIcon, UserIcon } from '@hugeicons/core-free-icons' import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarHeader, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarRail, } from '@/components/ui/sidebar' import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from '@/components/ui/collapsible' import { Tooltip, TooltipContent, TooltipTrigger, } from '@/components/ui/tooltip' import { Button } from '@/components/ui/button' import { useAuth } from '@/contexts/auth-context' import { DASHBOARD_ITEM, CONFIGURATION_ITEM, NAV_GROUPS, type NavGroup, type NavItem } from '@/config/nav' function canSee(item: NavItem, permissions: Set): boolean { if (!item.permission) return true return permissions.has(item.permission) } function isGroupVisible(group: NavGroup, permissions: Set): boolean { return group.items.some((item) => canSee(item, permissions)) } export function AppSidebar() { const { user, permissions, logout } = useAuth() const pathname = usePathname() const dashboardActive = pathname === DASHBOARD_ITEM.href const configurationActive = pathname === CONFIGURATION_ITEM.href || pathname.startsWith(CONFIGURATION_ITEM.href + '/') const [openGroups, setOpenGroups] = useState>({}) useEffect(() => { setOpenGroups((prev) => { const next = { ...prev } for (const group of NAV_GROUPS) { if (!isGroupVisible(group, permissions)) continue const visibleItems = group.items.filter((item) => canSee(item, permissions)) const groupActive = visibleItems.some( (item) => pathname === item.href || (item.href !== '/' && pathname.startsWith(item.href)), ) if (groupActive) { next[group.title] = true } else if (!(group.title in next)) { next[group.title] = false } } return next }) }, [pathname, permissions]) return (
D
Distribution
{/* Dashboard — standalone, not inside a collapsible group */} } isActive={dashboardActive} tooltip={DASHBOARD_ITEM.title} > {DASHBOARD_ITEM.title} {/* Collapsible groups */} {NAV_GROUPS.map((group) => { if (!isGroupVisible(group, permissions)) return null const visibleItems = group.items.filter((item) => canSee(item, permissions), ) const groupActive = visibleItems.some( (item) => pathname === item.href || (item.href !== '/' && pathname.startsWith(item.href)), ) return ( setOpenGroups((prev) => ({ ...prev, [group.title]: open })) } className="group/collapsible" > } isActive={groupActive} tooltip={group.title} > {group.title} {visibleItems.map((item) => { const isActive = pathname === item.href || (item.href !== '/' && pathname.startsWith(item.href)) return ( } />} isActive={isActive} > {item.title} {item.description ?? item.title} ) })} ) })} {/* Configuration — standalone, no sub-nav */} {canSee(CONFIGURATION_ITEM, permissions) && ( } isActive={configurationActive} tooltip={CONFIGURATION_ITEM.title} > {CONFIGURATION_ITEM.title} )}
{user?.username ?? '—'}
) }