From 06feb85aa5d6cd72de4e65fc31275b50bd4dbe7e Mon Sep 17 00:00:00 2001 From: Dorian Date: Wed, 22 Apr 2026 05:42:52 -0400 Subject: [PATCH] release(v1.7.34-alpha): re-seed onboarding cache + rotating login bg + drop re-login zoom MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - useOnboarding.ts: when the backend gives a definitive answer (true/false, not a null retry failure), re-seed the neode_onboarding_complete localStorage flag accordingly. Fixes the case where a user clears site data on an already-onboarded node — OnboardingWrapper's useVideoBackground computed reads localStorage synchronously, so without this re-seed the intro video would fire again on /login even though RootRedirect correctly sent them straight to /login. - OnboardingWrapper.vue: login background now rotates through bg-intro-1..6 on each /login mount, with the current index persisted to localStorage (neode_login_bg_idx) so subsequent logouts advance rather than repeat the same image. - Dashboard.vue: subsequent-login branch drops the 1.2s showZoomIn entirely. Only the first dashboard entry after onboarding plays the full zoom + glitch reveal; every re-login now just fades in with the welcome typing (~300ms). Co-Authored-By: Claude Opus 4.7 (1M context) --- core/Cargo.lock | 2 +- core/archipelago/Cargo.toml | 2 +- neode-ui/src/composables/useOnboarding.ts | 13 ++++++++++- neode-ui/src/views/Dashboard.vue | 8 +++---- neode-ui/src/views/OnboardingWrapper.vue | 27 ++++++++++++++++++++++- 5 files changed, 43 insertions(+), 9 deletions(-) diff --git a/core/Cargo.lock b/core/Cargo.lock index 1da20db5..0ddd2491 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -80,7 +80,7 @@ checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "archipelago" -version = "1.7.33-alpha" +version = "1.7.34-alpha" dependencies = [ "anyhow", "archipelago-container", diff --git a/core/archipelago/Cargo.toml b/core/archipelago/Cargo.toml index 28e858db..0ddd5b2a 100644 --- a/core/archipelago/Cargo.toml +++ b/core/archipelago/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "archipelago" -version = "1.7.33-alpha" +version = "1.7.34-alpha" edition = "2021" description = "Archipelago Bitcoin Node OS - Native backend" authors = ["Archipelago Team"] diff --git a/neode-ui/src/composables/useOnboarding.ts b/neode-ui/src/composables/useOnboarding.ts index 4c70acd3..c9573979 100644 --- a/neode-ui/src/composables/useOnboarding.ts +++ b/neode-ui/src/composables/useOnboarding.ts @@ -24,7 +24,18 @@ export async function isOnboardingComplete(): Promise { // as already-onboarded and skip the wizard entirely). Only fall // back to localStorage if the backend is unreachable. const result = await callWithRetry(() => rpcClient.isOnboardingComplete(), 2) - if (result !== null) return result + if (result !== null) { + // Re-seed the localStorage cache so non-async consumers + // (OnboardingWrapper's useVideoBackground computed, etc.) see the + // right answer after the user clears site data on an already- + // onboarded node. + if (result) { + try { localStorage.setItem('neode_onboarding_complete', '1') } catch {} + } else { + try { localStorage.removeItem('neode_onboarding_complete') } catch {} + } + return result + } return localStorage.getItem('neode_onboarding_complete') === '1' } diff --git a/neode-ui/src/views/Dashboard.vue b/neode-ui/src/views/Dashboard.vue index 571d80cb..c30be20b 100644 --- a/neode-ui/src/views/Dashboard.vue +++ b/neode-ui/src/views/Dashboard.vue @@ -285,17 +285,15 @@ onMounted(() => { loginTransition.setPendingWelcomeTyping(false) }, 4000) } else if (loginTransition.justLoggedIn) { - // Regular re-login — quick interface draw, no triple glitch flashes. - // Just the zoom-in for a short beat, then welcome typing fires fast. + // Regular re-login — no zoom, no glitch. Just land on the + // dashboard and kick off the welcome typing quickly. playDashboardLoadOomph() - showZoomIn.value = true loginTransition.setPendingWelcomeTyping(true) loginTransition.setJustLoggedIn(false) - scheduledTimeout(() => { showZoomIn.value = false }, 1200) scheduledTimeout(() => { loginTransition.setStartWelcomeTyping(true) loginTransition.setPendingWelcomeTyping(false) - }, 600) + }, 300) } window.addEventListener('keydown', handleKioskShortcuts) diff --git a/neode-ui/src/views/OnboardingWrapper.vue b/neode-ui/src/views/OnboardingWrapper.vue index 0b9f3da1..358d1546 100644 --- a/neode-ui/src/views/OnboardingWrapper.vue +++ b/neode-ui/src/views/OnboardingWrapper.vue @@ -122,7 +122,32 @@ const routeBackgrounds: Record = { '/login': 'bg-intro.jpg' // Video loops from splash (same as intro) } -const loginBackground = 'bg-intro-1.jpg' +// Rotate the login background so the lock screen doesn't look +// identical on every logout. Cycles through bg-intro-1..6 using a +// counter persisted to localStorage so subsequent visits advance. +const LOGIN_BACKGROUNDS = [ + 'bg-intro-1.jpg', + 'bg-intro-2.jpg', + 'bg-intro-3.jpg', + 'bg-intro-4.jpg', + 'bg-intro-5.jpg', + 'bg-intro-6.jpg', +] +function pickNextLoginBackground(): string { + try { + const raw = localStorage.getItem('neode_login_bg_idx') + const prev = raw !== null ? parseInt(raw, 10) : -1 + const next = (Number.isFinite(prev) ? prev + 1 : 0) % LOGIN_BACKGROUNDS.length + localStorage.setItem('neode_login_bg_idx', String(next)) + return LOGIN_BACKGROUNDS[next]! + } catch { + return LOGIN_BACKGROUNDS[Math.floor(Math.random() * LOGIN_BACKGROUNDS.length)]! + } +} +const loginBackground = ref(pickNextLoginBackground()) +watch(() => route.path, (p) => { + if (p === '/login') loginBackground.value = pickNextLoginBackground() +}) // Restore video time from splash screen for seamless transition function restoreVideoTime() {