123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- import { create } from "zustand";
- import { persist } from "zustand/middleware";
- import { FETCH_COMMIT_URL, StoreKey } from "../constant";
- import { api } from "../client/api";
- import { showToast } from "../components/ui-lib";
- export interface UpdateStore {
- lastUpdate: number;
- remoteVersion: string;
- used?: number;
- subscription?: number;
- lastUpdateUsage: number;
- version: string;
- getLatestVersion: (force?: boolean) => Promise<void>;
- updateUsage: (force?: boolean) => Promise<void>;
- }
- function queryMeta(key: string, defaultValue?: string): string {
- let ret: string;
- if (document) {
- const meta = document.head.querySelector(
- `meta[name='${key}']`,
- ) as HTMLMetaElement;
- ret = meta?.content ?? "";
- } else {
- ret = defaultValue ?? "";
- }
- return ret;
- }
- const ONE_MINUTE = 60 * 1000;
- export const useUpdateStore = create<UpdateStore>()(
- persist(
- (set, get) => ({
- lastUpdate: 0,
- remoteVersion: "",
- lastUpdateUsage: 0,
- version: "unknown",
- async getLatestVersion(force = false) {
- set(() => ({ version: queryMeta("version") ?? "unknown" }));
- const overTenMins = Date.now() - get().lastUpdate > 10 * ONE_MINUTE;
- if (!force && !overTenMins) return;
- set(() => ({
- lastUpdate: Date.now(),
- }));
- try {
- const data = await (await fetch(FETCH_COMMIT_URL)).json();
- const remoteCommitTime = data[0].commit.committer.date;
- const remoteId = new Date(remoteCommitTime).getTime().toString();
- set(() => ({
- remoteVersion: remoteId,
- }));
- console.log("[Got Upstream] ", remoteId);
- } catch (error) {
- console.error("[Fetch Upstream Commit Id]", error);
- }
- },
- async updateUsage(force = false) {
- const overOneMinute = Date.now() - get().lastUpdateUsage >= ONE_MINUTE;
- if (!overOneMinute && !force) return;
- set(() => ({
- lastUpdateUsage: Date.now(),
- }));
- try {
- const usage = await api.llm.usage();
- if (usage) {
- set(() => ({
- used: usage.used,
- subscription: usage.total,
- }));
- }
- } catch (e) {
- showToast((e as Error).message);
- }
- },
- }),
- {
- name: StoreKey.Update,
- version: 1,
- },
- ),
- );
|