From c3b532eaf4dcd60490b66b9d46cb4d6b1691da85 Mon Sep 17 00:00:00 2001 From: archipelago Date: Mon, 10 Aug 2026 08:53:15 -0400 Subject: [PATCH] fix(onboarding): seed screen's lock stays steady through silent retries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The catch block dropped `loading` before branching, so every failed poll unmounted the lock icon and status text for the 4s retry gap — the screen flashed in and out on a live install test (zaza-optiplex, 2026-08-09). `loading` now stays true across isServerStartingError retries; only success or a genuine failure dismisses the waiting state. Co-Authored-By: Claude Fable 5 --- neode-ui/src/views/OnboardingSeedGenerate.vue | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/neode-ui/src/views/OnboardingSeedGenerate.vue b/neode-ui/src/views/OnboardingSeedGenerate.vue index d170abb5..eb3b8885 100644 --- a/neode-ui/src/views/OnboardingSeedGenerate.vue +++ b/neode-ui/src/views/OnboardingSeedGenerate.vue @@ -259,9 +259,11 @@ async function generateSeed() { loading.value = false waitingForServer.value = false } catch (err) { - loading.value = false if (isServerStartingError(err)) { - // Backend not ready yet — keep waiting, retry silently. + // Backend not ready yet — keep waiting, retry silently. `loading` stays + // true through the whole retry loop: dropping it here unmounts the lock + // icon and status text for the 4s between attempts, which reads as the + // screen flashing in and out (reported on a live install test). if (!waitingForServer.value) { waitingForServer.value = true startElapsedTimer() @@ -270,6 +272,7 @@ async function generateSeed() { } else { // Genuine failure — stop the silent loop and surface it with a manual retry. stopTimers() + loading.value = false waitingForServer.value = false errorMessage.value = err instanceof Error ? err.message : 'Failed to generate seed' }