Spaces:
Sleeping
Sleeping
File size: 3,265 Bytes
a247911 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | import Inventory2OutlinedIcon from '@mui/icons-material/Inventory2Outlined';
import LogoutIcon from '@mui/icons-material/Logout';
import ReceiptLongOutlinedIcon from '@mui/icons-material/ReceiptLongOutlined';
import SpaceDashboardOutlinedIcon from '@mui/icons-material/SpaceDashboardOutlined';
import {
AppBar,
Box,
Button,
Chip,
Container,
Divider,
Drawer,
List,
ListItemButton,
ListItemIcon,
ListItemText,
Toolbar,
Typography
} from '@mui/material';
import { NavLink, Outlet, useLocation } from 'react-router-dom';
import { useAuth } from '../context/AuthContext';
const drawerWidth = 260;
const navItems = [
{ label: 'Dashboard', path: '/app', icon: <SpaceDashboardOutlinedIcon /> },
{ label: 'Products', path: '/app/products', icon: <Inventory2OutlinedIcon /> },
{ label: 'Orders', path: '/app/orders', icon: <ReceiptLongOutlinedIcon /> }
];
export function AppShell() {
const { role, logout } = useAuth();
const location = useLocation();
const drawer = (
<Box sx={{ height: '100%', display: 'flex', flexDirection: 'column' }}>
<Box sx={{ p: 3 }}>
<Typography variant="h5" fontWeight={800}>
RTOPP
</Typography>
<Typography variant="body2" color="text.secondary">
Real-Time Order Processing
</Typography>
</Box>
<Divider />
<List sx={{ px: 1.5, flex: 1 }}>
{navItems.map((item) => (
<ListItemButton
key={item.path}
component={NavLink}
to={item.path}
selected={location.pathname === item.path}
sx={{ borderRadius: 2, mb: 0.5 }}
>
<ListItemIcon>{item.icon}</ListItemIcon>
<ListItemText primary={item.label} />
</ListItemButton>
))}
</List>
<Box sx={{ p: 2 }}>
<Button fullWidth variant="outlined" startIcon={<LogoutIcon />} onClick={logout}>
Logout
</Button>
</Box>
</Box>
);
return (
<Box sx={{ display: 'flex', minHeight: '100vh', bgcolor: 'background.default' }}>
<AppBar
position="fixed"
color="inherit"
elevation={0}
sx={{ width: { md: `calc(100% - ${drawerWidth}px)` }, ml: { md: `${drawerWidth}px` }, borderBottom: 1, borderColor: 'divider' }}
>
<Toolbar sx={{ justifyContent: 'space-between' }}>
<Box>
<Typography variant="h6" fontWeight={700}>
Operations Dashboard
</Typography>
<Typography variant="caption" color="text.secondary">
Manage products, orders and live fulfilment updates
</Typography>
</Box>
<Chip label={role ?? 'GUEST'} color={role === 'ADMIN' ? 'primary' : 'secondary'} />
</Toolbar>
</AppBar>
<Drawer
variant="permanent"
sx={{
width: drawerWidth,
flexShrink: 0,
display: { xs: 'none', md: 'block' },
'& .MuiDrawer-paper': { width: drawerWidth, boxSizing: 'border-box' }
}}
>
{drawer}
</Drawer>
<Box component="main" sx={{ flexGrow: 1, pt: 11, pb: 5 }}>
<Container maxWidth="xl">
<Outlet />
</Container>
</Box>
</Box>
);
}
|