DrawioViewerWithEditButton.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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 '@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 { data: isGuestUser } = useIsGuestUser();
  23. const { data: isReadOnlyUser } = useIsReadOnlyUser();
  24. const { data: isSharedUser } = useIsSharedUser();
  25. const { data: shareLinkId } = useShareLinkId();
  26. const { data: isRevisionOutdated } = useIsRevisionOutdated();
  27. const [isRendered, setRendered] = useState(false);
  28. const [mxfile, setMxfile] = useState('');
  29. const editButtonClickHandler = useCallback(() => {
  30. const data: DrawioEditByViewerProps = {
  31. bol, eol, drawioMxFile: mxfile,
  32. };
  33. globalEmitter.emit('launchDrawioModal', data);
  34. }, [bol, eol, mxfile]);
  35. const renderingStartHandler = useCallback(() => {
  36. setRendered(false);
  37. }, []);
  38. const renderingUpdatedHandler = useCallback((mxfile: string | null) => {
  39. setRendered(mxfile != null);
  40. if (mxfile != null) {
  41. setMxfile(mxfile);
  42. }
  43. }, []);
  44. const showEditButton = !isRevisionOutdated && isRendered && !isGuestUser && !isReadOnlyUser && !isSharedUser && shareLinkId == null;
  45. return (
  46. <div className={`drawio-viewer-with-edit-button ${styles['drawio-viewer-with-edit-button']}`}>
  47. { showEditButton && (
  48. <button
  49. type="button"
  50. className="btn btn-sm btn-outline-secondary btn-edit-drawio"
  51. onClick={editButtonClickHandler}
  52. >
  53. <span className="material-symbols-outlined me-1">edit_square</span>{t('Edit')}
  54. </button>
  55. ) }
  56. <DrawioViewer {...props} onRenderingStart={renderingStartHandler} onRenderingUpdated={renderingUpdatedHandler} />
  57. </div>
  58. );
  59. });
  60. DrawioViewerWithEditButton.displayName = 'DrawioViewerWithEditButton';