index.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import {
  2. memo,
  3. useEffect,
  4. } from 'react'
  5. import {
  6. $insertNodes,
  7. COMMAND_PRIORITY_EDITOR,
  8. createCommand,
  9. } from 'lexical'
  10. import { mergeRegister } from '@lexical/utils'
  11. import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
  12. import type { GetVarType, WorkflowVariableBlockType } from '../../types'
  13. import {
  14. $createWorkflowVariableBlockNode,
  15. WorkflowVariableBlockNode,
  16. } from './node'
  17. import type { Node } from '@/app/components/workflow/types'
  18. export const INSERT_WORKFLOW_VARIABLE_BLOCK_COMMAND = createCommand('INSERT_WORKFLOW_VARIABLE_BLOCK_COMMAND')
  19. export const DELETE_WORKFLOW_VARIABLE_BLOCK_COMMAND = createCommand('DELETE_WORKFLOW_VARIABLE_BLOCK_COMMAND')
  20. export const CLEAR_HIDE_MENU_TIMEOUT = createCommand('CLEAR_HIDE_MENU_TIMEOUT')
  21. export const UPDATE_WORKFLOW_NODES_MAP = createCommand('UPDATE_WORKFLOW_NODES_MAP')
  22. export type WorkflowVariableBlockProps = {
  23. getWorkflowNode: (nodeId: string) => Node
  24. onInsert?: () => void
  25. onDelete?: () => void
  26. getVarType: GetVarType
  27. }
  28. const WorkflowVariableBlock = memo(({
  29. workflowNodesMap,
  30. onInsert,
  31. onDelete,
  32. getVarType,
  33. }: WorkflowVariableBlockType) => {
  34. const [editor] = useLexicalComposerContext()
  35. useEffect(() => {
  36. editor.update(() => {
  37. editor.dispatchCommand(UPDATE_WORKFLOW_NODES_MAP, workflowNodesMap)
  38. })
  39. }, [editor, workflowNodesMap])
  40. useEffect(() => {
  41. if (!editor.hasNodes([WorkflowVariableBlockNode]))
  42. throw new Error('WorkflowVariableBlockPlugin: WorkflowVariableBlock not registered on editor')
  43. return mergeRegister(
  44. editor.registerCommand(
  45. INSERT_WORKFLOW_VARIABLE_BLOCK_COMMAND,
  46. (variables: string[]) => {
  47. editor.dispatchCommand(CLEAR_HIDE_MENU_TIMEOUT, undefined)
  48. const workflowVariableBlockNode = $createWorkflowVariableBlockNode(variables, workflowNodesMap, getVarType)
  49. $insertNodes([workflowVariableBlockNode])
  50. if (onInsert)
  51. onInsert()
  52. return true
  53. },
  54. COMMAND_PRIORITY_EDITOR,
  55. ),
  56. editor.registerCommand(
  57. DELETE_WORKFLOW_VARIABLE_BLOCK_COMMAND,
  58. () => {
  59. if (onDelete)
  60. onDelete()
  61. return true
  62. },
  63. COMMAND_PRIORITY_EDITOR,
  64. ),
  65. )
  66. }, [editor, onInsert, onDelete, workflowNodesMap, getVarType])
  67. return null
  68. })
  69. WorkflowVariableBlock.displayName = 'WorkflowVariableBlock'
  70. export { WorkflowVariableBlock }
  71. export { WorkflowVariableBlockNode } from './node'
  72. export { default as WorkflowVariableBlockReplacementBlock } from './workflow-variable-block-replacement-block'