feat: persistent app install state across navigation (#9)

Move installingApps from local refs in Marketplace/Discover to the
global server store. Install progress now persists when navigating
between views. My Apps shows installing overlay with progress bar
for apps being installed from the Marketplace.

Changes:
- server.ts: add installingApps Map + helpers to store
- Marketplace.vue: use store's installingApps instead of local ref
- Discover.vue: same
- Apps.vue: pass isInstalling + installProgress to AppCard
- AppCard.vue: add amber installing overlay with progress bar

522 tests pass, vue-tsc clean.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dorian
2026-03-29 00:13:39 +00:00
co-authored by Claude Opus 4.6
parent 840ecfaa5f
commit 2e29a41627
5 changed files with 108 additions and 52 deletions
+4
View File
@@ -101,6 +101,8 @@
:index="index"
:show-stagger="showStagger"
:is-loading="!!actions.loadingActions.value[id as string]"
:is-installing="serverStore.isInstalling(id as string)"
:install-progress="serverStore.installingApps.get(id as string)"
:is-uninstalling="actions.uninstallingApps.value.has(id as string)"
@go-to-app="goToApp"
@launch="launchApp"
@@ -141,6 +143,7 @@ import { computed, ref, watch, onMounted, onBeforeUnmount } from 'vue'
import { useRouter, useRoute, RouterLink } from 'vue-router'
import { useI18n } from 'vue-i18n'
import { useAppStore } from '@/stores/app'
import { useServerStore } from '@/stores/server'
import { useAppLauncherStore } from '@/stores/appLauncher'
import type { PackageDataEntry } from '@/types/api'
import AppCard from './apps/AppCard.vue'
@@ -155,6 +158,7 @@ const { t } = useI18n()
const router = useRouter()
const route = useRoute()
const store = useAppStore()
const serverStore = useServerStore()
const actions = useAppsActions()
// Only stagger-animate on first mount