import { useState } from "react"; import { NavLink, useLocation } from "react-router-dom"; import { useAuth } from "../auth/AuthContext"; const navItems = [ { to: "/", label: "Dashboard", roles: null }, { label: "Melodies", roles: ["superadmin", "melody_editor", "viewer"], children: [ { to: "/melodies", label: "Editor" }, { to: "/melodies/settings", label: "Settings" }, ], }, { to: "/devices", label: "Devices", roles: ["superadmin", "device_manager", "viewer"] }, { to: "/users", label: "Users", roles: ["superadmin", "user_manager", "viewer"] }, { label: "MQTT", roles: ["superadmin", "device_manager", "viewer"], children: [ { to: "/mqtt", label: "Dashboard" }, { to: "/mqtt/commands", label: "Commands" }, { to: "/mqtt/logs", label: "Logs" }, ], }, { to: "/equipment/notes", label: "Equipment Notes", roles: ["superadmin", "device_manager", "viewer"] }, ]; const linkClass = (isActive) => `block px-3 py-2 rounded-md text-sm transition-colors ${ 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 { hasRole } = useAuth(); const location = useLocation(); const visibleItems = navItems.filter( (item) => item.roles === null || hasRole(...item.roles) ); return ( ); } function CollapsibleGroup({ label, children, currentPath }) { const isChildActive = children.some( (child) => currentPath === child.to || (child.to !== "/" && currentPath.startsWith(child.to + "/")) ); const [open, setOpen] = useState(isChildActive); const shouldBeOpen = open || isChildActive; return (