PageTimeline.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import React, { useEffect, useState, useCallback } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import { apiv3Get } from '~/client/util/apiv3-client';
  4. import { IPageHasId } from '~/interfaces/page';
  5. import { useCurrentPagePath } from '~/stores/context';
  6. import { useTimelineOptions } from '~/stores/renderer';
  7. import RevisionLoader from './Page/RevisionLoader';
  8. import PaginationWrapper from './PaginationWrapper';
  9. export const PageTimeline = (): JSX.Element => {
  10. const [activePage, setActivePage] = useState(1);
  11. const [totalPageItems, setTotalPageItems] = useState(0);
  12. const [limit, setLimit] = useState(10);
  13. const [pages, setPages] = useState<IPageHasId[] | null>(null);
  14. const { data: currentPagePath } = useCurrentPagePath();
  15. const { t } = useTranslation();
  16. const { data: rendererOptions } = useTimelineOptions();
  17. const handlePage = useCallback(async(selectedPage: number) => {
  18. if (currentPagePath == null) { return }
  19. const res = await apiv3Get('/pages/list', { path: currentPagePath, selectedPage });
  20. setTotalPageItems(res.data.totalCount);
  21. setPages(res.data.pages);
  22. setLimit(res.data.limit);
  23. setActivePage(selectedPage);
  24. }, [currentPagePath]);
  25. useEffect(() => {
  26. handlePage(1);
  27. }, [handlePage]);
  28. if (rendererOptions == null) {
  29. return <></>;
  30. }
  31. if (pages == null || pages.length === 0) {
  32. return (
  33. <div className="mt-2">
  34. {/* eslint-disable-next-line react/no-danger */}
  35. <p>{t('custom_navigation.no_page_list')}</p>
  36. </div>
  37. );
  38. }
  39. return (
  40. <div>
  41. { pages.map((page) => {
  42. return (
  43. <div className="timeline-body" key={`key-${page._id}`}>
  44. <div className="card card-timeline">
  45. <div className="card-header"><a href={page.path}>{page.path}</a></div>
  46. <div className="card-body">
  47. <RevisionLoader
  48. lazy
  49. rendererOptions={rendererOptions}
  50. pageId={page._id}
  51. pagePath={page.path}
  52. revisionId={page.revision}
  53. />
  54. </div>
  55. </div>
  56. </div>
  57. );
  58. }) }
  59. <PaginationWrapper
  60. activePage={activePage}
  61. changePage={handlePage}
  62. totalItemsCount={totalPageItems}
  63. pagingLimit={limit}
  64. align="center"
  65. />
  66. </div>
  67. );
  68. };