| import React, { memo } from 'react'; |
| import { Handle, useReactFlow, useStoreApi, Position } from 'reactflow'; |
|
|
| const options = [ |
| { |
| value: 'smoothstep', |
| label: 'Smoothstep', |
| }, |
| { |
| value: 'step', |
| label: 'Step', |
| }, |
| { |
| value: 'default', |
| label: 'Bezier (default)', |
| }, |
| { |
| value: 'straight', |
| label: 'Straight', |
| }, |
| ]; |
|
|
| function Select({ value, handleId, nodeId }) { |
| const { setNodes } = useReactFlow(); |
| const store = useStoreApi(); |
|
|
| const onChange = (evt) => { |
| const { nodeInternals } = store.getState(); |
| setNodes( |
| Array.from(nodeInternals.values()).map((node) => { |
| if (node.id === nodeId) { |
| node.data = { |
| ...node.data, |
| selects: { |
| ...node.data.selects, |
| [handleId]: evt.target.value, |
| }, |
| }; |
| } |
|
|
| return node; |
| }) |
| ); |
| }; |
|
|
| return ( |
| <div className="custom-node__select"> |
| <div>Edge Type</div> |
| <select className="nodrag" onChange={onChange} value={value}> |
| {options.map((option) => ( |
| <option key={option.value} value={option.value}> |
| {option.label} |
| </option> |
| ))} |
| </select> |
| <Handle type="source" position={Position.Right} id={handleId} /> |
| </div> |
| ); |
| } |
|
|
| function CustomNode({ id, data }) { |
| return ( |
| <> |
| <div className="custom-node__header"> |
| This is a <strong>custom node</strong> |
| </div> |
| <div className="custom-node__body"> |
| {Object.keys(data.selects).map((handleId) => ( |
| <Select key={handleId} nodeId={id} value={data.selects[handleId]} handleId={handleId} /> |
| ))} |
| </div> |
| </> |
| ); |
| } |
|
|
| export default memo(CustomNode); |
|
|