frontend/src/navigation/SideNavigator.tsx

241 lines
No EOL
6.7 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";
import BinsIcon from "products/Bindapt/BinsIcon";
import { useGlobalState } from "providers";
import {
// hasTutorialPlaylist,
// IsAdaptiveAgriculture,
// IsAdCon,
// isBXT,
IsMiVent,
// IsOmniAir
} from "services/whiteLabel";
import MiningIcon from "products/ventilation/MiningIcon";
import { useAuth0 } from "@auth0/auth0-react";
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 { isAuthenticated } = useAuth0()
const theme = useTheme();
const width = useWidth();
const classes = useStyles();
const location = useLocation();
const [{ user }] = useGlobalState()
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 = () => {
const isMiVent = IsMiVent();
return (
<List className={classes.list} component="nav">
<Tooltip title="Bins" placement="right">
<ListItemButton
id="tour-dashboard"
component={Link}
to="/bins"
onClick={onClose}
classes={getClasses("/bin")}
>
<ListItemIcon>
<BinsIcon height={"26px"}/>
</ListItemIcon>
{open && <ListItemText primary="Bins" />}
</ListItemButton>
</Tooltip>
<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>
{(isMiVent || user.hasFeature("admin")) && (
<Tooltip title="Mines" placement="right">
<ListItemButton
id="tour-dashboard"
component={Link}
to="/mines"
onClick={onClose}
classes={getClasses("/mine")}
>
<ListItemIcon>
<MiningIcon height={"26px"} width={"26px"} />
</ListItemIcon>
{open && <ListItemText primary="Mines" />}
</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()} */}
{isAuthenticated && authenticatedSideMenu()}
</SwipeableDrawer>
);
}