import { useState } from "react"; import { NavLink, useLocation } from "react-router-dom"; import { useAuth } from "../auth/AuthContext"; const navItems = [ { to: "/", label: "Dashboard", permission: null }, { label: "Melodies", permission: "melodies", children: [ { to: "/melodies", label: "Main Editor" }, { to: "/melodies/archetypes", label: "Archetypes" }, { to: "/melodies/settings", label: "Settings" }, { to: "/melodies/composer", label: "Composer" }, ], }, { to: "/devices", label: "Devices", permission: "devices" }, { to: "/users", label: "App Users", permission: "app_users" }, { label: "MQTT", permission: "mqtt", children: [ { to: "/mqtt", label: "Dashboard" }, { to: "/mqtt/commands", label: "Commands" }, { to: "/mqtt/logs", label: "Logs" }, ], }, { to: "/equipment/notes", label: "Issues and Notes", permission: "equipment" }, { label: "Manufacturing", permission: "manufacturing", children: [ { to: "/manufacturing", label: "Device Inventory" }, { to: "/manufacturing/batch/new", label: "New Batch" }, { to: "/firmware", label: "Firmware" }, ], }, ]; const linkClass = (isActive, locked) => `block px-3 py-2 rounded-md text-sm transition-colors ${ locked ? "opacity-40 cursor-not-allowed" : isActive ? "bg-[var(--accent)] text-[var(--bg-primary)] font-medium" : "text-[var(--text-secondary)] hover:bg-[var(--bg-card-hover)] hover:text-[var(--text-heading)]" }`; export default function Sidebar() { const { hasPermission, hasRole } = useAuth(); const location = useLocation(); const canViewSection = (permission) => { if (!permission) return true; return hasPermission(permission, "view"); }; // Settings visible only to sysadmin and admin const canManageStaff = hasRole("sysadmin", "admin"); return ( ); } function CollapsibleGroup({ label, children, currentPath, locked = false }) { const isChildActive = children.some( (child) => currentPath === child.to || (child.to !== "/" && currentPath.startsWith(child.to + "/")) ); const [open, setOpen] = useState(isChildActive); const shouldBeOpen = open || isChildActive; return (