DrawioViewerWithEditButton.tsx 2.7 KB

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