fix: preserve dragged workflow graph positions

This commit is contained in:
lda
2026-07-13 08:58:13 +07:00 Verified
parent 4982061ba3
commit 41f084c420
@@ -1,4 +1,4 @@
import { useCallback, useEffect, useMemo, type MouseEvent } from "react"; import { useCallback, useEffect, useMemo, useRef, type MouseEvent } from "react";
import { import {
Background, Background,
Controls, Controls,
@@ -114,6 +114,17 @@ const WorkflowGraphStageInner = ({
variant = "full", variant = "full",
}: WorkflowGraphStageProps) => { }: WorkflowGraphStageProps) => {
const { fitView } = useReactFlow<Node<PresentationNodeData>, Edge>(); const { fitView } = useReactFlow<Node<PresentationNodeData>, Edge>();
const selectNodeRef = useRef(selectNode);
useEffect(() => {
selectNodeRef.current = selectNode;
}, [selectNode]);
// Inspector selection rerenders the parent. Keep the node callback stable so
// that rerender does not recreate baseNodes and erase user-dragged positions.
const handleSelectNode = useCallback((nodeId: string) => {
selectNodeRef.current(nodeId);
}, []);
const model = useMemo(() => { const model = useMemo(() => {
const generated = buildWorkflowGraph(presentationWorkflowPlan, { const generated = buildWorkflowGraph(presentationWorkflowPlan, {
direction: "LR", direction: "LR",
@@ -149,12 +160,12 @@ const WorkflowGraphStageInner = ({
selectable: false, selectable: false,
data: { data: {
...node.data, ...node.data,
selectNode, selectNode: handleSelectNode,
positionX: node.position.x, positionX: node.position.x,
positionY: node.position.y, positionY: node.position.y,
}, },
})), })),
[model.nodes, selectNode], [handleSelectNode, model.nodes],
); );
const [nodes, setNodes, onNodesChange] = useNodesState(baseNodes); const [nodes, setNodes, onNodesChange] = useNodesState(baseNodes);