import React, { useState } from 'react'; import { Button } from '../ui/button'; import { Home, FileText, GraduationCap, Users, Calendar, Globe, BarChart3, Settings, Menu, ChevronLeft, LogOut, User, Shield, Building, UserPlus, Webcam, ClipboardList, Target } from 'lucide-react'; import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from '../ui/breadcrumb'; import { Avatar, AvatarFallback } from '../ui/avatar'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '../ui/dropdown-menu'; import klcLogoDark from '../../assets/klc-logo-white.png'; import { useNavigate } from 'react-router-dom'; interface NavigationItem { id: string; label: string; icon: React.ComponentType<{ className?: string }>; route: string; children?: NavigationItem[]; } interface AuthenticatedLayoutProps { children: React.ReactNode; currentRoute: string; // onNavigate: (route: string) => void; onLogout: () => void; user: { name: string; email: string; role: string; avatar?: string; lastLogin: string; }; breadcrumbs?: Array<{ label: string; route?: string }>; } const navigationItems: NavigationItem[] = [ { id: 'dashboard', label: 'Dashboard', icon: Home, route: '/dashboard' }, { id: 'content', label: 'Content', icon: FileText, route: '/content' }, { id: 'courses', label: 'Courses', icon: GraduationCap, route: '/courses' }, { id: 'profilers', label: 'Profilers', icon: Target, route: '/profilers' }, { id: 'programmes', label: 'Programmes', icon: ClipboardList, route: '/programmes' }, { id: 'open-programme', label: 'Open Programme', icon: Globe, route: '/open-programme' }, { id: 'webinars', label: 'Webinars', icon: Webcam, route: '/webinars' }, { id: 'class-scheduler', label: 'Class Scheduler', icon: Calendar, route: '/class-scheduler' }, { id: 'landing-pages', label: 'Landing Pages', icon: Globe, route: '/landing-pages' }, { id: 'users', label: 'Users', icon: Users, route: '/users/individual', children: [ { id: 'individual', label: 'Individual Learners', icon: User, route: '/users/individual' }, { id: 'organizations', label: 'Organizations', icon: Building, route: '/users/organizations' } ] }, { id: 'roles', label: 'Roles', icon: Shield, route: '/admin/roles' }, { id: 'analytics', label: 'Analytics', icon: BarChart3, route: '/admin/analytics' }, { id: 'settings', label: 'Settings', icon: Settings, route: '/settings', children: [ { id: 'leads', label: 'Leads', icon: UserPlus, route: '/admin/leads' }, { id: 'facilities', label: 'Facilities', icon: Building, route: '/admin/facilities' } ] } ]; export function AuthenticatedLayout({ children, currentRoute, // onNavigate, onLogout, user, breadcrumbs = [] }: AuthenticatedLayoutProps) { const [sidebarCollapsed, setSidebarCollapsed] = useState(false); const isActiveRoute = (route: string) => { return currentRoute === route || (route === '/users/individual' && currentRoute.startsWith('/users/')); }; const getActiveParent = (items: NavigationItem[]): string | null => { for (const item of items) { if (isActiveRoute(item.route)) return item.id; if (item.children) { for (const child of item.children) { if (isActiveRoute(child.route)) return item.id; } } } return null; }; const activeParent = getActiveParent(navigationItems); const renderNavigationItem = (item: NavigationItem, isChild = false) => { const isActive = isActiveRoute(item.route); const isParentActive = activeParent === item.id; const Icon = item.icon; const navigate = useNavigate(); return (
{/* Render children if parent is active and not collapsed */} {item.children && isParentActive && !sidebarCollapsed && (
{item.children.map(child => renderNavigationItem(child, true))}
)}
); }; const navigate = useNavigate(); return (
{/* Left Sidebar */}
{/* Logo Header */}
{!sidebarCollapsed && ( Kautilya Leadership Centre )}
{/* Navigation Items */}
{/* User Section */}
navigate('/profile')} >
{user.name}
{user.email}
navigate('/profile')}> Profile Sign out
{/* Main Content */}
{/* Breadcrumb */} {breadcrumbs.length > 0 && (
navigate('/dashboard')} className="cursor-pointer" > Admin {breadcrumbs.map((crumb, index) => ( {crumb.route && index < breadcrumbs.length - 1 ? ( navigate(crumb.route!)} className="cursor-pointer" > {crumb.label} ) : ( {crumb.label} )} ))}
)} {/* Page Content */}
{children}
{/* Footer */}
); }