frontend: polish app launch and release experience

This commit is contained in:
archipelago
2026-06-11 00:24:40 -04:00
parent c393b96da3
commit 1a3d726eac
140 changed files with 5930 additions and 920 deletions
+12 -3
View File
@@ -27,7 +27,7 @@ const PHASE_INFO: Record<InstallPhase, { progress: number; message: string; stat
'pulling-image': { progress: 20, message: 'Downloading image…', status: 'downloading' },
'creating-container': { progress: 70, message: 'Creating container…', status: 'installing' },
'starting-container': { progress: 80, message: 'Starting container…', status: 'starting' },
'waiting-healthy': { progress: 88, message: 'Waiting for container…', status: 'starting' },
'waiting-healthy': { progress: 88, message: 'Finalizing first start…', status: 'starting' },
'post-install': { progress: 95, message: 'Finalizing…', status: 'installing' },
'done': { progress: 100, message: 'Installed', status: 'complete' },
}
@@ -126,6 +126,12 @@ export const useServerStore = defineStore('server', () => {
installingApps.value.delete(appId)
}
}
if ((pkg.state as string) === 'removing') {
uninstallingApps.value.add(appId)
} else if (uninstallingApps.value.has(appId)) {
uninstallingApps.value.delete(appId)
}
}
// Clear installingApps entries for apps that vanished from backend data
// Only clean up entries that have errored — active installs may take minutes to pull images
@@ -183,8 +189,11 @@ export const useServerStore = defineStore('server', () => {
return rpcClient.installPackage(id, marketplaceUrl, version)
}
async function uninstallPackage(id: string): Promise<{ status: string; package_id: string }> {
return rpcClient.uninstallPackage(id)
async function uninstallPackage(
id: string,
options: { preserveData?: boolean } = {},
): Promise<{ status: string; package_id: string }> {
return rpcClient.uninstallPackage(id, options)
}
async function startPackage(id: string): Promise<void> {