DrawioViewerWithEditButton.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import React, { useCallback, useState, type JSX } from 'react';
  2. import { globalEventTarget } from '@growi/core/dist/utils';
  3. import {
  4. DrawioViewer,
  5. type DrawioEditByViewerProps,
  6. type DrawioViewerProps,
  7. } from '@growi/remark-drawio';
  8. import { useTranslation } from 'next-i18next';
  9. import { useCurrentPageYjsData } from '~/features/collaborative-editor/states';
  10. import { useIsGuestUser, useIsReadOnlyUser, useIsSharedUser } from '~/states/context';
  11. import { useShareLinkId } from '~/states/page/hooks';
  12. import { useIsRevisionOutdated } from '~/stores/page';
  13. import '@growi/remark-drawio/dist/style.css';
  14. import styles from './DrawioViewerWithEditButton.module.scss';
  15. export const DrawioViewerWithEditButton = React.memo((props: DrawioViewerProps): JSX.Element => {
  16. const { t } = useTranslation();
  17. const { bol, eol } = props;
  18. const isGuestUser = useIsGuestUser();
  19. const isReadOnlyUser = useIsReadOnlyUser();
  20. const isSharedUser = useIsSharedUser();
  21. const shareLinkId = useShareLinkId();
  22. const isRevisionOutdated = useIsRevisionOutdated();
  23. const currentPageYjsData = useCurrentPageYjsData();
  24. const [isRendered, setRendered] = useState(false);
  25. const [mxfile, setMxfile] = useState('');
  26. const editButtonClickHandler = useCallback(() => {
  27. globalEventTarget.dispatchEvent(new CustomEvent<DrawioEditByViewerProps>('launchDrawioModal', {
  28. detail: {
  29. bol, eol, drawioMxFile: mxfile,
  30. },
  31. }));
  32. }, [bol, eol, mxfile]);
  33. const renderingStartHandler = useCallback(() => {
  34. setRendered(false);
  35. }, []);
  36. const renderingUpdatedHandler = useCallback((mxfile: string | null) => {
  37. setRendered(mxfile != null);
  38. if (mxfile != null) {
  39. setMxfile(mxfile);
  40. }
  41. }, []);
  42. const isNoEditingUsers = currentPageYjsData?.awarenessStateSize == null || currentPageYjsData?.awarenessStateSize === 0;
  43. const showEditButton = isNoEditingUsers
  44. && !isRevisionOutdated
  45. && isRendered
  46. && !isGuestUser
  47. && !isReadOnlyUser
  48. && !isSharedUser
  49. && shareLinkId == null;
  50. return (
  51. <div className={`drawio-viewer-with-edit-button ${styles['drawio-viewer-with-edit-button']}`}>
  52. { showEditButton && (
  53. <button
  54. type="button"
  55. className="btn btn-sm btn-outline-secondary btn-edit-drawio"
  56. onClick={editButtonClickHandler}
  57. >
  58. <span className="material-symbols-outlined me-1">edit_square</span>{t('Edit')}
  59. </button>
  60. ) }
  61. <DrawioViewer {...props} onRenderingStart={renderingStartHandler} onRenderingUpdated={renderingUpdatedHandler} />
  62. </div>
  63. );
  64. });
  65. DrawioViewerWithEditButton.displayName = 'DrawioViewerWithEditButton';