fix: onboarding persistence, clipboard, install UI, OnlyOffice removal, UI containers

Onboarding:
- Persist current step in localStorage — page refresh resumes where user was
- Router afterEach saves step; guard redirects to saved step, not always intro
- Show npub alongside DID on restore success screen

UI fixes:
- Clipboard polyfill for HTTP contexts (fixes Copy DID crash on non-HTTPS)
- AppCard installing overlay shows for pkg.state=installing (survives refresh)
- Hide uninstall button during installation
- Frontend version bumped to 1.3.2

App store:
- OnlyOffice fully removed from marketplace, curated apps, app config
- Replaced with CryptPad references throughout
- Remove OnlyOffice from ISO capture patterns

Container stability:
- UI containers (bitcoin-ui, lnd-ui, electrs-ui) pull from registry first
- Added --cap-add FOWNER for rootless Podman compatibility
- electrs-ui now included in first-boot loop alongside bitcoin-ui and lnd-ui

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dorian
2026-04-02 18:20:52 +01:00
co-authored by Claude Opus 4.6
parent a808458124
commit 81b4db82d1
13 changed files with 103 additions and 56 deletions
+11 -2
View File
@@ -303,10 +303,11 @@ router.beforeEach(async (to, _from, next) => {
}
// Check if this is a fresh install that needs onboarding
try {
const { isOnboardingComplete } = await import('@/composables/useOnboarding')
const { isOnboardingComplete, getSavedOnboardingStep } = await import('@/composables/useOnboarding')
const setupDone = await isOnboardingComplete()
if (!setupDone) {
next('/onboarding/intro')
const step = getSavedOnboardingStep()
next(`/onboarding/${step}`)
return
}
} catch {
@@ -328,6 +329,14 @@ router.beforeEach(async (to, _from, next) => {
next()
})
// Persist onboarding step so page refresh resumes where user left off
router.afterEach((to) => {
const match = to.path.match(/^\/onboarding\/(.+)/)
if (match && match[1] !== 'intro') {
localStorage.setItem('neode_onboarding_step', match[1]!)
}
})
// Stop all login/splash audio when entering the dashboard
router.afterEach((to, from) => {
if (to.path.startsWith('/dashboard') && !from.path.startsWith('/dashboard')) {