mirror of
https://github.com/rowboatlabs/rowboat.git
synced 2026-07-12 21:02:17 +02:00
fix(apps): stop reinstall from yanking the user out of the agent dialog
Two races around the post-install prompt: - AppsView kept a stale selectedFolder after the open app was uninstalled; on reinstall the 4s apps:list poll matched it again and instantly swapped in the app frame, unmounting the catalog and the enable-agents dialog mid-choice. Clear the selection when its app disappears from the list. - Bundled agents materialized on the NEXT apps:list poll, not at install — so the dialog's bg-task:get/patch hit a task that didn't exist yet if the user acted within ~4s. Install handlers now call syncAppAgents synchronously.
This commit is contained in:
parent
ec4ae4d5eb
commit
043cdc7cb2
2 changed files with 9 additions and 0 deletions
|
|
@ -1646,6 +1646,9 @@ export function setupIpcHandlers() {
|
||||||
const preview = appInstallPreviews.get(args.name) ?? await appsInstaller.previewInstall(record);
|
const preview = appInstallPreviews.get(args.name) ?? await appsInstaller.previewInstall(record);
|
||||||
const result = await appsInstaller.installFromRegistry(record, preview);
|
const result = await appsInstaller.installFromRegistry(record, preview);
|
||||||
appInstallPreviews.delete(args.name);
|
appInstallPreviews.delete(args.name);
|
||||||
|
// Materialize bundled agents NOW, not on the next apps:list poll — the
|
||||||
|
// renderer's post-install enable dialog patches these tasks immediately.
|
||||||
|
if (result.app) await appsAgents.syncAppAgents(result.app);
|
||||||
capture('app_installed', { name: args.name });
|
capture('app_installed', { name: args.name });
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
@ -1654,6 +1657,7 @@ export function setupIpcHandlers() {
|
||||||
return appsInstaller.previewUrlInstall(args.url);
|
return appsInstaller.previewUrlInstall(args.url);
|
||||||
}
|
}
|
||||||
const result = await appsInstaller.confirmUrlInstall(args.url);
|
const result = await appsInstaller.confirmUrlInstall(args.url);
|
||||||
|
if (result.app) await appsAgents.syncAppAgents(result.app);
|
||||||
capture('app_installed', { name: result.app.manifest?.name ?? result.app.folder });
|
capture('app_installed', { name: result.app.manifest?.name ?? result.app.folder });
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -186,6 +186,11 @@ export function AppsView({ initialAppFolder, initialVersion, onNewApp }: {
|
||||||
const r = await window.ipc.invoke('apps:list', {})
|
const r = await window.ipc.invoke('apps:list', {})
|
||||||
if (cancelled) return
|
if (cancelled) return
|
||||||
setApps(r.apps)
|
setApps(r.apps)
|
||||||
|
// Drop a selection whose app no longer exists (uninstalled while
|
||||||
|
// open). Left stale, a later reinstall makes this view yank the user
|
||||||
|
// into the app frame mid-flow — e.g. while they're in the catalog's
|
||||||
|
// post-install agent dialog.
|
||||||
|
setSelectedFolder((cur) => (cur && !r.apps.some((a) => a.folder === cur) ? null : cur))
|
||||||
setServerError(r.serverRunning ? null : (r.serverError ?? 'Apps server is not running.'))
|
setServerError(r.serverRunning ? null : (r.serverError ?? 'Apps server is not running.'))
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (!cancelled) setServerError(e instanceof Error ? e.message : String(e))
|
if (!cancelled) setServerError(e instanceof Error ? e.message : String(e))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue