DrawioViewerWithEditButton.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import React, { useCallback, useState } from 'react';
  2. import EventEmitter from 'events';
  3. import {
  4. DrawioEditByViewerProps,
  5. DrawioViewer, DrawioViewerProps,
  6. } from '@growi/remark-drawio';
  7. import { useTranslation } from 'next-i18next';
  8. import { useIsGuestUser, useIsSharedUser, useShareLinkId } from '~/stores/context';
  9. import styles from './DrawioViewerWithEditButton.module.scss';
  10. declare global {
  11. // eslint-disable-next-line vars-on-top, no-var
  12. var globalEmitter: EventEmitter;
  13. }
  14. export const DrawioViewerWithEditButton = React.memo((props: DrawioViewerProps): JSX.Element => {
  15. const { t } = useTranslation();
  16. const { bol, eol } = props;
  17. const { data: isGuestUser } = useIsGuestUser();
  18. const { data: isSharedUser } = useIsSharedUser();
  19. const { data: shareLinkId } = useShareLinkId();
  20. const [isRendered, setRendered] = useState(false);
  21. const [mxfile, setMxfile] = useState('');
  22. const editButtonClickHandler = useCallback(() => {
  23. const data: DrawioEditByViewerProps = {
  24. bol, eol, drawioMxFile: mxfile,
  25. };
  26. globalEmitter.emit('launchDrawioModal', data);
  27. }, [bol, eol, mxfile]);
  28. const renderingStartHandler = useCallback(() => {
  29. setRendered(false);
  30. }, []);
  31. const renderingUpdatedHandler = useCallback((mxfile: string | null) => {
  32. setRendered(mxfile != null);
  33. if (mxfile != null) {
  34. setMxfile(mxfile);
  35. }
  36. }, []);
  37. const showEditButton = isRendered && !isGuestUser && !isSharedUser && shareLinkId == null;
  38. return (
  39. <div className={`drawio-viewer-with-edit-button ${styles['drawio-viewer-with-edit-button']}`}>
  40. { showEditButton && (
  41. <button
  42. type="button"
  43. className="btn btn-outline-secondary btn-edit-drawio"
  44. onClick={editButtonClickHandler}
  45. >
  46. <i className="icon-note mr-1"></i>{t('Edit')}
  47. </button>
  48. ) }
  49. <DrawioViewer {...props} onRenderingStart={renderingStartHandler} onRenderingUpdated={renderingUpdatedHandler} />
  50. </div>
  51. );
  52. });
  53. DrawioViewerWithEditButton.displayName = 'DrawioViewerWithEditButton';