index.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. import { Box, Container } from '@mui/material';
  2. import { useEffect } from 'react';
  3. import { connect, useDispatch, useSelector } from 'react-redux';
  4. import { Navigate, Route, Routes, useParams, useSearchParams } from 'react-router-dom';
  5. import { actionGoodById } from '../../../actions/actionGoodById';
  6. import { actionCatById } from '../../../actions/actionCatById';
  7. import { actionPromiseClear, store, actionFeedCats } from '../../../reducers';
  8. import { actionFeedAdd, actionFeedClear, actionFeedGoods, actionFeedOrders } from '../../../reducers/feedReducer';
  9. import { CProtectedRoute } from '../../common/ProtectedRoute';
  10. import { CAdminGoodPage } from '../AdminGoodPage';
  11. import { AdminGoodsPage } from '../AdminGoodsPage';
  12. import { AdminCategoriesPage } from '../AdminCategoriesPage';
  13. import { CAdminCategoryPage } from '../AdminCategoryPage';
  14. import { AdminOrdersPage } from '../AdminOrdersPage';
  15. import { CAdminOrderPage } from '../AdminOrderPage';
  16. import { actionOrderById } from '../../../actions/actionOrderById';
  17. import { actionCatAll } from '../../../actions/actionCatAll';
  18. import { actionGoodsAll } from '../../../actions/actionGoodsAll';
  19. const AdminCategoryPageContainer = ({}) => {
  20. const dispatch = useDispatch();
  21. const params = useParams();
  22. dispatch(actionGoodsAll());
  23. useEffect(() => {
  24. if (params._id) {
  25. dispatch(actionCatById({ _id: params._id, promiseName: 'adminCatById' }));
  26. } else {
  27. dispatch(actionPromiseClear('adminCatById'));
  28. }
  29. }, [params._id]);
  30. return <CAdminCategoryPage />;
  31. };
  32. const AdminCategoriesPageContainer = ({ cats }) => {
  33. const dispatch = useDispatch();
  34. const [searchParams] = useSearchParams();
  35. const orderBy = searchParams.get('orderBy') || '_id';
  36. useEffect(() => {
  37. dispatch(actionFeedClear());
  38. dispatch(actionPromiseClear('feedCatAll'));
  39. dispatch(actionPromiseClear('categoryUpsert'));
  40. dispatch(actionFeedCats({ skip: 0, orderBy }));
  41. }, [orderBy]);
  42. useEffect(() => {
  43. dispatch(actionFeedCats({ skip: cats?.length || 0, orderBy }));
  44. window.onscroll = (e) => {
  45. if (window.innerHeight + window.scrollY >= document.body.offsetHeight) {
  46. const {
  47. feed,
  48. promise: { feedCatAll },
  49. } = store.getState();
  50. if (feedCatAll.status !== 'PENDING') {
  51. dispatch(actionFeedCats(feed.payload?.length || 0, orderBy));
  52. }
  53. }
  54. };
  55. return () => {
  56. dispatch(actionFeedClear());
  57. dispatch(actionPromiseClear('feedCatAll'));
  58. dispatch(actionPromiseClear('categoryUpsert'));
  59. window.onscroll = null;
  60. };
  61. }, []);
  62. useEffect(() => {
  63. if (cats.length) dispatch(actionFeedAdd(cats));
  64. }, [cats]);
  65. return <AdminCategoriesPage orderBy={orderBy} />;
  66. };
  67. const AdminGoodPageContainer = () => {
  68. const params = useParams();
  69. const dispatch = useDispatch();
  70. dispatch(actionCatAll());
  71. useEffect(() => {
  72. if (params._id) {
  73. dispatch(actionGoodById({ _id: params._id, promiseName: 'adminGoodById' }));
  74. } else {
  75. dispatch(actionPromiseClear('adminGoodById'));
  76. }
  77. }, [params._id]);
  78. return <CAdminGoodPage />;
  79. };
  80. const AdminGoodsPageContainer = ({ goods }) => {
  81. const dispatch = useDispatch();
  82. const [searchParams] = useSearchParams();
  83. const orderBy = searchParams.get('orderBy') || '_id';
  84. useEffect(() => {
  85. dispatch(actionFeedClear());
  86. dispatch(actionPromiseClear('feedGoodsAll'));
  87. dispatch(actionPromiseClear('goodUpsert'));
  88. dispatch(actionFeedGoods({ skip: 0, orderBy }));
  89. }, [orderBy]);
  90. useEffect(() => {
  91. dispatch(actionFeedGoods({ skip: goods?.length || 0, orderBy }));
  92. window.onscroll = (e) => {
  93. if (window.innerHeight + window.scrollY >= document.body.offsetHeight) {
  94. const {
  95. feed,
  96. promise: { feedGoodsAll },
  97. } = store.getState();
  98. if (feedGoodsAll.status !== 'PENDING') {
  99. dispatch(actionFeedGoods({ skip: feed.payload?.length || 0, orderBy }));
  100. }
  101. }
  102. };
  103. return () => {
  104. dispatch(actionFeedClear());
  105. dispatch(actionPromiseClear('feedGoodsAll'));
  106. dispatch(actionPromiseClear('goodUpsert'));
  107. window.onscroll = null;
  108. };
  109. }, []);
  110. useEffect(() => {
  111. if (goods?.length) store.dispatch(actionFeedAdd(goods));
  112. }, [goods]);
  113. return <AdminGoodsPage orderBy={orderBy} />;
  114. };
  115. const AdminOrdersPageContainer = ({ orders }) => {
  116. const dispatch = useDispatch();
  117. const [searchParams] = useSearchParams();
  118. const orderBy = searchParams.get('orderBy') || '_id';
  119. useEffect(() => {
  120. dispatch(actionFeedClear());
  121. dispatch(actionPromiseClear('feedOrdersAll'));
  122. dispatch(actionPromiseClear('orderUpsert'));
  123. dispatch(actionFeedOrders({ skip: 0, orderBy }));
  124. }, [orderBy]);
  125. useEffect(() => {
  126. dispatch(actionFeedOrders({ skip: orders?.length || 0, orderBy }));
  127. window.onscroll = (e) => {
  128. if (window.innerHeight + window.scrollY >= document.body.offsetHeight) {
  129. const {
  130. feed,
  131. promise: { feedOrdersAll },
  132. } = store.getState();
  133. if (feedOrdersAll.status !== 'PENDING') {
  134. dispatch(actionFeedOrders({ skip: feed.payload?.length || 0, orderBy }));
  135. }
  136. }
  137. };
  138. return () => {
  139. dispatch(actionFeedClear());
  140. dispatch(actionPromiseClear('feedOrdersAll'));
  141. dispatch(actionPromiseClear('orderUpsert'));
  142. window.onscroll = null;
  143. };
  144. }, []);
  145. useEffect(() => {
  146. if (orders?.length) store.dispatch(actionFeedAdd(orders));
  147. }, [orders]);
  148. return <AdminOrdersPage orderBy={orderBy} />;
  149. };
  150. const AdminOrderPageContainer = () => {
  151. const params = useParams();
  152. const dispatch = useDispatch();
  153. dispatch(actionPromiseClear('adminOrderById'));
  154. useEffect(() => {
  155. if (params._id) {
  156. dispatch(actionOrderById({ _id: params._id, promiseName: 'adminOrderById' }));
  157. } else {
  158. dispatch(actionOrderById('adminOrderById'));
  159. }
  160. }, [params._id]);
  161. return <CAdminOrderPage />;
  162. };
  163. const CAdminGoodsPageContainer = connect((state) => ({ goods: state.promise?.feedGoodsAll?.payload || [] }))(
  164. AdminGoodsPageContainer
  165. );
  166. const CAdminOrdersPageContainer = connect((state) => ({ orders: state.promise?.feedOrdersAll?.payload || [] }))(
  167. AdminOrdersPageContainer
  168. );
  169. const CAdminCategoriesPageContainer = connect((state) => ({ cats: state.promise?.feedCatAll?.payload || [] }))(
  170. AdminCategoriesPageContainer
  171. );
  172. const AdminLayoutPage = () => {
  173. return (
  174. <Box className="AdminLayoutPage">
  175. <Routes>
  176. <Route path="/" element={<Navigate to={'/admin/goods/'} />} exact />
  177. <Route path="/goods/" element={<CAdminGoodsPageContainer />} />
  178. <Route path="/good/" element={<AdminGoodPageContainer />} />
  179. <Route path="/good/:_id" element={<AdminGoodPageContainer />} />
  180. <Route path="/categories/" element={<CAdminCategoriesPageContainer />} />
  181. <Route path="/category/" element={<AdminCategoryPageContainer />} />
  182. <Route path="/category/:_id" element={<AdminCategoryPageContainer />} />
  183. <Route path="/orders/" element={<CAdminOrdersPageContainer />} />
  184. <Route path="/order/" element={<AdminOrderPageContainer />} />
  185. <Route path="/order/:_id" element={<AdminOrderPageContainer />} />
  186. </Routes>
  187. </Box>
  188. );
  189. };
  190. export { AdminLayoutPage };