import React, { FC, useCallback, useRef, useState } from "react"; import clsx from "clsx"; import { createStyles, makeStyles, useTheme, Theme, } from "@material-ui/core/styles"; import Drawer from "@material-ui/core/Drawer"; import AppBar from "@material-ui/core/AppBar"; import Toolbar from "@material-ui/core/Toolbar"; import CssBaseline from "@material-ui/core/CssBaseline"; import Typography from "@material-ui/core/Typography"; import Divider from "@material-ui/core/Divider"; import IconButton from "@material-ui/core/IconButton"; import MenuIcon from "@material-ui/icons/Menu"; import ChevronLeftIcon from "@material-ui/icons/ChevronLeft"; import ChevronRightIcon from "@material-ui/icons/ChevronRight"; import { ProjectPanel } from "../projects/project-panel"; import { HeaderContainerProvider } from "./header-container"; const drawerWidth = 240; const useStyles = makeStyles((theme: Theme) => createStyles({ root: { display: "flex", overflow: "hidden", }, appBar: { zIndex: theme.zIndex.drawer + 1, transition: theme.transitions.create(["width", "margin"], { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.leavingScreen, }), }, appBarShift: { marginLeft: drawerWidth, width: `calc(100% - ${drawerWidth}px)`, transition: theme.transitions.create(["width", "margin"], { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.enteringScreen, }), }, menuButton: { marginRight: 36, }, hide: { display: "none", }, drawer: { width: drawerWidth, flexShrink: 0, whiteSpace: "nowrap", }, drawerOpen: { width: drawerWidth, transition: theme.transitions.create("width", { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.enteringScreen, }), }, drawerClose: { transition: theme.transitions.create("width", { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.leavingScreen, }), overflowX: "hidden", width: 0, }, toolbar: { display: "flex", alignItems: "center", justifyContent: "flex-end", padding: theme.spacing(0, 1), flex: "none", // necessary for content to be below app bar ...theme.mixins.toolbar, }, headerContaner: { flex: "auto", }, content: { flexGrow: 1, height: "100vh", display: "flex", flexFlow: "column", padding: theme.spacing(0), }, }) ); export const DefaultLayout: FC = ({ children }) => { const classes = useStyles(); const theme = useTheme(); const [open, setOpen] = React.useState(true); const handleDrawerOpen = () => { setOpen(true); }; const handleDrawerClose = () => { setOpen(false); }; const [headerContainer, setHeaderContainer] = useState(undefined); const onRefChange = useCallback( (node) => { setHeaderContainer(node); }, [setHeaderContainer] ); return (