BookmarkList.jsx 2.9 KB

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