Files
pepperplus-ui/src/visualProgrammingUI/VisProgUI.tsx
JGerla 1a5b1e7617 feat: moved the state handling logic for VisProgUI to a Zustand store
all functional logic and state is now contained within a single Zustand store, and removed from the editor component definition

ref: N25B-162
2025-10-08 15:19:49 +02:00

115 lines
3.1 KiB
TypeScript

import './VisProgUI.css'
import {
Background,
Controls,
ReactFlow,
ReactFlowProvider,
MarkerType,
Panel,
} from '@xyflow/react';
import '@xyflow/react/dist/style.css';
import {
StartNode,
EndNode,
PhaseNode,
NormNode
} from "./components/NodeDefinitions.tsx";
import { Sidebar } from './components/DragDropSidebar.tsx';
import useStore from "./VisProgStores.tsx";
import {useShallow} from "zustand/react/shallow";
import type {FlowState} from "./VisProgTypes.tsx";
// --| config starting params for flow |--
const nodeTypes = {
start: StartNode,
end: EndNode,
phase: PhaseNode,
norm: NormNode
};
const defaultEdgeOptions = {
type: 'default',
markerEnd: {
type: MarkerType.ArrowClosed,
color: '#505050',
},
};
const selector = (state: FlowState) => ({
nodes: state.nodes,
edges: state.edges,
onNodesChange: state.onNodesChange,
onEdgesChange: state.onEdgesChange,
onConnect: state.onConnect,
onReconnectStart: state.onReconnectStart,
onReconnectEnd: state.onReconnectEnd,
onReconnect: state.onReconnect
});
// --| define ReactFlow editor |--
const VisProgUI = ()=> {
const { nodes, edges, onNodesChange, onEdgesChange, onConnect, onReconnect, onReconnectStart, onReconnectEnd } = useStore(
useShallow(selector),
);
// handles connection of newly created edges
return (
<div style={{marginInline: 'auto',display: 'flex',justifySelf: 'center', padding:'10px', alignItems: 'center', width: '80vw', height: '80vh'}}>
<div style={{outlineStyle: 'solid', borderRadius: '10pt',width: '90%', height:'100%' }}>
<ReactFlow
nodes={nodes}
edges={edges}
defaultEdgeOptions={defaultEdgeOptions}
onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange}
nodeTypes={nodeTypes}
onReconnect={onReconnect}
onReconnectStart={onReconnectStart}
onReconnectEnd={onReconnectEnd}
onConnect={onConnect}
snapToGrid
fitView
proOptions={{hideAttribution: true }}
>
<Panel position="top-center" style={{marginInlineStart: 'auto', marginInlineEnd:'auto',backgroundColor: 'canvas' ,marginBottom: '0.5rem', marginTop:'auto', width: '50%', height:'7%'}}>
<Sidebar />
</Panel>
<Controls />
<Background />
</ReactFlow>
</div>
</div>
);
};
/* --| Places the VisProgUI component inside a ReactFlowProvider
*
* Wrapping the editor component inside a ReactFlowProvider
* allows us to access and interact with the components inside the editor,
* thus facilitating the addition of node specific functions inside their node definitions
*/
function VisualProgrammingUI(){
return (
<ReactFlowProvider>
<VisProgUI />
</ReactFlowProvider>
);
}
export default VisualProgrammingUI;