import { forwardRef, PropsWithChildren, useCallback, useEffect, useMemo, useState, SyntheticEvent, } from 'react' import { Link } from 'react-router-dom' import CssBaseline from '@mui/material/CssBaseline' import { styled, useTheme } from '@mui/material/styles' import MuiAppBar, { AppBarProps as MuiAppBarProps } from '@mui/material/AppBar' import { ThemeProvider, createTheme } from '@mui/material/styles' import Drawer from '@mui/material/Drawer' import Toolbar from '@mui/material/Toolbar' import Box from '@mui/material/Box' import List from '@mui/material/List' import Typography from '@mui/material/Typography' import Divider from '@mui/material/Divider' import StepIcon from '@mui/material/StepIcon' import Tooltip from '@mui/material/Tooltip' import Snackbar from '@mui/material/Snackbar' import MuiAlert, { AlertProps, AlertColor } from '@mui/material/Alert' import IconButton from '@mui/material/IconButton' import MenuIcon from '@mui/icons-material/Menu' import ChevronLeftIcon from '@mui/icons-material/ChevronLeft' import ChevronRightIcon from '@mui/icons-material/ChevronRight' import ListItem from '@mui/material/ListItem' import ListItemButton from '@mui/material/ListItemButton' import ListItemIcon from '@mui/material/ListItemIcon' import ListItemText from '@mui/material/ListItemText' import Home from '@mui/icons-material/Home' import { ShellContext } from 'ShellContext' import { AlertOptions } from 'models/shell' export interface ShellProps extends PropsWithChildren {} const drawerWidth = 240 const Alert = forwardRef(function Alert( props, ref ) { return }) const Main = styled('main', { shouldForwardProp: prop => prop !== 'open' })<{ open?: boolean }>(({ theme, open }) => ({ flexGrow: 1, padding: theme.spacing(3), paddingTop: 0, transition: theme.transitions.create('margin', { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.leavingScreen, }), marginLeft: `-${drawerWidth}px`, ...(open && { transition: theme.transitions.create('margin', { easing: theme.transitions.easing.easeOut, duration: theme.transitions.duration.enteringScreen, }), marginLeft: 0, }), })) interface AppBarProps extends MuiAppBarProps { open?: boolean } const AppBar = styled(MuiAppBar, { shouldForwardProp: prop => prop !== 'open', })(({ theme, open }) => ({ transition: theme.transitions.create(['margin', 'width'], { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.leavingScreen, }), ...(open && { width: `calc(100% - ${drawerWidth}px)`, marginLeft: `${drawerWidth}px`, transition: theme.transitions.create(['margin', 'width'], { easing: theme.transitions.easing.easeOut, duration: theme.transitions.duration.enteringScreen, }), }), })) const DrawerHeader = styled('div')(({ theme }) => ({ display: 'flex', alignItems: 'center', padding: theme.spacing(0, 1), // necessary for content to be below app bar ...theme.mixins.toolbar, justifyContent: 'flex-end', })) const darkTheme = createTheme({ palette: { mode: 'dark', }, }) export const Shell = ({ children }: ShellProps) => { const theme = useTheme() const [isAlertShowing, setIsAlertShowing] = useState(false) const [isDrawerOpen, setIsDrawerOpen] = useState(false) const [doShowPeers, setDoShowPeers] = useState(false) const [alertSeverity, setAlertSeverity] = useState('info') const [title, setTitle] = useState('') const [alertText, setAlertText] = useState('') const [numberOfPeers, setNumberOfPeers] = useState(1) const showAlert = useCallback< (message: string, options?: AlertOptions) => void >((message, options) => { setAlertText(message) setAlertSeverity(options?.severity ?? 'info') setIsAlertShowing(true) }, []) const shellContextValue = useMemo( () => ({ numberOfPeers, setDoShowPeers, setNumberOfPeers, setTitle, showAlert, }), [numberOfPeers, setDoShowPeers, setNumberOfPeers, setTitle, showAlert] ) const handleAlertClose = ( _event?: SyntheticEvent | Event, reason?: string ) => { if (reason === 'clickaway') { return } setIsAlertShowing(false) } useEffect(() => { document.title = title }, [title]) const handleDrawerOpen = () => { setIsDrawerOpen(true) } const handleDrawerClose = () => { setIsDrawerOpen(false) } return ( ({ height: '100vh', display: 'flex', paddingTop: theme.spacing(7), })} > {alertText} {title} {doShowPeers ? ( ) : null} {theme.direction === 'ltr' ? ( ) : ( )}
{children}
) }