BookmarkList.jsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import React, { useState, useCallback, useEffect } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import loggerFactory from '~/utils/logger';
  5. import { withUnstatedContainers } from '../UnstatedUtils';
  6. import AppContainer from '~/client/services/AppContainer';
  7. import { toastError } from '~/client/util/apiNotification';
  8. import PaginationWrapper from '../PaginationWrapper';
  9. import Page from './Page';
  10. const logger = loggerFactory('growi:BookmarkList');
  11. const BookmarkList = (props) => {
  12. const { t, appContainer, userId } = props;
  13. const [pages, setPages] = useState([]);
  14. const [activePage, setActivePage] = useState(1);
  15. const [totalItemsCount, setTotalItemsCount] = useState(0);
  16. const [pagingLimit, setPagingLimit] = useState(10);
  17. const setPageNumber = (selectedPageNumber) => {
  18. setActivePage(selectedPageNumber);
  19. };
  20. const getMyBookmarkList = useCallback(async() => {
  21. const page = activePage;
  22. try {
  23. const res = await appContainer.apiv3Get(`/bookmarks/${userId}`, { page });
  24. const { paginationResult } = res.data;
  25. setPages(paginationResult.docs);
  26. setTotalItemsCount(paginationResult.totalDocs);
  27. setPagingLimit(paginationResult.limit);
  28. }
  29. catch (error) {
  30. logger.error('failed to fetch data', error);
  31. toastError(error, 'Error occurred in bookmark page list');
  32. }
  33. }, [appContainer, activePage, userId]);
  34. useEffect(() => {
  35. getMyBookmarkList();
  36. }, [getMyBookmarkList]);
  37. /**
  38. * generate Elements of Page
  39. *
  40. * @param {any} pages Array of pages Model Obj
  41. *
  42. */
  43. const generatePageList = pages.map(page => (
  44. <li key={`my-bookmarks:${page._id}`} className="mt-4">
  45. <Page page={page.page} />
  46. </li>
  47. ));
  48. return (
  49. <div className="bookmarks-list-container">
  50. {pages.length === 0 ? t('No bookmarks yet') : (
  51. <>
  52. <ul className="page-list-ul page-list-ul-flat mb-3">
  53. {generatePageList}
  54. </ul>
  55. <PaginationWrapper
  56. activePage={activePage}
  57. changePage={setPageNumber}
  58. totalItemsCount={totalItemsCount}
  59. pagingLimit={pagingLimit}
  60. align="center"
  61. size="sm"
  62. />
  63. </>
  64. )}
  65. </div>
  66. );
  67. };
  68. /**
  69. * Wrapper component for using unstated
  70. */
  71. const BookmarkListWrapper = withUnstatedContainers(BookmarkList, [AppContainer]);
  72. BookmarkList.propTypes = {
  73. t: PropTypes.func.isRequired,
  74. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  75. userId: PropTypes.string.isRequired,
  76. };
  77. export default withTranslation()(BookmarkListWrapper);