File size: 3,457 Bytes
5365cac
e3322d7
 
 
 
 
 
 
 
 
 
 
 
 
 
5365cac
dcce454
 
5365cac
dcce454
5365cac
 
dcce454
 
 
 
5365cac
dcce454
 
 
5365cac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dcce454
5365cac
 
 
 
 
 
dcce454
5365cac
 
78dc980
5365cac
 
 
 
78dc980
 
 
5365cac
 
 
dcce454
5365cac
dcce454
 
5365cac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dcce454
e3322d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import { useSetModalState } from '@/hooks/commonHooks';
import React, {
  Dispatch,
  KeyboardEventHandler,
  SetStateAction,
  useCallback,
  useState,
} from 'react';
import {
  Node,
  Position,
  ReactFlowInstance,
  useOnSelectionChange,
  useReactFlow,
} from 'reactflow';
import { v4 as uuidv4 } from 'uuid';

export const useHandleDrag = () => {
  const handleDragStart = useCallback(
    (operatorId: string) => (ev: React.DragEvent<HTMLDivElement>) => {
      ev.dataTransfer.setData('application/reactflow', operatorId);
      ev.dataTransfer.effectAllowed = 'move';
    },
    [],
  );

  return { handleDragStart };
};

export const useHandleDrop = (setNodes: Dispatch<SetStateAction<Node[]>>) => {
  const [reactFlowInstance, setReactFlowInstance] =
    useState<ReactFlowInstance<any, any>>();

  const onDragOver = useCallback((event: React.DragEvent<HTMLDivElement>) => {
    event.preventDefault();
    event.dataTransfer.dropEffect = 'move';
  }, []);

  const onDrop = useCallback(
    (event: React.DragEvent<HTMLDivElement>) => {
      event.preventDefault();

      const type = event.dataTransfer.getData('application/reactflow');

      // check if the dropped element is valid
      if (typeof type === 'undefined' || !type) {
        return;
      }

      // reactFlowInstance.project was renamed to reactFlowInstance.screenToFlowPosition
      // and you don't need to subtract the reactFlowBounds.left/top anymore
      // details: https://reactflow.dev/whats-new/2023-11-10
      const position = reactFlowInstance?.screenToFlowPosition({
        x: event.clientX,
        y: event.clientY,
      });
      const newNode = {
        id: uuidv4(),
        type: 'textUpdater',
        position: position || {
          x: 0,
          y: 0,
        },
        data: { label: `${type}` },
        sourcePosition: Position.Right,
        targetPosition: Position.Left,
      };

      setNodes((nds) => nds.concat(newNode));
    },
    [reactFlowInstance, setNodes],
  );

  return { onDrop, onDragOver, setReactFlowInstance };
};

export const useShowDrawer = () => {
  const {
    visible: drawerVisible,
    hideModal: hideDrawer,
    showModal: showDrawer,
  } = useSetModalState();

  return {
    drawerVisible,
    hideDrawer,
    showDrawer,
  };
};

export const useHandleSelectionChange = () => {
  const [selectedNodes, setSelectedNodes] = useState<string[]>([]);
  const [selectedEdges, setSelectedEdges] = useState<string[]>([]);

  useOnSelectionChange({
    onChange: ({ nodes, edges }) => {
      setSelectedNodes(nodes.map((node) => node.id));
      setSelectedEdges(edges.map((edge) => edge.id));
    },
  });

  return { selectedEdges, selectedNodes };
};

export const useDeleteEdge = (selectedEdges: string[]) => {
  const { setEdges } = useReactFlow();

  const deleteEdge = useCallback(() => {
    setEdges((edges) =>
      edges.filter((edge) => selectedEdges.every((x) => x !== edge.id)),
    );
  }, [setEdges, selectedEdges]);

  return deleteEdge;
};

export const useHandleKeyUp = (
  selectedEdges: string[],
  selectedNodes: string[],
) => {
  const deleteEdge = useDeleteEdge(selectedEdges);
  const handleKeyUp: KeyboardEventHandler = useCallback(
    (e) => {
      if (e.code === 'Delete') {
        deleteEdge();
      }
    },
    [deleteEdge],
  );

  return { handleKeyUp };
};

export const useSaveGraph = () => {
  const saveGraph = useCallback(() => {}, []);

  return { saveGraph };
};