|
import { RAGFlowNodeType } from '@/interfaces/database/flow'; |
|
import { OnBeforeDelete } from '@xyflow/react'; |
|
import { Operator } from '../constant'; |
|
import useGraphStore from '../store'; |
|
|
|
const UndeletableNodes = [Operator.Begin, Operator.IterationStart]; |
|
|
|
export function useBeforeDelete() { |
|
const getOperatorTypeFromId = useGraphStore( |
|
(state) => state.getOperatorTypeFromId, |
|
); |
|
const handleBeforeDelete: OnBeforeDelete<RAGFlowNodeType> = async ({ |
|
nodes, |
|
edges, |
|
}) => { |
|
const toBeDeletedNodes = nodes.filter((node) => { |
|
const operatorType = node.data?.label as Operator; |
|
if (operatorType === Operator.Begin) { |
|
return false; |
|
} |
|
|
|
if ( |
|
operatorType === Operator.IterationStart && |
|
!nodes.some((x) => x.id === node.parentId) |
|
) { |
|
return false; |
|
} |
|
|
|
return true; |
|
}); |
|
|
|
const toBeDeletedEdges = edges.filter((edge) => { |
|
const sourceType = getOperatorTypeFromId(edge.source) as Operator; |
|
const downStreamNodes = nodes.filter((x) => x.id === edge.target); |
|
|
|
|
|
if ( |
|
UndeletableNodes.includes(sourceType) && |
|
downStreamNodes.length === 0 |
|
) { |
|
if (!nodes.some((x) => x.id === edge.source)) { |
|
return true; |
|
} |
|
return false; |
|
} |
|
|
|
return true; |
|
}); |
|
|
|
return { |
|
nodes: toBeDeletedNodes, |
|
edges: toBeDeletedEdges, |
|
}; |
|
}; |
|
|
|
return { handleBeforeDelete }; |
|
} |
|
|