diff options
| author | 2026-01-15 14:56:53 +0800 | |
|---|---|---|
| committer | 2026-01-15 14:56:53 +0800 | |
| commit | fda94a25d9cd7d777163ce968e5a6b6bc7ea41a1 (patch) | |
| tree | 6927424776295493339e97161e38107c4134901c /ui/src | |
| parent | 201743ed0bdd74af06b3e4e67099fc3e38c3f5c0 (diff) | |
| download | DropOut-fda94a25d9cd7d777163ce968e5a6b6bc7ea41a1.tar.gz DropOut-fda94a25d9cd7d777163ce968e5a6b6bc7ea41a1.zip | |
feat: Add ReleasesState class to manage GitHub releases and implement loading logic
Diffstat (limited to 'ui/src')
| -rw-r--r-- | ui/src/stores/game.svelte.ts | 4 | ||||
| -rw-r--r-- | ui/src/stores/releases.svelte.ts | 36 |
2 files changed, 40 insertions, 0 deletions
diff --git a/ui/src/stores/game.svelte.ts b/ui/src/stores/game.svelte.ts index 0af3daf..28b2db5 100644 --- a/ui/src/stores/game.svelte.ts +++ b/ui/src/stores/game.svelte.ts @@ -7,6 +7,10 @@ export class GameState { versions = $state<Version[]>([]); selectedVersion = $state(""); + get latestRelease() { + return this.versions.find((v) => v.type === "release"); + } + async loadVersions() { try { this.versions = await invoke<Version[]>("get_versions"); diff --git a/ui/src/stores/releases.svelte.ts b/ui/src/stores/releases.svelte.ts new file mode 100644 index 0000000..c858abb --- /dev/null +++ b/ui/src/stores/releases.svelte.ts @@ -0,0 +1,36 @@ +import { invoke } from "@tauri-apps/api/core"; + +export interface GithubRelease { + tag_name: string; + name: string; + published_at: string; + body: string; + html_url: string; +} + +export class ReleasesState { + releases = $state<GithubRelease[]>([]); + isLoading = $state(false); + isLoaded = $state(false); + error = $state<string | null>(null); + + async loadReleases() { + // If already loaded or currently loading, skip to prevent duplicate requests + if (this.isLoaded || this.isLoading) return; + + this.isLoading = true; + this.error = null; + + try { + this.releases = await invoke<GithubRelease[]>("get_github_releases"); + this.isLoaded = true; + } catch (e) { + console.error("Failed to load releases:", e); + this.error = String(e); + } finally { + this.isLoading = false; + } + } +} + +export const releasesState = new ReleasesState(); |