DrawioViewerWithEditButton.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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/context';
  12. import '@growi/remark-drawio/dist/style.css';
  13. import styles from './DrawioViewerWithEditButton.module.scss';
  14. declare global {
  15. // eslint-disable-next-line vars-on-top, no-var
  16. var globalEmitter: EventEmitter;
  17. }
  18. export const DrawioViewerWithEditButton = React.memo((props: DrawioViewerProps): JSX.Element => {
  19. const { t } = useTranslation();
  20. const { bol, eol } = props;
  21. const { data: isGuestUser } = useIsGuestUser();
  22. const { data: isReadOnlyUser } = useIsReadOnlyUser();
  23. const { data: isSharedUser } = useIsSharedUser();
  24. const { data: shareLinkId } = useShareLinkId();
  25. const [isRendered, setRendered] = useState(false);
  26. const [mxfile, setMxfile] = useState('');
  27. const editButtonClickHandler = useCallback(() => {
  28. const data: DrawioEditByViewerProps = {
  29. bol, eol, drawioMxFile: mxfile,
  30. };
  31. globalEmitter.emit('launchDrawioModal', data);
  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 showEditButton = isRendered && !isGuestUser && !isReadOnlyUser && !isSharedUser && shareLinkId == null;
  43. return (
  44. <div className={`drawio-viewer-with-edit-button ${styles['drawio-viewer-with-edit-button']}`}>
  45. { showEditButton && (
  46. <button
  47. type="button"
  48. className="btn btn-outline-secondary btn-edit-drawio"
  49. onClick={editButtonClickHandler}
  50. >
  51. <span className="material-symbols-outlined me-1">edit_square</span>{t('Edit')}
  52. </button>
  53. ) }
  54. <DrawioViewer {...props} onRenderingStart={renderingStartHandler} onRenderingUpdated={renderingUpdatedHandler} />
  55. </div>
  56. );
  57. });
  58. DrawioViewerWithEditButton.displayName = 'DrawioViewerWithEditButton';