123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- import { useCallback } from 'react'
- import produce from 'immer'
- import type {
- EdgeMouseHandler,
- OnEdgesChange,
- } from 'reactflow'
- import {
- useStoreApi,
- } from 'reactflow'
- import type {
- Node,
- } from '../types'
- import { getNodesConnectedSourceOrTargetHandleIdsMap } from '../utils'
- import { useNodesSyncDraft } from './use-nodes-sync-draft'
- import { useNodesReadOnly } from './use-workflow'
- import { WorkflowHistoryEvent, useWorkflowHistory } from './use-workflow-history'
- export const useEdgesInteractions = () => {
- const store = useStoreApi()
- const { handleSyncWorkflowDraft } = useNodesSyncDraft()
- const { getNodesReadOnly } = useNodesReadOnly()
- const { saveStateToHistory } = useWorkflowHistory()
- const handleEdgeEnter = useCallback<EdgeMouseHandler>((_, edge) => {
- if (getNodesReadOnly())
- return
- const {
- edges,
- setEdges,
- } = store.getState()
- const newEdges = produce(edges, (draft) => {
- const currentEdge = draft.find(e => e.id === edge.id)!
- currentEdge.data._hovering = true
- })
- setEdges(newEdges)
- }, [store, getNodesReadOnly])
- const handleEdgeLeave = useCallback<EdgeMouseHandler>((_, edge) => {
- if (getNodesReadOnly())
- return
- const {
- edges,
- setEdges,
- } = store.getState()
- const newEdges = produce(edges, (draft) => {
- const currentEdge = draft.find(e => e.id === edge.id)!
- currentEdge.data._hovering = false
- })
- setEdges(newEdges)
- }, [store, getNodesReadOnly])
- const handleEdgeDeleteByDeleteBranch = useCallback((nodeId: string, branchId: string) => {
- if (getNodesReadOnly())
- return
- const {
- getNodes,
- setNodes,
- edges,
- setEdges,
- } = store.getState()
- const currentEdgeIndex = edges.findIndex(edge => edge.source === nodeId && edge.sourceHandle === branchId)
- if (currentEdgeIndex < 0)
- return
- const currentEdge = edges[currentEdgeIndex]
- const newNodes = produce(getNodes(), (draft: Node[]) => {
- const sourceNode = draft.find(node => node.id === currentEdge.source)
- const targetNode = draft.find(node => node.id === currentEdge.target)
- if (sourceNode)
- sourceNode.data._connectedSourceHandleIds = sourceNode.data._connectedSourceHandleIds?.filter(handleId => handleId !== currentEdge.sourceHandle)
- if (targetNode)
- targetNode.data._connectedTargetHandleIds = targetNode.data._connectedTargetHandleIds?.filter(handleId => handleId !== currentEdge.targetHandle)
- })
- setNodes(newNodes)
- const newEdges = produce(edges, (draft) => {
- draft.splice(currentEdgeIndex, 1)
- })
- setEdges(newEdges)
- handleSyncWorkflowDraft()
- saveStateToHistory(WorkflowHistoryEvent.EdgeDeleteByDeleteBranch)
- }, [getNodesReadOnly, store, handleSyncWorkflowDraft, saveStateToHistory])
- const handleEdgeDelete = useCallback(() => {
- if (getNodesReadOnly())
- return
- const {
- getNodes,
- setNodes,
- edges,
- setEdges,
- } = store.getState()
- const currentEdgeIndex = edges.findIndex(edge => edge.selected)
- if (currentEdgeIndex < 0)
- return
- const currentEdge = edges[currentEdgeIndex]
- const nodes = getNodes()
- const nodesConnectedSourceOrTargetHandleIdsMap = getNodesConnectedSourceOrTargetHandleIdsMap(
- [
- { type: 'remove', edge: currentEdge },
- ],
- nodes,
- )
- const newNodes = produce(nodes, (draft: Node[]) => {
- draft.forEach((node) => {
- if (nodesConnectedSourceOrTargetHandleIdsMap[node.id]) {
- node.data = {
- ...node.data,
- ...nodesConnectedSourceOrTargetHandleIdsMap[node.id],
- }
- }
- })
- })
- setNodes(newNodes)
- const newEdges = produce(edges, (draft) => {
- draft.splice(currentEdgeIndex, 1)
- })
- setEdges(newEdges)
- handleSyncWorkflowDraft()
- saveStateToHistory(WorkflowHistoryEvent.EdgeDelete)
- }, [getNodesReadOnly, store, handleSyncWorkflowDraft, saveStateToHistory])
- const handleEdgesChange = useCallback<OnEdgesChange>((changes) => {
- if (getNodesReadOnly())
- return
- const {
- edges,
- setEdges,
- } = store.getState()
- const newEdges = produce(edges, (draft) => {
- changes.forEach((change) => {
- if (change.type === 'select')
- draft.find(edge => edge.id === change.id)!.selected = change.selected
- })
- })
- setEdges(newEdges)
- }, [store, getNodesReadOnly])
- const handleEdgeCancelRunningStatus = useCallback(() => {
- const {
- edges,
- setEdges,
- } = store.getState()
- const newEdges = produce(edges, (draft) => {
- draft.forEach((edge) => {
- edge.data._run = false
- })
- })
- setEdges(newEdges)
- }, [store])
- return {
- handleEdgeEnter,
- handleEdgeLeave,
- handleEdgeDeleteByDeleteBranch,
- handleEdgeDelete,
- handleEdgesChange,
- handleEdgeCancelRunningStatus,
- }
- }
|