'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 { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Tooltip, TooltipContent, TooltipTrigger, } from '@/components/ui/tooltip' import { useAuth, type Role } from '@/contexts/auth-context' import { DASHBOARD_ITEM, CONFIGURATION_ITEM, NAV_GROUPS, type NavGroup, type NavItem } from '@/config/nav' function canSee(item: NavItem, permissions: string[]): boolean { if (!item.permission) return true return permissions.includes('*') || permissions.includes(item.permission) } function isGroupVisible(group: NavGroup, permissions: string[]): boolean { return group.items.some((item) => canSee(item, permissions)) } export function AppSidebar() { const { user, setRole, permissions } = 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" > {/* Group trigger — looks like a regular nav button */} } isActive={groupActive} tooltip={group.title} > {group.title} {/* Sub-items with indent line */} {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 */} } isActive={configurationActive} tooltip={CONFIGURATION_ITEM.title} > {CONFIGURATION_ITEM.title}
{user.fullName}
) }