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"] }, { to: "/mqtt", label: "MQTT", 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 (
{shouldBeOpen && (
{children.map((child) => ( `block pl-4 pr-3 py-1.5 rounded-md text-sm transition-colors ${ isActive ? "bg-[var(--accent)] text-[var(--bg-primary)] font-medium" : "text-[var(--text-muted)] hover:bg-[var(--bg-card-hover)] hover:text-[var(--text-heading)]" }` } > {child.label} ))}
)}
); }