import React, { useCallback, useState } from 'react'; import type EventEmitter from 'events'; import { DrawioViewer, type DrawioEditByViewerProps, type DrawioViewerProps, } from '@growi/remark-drawio'; import { useTranslation } from 'next-i18next'; import { useIsGuestUser, useIsReadOnlyUser, useIsSharedUser, useShareLinkId, } from '~/stores/context'; import '@growi/remark-drawio/dist/style.css'; import { useSWRxCurrentPage } from '~/stores/page'; import { useRemoteRevisionId } from '~/stores/remote-latest-page'; import styles from './DrawioViewerWithEditButton.module.scss'; declare global { // eslint-disable-next-line vars-on-top, no-var var globalEmitter: EventEmitter; } export const DrawioViewerWithEditButton = React.memo((props: DrawioViewerProps): JSX.Element => { const { t } = useTranslation(); const { bol, eol } = props; const { data: isGuestUser } = useIsGuestUser(); const { data: isReadOnlyUser } = useIsReadOnlyUser(); const { data: isSharedUser } = useIsSharedUser(); const { data: shareLinkId } = useShareLinkId(); const { data: currentPage } = useSWRxCurrentPage(); const { data: remoteRevisionId } = useRemoteRevisionId(); const [isRendered, setRendered] = useState(false); const [mxfile, setMxfile] = useState(''); const editButtonClickHandler = useCallback(() => { const data: DrawioEditByViewerProps = { bol, eol, drawioMxFile: mxfile, }; globalEmitter.emit('launchDrawioModal', data); }, [bol, eol, mxfile]); const renderingStartHandler = useCallback(() => { setRendered(false); }, []); const renderingUpdatedHandler = useCallback((mxfile: string | null) => { setRendered(mxfile != null); if (mxfile != null) { setMxfile(mxfile); } }, []); const currentRevisionId = currentPage?.revision?._id; const isRevisionOutdated = (currentRevisionId != null && remoteRevisionId != null) && (currentRevisionId !== remoteRevisionId); const showEditButton = !isRevisionOutdated && isRendered && !isGuestUser && !isReadOnlyUser && !isSharedUser && shareLinkId == null; return (