import { memo, useEffect, } from 'react' import { $insertNodes, COMMAND_PRIORITY_EDITOR, createCommand, } from 'lexical' import { mergeRegister } from '@lexical/utils' import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext' import type { WorkflowVariableBlockType } from '../../types' import { $createWorkflowVariableBlockNode, WorkflowVariableBlockNode, } from './node' import type { Node } from '@/app/components/workflow/types' export const INSERT_WORKFLOW_VARIABLE_BLOCK_COMMAND = createCommand('INSERT_WORKFLOW_VARIABLE_BLOCK_COMMAND') export const DELETE_WORKFLOW_VARIABLE_BLOCK_COMMAND = createCommand('DELETE_WORKFLOW_VARIABLE_BLOCK_COMMAND') export const CLEAR_HIDE_MENU_TIMEOUT = createCommand('CLEAR_HIDE_MENU_TIMEOUT') export const UPDATE_WORKFLOW_NODES_MAP = createCommand('UPDATE_WORKFLOW_NODES_MAP') export type WorkflowVariableBlockProps = { getWorkflowNode: (nodeId: string) => Node onInsert?: () => void onDelete?: () => void } const WorkflowVariableBlock = memo(({ workflowNodesMap, onInsert, onDelete, }: WorkflowVariableBlockType) => { const [editor] = useLexicalComposerContext() useEffect(() => { editor.update(() => { editor.dispatchCommand(UPDATE_WORKFLOW_NODES_MAP, workflowNodesMap) }) }, [editor, workflowNodesMap]) useEffect(() => { if (!editor.hasNodes([WorkflowVariableBlockNode])) throw new Error('WorkflowVariableBlockPlugin: WorkflowVariableBlock not registered on editor') return mergeRegister( editor.registerCommand( INSERT_WORKFLOW_VARIABLE_BLOCK_COMMAND, (variables: string[]) => { editor.dispatchCommand(CLEAR_HIDE_MENU_TIMEOUT, undefined) const workflowVariableBlockNode = $createWorkflowVariableBlockNode(variables, workflowNodesMap) $insertNodes([workflowVariableBlockNode]) if (onInsert) onInsert() return true }, COMMAND_PRIORITY_EDITOR, ), editor.registerCommand( DELETE_WORKFLOW_VARIABLE_BLOCK_COMMAND, () => { if (onDelete) onDelete() return true }, COMMAND_PRIORITY_EDITOR, ), ) }, [editor, onInsert, onDelete, workflowNodesMap]) return null }) WorkflowVariableBlock.displayName = 'WorkflowVariableBlock' export { WorkflowVariableBlock } export { WorkflowVariableBlockNode } from './node' export { default as WorkflowVariableBlockReplacementBlock } from './workflow-variable-block-replacement-block'