saleor-dashboard/src/components/SideBarDrawer/SideBarDrawer.tsx
Dominik Żegleń 33d680639b
Add new side menu navigation (#819)
Update snapshots

Fix savebar

Fix cypress

Update messages

Fix cypress
2020-11-18 16:11:15 +01:00

132 lines
4.1 KiB
TypeScript

import logoLight from "@assets/images/logo-sidebar-light.svg";
import { Typography } from "@material-ui/core";
import Drawer from "@material-ui/core/Drawer";
import ArrowLeftIcon from "@material-ui/icons/ArrowLeft";
import MenuIcon from "@material-ui/icons/Menu";
import classNames from "classnames";
import React from "react";
import SVG from "react-inlinesvg";
import { useIntl } from "react-intl";
import { IMenuItem } from "../AppLayout/menuStructure";
import { getConfigureMenuItem, SideBarProps } from "../SideBar/SideBar";
import SquareButton from "../SquareButton";
import MenuItemBtn from "./MenuItemBtn";
import useStyles from "./styles";
export type SideBarDrawerProps = SideBarProps;
const SideBarDrawer: React.FC<SideBarDrawerProps> = ({
menuItems,
onMenuItemClick,
renderConfigure,
user
}) => {
const [isOpened, setOpened] = React.useState(false);
const classes = useStyles({});
const intl = useIntl();
const [activeMenu, setActiveMenu] = React.useState<IMenuItem>(null);
const [showSubmenu, setShowSubmenu] = React.useState(false);
const container = React.useRef<HTMLDivElement>(null);
const configureMenuItem = getConfigureMenuItem(intl);
const handleMenuItemClick = (url: string) => {
setOpened(false);
setShowSubmenu(false);
onMenuItemClick(url);
};
const handleMenuItemWithChildrenClick = (menuItem: IMenuItem) => {
setActiveMenu(menuItem);
setShowSubmenu(true);
container.current.scrollTo({
top: 0
});
};
return (
<>
<SquareButton onClick={() => setOpened(true)}>
<MenuIcon />
</SquareButton>
<Drawer
classes={{
paper: classes.root
}}
open={isOpened}
onClose={() => setOpened(false)}
>
<div
className={classNames(classes.container, {
[classes.containerSubMenu]: showSubmenu
})}
ref={container}
>
<div
className={classNames(classes.innerContainer, {
[classes.secondaryContentActive]: showSubmenu
})}
>
<div className={classes.content}>
<SVG className={classes.logo} src={logoLight} />
{menuItems.map(menuItem => {
if (
menuItem.permission &&
!user.userPermissions
.map(perm => perm.code)
.includes(menuItem.permission)
) {
return null;
}
return (
<MenuItemBtn
menuItem={menuItem}
onClick={
menuItem.children
? () => handleMenuItemWithChildrenClick(menuItem)
: handleMenuItemClick
}
key={menuItem.ariaLabel}
/>
);
})}
{renderConfigure && (
<MenuItemBtn
menuItem={configureMenuItem}
onClick={handleMenuItemClick}
/>
)}
</div>
{activeMenu && (
<div className={classes.content}>
<div className={classes.subMenuTopBar}>
<div className={classes.activeMenuLabel}>
<SVG className={classes.icon} src={activeMenu.icon} />
<Typography className={classes.label}>
{activeMenu.label}
</Typography>
</div>
<SquareButton onClick={() => setShowSubmenu(false)}>
<ArrowLeftIcon />
</SquareButton>
</div>
{activeMenu.children.map(subMenuItem => (
<MenuItemBtn
menuItem={subMenuItem}
onClick={handleMenuItemClick}
key={subMenuItem.ariaLabel}
/>
))}
</div>
)}
</div>
</div>
</Drawer>
</>
);
};
SideBarDrawer.displayName = "SideBarDrawer";
export default SideBarDrawer;