PagePresentationModal.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import React from 'react';
  2. import type { PresentationProps } from '@growi/presentation';
  3. import dynamic from 'next/dynamic';
  4. import type { ReactMarkdownOptions } from 'react-markdown/lib/react-markdown';
  5. import {
  6. Modal, ModalBody,
  7. } from 'reactstrap';
  8. import { usePagePresentationModal } from '~/stores/modal';
  9. import { useSWRxCurrentPage } from '~/stores/page';
  10. import { usePresentationViewOptions } from '~/stores/renderer';
  11. import { useNextThemes } from '~/stores/use-next-themes';
  12. import styles from './PagePresentationModal.module.scss';
  13. const Presentation = dynamic<PresentationProps>(() => import('@growi/presentation').then(mod => mod.Presentation), {
  14. ssr: false,
  15. loading: () => (
  16. <i className="fa fa-4x fa-spinner fa-pulse text-muted"></i>
  17. ),
  18. });
  19. const PagePresentationModal = (): JSX.Element => {
  20. const { data: presentationModalData, close: closePresentationModal } = usePagePresentationModal();
  21. const { isDarkMode } = useNextThemes();
  22. const { data: currentPage } = useSWRxCurrentPage();
  23. const { data: rendererOptions } = usePresentationViewOptions();
  24. const isOpen = presentationModalData?.isOpened ?? false;
  25. if (!isOpen) {
  26. return <></>;
  27. }
  28. const markdown = currentPage?.revision.body;
  29. return (
  30. <Modal
  31. isOpen={isOpen}
  32. toggle={closePresentationModal}
  33. data-testid="page-presentation-modal"
  34. className={`grw-presentation-modal ${styles['grw-presentation-modal']}`}
  35. >
  36. <button className="close" type="button" aria-label="close" onClick={closePresentationModal}>
  37. <span aria-hidden>×</span>
  38. </button>
  39. <ModalBody className="modal-body d-flex justify-content-center align-items-center">
  40. { rendererOptions != null && (
  41. <Presentation
  42. options={{
  43. rendererOptions: rendererOptions as ReactMarkdownOptions,
  44. revealOptions: {
  45. embedded: true,
  46. hash: true,
  47. },
  48. isDarkMode,
  49. }}
  50. >
  51. {markdown}
  52. </Presentation>
  53. ) }
  54. </ModalBody>
  55. </Modal>
  56. );
  57. };
  58. export default PagePresentationModal;