From 86bf85fb35185ea4799d86c9fd6525f2be37fca1 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 5 Jul 2026 01:54:58 -0700 Subject: [PATCH] fix(ui): publish mobile setup independently (#100179) * fix(ui): publish mobile setup independently * fix(ui): publish mobile setup independently --- ui/src/app/overlays.ts | 5 +++-- ui/src/e2e/mobile-pairing.e2e.test.ts | 10 +++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/ui/src/app/overlays.ts b/ui/src/app/overlays.ts index 4344998294ee..2f6dabdf6887 100644 --- a/ui/src/app/overlays.ts +++ b/ui/src/app/overlays.ts @@ -620,9 +620,10 @@ export function createApplicationOverlays(gateway: ApplicationGateway): Applicat } devicePairSetupState.pendingCount = 0; const setupOperation = openDevicePairSetupState(devicePairSetupState); - const pendingCountOperation = refreshDevicePairPendingCount(); + // Pairing-list latency must not keep a ready setup code behind the loading state. + void refreshDevicePairPendingCount(); publish(); - await Promise.all([setupOperation, pendingCountOperation]); + await setupOperation; if (!disposed) { publish(); } diff --git a/ui/src/e2e/mobile-pairing.e2e.test.ts b/ui/src/e2e/mobile-pairing.e2e.test.ts index 711029cbad6a..2dbe477993c4 100644 --- a/ui/src/e2e/mobile-pairing.e2e.test.ts +++ b/ui/src/e2e/mobile-pairing.e2e.test.ts @@ -75,6 +75,7 @@ describeControlUiE2e("Control UI mobile pairing mocked Gateway E2E", () => { const sidebarPairingButton = page.locator(".sidebar-pair-mobile"); await sidebarPairingButton.waitFor(); await expect.poll(async () => sidebarPairingButton.isEnabled()).toBe(true); + await gateway.deferNext("device.pair.list"); await sidebarPairingButton.click(); const dialog = page.getByRole("dialog", { name: "OpenClaw mobile" }); @@ -88,8 +89,15 @@ describeControlUiE2e("Control UI mobile pairing mocked Gateway E2E", () => { ); expect( await page.getByText("Official OpenClaw mobile apps connect automatically").isVisible(), - ).toBe(false); + ).toBe(true); + await gateway.resolveDeferred("device.pair.list", { + paired: [], + pending: [{ deviceId: "mobile-1", requestId: "request-1" }], + }); expect(await page.getByText("Device requests waiting for review: 1").isVisible()).toBe(true); + expect( + await page.getByText("Official OpenClaw mobile apps connect automatically").isVisible(), + ).toBe(false); const firstRequest = await gateway.waitForRequest("device.pair.setupCode"); expect(firstRequest.params).toEqual({});