import React, { useCallback, type JSX } from 'react'; import { globalEventTarget } from '@growi/core/dist/utils'; import type { Element } from 'hast'; import type { LaunchHandsonTableModalEventDetail } from '~/client/interfaces/handsontable-modal'; import { useIsGuestUser, useIsReadOnlyUser, useIsSharedUser, useShareLinkId, } from '~/stores-universal/context'; import { useIsRevisionOutdated } from '~/stores/page'; import { useCurrentPageYjsData } from '~/stores/yjs'; import styles from './TableWithEditButton.module.scss'; type TableWithEditButtonProps = { children: React.ReactNode, node: Element, className?: string } const TableWithEditButtonNoMemorized = (props: TableWithEditButtonProps): JSX.Element => { const { children, node, className } = props; const { data: isGuestUser } = useIsGuestUser(); const { data: isReadOnlyUser } = useIsReadOnlyUser(); const { data: isSharedUser } = useIsSharedUser(); const { data: shareLinkId } = useShareLinkId(); const { data: isRevisionOutdated } = useIsRevisionOutdated(); const { data: currentPageYjsData } = useCurrentPageYjsData(); const bol = node.position?.start.line ?? 0; const eol = node.position?.end.line ?? 0; const editButtonClickHandler = useCallback(() => { globalEventTarget.dispatchEvent(new CustomEvent('launchHandsonTableModal', { detail: { bol, eol, }, })); }, [bol, eol]); const isNoEditingUsers = currentPageYjsData?.awarenessStateSize == null || currentPageYjsData?.awarenessStateSize === 0; const showEditButton = isNoEditingUsers && !isRevisionOutdated && !isGuestUser && !isReadOnlyUser && !isSharedUser && shareLinkId == null; return (
{ showEditButton && ( )} {children}
); }; TableWithEditButtonNoMemorized.displayName = 'TableWithEditButton'; export const TableWithEditButton = React.memo(TableWithEditButtonNoMemorized) as typeof TableWithEditButtonNoMemorized;