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
parent e9903e7b4b
commit 2b7e564a14
5 changed files with 108 additions and 52 deletions

View File

@@ -1,13 +1,37 @@
// Server store — computed server state and RPC action proxies
import { defineStore } from 'pinia'
import { computed } from 'vue'
import { computed, ref } from 'vue'
import { rpcClient } from '../api/rpc-client'
import { useSyncStore } from './sync'
import type { InstallProgress } from '../views/marketplace/marketplaceData'
export const useServerStore = defineStore('server', () => {
const sync = useSyncStore()
// Global install tracking — persists across navigation
const installingApps = ref<Map<string, InstallProgress>>(new Map())
function setInstallProgress(appId: string, progress: Partial<InstallProgress> & { id: string; title: string }) {
const existing = installingApps.value.get(appId)
installingApps.value.set(appId, {
status: 'downloading',
progress: 0,
message: 'Preparing...',
attempt: 0,
...existing,
...progress,
})
}
function clearInstallProgress(appId: string) {
installingApps.value.delete(appId)
}
function isInstalling(appId: string): boolean {
return installingApps.value.has(appId)
}
// Computed — derived from sync store's data
const serverName = computed(() => sync.serverInfo?.name || 'Archipelago')
const isRestarting = computed(() => sync.serverInfo?.['status-info']?.restarting || false)
@@ -70,6 +94,12 @@ export const useServerStore = defineStore('server', () => {
isShuttingDown,
isOffline,
// Install tracking (global, persists across navigation)
installingApps,
setInstallProgress,
clearInstallProgress,
isInstalling,
// Actions
installPackage,
uninstallPackage,