PageTimeline.tsx 2.5 KB

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