1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
import { invoke } from "@tauri-apps/api/core";
import { create } from "zustand";
import type { GithubRelease } from "@/types/bindings/core";
interface ReleasesState {
// State
releases: GithubRelease[];
isLoading: boolean;
isLoaded: boolean;
error: string | null;
// Actions
loadReleases: () => Promise<void>;
setReleases: (releases: GithubRelease[]) => void;
setIsLoading: (isLoading: boolean) => void;
setIsLoaded: (isLoaded: boolean) => void;
setError: (error: string | null) => void;
}
export const useReleasesStore = create<ReleasesState>((set, get) => ({
// Initial state
releases: [],
isLoading: false,
isLoaded: false,
error: null,
// Actions
loadReleases: async () => {
const { isLoaded, isLoading } = get();
// If already loaded or currently loading, skip to prevent duplicate requests
if (isLoaded || isLoading) return;
set({ isLoading: true, error: null });
try {
const releases = await invoke<GithubRelease[]>("get_github_releases");
set({ releases, isLoaded: true });
} catch (e) {
const error = e instanceof Error ? e.message : String(e);
console.error("Failed to load releases:", e);
set({ error });
} finally {
set({ isLoading: false });
}
},
setReleases: (releases) => {
set({ releases });
},
setIsLoading: (isLoading) => {
set({ isLoading });
},
setIsLoaded: (isLoaded) => {
set({ isLoaded });
},
setError: (error) => {
set({ error });
},
}));
|