Some checks failed
No response / noResponse (push) Has been cancelled
CI / Continuous releases (push) Has been cancelled
CI / test-dev (macos-latest) (push) Has been cancelled
CI / test-dev (ubuntu-latest) (push) Has been cancelled
CI / test-dev (windows-latest) (push) Has been cancelled
Maintenance / main (push) Has been cancelled
Scorecards supply-chain security / Scorecards analysis (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
95 lines
2.4 KiB
TypeScript
95 lines
2.4 KiB
TypeScript
import * as React from 'react';
|
|
import { useTheme } from '@mui/material/styles';
|
|
import useMediaQuery from '@mui/material/useMediaQuery';
|
|
import Box from '@mui/material/Box';
|
|
import Toolbar from '@mui/material/Toolbar';
|
|
import { Outlet } from 'react-router';
|
|
import DashboardHeader from './DashboardHeader';
|
|
import DashboardSidebar from './DashboardSidebar';
|
|
import SitemarkIcon from './SitemarkIcon';
|
|
|
|
export default function DashboardLayout() {
|
|
const theme = useTheme();
|
|
|
|
const [isDesktopNavigationExpanded, setIsDesktopNavigationExpanded] =
|
|
React.useState(true);
|
|
const [isMobileNavigationExpanded, setIsMobileNavigationExpanded] =
|
|
React.useState(false);
|
|
|
|
const isOverMdViewport = useMediaQuery(theme.breakpoints.up('md'));
|
|
|
|
const isNavigationExpanded = isOverMdViewport
|
|
? isDesktopNavigationExpanded
|
|
: isMobileNavigationExpanded;
|
|
|
|
const setIsNavigationExpanded = React.useCallback(
|
|
(newExpanded: boolean) => {
|
|
if (isOverMdViewport) {
|
|
setIsDesktopNavigationExpanded(newExpanded);
|
|
} else {
|
|
setIsMobileNavigationExpanded(newExpanded);
|
|
}
|
|
},
|
|
[
|
|
isOverMdViewport,
|
|
setIsDesktopNavigationExpanded,
|
|
setIsMobileNavigationExpanded,
|
|
],
|
|
);
|
|
|
|
const handleToggleHeaderMenu = React.useCallback(
|
|
(isExpanded: boolean) => {
|
|
setIsNavigationExpanded(isExpanded);
|
|
},
|
|
[setIsNavigationExpanded],
|
|
);
|
|
|
|
const layoutRef = React.useRef<HTMLDivElement>(null);
|
|
|
|
return (
|
|
<Box
|
|
ref={layoutRef}
|
|
sx={{
|
|
position: 'relative',
|
|
display: 'flex',
|
|
overflow: 'hidden',
|
|
height: '100%',
|
|
width: '100%',
|
|
}}
|
|
>
|
|
<DashboardHeader
|
|
logo={<SitemarkIcon />}
|
|
title=""
|
|
menuOpen={isNavigationExpanded}
|
|
onToggleMenu={handleToggleHeaderMenu}
|
|
/>
|
|
<DashboardSidebar
|
|
expanded={isNavigationExpanded}
|
|
setExpanded={setIsNavigationExpanded}
|
|
container={layoutRef?.current ?? undefined}
|
|
/>
|
|
<Box
|
|
sx={{
|
|
display: 'flex',
|
|
flexDirection: 'column',
|
|
flex: 1,
|
|
minWidth: 0,
|
|
}}
|
|
>
|
|
<Toolbar sx={{ displayPrint: 'none' }} />
|
|
<Box
|
|
component="main"
|
|
sx={{
|
|
display: 'flex',
|
|
flexDirection: 'column',
|
|
flex: 1,
|
|
overflow: 'auto',
|
|
}}
|
|
>
|
|
<Outlet />
|
|
</Box>
|
|
</Box>
|
|
</Box>
|
|
);
|
|
}
|