2
0

PageTimeline.tsx 2.4 KB

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