import React, { useState } from 'react'; import { ChevronLeft, ChevronDown, ChevronRight, Menu, User, LogOut, Stethoscope } from 'lucide-react'; import * as LucideIcons from 'lucide-react'; import { NavigationItem } from '../../types/navigation'; interface SidebarProps { isOpen: boolean; onToggle: () => void; activeTab: string; onTabChange: (tab: string) => void; user?: any; onLogout?: () => void; navigationItems: NavigationItem[]; isLoading?: boolean; } export const Sidebar: React.FC = ({ isOpen, onToggle, activeTab, onTabChange, user, onLogout, navigationItems, isLoading = false }) => { const [expandedMenus, setExpandedMenus] = useState>(new Set()); const getIconComponent = (iconName: string) => { const IconComponent = (LucideIcons as any)[iconName]; return IconComponent || LucideIcons.Home; }; const toggleMenu = (menuId: string, e: React.MouseEvent) => { e.stopPropagation(); // Prevent triggering parent click const newExpanded = new Set(expandedMenus); if (newExpanded.has(menuId)) { newExpanded.delete(menuId); } else { newExpanded.add(menuId); } setExpandedMenus(newExpanded); }; const handleMenuClick = (item: NavigationItem) => { const hasChildren = item.children && item.children.length > 0; // If item has a route (is clickable), navigate to it if (item.route) { onTabChange(item.id); // Close sidebar on mobile only when selecting a final destination if (window.innerWidth < 1024) { onToggle(); } } else if (hasChildren) { // If no route but has children, just expand/collapse setExpandedMenus(prev => { const newExpanded = new Set(prev); if (newExpanded.has(item.id)) { newExpanded.delete(item.id); } else { newExpanded.add(item.id); } return newExpanded; }); } }; const renderMenuItem = (item: NavigationItem, level: number = 0) => { const isActive = activeTab === item.id; const isExpanded = expandedMenus.has(item.id); const hasChildren = item.children && item.children.length > 0; const Icon = getIconComponent(item.icon); return (
{/* Parent Menu Item */}
0 ? 'pl-8' : 'pl-4' } pr-4 py-3 ${ isActive ? 'bg-teal-700 border-r-4 border-teal-300' : 'hover:bg-teal-700/50' }`} > {/* Main clickable area - icon and label */} {/* Separate expand/collapse button */} {isOpen && hasChildren && ( )}
{/* Tooltip for collapsed sidebar */} {!isOpen && (
{item.label} {item.badge && ( {item.badge} )}
)}
{/* Child Menu Items */} {hasChildren && isExpanded && isOpen && (
{item.children!.map((child) => renderMenuItem(child, level + 1))}
)}
); }; return ( <> {/* Mobile overlay */} {isOpen && (
)} {/* Sidebar */}
{/* Header */}
{isOpen && (

LLI-SFE

{user?.company || 'Role'}

)}
{/* Navigation */} {/* User Profile */}
{isOpen && (

{user?.userName || 'User'}

{user?.userRole || 'Role'}

)} {isOpen && onLogout && ( )}
); };