| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- import { useCallback } from 'react'
- import { getOutgoers, useStoreApi } from 'reactflow'
- import { BlockEnum, type Node, type ValueSelector } from '../../workflow/types'
- import { uniqBy } from 'lodash-es'
- import { findUsedVarNodes, updateNodeVars } from '../../workflow/nodes/_base/components/variable/utils'
- import type { DataSourceNodeType } from '../../workflow/nodes/data-source/types'
-
- export const usePipeline = () => {
- const store = useStoreApi()
-
- const getAllDatasourceNodes = useCallback(() => {
- const {
- getNodes,
- } = store.getState()
- const nodes = getNodes() as Node<DataSourceNodeType>[]
- const datasourceNodes = nodes.filter(node => node.data.type === BlockEnum.DataSource)
-
- return datasourceNodes
- }, [store])
-
- const getAllNodesInSameBranch = useCallback((nodeId: string) => {
- const {
- getNodes,
- edges,
- } = store.getState()
- const nodes = getNodes()
- const list: Node[] = []
-
- const traverse = (root: Node, callback: (node: Node) => void) => {
- if (root) {
- const outgoers = getOutgoers(root, nodes, edges)
-
- if (outgoers.length) {
- outgoers.forEach((node) => {
- callback(node)
- traverse(node, callback)
- })
- }
- }
- }
-
- if (nodeId === 'shared') {
- const allDatasourceNodes = getAllDatasourceNodes()
-
- if (allDatasourceNodes.length === 0)
- return []
-
- list.push(...allDatasourceNodes)
-
- allDatasourceNodes.forEach((node) => {
- traverse(node, (childNode) => {
- list.push(childNode)
- })
- })
- }
- else {
- const currentNode = nodes.find(node => node.id === nodeId)!
-
- if (!currentNode)
- return []
-
- list.push(currentNode)
-
- traverse(currentNode, (node) => {
- list.push(node)
- })
- }
-
- return uniqBy(list, 'id')
- }, [getAllDatasourceNodes, store])
-
- const isVarUsedInNodes = useCallback((varSelector: ValueSelector) => {
- const nodeId = varSelector[1] // Assuming the first element is always 'VARIABLE_PREFIX'(rag)
- const afterNodes = getAllNodesInSameBranch(nodeId)
- const effectNodes = findUsedVarNodes(varSelector, afterNodes)
- return effectNodes.length > 0
- }, [getAllNodesInSameBranch])
-
- const handleInputVarRename = useCallback((nodeId: string, oldValeSelector: ValueSelector, newVarSelector: ValueSelector) => {
- const { getNodes, setNodes } = store.getState()
- const afterNodes = getAllNodesInSameBranch(nodeId)
- const effectNodes = findUsedVarNodes(oldValeSelector, afterNodes)
- if (effectNodes.length > 0) {
- const newNodes = getNodes().map((node) => {
- if (effectNodes.find(n => n.id === node.id))
- return updateNodeVars(node, oldValeSelector, newVarSelector)
-
- return node
- })
- setNodes(newNodes)
- }
- }, [getAllNodesInSameBranch, store])
-
- const removeUsedVarInNodes = useCallback((varSelector: ValueSelector) => {
- const nodeId = varSelector[1] // Assuming the first element is always 'VARIABLE_PREFIX'(rag)
- const { getNodes, setNodes } = store.getState()
- const afterNodes = getAllNodesInSameBranch(nodeId)
- const effectNodes = findUsedVarNodes(varSelector, afterNodes)
- if (effectNodes.length > 0) {
- const newNodes = getNodes().map((node) => {
- if (effectNodes.find(n => n.id === node.id))
- return updateNodeVars(node, varSelector, [])
-
- return node
- })
- setNodes(newNodes)
- }
- }, [getAllNodesInSameBranch, store])
-
- return {
- handleInputVarRename,
- isVarUsedInNodes,
- removeUsedVarInNodes,
- }
- }
|