'use client'; import { useCallback, useLayoutEffect, useMemo } from 'react'; import { EdgeChange, NodeChange, NodeTypes, ProOptions, ReactFlow, useEdgesState, useNodesState, useViewport } from 'reactflow'; import Overlay from '@/components/ui/Overlay'; import AnimateFade from '@/components/wrap/AnimateFade'; import { useConceptOptions } from '@/context/ConceptOptionsContext'; import { useOSS } from '@/context/OssContext'; import { useOssEdit } from '../OssEditContext'; import InputNode from './InputNode'; import OperationNode from './OperationNode'; import ToolbarOssGraph from './ToolbarOssGraph'; function OssFlow() { const { calculateHeight } = useConceptOptions(); const model = useOSS(); const controller = useOssEdit(); const viewport = useViewport(); const [nodes, setNodes, onNodesChange] = useNodesState([]); const [edges, setEdges, onEdgesChange] = useEdgesState([]); useLayoutEffect(() => { if (!model.schema) { setNodes([]); setEdges([]); return; } setNodes( model.schema.items.map(operation => ({ id: String(operation.id), data: { label: operation.alias }, position: { x: operation.position_x, y: operation.position_y }, type: operation.operation_type.toString() })) ); setEdges( model.schema.arguments.map((argument, index) => ({ id: String(index), source: String(argument.argument), target: String(argument.operation) })) ); }, [model.schema, setNodes, setEdges]); const getPositions = useCallback( () => nodes.map(node => ({ id: Number(node.id), position_x: node.position.x, position_y: node.position.y })), [nodes] ); const handleNodesChange = useCallback( (changes: NodeChange[]) => { onNodesChange(changes); }, [onNodesChange] ); const handleEdgesChange = useCallback( (changes: EdgeChange[]) => { onEdgesChange(changes); }, [onEdgesChange] ); const handleCreateOperation = useCallback(() => { // TODO: calculate insert location controller.promptCreateOperation(viewport.x, viewport.y, getPositions()); }, [controller, viewport, getPositions]); const proOptions: ProOptions = useMemo(() => ({ hideAttribution: true }), []); const canvasWidth = useMemo(() => 'calc(100vw - 1rem)', []); const canvasHeight = useMemo(() => calculateHeight('1.75rem + 4px'), [calculateHeight]); const OssNodeTypes: NodeTypes = useMemo( () => ({ synthesis: OperationNode, input: InputNode }), [] ); const graph = useMemo( () => ( ), [nodes, edges, proOptions, handleNodesChange, handleEdgesChange, OssNodeTypes] ); return (
{graph}
); } export default OssFlow;