fix(ui): refresh picker topology after node changes (#122774)

This commit is contained in:
Peter Steinberger
2026-08-12 12:35:20 -07:00
committed by GitHub
parent 7b73d33b60
commit 11fe5abaa9
2 changed files with 29 additions and 9 deletions
@@ -66,7 +66,13 @@ suite.define(() => {
},
],
},
"environments.list": { environments: [], profiles: [] },
"environments.list": {
environments: [
{ id: "gateway", type: "local", status: "available" },
{ id: "node:existing-mac", type: "node", status: "available" },
],
profiles: [],
},
},
});
@@ -96,6 +102,14 @@ suite.define(() => {
},
],
});
await gateway.setMethodResponse("environments.list", {
environments: [
{ id: "gateway", type: "local", status: "available" },
{ id: "node:existing-mac", type: "node", status: "available" },
{ id: "node:new-mac", type: "node", status: "available" },
],
profiles: [],
});
await gateway.emitGatewayEvent("presence", {
presence: [
{ deviceId: "existing-mac", mode: "node", reason: "connect", ts: 1 },
@@ -106,12 +120,15 @@ suite.define(() => {
await expect
.poll(async () => (await gateway.getRequests("node.list")).length)
.toBeGreaterThan(nodeRequests);
await expect
.poll(async () => (await gateway.getRequests("environments.list")).length)
.toBeGreaterThan(environmentRequests);
await place.getByRole("button", { name: "New Mac" }).waitFor();
await place.getByText("This gateway", { exact: true }).waitFor();
await place.getByText("Your devices", { exact: true }).waitFor();
expect(await place.getAttribute("open")).not.toBeNull();
expect(await gateway.getRequests("environments.list")).toHaveLength(environmentRequests);
const refreshedEnvironmentRequests = (await gateway.getRequests("environments.list")).length;
await gateway.setMethodResponse("environments.list", {
environments: [],
profiles: [{ id: "aws", providerId: "crabbox", trust: "disposable" }],
@@ -123,7 +140,7 @@ suite.define(() => {
});
await expect
.poll(async () => (await gateway.getRequests("environments.list")).length)
.toBeGreaterThan(environmentRequests);
.toBeGreaterThan(refreshedEnvironmentRequests);
await place.getByText("Cloud", { exact: true }).waitFor();
await place.getByRole("button", { name: "Cloud · aws" }).waitFor();
expect(await place.getAttribute("open")).not.toBeNull();
+9 -6
View File
@@ -184,17 +184,14 @@ class NewSessionPage extends OpenClawLightDomElement {
if (this.context?.gateway !== gateway) {
return;
}
if (event.event === "config.changed") {
void this.gateway.refreshCloudProfiles();
return;
}
if (
event.event === "config.changed" ||
event.event === "node.pair.requested" ||
event.event === "node.pair.resolved" ||
event.event === "device.pair.requested" ||
event.event === "device.pair.resolved"
) {
void this.place.refreshNodes();
this.refreshPlaceTopology();
return;
}
const presence = event.event === "presence" ? readPresence(event.payload) : null;
@@ -204,7 +201,7 @@ class NewSessionPage extends OpenClawLightDomElement {
const signature = presenceConnectivitySignature(presence);
if (signature !== this.presenceSignature) {
this.presenceSignature = signature;
void this.place.refreshNodes();
this.refreshPlaceTopology();
}
});
},
@@ -223,6 +220,12 @@ class NewSessionPage extends OpenClawLightDomElement {
);
}
// Device visibility intersects both catalogs, so topology changes must refresh them together.
private refreshPlaceTopology() {
void this.place.refreshNodes();
void this.gateway.refreshCloudProfiles();
}
handleEvent(event: Event) {
const pickers = this.querySelectorAll<HTMLDetailsElement>(
".chat-controls__inline-select[open]",