PageTimeline.tsx 2.5 KB

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