DrawioViewerWithEditButton.tsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import React, { useCallback, useState, type JSX } from 'react';
  2. import type EventEmitter from 'events';
  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 { useIsRevisionOutdated } from '~/states/page';
  12. import { useShareLinkId } from '~/states/page/hooks';
  13. import '@growi/remark-drawio/dist/style.css';
  14. import styles from './DrawioViewerWithEditButton.module.scss';
  15. declare global {
  16. // eslint-disable-next-line vars-on-top, no-var
  17. var globalEmitter: EventEmitter;
  18. }
  19. export const DrawioViewerWithEditButton = React.memo((props: DrawioViewerProps): JSX.Element => {
  20. const { t } = useTranslation();
  21. const { bol, eol } = props;
  22. const isGuestUser = useIsGuestUser();
  23. const isReadOnlyUser = useIsReadOnlyUser();
  24. const isSharedUser = useIsSharedUser();
  25. const shareLinkId = useShareLinkId();
  26. const isRevisionOutdated = useIsRevisionOutdated();
  27. const currentPageYjsData = useCurrentPageYjsData();
  28. const [isRendered, setRendered] = useState(false);
  29. const [mxfile, setMxfile] = useState('');
  30. const editButtonClickHandler = useCallback(() => {
  31. const data: DrawioEditByViewerProps = {
  32. bol, eol, drawioMxFile: mxfile,
  33. };
  34. globalEmitter.emit('launchDrawioModal', data);
  35. }, [bol, eol, mxfile]);
  36. const renderingStartHandler = useCallback(() => {
  37. setRendered(false);
  38. }, []);
  39. const renderingUpdatedHandler = useCallback((mxfile: string | null) => {
  40. setRendered(mxfile != null);
  41. if (mxfile != null) {
  42. setMxfile(mxfile);
  43. }
  44. }, []);
  45. const isNoEditingUsers = currentPageYjsData?.awarenessStateSize == null || currentPageYjsData?.awarenessStateSize === 0;
  46. const showEditButton = isNoEditingUsers
  47. && !isRevisionOutdated
  48. && isRendered
  49. && !isGuestUser
  50. && !isReadOnlyUser
  51. && !isSharedUser
  52. && shareLinkId == null;
  53. return (
  54. <div className={`drawio-viewer-with-edit-button ${styles['drawio-viewer-with-edit-button']}`}>
  55. { showEditButton && (
  56. <button
  57. type="button"
  58. className="btn btn-sm btn-outline-secondary btn-edit-drawio"
  59. onClick={editButtonClickHandler}
  60. >
  61. <span className="material-symbols-outlined me-1">edit_square</span>{t('Edit')}
  62. </button>
  63. ) }
  64. <DrawioViewer {...props} onRenderingStart={renderingStartHandler} onRenderingUpdated={renderingUpdatedHandler} />
  65. </div>
  66. );
  67. });
  68. DrawioViewerWithEditButton.displayName = 'DrawioViewerWithEditButton';