index.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { useEffect, useState } from "react";
  2. import { Outlet } from "react-router-dom";
  3. import { useDispatch, useSelector } from "react-redux";
  4. // material-ui
  5. import { useTheme } from "@mui/material/styles";
  6. import { useMediaQuery, Box, Container, Toolbar } from "@mui/material";
  7. // project import
  8. import Drawer from "./Drawer";
  9. import Header from "./Header";
  10. import Footer from "./Footer";
  11. import navigation from "@/menu-items";
  12. import useConfig from "@/hooks/useConfig";
  13. import Breadcrumbs from "@/components/@extended/Breadcrumbs";
  14. // types
  15. import { RootStateProps } from "@/types/root";
  16. import { openDrawer } from "@/store/reducers/menu";
  17. // ==============================|| MAIN LAYOUT ||============================== //
  18. const MainLayout = () => {
  19. const theme = useTheme();
  20. const matchDownLG = useMediaQuery(theme.breakpoints.down("xl"));
  21. const { container, miniDrawer } = useConfig();
  22. const dispatch = useDispatch();
  23. const menu = useSelector((state: RootStateProps) => state.menu);
  24. const { drawerOpen } = menu;
  25. // drawer toggler
  26. const [open, setOpen] = useState(!miniDrawer || drawerOpen);
  27. const handleDrawerToggle = () => {
  28. setOpen(!open);
  29. dispatch(openDrawer({ drawerOpen: !open }));
  30. };
  31. // set media wise responsive drawer
  32. useEffect(() => {
  33. if (!miniDrawer) {
  34. setOpen(!matchDownLG);
  35. dispatch(openDrawer({ drawerOpen: !matchDownLG }));
  36. }
  37. // eslint-disable-next-line react-hooks/exhaustive-deps
  38. }, [matchDownLG]);
  39. // useEffect(() => {
  40. // if (open !== drawerOpen) setOpen(drawerOpen);
  41. // // eslint-disable-next-line react-hooks/exhaustive-deps
  42. // }, [drawerOpen]);
  43. return (
  44. <Box sx={{ display: "flex", width: "100%" }}>
  45. <Header open={open} handleDrawerToggle={handleDrawerToggle} />
  46. <Drawer open={open} handleDrawerToggle={handleDrawerToggle} />
  47. <Box component="main" sx={{ width: "calc(100% - 260px)", flexGrow: 1, p: { xs: 2, sm: 3 } }}>
  48. <Toolbar />
  49. {container && (
  50. <Container
  51. maxWidth="xl"
  52. sx={{
  53. px: { xs: 0, sm: 2 },
  54. position: "relative",
  55. minHeight: "calc(100vh - 110px)",
  56. display: "flex",
  57. flexDirection: "column"
  58. }}
  59. >
  60. <Breadcrumbs navigation={navigation} title titleBottom card={false} divider={false} />
  61. <Outlet />
  62. <Footer />
  63. </Container>
  64. )}
  65. {!container && (
  66. <Box
  67. sx={{ position: "relative", minHeight: "calc(100vh - 110px)", display: "flex", flexDirection: "column" }}
  68. >
  69. <Breadcrumbs navigation={navigation} title titleBottom card={false} divider={false} />
  70. <Outlet />
  71. <Footer />
  72. </Box>
  73. )}
  74. </Box>
  75. </Box>
  76. );
  77. };
  78. export default MainLayout;