import { useState, useCallback, useEffect, useRef } from 'react' import type { User } from '../lib/supabase' interface SidebarProps { user: User currentView: string onViewChange: (view: string) => void isExpanded?: boolean isMobileOpen?: boolean isHovered?: boolean setIsHovered?: (hovered: boolean) => void } interface MenuItem { id: string name: string icon: React.ReactElement requiredRoles?: string[] subItems?: { name: string; id: string; requiredRoles?: string[] }[] } export function Sidebar({ user, currentView, onViewChange, isExpanded = true, isMobileOpen = false, isHovered = false, setIsHovered }: SidebarProps) { const [openSubmenu, setOpenSubmenu] = useState(null) const [subMenuHeight, setSubMenuHeight] = useState>({}) const subMenuRefs = useRef>({}) const menuItems: MenuItem[] = [ { id: 'dashboard', name: 'Dashboard', icon: ( ), }, { id: 'user-management', name: 'User Management', icon: ( ), requiredRoles: ['admin'] }, { id: 'experiments', name: 'Experiments', icon: ( ), requiredRoles: ['admin', 'conductor'] }, { id: 'video-library', name: 'Video Library', icon: ( ), }, { id: 'analytics', name: 'Analytics', icon: ( ), requiredRoles: ['admin', 'conductor', 'analyst'] }, { id: 'data-entry', name: 'Data Entry', icon: ( ), requiredRoles: ['admin', 'conductor', 'data recorder'] }, { id: 'vision-system', name: 'Vision System', icon: ( ), } ] // const isActive = (path: string) => location.pathname === path; const isActive = useCallback( (id: string) => currentView === id, [currentView] ) useEffect(() => { // Auto-open submenu if current view is in a submenu menuItems.forEach((nav, index) => { if (nav.subItems) { nav.subItems.forEach((subItem) => { if (isActive(subItem.id)) { setOpenSubmenu(index) } }) } }) }, [currentView, isActive, menuItems]) useEffect(() => { if (openSubmenu !== null) { const key = `submenu-${openSubmenu}` if (subMenuRefs.current[key]) { setSubMenuHeight((prevHeights) => ({ ...prevHeights, [key]: subMenuRefs.current[key]?.scrollHeight || 0, })) } } }, [openSubmenu]) const handleSubmenuToggle = (index: number) => { setOpenSubmenu((prevOpenSubmenu) => { if (prevOpenSubmenu === index) { return null } return index }) } const hasAccess = (item: MenuItem): boolean => { if (!item.requiredRoles) return true return item.requiredRoles.some(role => user.roles.includes(role as any)) } const renderMenuItems = (items: MenuItem[]) => (
    {items.map((nav, index) => { if (!hasAccess(nav)) return null return (
  • {nav.subItems ? ( ) : ( )} {nav.subItems && (isExpanded || isHovered || isMobileOpen) && (
    { subMenuRefs.current[`submenu-${index}`] = el }} className="overflow-hidden transition-all duration-300" style={{ height: openSubmenu === index ? `${subMenuHeight[`submenu-${index}`]}px` : "0px", }} >
      {nav.subItems.map((subItem) => { if (subItem.requiredRoles && !subItem.requiredRoles.some(role => user.roles.includes(role as any))) { return null } return (
    • ) })}
    )}
  • ) })}
) return ( ) }