import React, { useCallback } from 'react'
import ReactFlow, {
Background,
Controls,
MiniMap,
useNodesState,
useEdgesState,
addEdge,
} from 'react-flow-renderer'
const nodeTypes = {
checkpoint: ({ data }) => (
{data.label}
{data.ckpt_name}
),
textEncode: ({ data }) => (
),
sampler: ({ data }) => (
{data.label}
Steps: {data.steps}, CFG: {data.cfg}
),
vae: ({ data }) => (
),
save: ({ data }) => (
),
}
export default function NodeEditor({ workflow }) {
const initialNodes = workflow.nodes.map(node => {
const baseNode = {
id: node.id.toString(),
position: { x: node.pos[0], y: node.pos[1] },
data: { ...node.inputs, label: node.type },
}
switch(node.type) {
case 'CheckpointLoaderSimple':
return { ...baseNode, type: 'checkpoint' }
case 'CLIPTextEncode':
return { ...baseNode, type: 'textEncode' }
case 'KSampler':
return { ...baseNode, type: 'sampler' }
case 'VAEDecode':
return { ...baseNode, type: 'vae' }
case 'SaveImage':
return { ...baseNode, type: 'save' }
default:
return baseNode
}
})
const initialEdges = workflow.links.map(link => ({
id: `e${link[0]}-${link[1]}-${link[2]}-${link[3]}`,
source: link[0].toString(),
sourceHandle: link[1].toString(),
target: link[2].toString(),
targetHandle: link[3].toString(),
}))
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes)
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges)
const onConnect = useCallback(
params => setEdges(eds => addEdge(params, eds)),
[setEdges]
)
return (
)
}