PageContents.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import React, { useEffect } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import { useUpdateStateAfterSave } from '~/client/services/page-operation';
  4. import { useDrawioModalLauncherForView } from '~/client/services/side-effects/drawio-modal-launcher-for-view';
  5. import { useHandsontableModalLauncherForView } from '~/client/services/side-effects/handsontable-modal-launcher-for-view';
  6. import { toastSuccess, toastError } from '~/client/util/toastr';
  7. import { useSWRxCurrentPage } from '~/stores/page';
  8. import { useViewOptions } from '~/stores/renderer';
  9. import { registerGrowiFacade } from '~/utils/growi-facade';
  10. import loggerFactory from '~/utils/logger';
  11. import RevisionRenderer from './RevisionRenderer';
  12. const logger = loggerFactory('growi:Page');
  13. export const PageContents = (): JSX.Element => {
  14. const { t } = useTranslation();
  15. const { data: currentPage } = useSWRxCurrentPage();
  16. const updateStateAfterSave = useUpdateStateAfterSave(currentPage?._id);
  17. const { data: rendererOptions, mutate: mutateRendererOptions } = useViewOptions();
  18. // register to facade
  19. useEffect(() => {
  20. registerGrowiFacade({
  21. markdownRenderer: {
  22. optionsMutators: {
  23. viewOptionsMutator: mutateRendererOptions,
  24. },
  25. },
  26. });
  27. }, [mutateRendererOptions]);
  28. useHandsontableModalLauncherForView({
  29. onSaveSuccess: () => {
  30. toastSuccess(t('toaster.save_succeeded'));
  31. updateStateAfterSave?.();
  32. },
  33. onSaveError: (error) => {
  34. toastError(error);
  35. },
  36. });
  37. useDrawioModalLauncherForView({
  38. onSaveSuccess: () => {
  39. toastSuccess(t('toaster.save_succeeded'));
  40. updateStateAfterSave?.();
  41. },
  42. onSaveError: (error) => {
  43. toastError(error);
  44. },
  45. });
  46. if (currentPage == null || rendererOptions == null) {
  47. const entries = Object.entries({
  48. currentPage, rendererOptions,
  49. })
  50. .map(([key, value]) => [key, value == null ? 'null' : undefined])
  51. .filter(([, value]) => value != null);
  52. logger.warn('Some of materials are missing.', Object.fromEntries(entries));
  53. return <></>;
  54. }
  55. const { _id: revisionId, body: markdown } = currentPage.revision;
  56. return (
  57. <>
  58. { revisionId != null && (
  59. <RevisionRenderer rendererOptions={rendererOptions} markdown={markdown} />
  60. )}
  61. </>
  62. );
  63. };