您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { useCallback } from 'react'
  2. import { useStoreApi } from 'reactflow'
  3. import { produce } from 'immer'
  4. import type { OnSelectBlock } from '@/app/components/workflow/types'
  5. import { generateNewNode } from '@/app/components/workflow/utils'
  6. import { useNodesMetaData } from '@/app/components/workflow/hooks'
  7. export const useReplaceDataSourceNode = (id: string) => {
  8. const store = useStoreApi()
  9. const { nodesMap: nodesMetaDataMap } = useNodesMetaData()
  10. const handleReplaceNode = useCallback<OnSelectBlock>((
  11. type,
  12. toolDefaultValue,
  13. ) => {
  14. const {
  15. getNodes,
  16. setNodes,
  17. } = store.getState()
  18. const nodes = getNodes()
  19. const emptyNodeIndex = nodes.findIndex(node => node.id === id)
  20. if (emptyNodeIndex < 0) return
  21. const {
  22. defaultValue,
  23. } = nodesMetaDataMap![type]
  24. const emptyNode = nodes[emptyNodeIndex]
  25. const { newNode } = generateNewNode({
  26. data: {
  27. ...(defaultValue as any),
  28. ...(toolDefaultValue || {}),
  29. },
  30. position: {
  31. x: emptyNode.position.x,
  32. y: emptyNode.position.y,
  33. },
  34. })
  35. const newNodes = produce(nodes, (draft) => {
  36. draft[emptyNodeIndex] = newNode
  37. })
  38. const newNodesWithoutTempNodes = produce(newNodes, (draft) => {
  39. return draft.filter(node => !node.data._isTempNode)
  40. })
  41. setNodes(newNodesWithoutTempNodes)
  42. }, [])
  43. return {
  44. handleReplaceNode,
  45. }
  46. }