|
import { create } from "zustand"; |
|
import { persist } from "zustand/middleware"; |
|
import { FETCH_COMMIT_URL, FETCH_TAG_URL, StoreKey } from "../constant"; |
|
import { requestUsage } from "../requests"; |
|
|
|
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 remoteId = (data[0].sha as string).substring(0, 7); |
|
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(), |
|
})); |
|
|
|
const usage = await requestUsage(); |
|
|
|
if (usage) { |
|
set(() => usage); |
|
} |
|
}, |
|
}), |
|
{ |
|
name: StoreKey.Update, |
|
version: 1, |
|
}, |
|
), |
|
); |
|
|