Files
DevToysWeb/src/components/layout/DrawerCollapseItem.tsx
rusconn 55fd4a6473 perf(dev): speed up dev server
Avoid compiling the entire of mui library by using babel.
2023-05-28 23:55:37 +09:00

56 lines
1.6 KiB
TypeScript

import { ExpandLess, ExpandMore } from "@mui/icons-material";
import { Collapse, List, ListItemButton, ListItemText } from "@mui/material";
import equal from "fast-deep-equal";
import { ComponentPropsWithoutRef, memo, MouseEventHandler, useCallback, useState } from "react";
import DrawerItem from "./DrawerItem";
import DrawerItemIcon from "./DrawerItemIcon";
type ContainerProps = {
title: string;
tools: ComponentPropsWithoutRef<typeof DrawerItem>[];
} & ComponentPropsWithoutRef<typeof DrawerItemIcon>;
type Props = {
open: boolean;
onClick: MouseEventHandler<HTMLDivElement>;
} & ContainerProps;
const StyledComponent = ({ icon, title, tools, open, onClick }: Props) => (
<>
<ListItemButton {...{ onClick }}>
<DrawerItemIcon {...{ icon }} />
<ListItemText primary={title} />
{open ? <ExpandLess /> : <ExpandMore />}
</ListItemButton>
<Collapse in={open} timeout="auto" unmountOnExit>
<List component="div" disablePadding>
{tools.map(tool => (
<DrawerItem
key={tool.title}
icon={tool.icon}
title={tool.title}
href={tool.href}
disabled={tool.disabled}
subItem
/>
))}
</List>
</Collapse>
</>
);
export const Component = memo(StyledComponent, equal);
const Container = ({ icon, title, tools }: ContainerProps) => {
const [open, setOpen] = useState(false);
const onClick = useCallback(() => {
setOpen(!open);
}, [open]);
return <Component {...{ icon, title, tools, open, onClick }} />;
};
export default Container;