import React, { useState, DragEvent } from 'react'; import ReactFlow, { ReactFlowProvider, addEdge, removeElements, Controls, OnLoadParams, Elements, Connection, Edge, ElementId, Node, } from 'react-flow-renderer'; import Sidebar from './Sidebar'; import './dnd.css'; const initialElements = [{ id: '1', type: 'input', data: { label: 'input node' }, position: { x: 250, y: 5 } }]; const onDragOver = (event: DragEvent) => { event.preventDefault(); event.dataTransfer.dropEffect = 'move'; }; let id = 0; const getId = (): ElementId => `dndnode_${id++}`; const DnDFlow = () => { const [reactFlowInstance, setReactFlowInstance] = useState(); const [elements, setElements] = useState(initialElements); const onConnect = (params: Connection | Edge) => setElements((els) => addEdge(params, els)); const onElementsRemove = (elementsToRemove: Elements) => setElements((els) => removeElements(elementsToRemove, els)); const onLoad = (_reactFlowInstance: OnLoadParams) => setReactFlowInstance(_reactFlowInstance); const onDrop = (event: DragEvent) => { event.preventDefault(); if (reactFlowInstance) { const type = event.dataTransfer.getData('application/reactflow'); const position = reactFlowInstance.project({ x: event.clientX, y: event.clientY - 40 }); const newNode: Node = { id: getId(), type, position, data: { label: `${type} node` }, }; setElements((es) => es.concat(newNode)); } }; return (
); }; export default DnDFlow;