RecentCreated.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import React, { type JSX, useCallback, useEffect, useState } 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(
  19. async (selectedPage) => {
  20. const page = selectedPage;
  21. try {
  22. const res = await apiv3Get(`/users/${userId}/recent`, { page });
  23. const { totalCount, pages, limit } = res.data;
  24. setPages(pages);
  25. setActivePage(selectedPage);
  26. setTotalPages(totalCount);
  27. setPagingLimit(limit);
  28. } catch (error) {
  29. logger.error('failed to fetch data', error);
  30. toastError(error);
  31. }
  32. },
  33. [userId],
  34. );
  35. useEffect(() => {
  36. getMyRecentCreatedList(1);
  37. }, [getMyRecentCreatedList]);
  38. const handlePage = useCallback(
  39. async (selectedPage) => {
  40. await getMyRecentCreatedList(selectedPage);
  41. },
  42. [getMyRecentCreatedList],
  43. );
  44. return (
  45. <div className="page-list-container-create">
  46. <ul className="page-list-ul page-list-ul-flat mb-3">
  47. {pages.map((page) => (
  48. <li key={`recent-created:list-view:${page._id}`} className="mt-4">
  49. <PageListItemS page={page} />
  50. </li>
  51. ))}
  52. </ul>
  53. <PaginationWrapper
  54. activePage={activePage}
  55. changePage={handlePage}
  56. totalItemsCount={totalPages}
  57. pagingLimit={pagingLimit}
  58. align="center"
  59. size="sm"
  60. />
  61. </div>
  62. );
  63. };