import { Avatar, DropdownMenu } from '@/components/ui'; import { useAuth } from '@/contexts/AuthContext'; import { useMaintenanceSetting } from '@/hooks/api/useAdminAPI'; import { useTranslation } from '@/hooks/useI18n'; import { clsx } from 'clsx'; import { BarChart3, Bell, Building2, ChevronRight, FileText, Languages, LayoutDashboard, LogOut, Menu, Settings, User, Users, X, } from 'lucide-react'; import React, { useState } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; export interface AdminNavItem { id: string; label: string; icon: React.ReactNode; path: string; badge?: number; children?: AdminNavItem[]; } export interface AdminLayoutProps { children: React.ReactNode; title?: string; breadcrumbs?: Array<{ label: string; href?: string }>; } const defaultNavItems: AdminNavItem[] = [ { id: 'dashboard', label: 'Dashboard', icon: , path: '/admin', }, { id: 'organizations', label: 'Organizations', icon: , path: '/admin/organizations', children: [ { id: 'org-list', label: 'All Organizations', path: '/admin/organizations' }, { id: 'org-new', label: 'New Organization', path: '/admin/organizations/new' }, { id: 'org-verify', label: 'Verification Queue', path: '/admin/organizations/verification' }, ], }, { id: 'localization', label: 'Localization', icon: , path: '/admin/localization', children: [ { id: 'loc-ui', label: 'UI Translations', path: '/admin/localization/ui' }, { id: 'loc-data', label: 'Data Translations', path: '/admin/localization/data' }, ], }, { id: 'content', label: 'Content', icon: , path: '/admin/content', children: [ { id: 'content-pages', label: 'Static Pages', path: '/admin/content/pages' }, { id: 'content-announcements', label: 'Announcements', path: '/admin/content/announcements' }, { id: 'content-media', label: 'Media Library', path: '/admin/content/media' }, ], }, { id: 'users', label: 'Users', icon: , path: '/admin/users', children: [ { id: 'users-list', label: 'All Users', path: '/admin/users' }, { id: 'users-new', label: 'New User', path: '/admin/users/new' }, { id: 'users-activity', label: 'Activity Log', path: '/admin/users/activity' }, ], }, { id: 'analytics', label: 'Analytics', icon: , path: '/admin/analytics', children: [ { id: 'analytics-overview', label: 'Overview', path: '/admin/analytics' }, { id: 'analytics-orgs', label: 'Organizations', path: '/admin/analytics/organizations' }, { id: 'analytics-users', label: 'User Activity', path: '/admin/analytics/users' }, { id: 'analytics-matching', label: 'Matching', path: '/admin/analytics/matching' }, ], }, { id: 'settings', label: 'Settings', icon: , path: '/admin/settings', children: [ { id: 'settings-general', label: 'General', path: '/admin/settings/general' }, { id: 'settings-localization', label: 'Localization', path: '/admin/settings/localization' }, { id: 'settings-integrations', label: 'Integrations', path: '/admin/settings/integrations' }, { id: 'settings-email', label: 'Email Templates', path: '/admin/settings/email' }, { id: 'settings-maintenance', label: 'Maintenance', path: '/admin/settings/maintenance' }, ], }, ]; /** * Admin Layout with sidebar navigation */ export const AdminLayout = ({ children, title, breadcrumbs }: AdminLayoutProps) => { const [sidebarOpen, setSidebarOpen] = useState(true); const [expandedItems, setExpandedItems] = useState>(new Set()); const location = useLocation(); const navigate = useNavigate(); const { user, logout } = useAuth(); const { t } = useTranslation(); const maintenance = useMaintenanceSetting(); const toggleSidebar = () => setSidebarOpen(!sidebarOpen); const toggleExpanded = (id: string) => { setExpandedItems((prev) => { const newSet = new Set(prev); if (newSet.has(id)) { newSet.delete(id); } else { newSet.add(id); } return newSet; }); }; const isActive = (path: string) => location.pathname === path || location.pathname.startsWith(path + '/'); const userMenuItems = [ { label: 'Profile', value: 'profile', icon: , onClick: () => navigate('/admin/profile'), }, { label: 'Settings', value: 'settings', icon: , onClick: () => navigate('/admin/settings'), }, { label: 'divider', value: 'divider', divider: true, }, { label: 'Logout', value: 'logout', icon: , onClick: () => logout(), }, ]; return ( {/* Sidebar */} {/* Main Content */} {/* Header */} {title && {title}} {user?.name || 'Admin'} } items={userMenuItems} align="right" /> {/* Page Content */} {/* Show maintenance banner for admins */} {maintenance.data?.enabled && ( Maintenance mode is active {maintenance.data?.message} )} {breadcrumbs && breadcrumbs.length > 0 && ( {/* Breadcrumbs will be rendered here if needed */} )} {children} ); };