aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/packages/ui/src/stores/releases-store.ts
blob: 56afa083c212902ae50474cd8e056aaefe0405f8 (plain) (blame)
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 });
  },
}));