Canvas: fix empty config tab

Change-Id: I7b59790577478d0b75c0b62e970bc7e95282f65a
diff --git a/apps/canvas/front/src/lib/state.ts b/apps/canvas/front/src/lib/state.ts
index fb461c2..428ae17 100644
--- a/apps/canvas/front/src/lib/state.ts
+++ b/apps/canvas/front/src/lib/state.ts
@@ -418,11 +418,24 @@
 
 export const useStateStore = create<AppState>((set, get): AppState => {
 	const setN = (nodes: AppNode[]) => {
-		set((state) => ({
-			...state,
+		if (nodes.length == 0) {
+			console.trace("setN", nodes);
+		}
+		set({
 			nodes,
 			messages: v(nodes),
-		}));
+		});
+	};
+
+	const restoreSaved = async () => {
+		const resp = await fetch(`/api/project/${get().projectId}/saved`, {
+			method: "GET",
+		});
+		const inst = await resp.json();
+		// const { x = 0, y = 0, zoom = 1 } = inst.viewport;
+		setN(inst.nodes || []);
+		get().setEdges(inst.edges || []);
+		// instance.setViewport({ x, y, zoom });
 	};
 
 	function updateNodeData<T extends NodeType>(id: string, data: NodeDataUpdate<T>): void {
@@ -688,11 +701,14 @@
 			} catch (error) {
 				console.error("Failed to fetch integrations:", error);
 			} finally {
-				set({ env: env });
-				if (env.integrations.github) {
-					set({ githubService: new GitHubServiceImpl(projectId!) });
-				} else {
-					set({ githubService: null });
+				if (JSON.stringify(get().env) !== JSON.stringify(env)) {
+					set({ env });
+
+					if (env.integrations.github) {
+						set({ githubService: new GitHubServiceImpl(projectId!) });
+					} else {
+						set({ githubService: null });
+					}
 				}
 			}
 		},
@@ -702,6 +718,12 @@
 			});
 			if (projectId) {
 				get().refreshEnv();
+				restoreSaved();
+			} else {
+				set({
+					nodes: [],
+					edges: [],
+				});
 			}
 		},
 	};