182 lines
No EOL
5.2 KiB
TypeScript
182 lines
No EOL
5.2 KiB
TypeScript
import { ChevronRight, People, Person } from "@mui/icons-material";
|
|
import ChevronLeft from "@mui/icons-material/ChevronLeft";
|
|
import { darken, Divider, Grid2 as Grid, IconButton, lighten, List, ListItemButton, ListItemIcon, ListItemText, SwipeableDrawer, Theme, Toolbar, Tooltip, useTheme } from "@mui/material";
|
|
import classNames from "classnames";
|
|
import { useWidth } from "../hooks/useWidth";
|
|
import { makeStyles } from "@mui/styles";
|
|
import BindaptIcon from "../products/Bindapt/BindaptIcon";
|
|
import { Link, useLocation } from "react-router-dom";
|
|
|
|
const drawerWidth = 230;
|
|
|
|
const useStyles = makeStyles((theme: Theme) => ({
|
|
sideMenu: {
|
|
position: "fixed",
|
|
height: "100%",
|
|
width: drawerWidth,
|
|
flexShrink: 0,
|
|
whiteSpace: "nowrap",
|
|
background: theme.palette.background.default
|
|
},
|
|
sideMenuOpened: {
|
|
zIndex: theme.zIndex.drawer + 2,
|
|
width: drawerWidth,
|
|
transition: theme.transitions.create(["width"], {
|
|
easing: theme.transitions.easing.sharp,
|
|
duration: theme.transitions.duration.enteringScreen
|
|
})
|
|
},
|
|
sideMenuOnClosed: {
|
|
transition: theme.transitions.create(["width", "z-index", "opacity"], {
|
|
easing: theme.transitions.easing.sharp,
|
|
duration: theme.transitions.duration.leavingScreen
|
|
}),
|
|
overflowX: "hidden",
|
|
width: theme.spacing(7),
|
|
zIndex: theme.zIndex.drawer,
|
|
opacity: 0,
|
|
[theme.breakpoints.up("md")]: {
|
|
width: theme.spacing(9),
|
|
opacity: 1
|
|
}
|
|
},
|
|
list: {
|
|
paddingTop: 0
|
|
},
|
|
listItem: {
|
|
paddingLeft: theme.spacing(2),
|
|
paddingRight: theme.spacing(2),
|
|
[theme.breakpoints.up("md")]: {
|
|
paddingLeft: theme.spacing(3),
|
|
paddingRight: theme.spacing(3)
|
|
},
|
|
},
|
|
activeItem:
|
|
theme.palette.mode === "light"
|
|
? {
|
|
background: darken(theme.palette.background.default, 0.25),
|
|
"&:hover": {
|
|
background: darken(theme.palette.background.default, 0.25)
|
|
}
|
|
}
|
|
: {
|
|
background: lighten(theme.palette.background.default, 0.25),
|
|
"&:hover": {
|
|
background: lighten(theme.palette.background.default, 0.25)
|
|
}
|
|
}
|
|
}))
|
|
|
|
interface Props {
|
|
open: boolean;
|
|
onOpen: () => void;
|
|
onClose: () => void;
|
|
}
|
|
|
|
export default function SideNavigator(props: Props) {
|
|
const { open, onOpen, onClose } = props;
|
|
const theme = useTheme();
|
|
const width = useWidth();
|
|
const classes = useStyles();
|
|
const location = useLocation();
|
|
|
|
const getClasses = (page: string) => {
|
|
if (page === "/device") {
|
|
if (location.pathname.startsWith("/device") ||
|
|
location.pathname.startsWith("/group")) {
|
|
return ({
|
|
root: `${classes.listItem} ${classes.activeItem}`
|
|
})
|
|
}
|
|
}
|
|
if (location.pathname.startsWith(page)) {
|
|
return ({
|
|
root: `${classes.listItem} ${classes.activeItem}`
|
|
})
|
|
}
|
|
return ({
|
|
root: `${classes.listItem}`
|
|
})
|
|
}
|
|
|
|
const authenticatedSideMenu = () => {
|
|
|
|
return (
|
|
<List className={classes.list} component="nav">
|
|
<Tooltip title="Devices" placement="right">
|
|
<ListItemButton
|
|
id="tour-dashboard"
|
|
component={Link}
|
|
to="/devices"
|
|
onClick={onClose}
|
|
classes={getClasses("/device")}
|
|
>
|
|
<ListItemIcon>
|
|
<BindaptIcon />
|
|
</ListItemIcon>
|
|
{open && <ListItemText primary="Devices" />}
|
|
</ListItemButton>
|
|
</Tooltip>
|
|
<Tooltip title="Teams" placement="right">
|
|
<ListItemButton
|
|
id="tour-dashboard"
|
|
component={Link}
|
|
to="/teams"
|
|
onClick={onClose}
|
|
classes={getClasses("/team")}
|
|
>
|
|
<ListItemIcon>
|
|
<People />
|
|
</ListItemIcon>
|
|
{open && <ListItemText primary="Teams" />}
|
|
</ListItemButton>
|
|
</Tooltip>
|
|
<Tooltip title="Users" placement="right">
|
|
<ListItemButton
|
|
id="tour-dashboard"
|
|
component={Link}
|
|
to="/users"
|
|
onClick={onClose}
|
|
classes={getClasses("/user")}
|
|
>
|
|
<ListItemIcon>
|
|
<Person />
|
|
</ListItemIcon>
|
|
{open && <ListItemText primary="Users" />}
|
|
</ListItemButton>
|
|
</Tooltip>
|
|
</List>
|
|
)
|
|
}
|
|
|
|
return (
|
|
<SwipeableDrawer
|
|
variant={width === "xs" || width === "sm" ? "temporary" : "permanent"}
|
|
classes={{
|
|
paper: classNames(
|
|
classes.sideMenu,
|
|
open ? classes.sideMenuOpened : classes.sideMenuOnClosed
|
|
)
|
|
}}
|
|
anchor="left"
|
|
open={open}
|
|
onOpen={onOpen}
|
|
onClose={onClose}
|
|
// disableBackdropTransition={!iOS}
|
|
// disableDiscovery={iOS}>
|
|
>
|
|
<Toolbar >
|
|
<Grid container direction="row" justifyContent={"flex-end"}>
|
|
<Grid>
|
|
<IconButton onClick={onClose} aria-label="onClose side menu">
|
|
{theme.direction === "rtl" ? <ChevronRight /> : <ChevronLeft />}
|
|
</IconButton>
|
|
</Grid>
|
|
</Grid>
|
|
</Toolbar>
|
|
<Divider />
|
|
{/* {isAuthenticated || isOffline() ? authenticatedSideMenu() : unauthenticatedSideMenu()} */}
|
|
{authenticatedSideMenu()}
|
|
</SwipeableDrawer>
|
|
);
|
|
} |