workflow-variable-block-replacement-block.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import {
  2. memo,
  3. useCallback,
  4. useEffect,
  5. } from 'react'
  6. import type { TextNode } from 'lexical'
  7. import { $applyNodeReplacement } from 'lexical'
  8. import { mergeRegister } from '@lexical/utils'
  9. import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
  10. import { decoratorTransform } from '../../utils'
  11. import type { WorkflowVariableBlockType } from '../../types'
  12. import { CustomTextNode } from '../custom-text/node'
  13. import { $createWorkflowVariableBlockNode } from './node'
  14. import { WorkflowVariableBlockNode } from './index'
  15. import { VAR_REGEX as REGEX, resetReg } from '@/config'
  16. const WorkflowVariableBlockReplacementBlock = ({
  17. workflowNodesMap,
  18. onInsert,
  19. }: WorkflowVariableBlockType) => {
  20. const [editor] = useLexicalComposerContext()
  21. useEffect(() => {
  22. if (!editor.hasNodes([WorkflowVariableBlockNode]))
  23. throw new Error('WorkflowVariableBlockNodePlugin: WorkflowVariableBlockNode not registered on editor')
  24. }, [editor])
  25. const createWorkflowVariableBlockNode = useCallback((textNode: TextNode): WorkflowVariableBlockNode => {
  26. if (onInsert)
  27. onInsert()
  28. const nodePathString = textNode.getTextContent().slice(3, -3)
  29. return $applyNodeReplacement($createWorkflowVariableBlockNode(nodePathString.split('.'), workflowNodesMap))
  30. }, [onInsert, workflowNodesMap])
  31. const getMatch = useCallback((text: string) => {
  32. const matchArr = REGEX.exec(text)
  33. if (matchArr === null)
  34. return null
  35. const startOffset = matchArr.index
  36. const endOffset = startOffset + matchArr[0].length
  37. return {
  38. end: endOffset,
  39. start: startOffset,
  40. }
  41. }, [])
  42. const transformListener = useCallback((textNode: any) => {
  43. resetReg()
  44. return decoratorTransform(textNode, getMatch, createWorkflowVariableBlockNode)
  45. }, [createWorkflowVariableBlockNode, getMatch])
  46. useEffect(() => {
  47. resetReg()
  48. return mergeRegister(
  49. editor.registerNodeTransform(CustomTextNode, transformListener),
  50. )
  51. }, [])
  52. return null
  53. }
  54. export default memo(WorkflowVariableBlockReplacementBlock)