Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import { useCallback } from 'react'
  2. import { getOutgoers, useStoreApi } from 'reactflow'
  3. import { BlockEnum, type Node, type ValueSelector } from '../../workflow/types'
  4. import { uniqBy } from 'lodash-es'
  5. import { findUsedVarNodes, updateNodeVars } from '../../workflow/nodes/_base/components/variable/utils'
  6. import type { DataSourceNodeType } from '../../workflow/nodes/data-source/types'
  7. export const usePipeline = () => {
  8. const store = useStoreApi()
  9. const getAllDatasourceNodes = useCallback(() => {
  10. const {
  11. getNodes,
  12. } = store.getState()
  13. const nodes = getNodes() as Node<DataSourceNodeType>[]
  14. const datasourceNodes = nodes.filter(node => node.data.type === BlockEnum.DataSource)
  15. return datasourceNodes
  16. }, [store])
  17. const getAllNodesInSameBranch = useCallback((nodeId: string) => {
  18. const {
  19. getNodes,
  20. edges,
  21. } = store.getState()
  22. const nodes = getNodes()
  23. const list: Node[] = []
  24. const traverse = (root: Node, callback: (node: Node) => void) => {
  25. if (root) {
  26. const outgoers = getOutgoers(root, nodes, edges)
  27. if (outgoers.length) {
  28. outgoers.forEach((node) => {
  29. callback(node)
  30. traverse(node, callback)
  31. })
  32. }
  33. }
  34. }
  35. if (nodeId === 'shared') {
  36. const allDatasourceNodes = getAllDatasourceNodes()
  37. if (allDatasourceNodes.length === 0)
  38. return []
  39. list.push(...allDatasourceNodes)
  40. allDatasourceNodes.forEach((node) => {
  41. traverse(node, (childNode) => {
  42. list.push(childNode)
  43. })
  44. })
  45. }
  46. else {
  47. const currentNode = nodes.find(node => node.id === nodeId)!
  48. if (!currentNode)
  49. return []
  50. list.push(currentNode)
  51. traverse(currentNode, (node) => {
  52. list.push(node)
  53. })
  54. }
  55. return uniqBy(list, 'id')
  56. }, [getAllDatasourceNodes, store])
  57. const isVarUsedInNodes = useCallback((varSelector: ValueSelector) => {
  58. const nodeId = varSelector[1] // Assuming the first element is always 'VARIABLE_PREFIX'(rag)
  59. const afterNodes = getAllNodesInSameBranch(nodeId)
  60. const effectNodes = findUsedVarNodes(varSelector, afterNodes)
  61. return effectNodes.length > 0
  62. }, [getAllNodesInSameBranch])
  63. const handleInputVarRename = useCallback((nodeId: string, oldValeSelector: ValueSelector, newVarSelector: ValueSelector) => {
  64. const { getNodes, setNodes } = store.getState()
  65. const afterNodes = getAllNodesInSameBranch(nodeId)
  66. const effectNodes = findUsedVarNodes(oldValeSelector, afterNodes)
  67. if (effectNodes.length > 0) {
  68. const newNodes = getNodes().map((node) => {
  69. if (effectNodes.find(n => n.id === node.id))
  70. return updateNodeVars(node, oldValeSelector, newVarSelector)
  71. return node
  72. })
  73. setNodes(newNodes)
  74. }
  75. }, [getAllNodesInSameBranch, store])
  76. const removeUsedVarInNodes = useCallback((varSelector: ValueSelector) => {
  77. const nodeId = varSelector[1] // Assuming the first element is always 'VARIABLE_PREFIX'(rag)
  78. const { getNodes, setNodes } = store.getState()
  79. const afterNodes = getAllNodesInSameBranch(nodeId)
  80. const effectNodes = findUsedVarNodes(varSelector, afterNodes)
  81. if (effectNodes.length > 0) {
  82. const newNodes = getNodes().map((node) => {
  83. if (effectNodes.find(n => n.id === node.id))
  84. return updateNodeVars(node, varSelector, [])
  85. return node
  86. })
  87. setNodes(newNodes)
  88. }
  89. }, [getAllNodesInSameBranch, store])
  90. return {
  91. handleInputVarRename,
  92. isVarUsedInNodes,
  93. removeUsedVarInNodes,
  94. }
  95. }