DrawioViewerWithEditButton.tsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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 { useSWRxCurrentPage } from '~/stores/page';
  14. import { useRemoteRevisionId } from '~/stores/remote-latest-page';
  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: currentPage } = useSWRxCurrentPage();
  28. const { data: remoteRevisionId } = useRemoteRevisionId();
  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 currentRevisionId = currentPage?.revision?._id;
  47. const isRevisionOutdated = (currentRevisionId != null && remoteRevisionId != null) && (currentRevisionId !== remoteRevisionId);
  48. const showEditButton = !isRevisionOutdated && isRendered && !isGuestUser && !isReadOnlyUser && !isSharedUser && shareLinkId == null;
  49. return (
  50. <div className={`drawio-viewer-with-edit-button ${styles['drawio-viewer-with-edit-button']}`}>
  51. { showEditButton && (
  52. <button
  53. type="button"
  54. className="btn btn-outline-secondary btn-edit-drawio"
  55. onClick={editButtonClickHandler}
  56. >
  57. <span className="material-symbols-outlined me-1">edit_square</span>{t('Edit')}
  58. </button>
  59. ) }
  60. <DrawioViewer {...props} onRenderingStart={renderingStartHandler} onRenderingUpdated={renderingUpdatedHandler} />
  61. </div>
  62. );
  63. });
  64. DrawioViewerWithEditButton.displayName = 'DrawioViewerWithEditButton';