import { useLocation } from "react-router-dom"; import { User, Shield, Link2, Activity, Building2, Users, Settings, FileText, Layers, GitBranch, ScrollText, Terminal, ShieldCheck, Key, Network, Monitor, ShieldAlert, BookOpen, } from "lucide-react"; import { SecuirdLogo } from "@/components/branding/SecuirdLogo"; import { NavLink } from "@/components/NavLink"; import { useAuth } from "@/contexts/AuthContext"; import { Sidebar, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarHeader, SidebarFooter, useSidebar, } from "@/components/ui/sidebar"; import { cn } from "@/lib/utils"; const userNavItems = [ { title: "Profile", url: "/profile", icon: User }, { title: "Security", url: "/security", icon: Shield }, { title: "SSH Keys", url: "/ssh-keys", icon: Terminal }, { title: "Linked Accounts", url: "/linked-accounts", icon: Link2 }, { title: "Activity", url: "/activity", icon: Activity }, { title: "CLI Guide", url: "/cli-guide", icon: BookOpen }, ]; // Visible to ALL org members const orgMemberNavItems = [ { title: "Overview", url: "/org", icon: Building2 }, { title: "My Memberships", url: "/org/my-memberships", icon: Layers }, { title: "ZeroTier Devices", url: "/org/zerotier/devices", icon: Monitor }, ]; // Visible to org admins/owners only (management) const orgAdminNavItems = [ { title: "Overview", url: "/org", icon: Building2 }, { title: "Members", url: "/org/members", icon: Users }, { title: "Departments", url: "/org/departments", icon: Layers }, { title: "Principals", url: "/org/principals", icon: GitBranch }, { title: "API Keys", url: "/org/api-keys", icon: Key }, { title: "Policies", url: "/org/policies", icon: Settings }, { title: "ZeroTier Networks", url: "/org/zerotier/networks", icon: Network }, { title: "ZeroTier Access", url: "/org/zerotier/access", icon: ShieldAlert }, ]; const adminNavItems = [ { title: "Certificate Auth.", url: "/org/cas", icon: ShieldCheck }, { title: "OIDC Clients", url: "/org/clients", icon: Key }, { title: "Org Audit Log", url: "/org/audit", icon: FileText }, ]; const systemLogNavItem = { title: "System Logs", url: "/admin/audit", icon: ScrollText }; export function AppSidebar() { const { state } = useSidebar(); const collapsed = state === "collapsed"; const location = useLocation(); const { isOrgAdmin, isOrgMember, canViewSystemLogs } = useAuth(); const isActive = (path: string) => location.pathname === path; const isOrgActive = orgAdminNavItems.some((item) => isActive(item.url)) || adminNavItems.some((item) => isActive(item.url)); void isOrgActive; // used for future active state tracking return ( {/* Logo */}
{!collapsed && ( Secuird )}
{/* User Section */} {!collapsed && ( Account )} {userNavItems.map((item) => ( {!collapsed && {item.title}} ))} {/* Organization Section — content differs by role */} {isOrgMember && ( {!collapsed && ( Organization )} {(isOrgAdmin ? orgAdminNavItems : orgMemberNavItems).map((item) => ( {!collapsed && {item.title}} ))} )} {/* Admin Section — only visible to org admins/owners */} {isOrgAdmin && ( {!collapsed && ( Admin )} {[...adminNavItems, ...(canViewSystemLogs ? [systemLogNavItem] : [])].map((item) => ( {!collapsed && {item.title}} ))} )} {!collapsed && (
{import.meta.env.VITE_APP_VERSION ?? 'Secuird'}
)}
); }