PageList.jsx 2.7 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 '~/client/services/AppContainer';
  7. import PageContainer from '~/client/services/PageContainer';
  8. import { toastError } from '~/client/util/apiNotification';
  9. import { useSWRxPageList } from '~/stores/page';
  10. import PaginationWrapper from './PaginationWrapper';
  11. const PageList = (props) => {
  12. const { appContainer, pageContainer, t } = props;
  13. const { path } = pageContainer.state;
  14. const [activePage, setActivePage] = useState(1);
  15. const { data: pagesListData, error } = useSWRxPageList(path, activePage);
  16. function setPageNumber(selectedPageNumber) {
  17. setActivePage(selectedPageNumber);
  18. }
  19. // TODO: To be implemented in #79549
  20. if (error != null) {
  21. // toastError(error, 'Error occurred in PageList');
  22. // eslint-disable-next-line no-console
  23. console.log(error, 'Error occurred in PageList');
  24. }
  25. if (pagesListData == null) {
  26. return (
  27. <div className="wiki">
  28. <div className="text-muted text-center">
  29. <i className="fa fa-2x fa-spinner fa-pulse mr-1"></i>
  30. </div>
  31. </div>
  32. );
  33. }
  34. const liClasses = props.liClasses.join(' ');
  35. const pageList = pagesListData.items.map(page => (
  36. <li key={page._id} className={liClasses}>
  37. <Page page={page} />
  38. </li>
  39. ));
  40. if (pageList.length === 0) {
  41. return (
  42. <div className="mt-2">
  43. {/* eslint-disable-next-line react/no-danger */}
  44. <p>{t('custom_navigation.no_page_list')}</p>
  45. </div>
  46. );
  47. }
  48. if (appContainer.config.disableLinkSharing) {
  49. return (
  50. <div className="mt-2">
  51. {/* eslint-disable-next-line react/no-danger */}
  52. <p>{t('custom_navigation.link_sharing_is_disabled')}</p>
  53. </div>
  54. );
  55. }
  56. return (
  57. <div className="page-list">
  58. <ul className="page-list-ul page-list-ul-flat">
  59. {pageList}
  60. </ul>
  61. <PaginationWrapper
  62. activePage={activePage}
  63. changePage={setPageNumber}
  64. totalItemsCount={pagesListData.totalCount}
  65. pagingLimit={pagesListData.limit}
  66. align="center"
  67. />
  68. </div>
  69. );
  70. };
  71. const PageListWrapper = withUnstatedContainers(PageList, [AppContainer, PageContainer]);
  72. const PageListTranslation = withTranslation()(PageListWrapper);
  73. PageList.propTypes = {
  74. t: PropTypes.func.isRequired, // i18next
  75. appContainer: PropTypes.instanceOf(AppContainer),
  76. pageContainer: PropTypes.instanceOf(PageContainer),
  77. liClasses: PropTypes.arrayOf(PropTypes.string),
  78. };
  79. PageList.defaultProps = {
  80. liClasses: ['mb-3'],
  81. };
  82. export default PageListTranslation;