update.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { create } from "zustand";
  2. import { persist } from "zustand/middleware";
  3. import { FETCH_COMMIT_URL, StoreKey } from "../constant";
  4. import { api } from "../client/api";
  5. import { getClientConfig } from "../config/client";
  6. export interface UpdateStore {
  7. lastUpdate: number;
  8. remoteVersion: string;
  9. used?: number;
  10. subscription?: number;
  11. lastUpdateUsage: number;
  12. version: string;
  13. getLatestVersion: (force?: boolean) => Promise<void>;
  14. updateUsage: (force?: boolean) => Promise<void>;
  15. }
  16. const ONE_MINUTE = 60 * 1000;
  17. export const useUpdateStore = create<UpdateStore>()(
  18. persist(
  19. (set, get) => ({
  20. lastUpdate: 0,
  21. remoteVersion: "",
  22. lastUpdateUsage: 0,
  23. version: "unknown",
  24. async getLatestVersion(force = false) {
  25. set(() => ({ version: getClientConfig()?.commitId ?? "unknown" }));
  26. const overTenMins = Date.now() - get().lastUpdate > 10 * ONE_MINUTE;
  27. if (!force && !overTenMins) return;
  28. set(() => ({
  29. lastUpdate: Date.now(),
  30. }));
  31. try {
  32. const data = await (await fetch(FETCH_COMMIT_URL)).json();
  33. const remoteCommitTime = data[0].commit.committer.date;
  34. const remoteId = new Date(remoteCommitTime).getTime().toString();
  35. set(() => ({
  36. remoteVersion: remoteId,
  37. }));
  38. console.log("[Got Upstream] ", remoteId);
  39. } catch (error) {
  40. console.error("[Fetch Upstream Commit Id]", error);
  41. }
  42. },
  43. async updateUsage(force = false) {
  44. const overOneMinute = Date.now() - get().lastUpdateUsage >= ONE_MINUTE;
  45. if (!overOneMinute && !force) return;
  46. set(() => ({
  47. lastUpdateUsage: Date.now(),
  48. }));
  49. try {
  50. const usage = await api.llm.usage();
  51. if (usage) {
  52. set(() => ({
  53. used: usage.used,
  54. subscription: usage.total,
  55. }));
  56. }
  57. } catch (e) {
  58. console.error((e as Error).message);
  59. }
  60. },
  61. }),
  62. {
  63. name: StoreKey.Update,
  64. version: 1,
  65. },
  66. ),
  67. );