| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 | 
							- 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,
 
-   }
 
- }
 
 
  |