1- import ReactFlow , { Background , BackgroundVariant , ControlButton , Controls , MiniMap , ReactFlowProvider , useReactFlow } from "reactflow" ;
1+ import { useCallback , useEffect , useRef , useState } from "react" ;
2+ import ReactFlow , { Background , useOnViewportChange , BackgroundVariant , ControlButton , Controls , MiniMap , Node , ReactFlowProvider , useEdgesState , useNodesState , useReactFlow , useStoreApi , useViewport , Viewport , XYPosition , applyNodeChanges , applyEdgeChanges , addEdge , Edge , Connection , ConnectionMode } from "reactflow" ;
3+ import { FlowMode } from "../../state/FlowStore" ;
24import { useStoreState } from "../../state/Hooks" ;
5+ import ConnectionLine from "./ConnectionLine" ;
6+ import JobNode from "./JobNode" ;
37
48export type FlowProps = { className ?: string }
59
10+
11+ const nodeTypes = {
12+ job : JobNode ,
13+ } ;
14+
15+ const initialNodes = [
16+ {
17+ id : '1' ,
18+ type : 'job' ,
19+ data : { label : 'Node A' } ,
20+ position : { x : 250 , y : 0 } ,
21+ } ,
22+ {
23+ id : '2' ,
24+ type : 'job' ,
25+ data : { label : 'Node B' } ,
26+ position : { x : 100 , y : 200 } ,
27+ } ,
28+ {
29+ id : '3' ,
30+ type : 'job' ,
31+ data : { label : 'Node C' } ,
32+ position : { x : 350 , y : 200 } ,
33+ } ,
34+ ] ;
35+
36+ const initialEdges = [ { id : 'e1-2' , source : '1' , target : '2' , label : 'updatable edge' } ] ;
37+ const MIN_DISTANCE = 1000 ;
38+
639const Flow = ( props : FlowProps ) => {
7- // const reactFlowInstance = useReactFlow ();
40+ const store = useStoreApi ( ) ;
841 const dragging = useStoreState ( ( state ) => state . dragging ) ;
42+ const viewport = useViewport ( ) ;
43+ const flowRef = useRef < HTMLDivElement > ( null ) ;
44+ const [ nodes , setNodes , onNodesChange ] = useNodesState ( initialNodes ) ;
45+ const [ edges , setEdges , onEdgesChange ] = useEdgesState ( initialEdges ) ;
46+ const mode = useStoreState ( ( state ) => state . mode ) ;
47+ const onConnect = useCallback ( ( params : Edge | Connection ) => setEdges ( ( eds ) => addEdge ( params , eds ) ) , [ setEdges ] ) ;
48+
949
1050 return < ReactFlow
1151 minZoom = { - Infinity }
1252 fitView
13- // nodes={nodes}
14- // edges={edges as Edge[]}
15- // onNodeClick={handleNodeClick}
16- className = { props . className }
53+ nodes = { nodes }
54+ edges = { edges }
55+ ref = { flowRef }
56+ onNodesChange = { onNodesChange }
57+ onEdgesChange = { onEdgesChange }
58+ onConnect = { onConnect }
59+ nodesDraggable = { mode == FlowMode . MOVE }
60+ elementsSelectable = { mode == FlowMode . SELECT }
61+ connectionLineComponent = { ConnectionLine }
62+ snapToGrid
63+ nodeTypes = { nodeTypes }
64+ className = { props . className }
1765 onDragOver = { ( e ) => {
1866 if ( dragging ?. dataType ?. dragTarget === 'workflow' ) {
1967 e . preventDefault ( ) ;
2068 }
2169 } }
70+ onMouseMove = { ( event ) => {
71+ // getClosestNode({ x: event.clientX, y: event.clientY });
72+ } }
2273 onInit = { ( reactFlowInstance ) => console . log ( 'flow loaded:' , reactFlowInstance ) }
2374 >
2475 < Background
2576 gap = { 15 }
2677 color = "#c7c7c7"
2778 className = "bg-circle-gray-200"
28- size = { 2 }
79+ size = { 2 }
2980 />
3081 < Controls >
3182 </ Controls >
@@ -38,4 +89,55 @@ const GraphWrapper = (props: FlowProps) => {
3889 </ ReactFlowProvider >
3990}
4091
41- export { GraphWrapper , Flow } ;
92+ export { GraphWrapper , Flow } ;
93+ // const onConnect = useCallback((params) => setEdges((els) => addEdge(params, els)), []);
94+
95+ // const onNodesChange = useCallback(
96+ // (changes) => setNodes((nds) => applyNodeChanges(changes, nds)),
97+ // [setNodes]
98+ // );
99+ // const onEdgesChange = useCallback(
100+ // (changes) => setEdges((eds) => applyEdgeChanges(changes, eds)),
101+ // [setEdges]
102+ // );
103+ // const onConnect = useCallback(
104+ // (connection) => setEdges((eds) => addEdge(connection, eds)),
105+ // [setEdges]
106+ // );
107+
108+ // const getClosestNode = useCallback((pos: XYPosition) => {
109+ // const { nodeInternals } = store.getState();
110+ // const storeNodes = Array.from(nodeInternals.values());
111+
112+ // const closestNode = storeNodes.reduce<{ distance: number, node?: Node<any>}>(
113+ // (res, n) => {
114+ // const boundingRect = flowRef.current?.getBoundingClientRect() || { x: 0, y: 0};
115+ // const mouseX = Math.abs((pos.x - boundingRect.x) * viewport.zoom + viewport.x);
116+ // const mouseY = Math.abs((pos.y - boundingRect.y) * viewport.zoom + viewport.y)
117+ // const dx = Math.abs(n.position.x) - mouseX;
118+ // const dy = Math.abs(n.position.y) - mouseY;
119+ // const d = Math.sqrt(dx * dx + dy * dy);
120+
121+ // // console.log(pos.y - boundingRect.y, mouseY, viewport.y)
122+
123+ // if (d < res.distance && d < MIN_DISTANCE) {
124+ // res.distance = d;
125+ // res.node = n;
126+ // }
127+
128+ // return res;
129+ // },
130+ // {
131+ // distance: Number.MAX_VALUE,
132+ // node: undefined,
133+ // }
134+ // );
135+
136+ // if (!closestNode.node) {
137+ // return null;
138+ // }
139+
140+ // // console.log(closestNode.node)
141+
142+ // return closestNode.node;
143+ // }, [viewport]);
0 commit comments