"use client"; import * as React from "react"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { LayoutDashboard, CreditCard, CalendarDays, Users, BarChart3, ClipboardList, Settings, ChevronsLeft, ChevronsRight, } from "lucide-react"; import { cn } from "@/lib/utils"; import { Tooltip, TooltipTrigger, TooltipContent, } from "@/components/ui/tooltip"; import { ScrollArea } from "@/components/ui/scroll-area"; import { OrgSwitcher } from "@/components/layout/org-switcher"; import { useUserProfile } from "@/lib/user-profile"; import { isAdminRole } from "@/lib/permissions"; const STORAGE_KEY = "echo-sidebar-collapsed"; const navItems = [ { href: "/", label: "Dashboard", icon: LayoutDashboard }, { href: "/cards", label: "Response Cards", icon: CreditCard }, { href: "/events", label: "Collection Days", icon: CalendarDays }, { href: "/people", label: "People", icon: Users }, { href: "/surveys", label: "Surveys", icon: ClipboardList }, { href: "/reports", label: "Reports", icon: BarChart3 }, ]; const bottomItems = [ { href: "/settings", label: "Settings", icon: Settings }, ]; function isActive(pathname: string, href: string) { if (href === "/") return pathname === "/"; return pathname === href || pathname.startsWith(href + "/"); } type SidebarContextValue = { collapsed: boolean; setCollapsed: (v: boolean) => void; toggle: () => void; }; const SidebarContext = React.createContext({ collapsed: false, setCollapsed: () => {}, toggle: () => {}, }); export function useSidebar() { return React.useContext(SidebarContext); } export function SidebarProvider({ children }: { children: React.ReactNode }) { const [collapsed, setCollapsedState] = React.useState(false); const [mounted, setMounted] = React.useState(false); React.useEffect(() => { setMounted(true); try { const stored = localStorage.getItem(STORAGE_KEY); if (stored === "true") setCollapsedState(true); } catch {} }, []); const setCollapsed = React.useCallback((v: boolean) => { setCollapsedState(v); try { localStorage.setItem(STORAGE_KEY, String(v)); } catch {} }, []); const toggle = React.useCallback(() => { setCollapsed(!collapsed); }, [collapsed, setCollapsed]); const value = React.useMemo( () => ({ collapsed: mounted ? collapsed : false, setCollapsed, toggle }), [mounted, collapsed, setCollapsed, toggle] ); return ( {children} ); } function NavItem({ href, label, icon: Icon, active, collapsed, }: { href: string; label: string; icon: React.ComponentType<{ className?: string }>; active: boolean; collapsed: boolean; }) { const content = ( {!collapsed && {label}} ); if (collapsed) { return ( }>{content} {label} ); } return content; } export function Sidebar() { const pathname = usePathname(); const { collapsed, toggle } = useSidebar(); const { role } = useUserProfile(); const canManageSettings = isAdminRole(role); const visibleBottomItems = bottomItems.filter( (item) => item.href !== "/settings" || canManageSettings ); return ( ); }