import * as React from 'react'; import { Box, Drawer, List, Divider, ListItem, ListItemButton, ListItemIcon, ListItemText, IconButton, Tooltip, useMediaQuery, useTheme, } from '@mui/material'; import TableViewIcon from '@mui/icons-material/TableView'; import DashboardIcon from '@mui/icons-material/Dashboard'; import MenuIcon from '@mui/icons-material/Menu'; import ChevronLeftIcon from '@mui/icons-material/ChevronLeft'; import ChevronRightIcon from '@mui/icons-material/ChevronRight'; import { ResourceConfig } from '../types/config'; import { useLocation, useNavigate } from 'react-router-dom'; const drawerWidth = 240; const collapsedWidth = 64; interface AdminLayoutProps { children: React.ReactNode; onSelectResource: (resourceName: string | null) => void; onLogout: () => void; username?: string; resources: ResourceConfig[]; } export default function AdminLayout({ children, onSelectResource, resources, }: AdminLayoutProps) { const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down('md')); const location = useLocation(); const navigate = useNavigate(); const [isCollapsed, setIsCollapsed] = React.useState(false); const [mobileOpen, setMobileOpen] = React.useState(false); const activeResourceName = location.pathname.split('/admin')[1] || null; // AUTO-TOGGLE LOGIC (unchanged) React.useEffect(() => { if (isMobile) { setIsCollapsed(false); setMobileOpen(false); } else { if (location.pathname === '/admin' || location.pathname === '') { setIsCollapsed(false); } else { setIsCollapsed(true); } } }, [location.pathname, isMobile]); const currentWidth = isMobile ? drawerWidth : isCollapsed ? collapsedWidth : drawerWidth; const handleDrawerToggle = () => { setMobileOpen((prev) => !prev); }; const handleSidebarToggle = () => { setIsCollapsed((prev) => !prev); }; const drawerContent = ( {!isMobile && ( <> {isCollapsed ? : } )} {/* Mobile spacing (replaces Toolbar) */} {isMobile && ( theme.spacing(7) }} /> )} navigate('/admin')} sx={{ minHeight: 48, justifyContent: isCollapsed && !isMobile ? 'center' : 'initial', px: 2.5, }} > {(!isCollapsed || isMobile) && ( )} {resources.map((res) => ( onSelectResource(res.name)} sx={{ minHeight: 48, justifyContent: isCollapsed && !isMobile ? 'center' : 'initial', px: 2.5, }} > {(!isCollapsed || isMobile) && ( )} ))} ); return ( {/* NAV */} {isMobile ? ( {drawerContent} ) : ( {drawerContent} )} {/* MAIN */} {/* Control row (replaces AppBar) */} {isMobile && ( theme.spacing(7), }} > )} {children} ); }