PageList.jsx 2.7 KB

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