From 934d11aebbf3cdd18b462018d854c8652a02abfc Mon Sep 17 00:00:00 2001 From: llama Date: Fri, 31 Oct 2025 23:03:52 +0800 Subject: [PATCH] allow launching existing or installing new if either fails --- qt/launcher-gui/src/routes/Action.svelte | 109 +++++++++++++---------- qt/launcher-gui/src/routes/Normal.svelte | 34 ++++--- 2 files changed, 87 insertions(+), 56 deletions(-) diff --git a/qt/launcher-gui/src/routes/Action.svelte b/qt/launcher-gui/src/routes/Action.svelte index e939e5985..11b66f87a 100644 --- a/qt/launcher-gui/src/routes/Action.svelte +++ b/qt/launcher-gui/src/routes/Action.svelte @@ -7,32 +7,39 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import type { ExistingVersions, Versions } from "@generated/anki/launcher_pb"; import Row from "$lib/components/Row.svelte"; import EnumSelector from "$lib/components/EnumSelector.svelte"; + import Warning from "./Warning.svelte"; + import Spinner from "./Spinner.svelte"; let { - releases, - existing, + releasesPromise, + existingPromise, allowBetas, choose, uninstall, }: { - releases: Versions; - existing: ExistingVersions; + releasesPromise: Promise; + existingPromise: Promise; allowBetas: boolean; choose: (version: string, existing: boolean, current?: string) => void; uninstall: (() => void) | null; } = $props(); + // TODO: replace once svelte's experimental async mode is on + let releases = $state(undefined as Versions | undefined); + let existing = $state(undefined as ExistingVersions | undefined); + releasesPromise.then((r) => (releases = r)); + existingPromise.then((r) => (existing = r)); + let availableVersions = $derived( - releases.all + releases?.all .filter((v) => allowBetas || !v.isPrerelease) .map((v) => ({ label: v.version, value: v.version })), ); - let latest = $derived(availableVersions[0]?.value ?? null); - let selected = $derived(availableVersions[0]?.value ?? null); - let current = $derived(existing.current?.version); - - let pyprojectModified = $derived(existing.pyprojectModifiedByUser); + let latest = $derived(availableVersions?.[0]?.value); + let selected = $derived(availableVersions?.[0]?.value); + let current = $derived(existing!?.current?.version); + let pyprojectModified = $derived(existing?.pyprojectModifiedByUser); function _choose(version: string, keepExisting: boolean = false) { choose(version, keepExisting, current); @@ -40,45 +47,57 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
- {#if latest != null && latest != current} + {#await releasesPromise} + + {:then} + {#if latest != null && latest != current} + + + + {/if} + {:catch} + + {/await} + {#await existingPromise} + + {:then} + {#if current != null} + + + + {/if} + {/await} + {#if availableVersions} - +
+ {"->"} +
+
+ +
{/if} - {#if current != null} - - - - {/if} - - -
- {"->"} -
-
- -
-
{#if uninstall != null}