update.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { create } from "zustand";
  2. import { persist } from "zustand/middleware";
  3. import { FETCH_COMMIT_URL, FETCH_TAG_URL } from "../constant";
  4. export interface UpdateStore {
  5. lastUpdate: number;
  6. remoteVersion: string;
  7. version: string;
  8. getLatestVersion: (force: boolean) => Promise<string>;
  9. }
  10. export const UPDATE_KEY = "chat-update";
  11. function queryMeta(key: string, defaultValue?: string): string {
  12. let ret: string;
  13. if (document) {
  14. const meta = document.head.querySelector(
  15. `meta[name='${key}']`,
  16. ) as HTMLMetaElement;
  17. ret = meta?.content ?? "";
  18. } else {
  19. ret = defaultValue ?? "";
  20. }
  21. return ret;
  22. }
  23. export const useUpdateStore = create<UpdateStore>()(
  24. persist(
  25. (set, get) => ({
  26. lastUpdate: 0,
  27. remoteVersion: "",
  28. version: "unknown",
  29. async getLatestVersion(force = false) {
  30. set(() => ({ version: queryMeta("version") }));
  31. const overTenMins = Date.now() - get().lastUpdate > 10 * 60 * 1000;
  32. const shouldFetch = force || overTenMins;
  33. if (!shouldFetch) {
  34. return get().version ?? "unknown";
  35. }
  36. try {
  37. // const data = await (await fetch(FETCH_TAG_URL)).json();
  38. // const remoteId = data[0].name as string;
  39. const data = await (await fetch(FETCH_COMMIT_URL)).json();
  40. const remoteId = (data[0].sha as string).substring(0, 7);
  41. set(() => ({
  42. lastUpdate: Date.now(),
  43. remoteVersion: remoteId,
  44. }));
  45. console.log("[Got Upstream] ", remoteId);
  46. return remoteId;
  47. } catch (error) {
  48. console.error("[Fetch Upstream Commit Id]", error);
  49. return get().version ?? "";
  50. }
  51. },
  52. }),
  53. {
  54. name: UPDATE_KEY,
  55. version: 1,
  56. },
  57. ),
  58. );