From 198d3e412b2d736edb8ad9d8887fad20defa0397 Mon Sep 17 00:00:00 2001
From: ali asaria <aliasaria@users.noreply.github.com>
Date: Wed, 26 Feb 2025 15:11:45 -0500
Subject: [PATCH] auto zoom to the number of nodes that are on the canvas

---
 .../Experiment/Workflows/WorkflowCanvas.tsx   | 40 +++++++++++++++++--
 1 file changed, 37 insertions(+), 3 deletions(-)

diff --git a/src/renderer/components/Experiment/Workflows/WorkflowCanvas.tsx b/src/renderer/components/Experiment/Workflows/WorkflowCanvas.tsx
index 4c2ac430..3277a5c7 100644
--- a/src/renderer/components/Experiment/Workflows/WorkflowCanvas.tsx
+++ b/src/renderer/components/Experiment/Workflows/WorkflowCanvas.tsx
@@ -1,6 +1,13 @@
-import { Background, ControlButton, Controls, ReactFlow } from '@xyflow/react';
+import {
+  Background,
+  ControlButton,
+  Controls,
+  ReactFlow,
+  ReactFlowProvider,
+  useReactFlow,
+} from '@xyflow/react';
 import { PlusCircleIcon } from 'lucide-react';
-import React from 'react';
+import React, { useEffect } from 'react';
 
 function generateNodes(workflow: any) {
   let out: any[] = [];
@@ -47,12 +54,31 @@ function generateEdges(workflow: any) {
   return out;
 }
 
-export default function WorkflowCanvas({ selectedWorkflow }) {
+const Flow = ({ selectedWorkflow }) => {
+  const reactFlowInstance = useReactFlow();
+  // Use fitView after the component mounts
+  useEffect(() => {
+    // Wait a moment to ensure the flow is rendered before fitting
+    const timer = setTimeout(() => {
+      reactFlowInstance.fitView({
+        includeHiddenNodes: false, // Don't include hidden nodes
+        minZoom: 0.5, // Set minimum zoom level
+        maxZoom: 10, // Set maximum zoom level
+      });
+    }, 100);
+
+    return () => clearTimeout(timer);
+  }, [reactFlowInstance, selectedWorkflow]);
+
   return (
     <ReactFlow
       nodes={generateNodes(selectedWorkflow)}
       edges={generateEdges(selectedWorkflow)}
       fitView
+      zoomOnScroll={false}
+      zoomOnPinch={false}
+      zoomOnDoubleClick={false}
+      panOnScroll={false}
       style={{ backgroundColor: '#F7F9FB' }}
     >
       <Background color="#96ADE9" />
@@ -72,4 +98,12 @@ export default function WorkflowCanvas({ selectedWorkflow }) {
       />
     </ReactFlow>
   );
+};
+
+export default function WorkflowCanvas({ selectedWorkflow }) {
+  return (
+    <ReactFlowProvider>
+      <Flow selectedWorkflow={selectedWorkflow} />
+    </ReactFlowProvider>
+  );
 }
-- 
GitLab