import { Link, useLocation } from "react-router-dom"; import { Archive, BarChart, Building2, ChartAreaIcon, ClipboardList, FileText, Globe, Settings, Users2, UsersRound, } from "lucide-react"; import { useTranslation } from "react-i18next"; import { useAuth } from "@/shared/context/AuthContext"; import { SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarMenu, SidebarMenuButton, SidebarMenuItem, useSidebar, } from "@/shared/common/ui/sidebar"; export interface MenuItem { label: string; href: string; icon: React.ReactNode; roles?: string[]; /** Sidebar section this item is bucketed under. */ group: string; } // Section render order; groups with no role-visible items are skipped. const GROUP_ORDER = [ "Overview", "Organizations", "Content", "Records", "Configuration", "Archive", "System", ]; export const AppMenuTabs = () => { const { user } = useAuth(); const { pathname } = useLocation(); const { setOpenMobile } = useSidebar(); const { t } = useTranslation(); const userRoles = user?.roles.map((role) => role.key) || []; const menuItems: MenuItem[] = [ { label: "dashboard", href: "/user-management/dashboard", icon: , roles: ["super_admin"], group: "Overview", }, { label: "organizations", href: "/user-management/organizations", icon: , roles: ["super_admin"], group: "Organizations", }, { label: "organizationAdmins", href: "/user-management/organization_admins", icon: , roles: ["super_admin"], group: "Organizations", }, { label: "externalUsers", href: "/user-management/external_users", icon: , roles: ["super_admin"], group: "Organizations", }, { label: "dashboard", href: "/user-management/user_management-dashboard", icon: , roles: ["admin", "organization_admin", "unit_admin"], group: "Overview", }, { label: "userManagement", href: "/user-management/user_management", icon: , roles: ["admin", "organization_admin", "unit_admin"], group: "Overview", }, { label: "contentManagement", href: "/user-management/content-management", icon: , roles: ["admin", "organization_admin", "unit_admin"], group: "Content", }, { label: "webManagement", href: "/user-management/web-management", icon: , roles: ["admin", "organization_admin", "unit_admin"], group: "Content", }, { label: "Bulk", href: "/user-management/bulk-upload", icon: , roles: ["admin", "organization_admin", "unit_admin"], group: "Content", }, { label: "Position", href: "/user-management/position-management", icon: , roles: ["admin", "organization_admin", "unit_admin", "super_admin"], group: "Configuration", }, { label: "settings", href: "/user-management/organization-settings", icon: , roles: ["admin", "organization_admin", "unit_admin"], group: "Configuration", }, { label: "Add Site", href: "/user-management/add-site", icon: , roles: ["super_admin"], group: "Configuration", }, { label: "migratedRecords", href: "/user-management/migrated-records-management", icon: , roles: ["super_admin"], group: "Records", }, { label: "Sector Reports", href: "/user-management/sector-reports", icon: , roles: ["unit_admin", "admin", "organization_admin"], group: "Records", }, { label: "Archive Users", href: "/user-management/archive-users", icon: , roles: ["super_admin"], group: "Archive", }, { label: "Archived Organizations", href: "/user-management/archived-organizations", icon: , roles: ["super_admin"], group: "Archive", }, { label: "Archive Users", href: "/user-management/archives", icon: , roles: ["admin", "organization_admin", "unit_admin"], group: "Archive", }, { label: "Archived Units & Positions", href: "/user-management/archived", icon: , roles: ["admin", "organization_admin", "unit_admin"], group: "Archive", }, { label: "activityLog", href: "/user-management/activity_log", icon: , roles: ["super_admin"], group: "System", }, { label: "setting", href: "/user-management/settings", icon: , roles: ["super_admin"], group: "System", }, { label: "Letter Template", href: "/user-management/templates", icon: , roles: ["super_admin"], group: "System", }, ]; const filteredMenu = menuItems.filter((item) => item.roles?.some((r) => userRoles.includes(r)), ); const isActive = (href: string) => pathname === href || pathname.startsWith(`${href}/`); return ( <> {GROUP_ORDER.map((group) => { const items = filteredMenu.filter((item) => item.group === group); if (items.length === 0) return null; return ( {group} {items.map((item) => { const label = t(`organization.${item.label}`, item.label); return ( setOpenMobile(false)} > {item.icon} {label} ); })} ); })} ); };