아이티 코드

리액트플로우

느림보. 2025. 3. 18. 10:32

import React, { useState, useEffect } from 'react';

import ReactFlow, {

  addEdge,

  MiniMap,

  Controls,

  Background,

  applyNodeChanges,

  applyEdgeChanges,

  Node,

  Edge,

  Connection,

  NodeChange,

  EdgeChange,

} from 'reactflow';

import 'reactflow/dist/style.css';

 

const initialNodes: Node[] = [

  {

    id: '1',

    type: 'input',

    data: { label: 'Node 1' },

    position: { x: 250, y: 5 },

  },

  // ...other nodes

];

 

const initialEdges: Edge[] = [

  { id: 'e1-2', source: '1', target: '2', animated: true },

  // ...other edges

];

 

const App: React.FC = () => {

  const [nodes, setNodes] = useState<Node[]>(initialNodes);

  const [edges, setEdges] = useState<Edge[]>(initialEdges);

  const [selectedNode, setSelectedNode] = useState<Node | null>(null);

 

  const onNodesChange = (changes: NodeChange[]) => {

    setNodes((nds) => {

      const updatedNodes = applyNodeChanges(changes, nds);

      if (selectedNode) {

        const updatedSelectedNode = updatedNodes.find(node => node.id === selectedNode.id) || null;

        setSelectedNode(updatedSelectedNode);

      }

      return updatedNodes;

    });

  };

 

  const onEdgesChange = (changes: EdgeChange[]) => setEdges((eds) => applyEdgeChanges(changes, eds));

  const onConnect = (params: Connection) => setEdges((eds) => addEdge(params, eds));

 

  const onNodeClick = (_event: React.MouseEvent, node: Node) => {

    setSelectedNode(node);

  };

 

  const handleSidebarChange = (event: React.ChangeEvent<HTMLInputElement>) => {

    const { name, value } = event.target;

    if (selectedNode) {

      const updatedNode = {

        ...selectedNode,

        data: { ...selectedNode.data, [name]: value },

      };

 

      setSelectedNode(updatedNode);

 

      setNodes((nds) =>

        nds.map((node) => (node.id === selectedNode.id ? updatedNode : node))

      );

    }

  };

 

  return (

    <div style={{ display: 'flex', height: '100vh' }}>

      <div style={{ width: '70%' }}>

        <ReactFlow

          nodes={nodes}

          edges={edges}

          onNodesChange={onNodesChange}

          onEdgesChange={onEdgesChange}

          onConnect={onConnect}

          onNodeClick={onNodeClick}

          fitView

        >

          <MiniMap />

          <Controls />

          <Background />

        </ReactFlow>

      </div>

      <div style={{ width: '30%', padding: '10px', borderLeft: '1px solid #ddd' }}>

        {selectedNode && (

          <div>

            <h3>Node Details</h3>

            <label>

              Label:

              <input

                type="text"

                name="label"

                value={selectedNode.data.label}

                onChange={handleSidebarChange}

              />

            </label>

          </div>

        )}

      </div>

    </div>

  );

};

 

export default App;