PageList.jsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import React, { useEffect, useCallback, useState } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import Page from './PageList/Page';
  5. import { withUnstatedContainers } from './UnstatedUtils';
  6. import AppContainer from '../services/AppContainer';
  7. import PageContainer from '../services/PageContainer';
  8. import PaginationWrapper from './PaginationWrapper';
  9. const PageList = (props) => {
  10. const { appContainer, pageContainer, t } = props;
  11. const { path } = pageContainer.state;
  12. const [pages, setPages] = useState(null);
  13. const [isLoading, setIsLoading] = useState(false);
  14. const [activePage, setActivePage] = useState(1);
  15. const [totalPages, setTotalPages] = useState(0);
  16. const [limit, setLimit] = useState(appContainer.getConfig().recentCreatedLimit);
  17. const [offset, setOffset] = useState(0);
  18. function setPageNumber(selectedPageNumber) {
  19. setActivePage(selectedPageNumber);
  20. setOffset((selectedPageNumber - 1) * limit);
  21. }
  22. const updatePageList = useCallback(async() => {
  23. const res = await appContainer.apiv3Get('/pages/list', { path, limit, offset });
  24. setPages(res.data.pages);
  25. setIsLoading(true);
  26. setTotalPages(res.data.totalCount);
  27. setLimit(res.data.limit);
  28. setOffset(res.data.offset);
  29. }, [appContainer, path, limit, offset]);
  30. useEffect(() => {
  31. updatePageList();
  32. }, [updatePageList]);
  33. if (isLoading === false) {
  34. return (
  35. <div className="wiki">
  36. <div className="text-muted test-center">
  37. <i className="fa fa-2x fa-spinner fa-pulse mr-1"></i>
  38. </div>
  39. </div>
  40. );
  41. }
  42. const pageList = pages.map(page => (
  43. <li key={page._id} className="mb-3">
  44. <Page page={page} />
  45. </li>
  46. ));
  47. if (pageList.length === 0) {
  48. return (
  49. <div className="mt-2">
  50. {/* eslint-disable-next-line react/no-danger */}
  51. <p dangerouslySetInnerHTML={{ __html: t('custom_navigation.no_page_list', { path }) }} />
  52. </div>
  53. );
  54. }
  55. return (
  56. <div className="page-list-container-create">
  57. <ul className="page-list-ul page-list-ul-flat ml-n4">
  58. {pageList}
  59. </ul>
  60. <PaginationWrapper
  61. activePage={activePage}
  62. changePage={setPageNumber}
  63. totalItemsCount={totalPages}
  64. pagingLimit={limit}
  65. align="center"
  66. />
  67. </div>
  68. );
  69. };
  70. const PageListWrapper = withUnstatedContainers(PageList, [AppContainer, PageContainer]);
  71. const PageListTranslation = withTranslation()(PageListWrapper);
  72. PageList.propTypes = {
  73. t: PropTypes.func.isRequired, // i18next
  74. appContainer: PropTypes.instanceOf(AppContainer),
  75. pageContainer: PropTypes.instanceOf(PageContainer),
  76. };
  77. export default PageListTranslation;