index.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import { Box, Grid } from "@mui/material";
  2. import { useEffect } from "react";
  3. import { connect } from "react-redux";
  4. import { Navigate, Route, Routes, useLocation, useParams } from "react-router-dom";
  5. import { actionGoodById } from "../../actions/actionGoodById";
  6. import { actionGoodsPopular } from "../../actions/actionGoodsPopular";
  7. import { actionOrders } from "../../actions/actionOrders";
  8. import { AdminLayoutPage } from "../admin/AdminLayoutPage";
  9. import { CCartPage } from "../CartPage";
  10. import { CProtectedRoute } from "../common/ProtectedRoute";
  11. import { CDashboardPage } from "../DashboardPage";
  12. import { GoodPage } from "../GoodPage";
  13. import { Aside } from "../layout/Aside";
  14. import Content from "../layout/Content";
  15. import { Footer } from "../layout/Footer";
  16. import { Header } from "../layout/Header";
  17. import { MainPage } from "../MainPage";
  18. import { CAdminGoodsPageContainer } from "./GoodsPageContainer";
  19. import { CAdminGoodsSearchPageContainer } from "./GoodsSearchPageContainer";
  20. const GoodPageContainer = ({ onLoad, onUnmount }) => {
  21. const params = useParams();
  22. useEffect(() => {
  23. onLoad({ _id: params._id });
  24. return () => {
  25. onUnmount && onUnmount();
  26. };
  27. }, []);
  28. return <GoodPage />;
  29. };
  30. const CGoodPageContainer = connect(null, {
  31. onLoad: ({ _id }) => actionGoodById({ _id }),
  32. })(GoodPageContainer);
  33. const DashboardPageContainer = ({ onLoad }) => {
  34. useEffect(() => {
  35. onLoad();
  36. }, []);
  37. return <CDashboardPage />;
  38. };
  39. const CDashboardPageContainer = connect(null, {
  40. onLoad: () => actionOrders(),
  41. })(DashboardPageContainer);
  42. const MainPageContainer = ({ onLoad, goods }) => {
  43. useEffect(() => {
  44. onLoad();
  45. }, []);
  46. return <MainPage goods={goods || []} />;
  47. };
  48. const CMainPageContainer = connect((state) => ({ goods: state.promise?.goodsPopular?.payload || [] }), {
  49. onLoad: () => actionGoodsPopular(),
  50. })(MainPageContainer);
  51. export const LayoutPage = () => {
  52. const location = useLocation();
  53. return (
  54. <Box className="LayoutPage">
  55. <Header />
  56. <Grid container columns={14} rows={1}>
  57. {!!location.pathname.match(/(\/categor)|(\/good)|(\/order)|(\/admin)+/) && (
  58. <Grid xs={3} item>
  59. <Aside />
  60. </Grid>
  61. )}
  62. <Grid xs={location.pathname.match(/(\/categor)|(\/good)|(\/order)|(\/admin)+/) ? 11 : 14} item>
  63. <Content>
  64. <Routes>
  65. <Route path="/" exact element={<CMainPageContainer />} />
  66. <Route
  67. path="/cart"
  68. exact
  69. element={
  70. <CProtectedRoute roles={["active"]} fallback="/auth">
  71. <CCartPage />
  72. </CProtectedRoute>
  73. }
  74. />
  75. {/* <Route path="/search/:searchData/" element={<CGoodsListContainer />} exact /> */}
  76. <Route path="/category/:_id" element={<CAdminGoodsPageContainer />} />
  77. <Route path="/good/:_id" element={<CGoodPageContainer />} />
  78. <Route path="/goods/search" element={<CAdminGoodsSearchPageContainer />} />
  79. <Route
  80. path="/admin/*"
  81. exact
  82. element={
  83. <CProtectedRoute roles={["admin"]} fallback="/auth">
  84. <AdminLayoutPage />
  85. </CProtectedRoute>
  86. }
  87. />
  88. <Route
  89. path="/dashboard/"
  90. exact
  91. element={
  92. <CProtectedRoute roles={["active"]} fallback="/">
  93. <CDashboardPageContainer />
  94. </CProtectedRoute>
  95. }
  96. />
  97. <Route path="*" element={<Navigate to="/404" />} />
  98. </Routes>
  99. </Content>
  100. </Grid>
  101. </Grid>
  102. <Footer />
  103. </Box>
  104. );
  105. };