PageList.jsx 2.6 KB

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