DrawioViewerWithEditButton.tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import React, { useCallback, useState } from 'react';
  2. import EventEmitter from 'events';
  3. import {
  4. DrawioEditByViewerProps,
  5. DrawioViewer, DrawioViewerProps, extractCodeFromMxfile,
  6. } from '@growi/remark-drawio-plugin';
  7. import { useTranslation } from 'next-i18next';
  8. import { useIsGuestUser, useIsSharedUser } 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 [isRendered, setRendered] = useState(false);
  20. const [mxfile, setMxfile] = useState('');
  21. const editButtonClickHandler = useCallback(() => {
  22. const data: DrawioEditByViewerProps = {
  23. bol, eol, drawioMxFile: extractCodeFromMxfile(mxfile),
  24. };
  25. globalEmitter.emit('launchDrawioModal', data);
  26. }, [bol, eol, mxfile]);
  27. const renderingStartHandler = useCallback(() => {
  28. setRendered(false);
  29. }, []);
  30. const renderingUpdatedHandler = useCallback((mxfile: string | null) => {
  31. setRendered(mxfile != null);
  32. if (mxfile != null) {
  33. setMxfile(mxfile);
  34. }
  35. }, []);
  36. const showEditButton = isRendered && !isGuestUser && !isSharedUser;
  37. return (
  38. <div className={`drawio-viewer-with-edit-button ${styles['drawio-viewer-with-edit-button']}`}>
  39. { showEditButton && (
  40. <button
  41. type="button"
  42. className="btn btn-outline-secondary btn-edit-drawio"
  43. onClick={editButtonClickHandler}
  44. >
  45. <i className="icon-note mr-1"></i>{t('Edit')}
  46. </button>
  47. ) }
  48. <DrawioViewer {...props} onRenderingStart={renderingStartHandler} onRenderingUpdated={renderingUpdatedHandler} />
  49. </div>
  50. );
  51. });
  52. DrawioViewerWithEditButton.displayName = 'DrawioViewerWithEditButton';