DrawioModal.tsx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import React, {
  2. useMemo,
  3. } from 'react';
  4. import {
  5. Modal,
  6. ModalBody,
  7. } from 'reactstrap';
  8. import { getDiagramsNetLangCode } from '~/client/util/locale-utils';
  9. import { useDrawioUri } from '~/stores/context';
  10. import { useDrawioModal } from '~/stores/modal';
  11. import { usePersonalSettings } from '~/stores/personal-settings';
  12. type Props = {
  13. // onSave: (drawioData) => void,
  14. };
  15. export const DrawioModal = (props: Props): JSX.Element => {
  16. const { data: growiDrawioUri } = useDrawioUri();
  17. const { data: personalSettingsInfo } = usePersonalSettings();
  18. const { data: drawioModalData, close: closeDrawioModal } = useDrawioModal();
  19. const isOpened = drawioModalData?.isOpened ?? false;
  20. const cancel = () => {
  21. closeDrawioModal();
  22. };
  23. const drawioUrl = useMemo(() => {
  24. const drawioUri = growiDrawioUri || 'https://embed.diagrams.net/';
  25. const url = new URL(drawioUri);
  26. // refs: https://desk.draw.io/support/solutions/articles/16000042546-what-url-parameters-are-supported-
  27. url.searchParams.append('spin', '1');
  28. url.searchParams.append('embed', '1');
  29. url.searchParams.append('lang', getDiagramsNetLangCode(personalSettingsInfo?.lang || 'en'));
  30. url.searchParams.append('ui', 'atlas');
  31. url.searchParams.append('configure', '1');
  32. return url;
  33. }, [growiDrawioUri, personalSettingsInfo?.lang]);
  34. return (
  35. <Modal
  36. isOpen={isOpened}
  37. toggle={cancel}
  38. backdrop="static"
  39. className="drawio-modal grw-body-only-modal-expanded"
  40. size="xl"
  41. keyboard={false}
  42. >
  43. <ModalBody className="p-0">
  44. {/* Loading spinner */}
  45. <div className="w-100 h-100 position-absolute d-flex">
  46. <div className="mx-auto my-auto">
  47. <i className="fa fa-3x fa-spinner fa-pulse mx-auto text-muted"></i>
  48. </div>
  49. </div>
  50. {/* iframe */}
  51. <div className="w-100 h-100 position-absolute d-flex">
  52. { isOpened && (
  53. <iframe
  54. src={drawioUrl.href}
  55. className="border-0 flex-grow-1"
  56. >
  57. </iframe>
  58. ) }
  59. </div>
  60. </ModalBody>
  61. </Modal>
  62. );
  63. };