RecentCreated.tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import React, { useState, useCallback, useEffect } from 'react';
  2. import type { IPageHasId } from '@growi/core';
  3. import { apiv3Get } from '~/client/util/apiv3-client';
  4. import { toastError } from '~/client/util/toastr';
  5. import loggerFactory from '~/utils/logger';
  6. import { PageListItemS } from '../PageList/PageListItemS';
  7. import PaginationWrapper from '../PaginationWrapper';
  8. const logger = loggerFactory('growi:RecentCreated');
  9. type RecentCreatedProps = {
  10. userId: string,
  11. }
  12. export const RecentCreated = (props: RecentCreatedProps): JSX.Element => {
  13. const { userId } = props;
  14. const [pages, setPages] = useState<IPageHasId[]>([]);
  15. const [activePage, setActivePage] = useState(1);
  16. const [totalPages, setTotalPages] = useState(0);
  17. const [pagingLimit, setPagingLimit] = useState(10);
  18. const getMyRecentCreatedList = useCallback(async(selectedPage) => {
  19. const page = selectedPage;
  20. try {
  21. const res = await apiv3Get(`/users/${userId}/recent`, { page });
  22. const { totalCount, pages, limit } = res.data;
  23. setPages(pages);
  24. setActivePage(selectedPage);
  25. setTotalPages(totalCount);
  26. setPagingLimit(limit);
  27. }
  28. catch (error) {
  29. logger.error('failed to fetch data', error);
  30. toastError(error);
  31. }
  32. }, [userId]);
  33. useEffect(() => {
  34. getMyRecentCreatedList(1);
  35. }, [getMyRecentCreatedList]);
  36. const handlePage = useCallback(async(selectedPage) => {
  37. await getMyRecentCreatedList(selectedPage);
  38. }, [getMyRecentCreatedList]);
  39. return (
  40. <div className="page-list-container-create">
  41. <ul className="page-list-ul page-list-ul-flat mb-3">
  42. {pages.map(page => (
  43. <li key={`recent-created:list-view:${page._id}`} className="mt-4">
  44. <PageListItemS page={page} />
  45. </li>
  46. ))}
  47. </ul>
  48. <PaginationWrapper
  49. activePage={activePage}
  50. changePage={handlePage}
  51. totalItemsCount={totalPages}
  52. pagingLimit={pagingLimit}
  53. align="center"
  54. size="sm"
  55. />
  56. </div>
  57. );
  58. };