| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 | 
							- import type { MouseEvent } from 'react'
 
- import {
 
-   useCallback,
 
- } from 'react'
 
- import produce from 'immer'
 
- import type {
 
-   OnSelectionChangeFunc,
 
- } from 'reactflow'
 
- import { useStoreApi } from 'reactflow'
 
- import { useWorkflowStore } from '../store'
 
- import type { Node } from '../types'
 
- export const useSelectionInteractions = () => {
 
-   const store = useStoreApi()
 
-   const workflowStore = useWorkflowStore()
 
-   const handleSelectionStart = useCallback(() => {
 
-     const {
 
-       getNodes,
 
-       setNodes,
 
-       edges,
 
-       setEdges,
 
-       userSelectionRect,
 
-     } = store.getState()
 
-     if (!userSelectionRect?.width || !userSelectionRect?.height) {
 
-       const nodes = getNodes()
 
-       const newNodes = produce(nodes, (draft) => {
 
-         draft.forEach((node) => {
 
-           if (node.data._isBundled)
 
-             node.data._isBundled = false
 
-         })
 
-       })
 
-       setNodes(newNodes)
 
-       const newEdges = produce(edges, (draft) => {
 
-         draft.forEach((edge) => {
 
-           if (edge.data._isBundled)
 
-             edge.data._isBundled = false
 
-         })
 
-       })
 
-       setEdges(newEdges)
 
-     }
 
-   }, [store])
 
-   const handleSelectionChange = useCallback<OnSelectionChangeFunc>(({ nodes: nodesInSelection, edges: edgesInSelection }) => {
 
-     const {
 
-       getNodes,
 
-       setNodes,
 
-       edges,
 
-       setEdges,
 
-       userSelectionRect,
 
-     } = store.getState()
 
-     const nodes = getNodes()
 
-     if (!userSelectionRect?.width || !userSelectionRect?.height)
 
-       return
 
-     const newNodes = produce(nodes, (draft) => {
 
-       draft.forEach((node) => {
 
-         const nodeInSelection = nodesInSelection.find(n => n.id === node.id)
 
-         if (nodeInSelection)
 
-           node.data._isBundled = true
 
-         else
 
-           node.data._isBundled = false
 
-       })
 
-     })
 
-     setNodes(newNodes)
 
-     const newEdges = produce(edges, (draft) => {
 
-       draft.forEach((edge) => {
 
-         const edgeInSelection = edgesInSelection.find(e => e.id === edge.id)
 
-         if (edgeInSelection)
 
-           edge.data._isBundled = true
 
-         else
 
-           edge.data._isBundled = false
 
-       })
 
-     })
 
-     setEdges(newEdges)
 
-   }, [store])
 
-   const handleSelectionDrag = useCallback((_: MouseEvent, nodesWithDrag: Node[]) => {
 
-     const {
 
-       getNodes,
 
-       setNodes,
 
-     } = store.getState()
 
-     workflowStore.setState({
 
-       nodeAnimation: false,
 
-     })
 
-     const nodes = getNodes()
 
-     const newNodes = produce(nodes, (draft) => {
 
-       draft.forEach((node) => {
 
-         const dragNode = nodesWithDrag.find(n => n.id === node.id)
 
-         if (dragNode)
 
-           node.position = dragNode.position
 
-       })
 
-     })
 
-     setNodes(newNodes)
 
-   }, [store, workflowStore])
 
-   const handleSelectionCancel = useCallback(() => {
 
-     const {
 
-       getNodes,
 
-       setNodes,
 
-       edges,
 
-       setEdges,
 
-     } = store.getState()
 
-     store.setState({
 
-       userSelectionRect: null,
 
-       userSelectionActive: true,
 
-     })
 
-     const nodes = getNodes()
 
-     const newNodes = produce(nodes, (draft) => {
 
-       draft.forEach((node) => {
 
-         if (node.data._isBundled)
 
-           node.data._isBundled = false
 
-       })
 
-     })
 
-     setNodes(newNodes)
 
-     const newEdges = produce(edges, (draft) => {
 
-       draft.forEach((edge) => {
 
-         if (edge.data._isBundled)
 
-           edge.data._isBundled = false
 
-       })
 
-     })
 
-     setEdges(newEdges)
 
-   }, [store])
 
-   return {
 
-     handleSelectionStart,
 
-     handleSelectionChange,
 
-     handleSelectionDrag,
 
-     handleSelectionCancel,
 
-   }
 
- }
 
 
  |