| 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._runned = false
 -       })
 -     })
 -     setEdges(newEdges)
 -   }, [store])
 - 
 -   return {
 -     handleEdgeEnter,
 -     handleEdgeLeave,
 -     handleEdgeDeleteByDeleteBranch,
 -     handleEdgeDelete,
 -     handleEdgesChange,
 -     handleEdgeCancelRunningStatus,
 -   }
 - }
 
 
  |