import { useNavigate, useLocation, Outlet, Link as RouterLink } from 'react-router-dom'; import { Box, Drawer, List, ListItem, ListItemButton, ListItemIcon, ListItemText, AppBar, Toolbar, Typography, Divider, Avatar, Tooltip, IconButton, Link } from '@mui/material'; import PeopleIcon from '@mui/icons-material/People'; import ArticleIcon from '@mui/icons-material/Article'; import NotificationsActiveIcon from '@mui/icons-material/NotificationsActive'; import CorporateFareIcon from '@mui/icons-material/CorporateFare'; import LogoutIcon from '@mui/icons-material/Logout'; import DashboardIcon from '@mui/icons-material/Dashboard'; import LocationOnIcon from '@mui/icons-material/LocationOn'; import CalendarMonthIcon from '@mui/icons-material/CalendarMonth'; import HomeIcon from '@mui/icons-material/Home'; import StoreIcon from '@mui/icons-material/Store'; import { useAuth } from '../context/AuthContext'; import ErrorBoundary from './ErrorBoundary'; const DRAWER_WIDTH = 240; const navCategories = [ { label: null, items: [ { label: 'Home', path: '/', icon: , roles: null }, ], }, { label: 'Administration', items: [ { label: 'Users', path: '/users', icon: , roles: ['ADMIN'] }, { label: 'Push', path: '/push', icon: , roles: ['ADMIN'] }, ], }, { label: 'Reporter', items: [ { label: 'Neuigkeiten', path: '/posts', icon: , roles: ['ADMIN', 'REPORTER'] }, { label: 'Kalendereinträge', path: '/calenderPosts', icon: , roles: ['ADMIN', 'REPORTER'] }, { label: 'Sehenswürdigkeiten', path: '/attractions', icon: , roles: ['ADMIN', 'REPORTER'] }, ], }, { label: 'Seiten', items: [ { label: 'Unternehmen', path: '/companies', icon: , roles: ['ADMIN', 'SITE_OWNER'] }, { label: 'Organization', path: '/organizations', icon: , roles: ['ADMIN', 'SITE_OWNER'] }, ], }, ]; const allNavItems = navCategories.flatMap((c) => c.items); function getActiveLabel(pathname) { const exact = allNavItems.find((i) => i.path === pathname); if (exact) return exact.label; const partial = allNavItems.find((i) => i.path !== '/' && pathname.startsWith(i.path)); return partial?.label ?? 'Admin'; } export default function Layout() { const navigate = useNavigate(); const location = useLocation(); const { logout, role } = useAuth(); const visibleCategories = navCategories .map((cat) => ({ ...cat, items: cat.items.filter((item) => !item.roles || item.roles.includes(role)), })) .filter((cat) => cat.items.length > 0); return ( {/* Logo */} Admin Panel {/* Navigation */} {visibleCategories.map((cat, catIdx) => ( {cat.label && ( {cat.label} )} {cat.items.map((item) => ( navigate(item.path)} sx={{ borderRadius: 2 }} > {item.icon} ))} ))} {/* Logout */} Impressum Datenschutz {/* Main content */} {getActiveLabel(location.pathname)} navigate('/profile')} sx={{ p: 0 }}> A ); }