Spaces:
Build error
Build error
| import { FETCH_COMMIT_URL, FETCH_TAG_URL, StoreKey } from "../constant"; | |
| import { api } from "../client/api"; | |
| import { getClientConfig } from "../config/client"; | |
| import { createPersistStore } from "../utils/store"; | |
| import ChatGptIcon from "../icons/chatgpt.png"; | |
| import Locale from "../locales"; | |
| const ONE_MINUTE = 60 * 1000; | |
| const isApp = !!getClientConfig()?.isApp; | |
| function formatVersionDate(t: string) { | |
| const d = new Date(+t); | |
| const year = d.getUTCFullYear(); | |
| const month = d.getUTCMonth() + 1; | |
| const day = d.getUTCDate(); | |
| return [ | |
| year.toString(), | |
| month.toString().padStart(2, "0"), | |
| day.toString().padStart(2, "0"), | |
| ].join(""); | |
| } | |
| type VersionType = "date" | "tag"; | |
| async function getVersion(type: VersionType) { | |
| if (type === "date") { | |
| const data = (await (await fetch(FETCH_COMMIT_URL)).json()) as { | |
| commit: { | |
| author: { name: string; date: string }; | |
| }; | |
| sha: string; | |
| }[]; | |
| const remoteCommitTime = data[0].commit.author.date; | |
| const remoteId = new Date(remoteCommitTime).getTime().toString(); | |
| return remoteId; | |
| } else if (type === "tag") { | |
| const data = (await (await fetch(FETCH_TAG_URL)).json()) as { | |
| commit: { sha: string; url: string }; | |
| name: string; | |
| }[]; | |
| return data.at(0)?.name; | |
| } | |
| } | |
| export const useUpdateStore = createPersistStore( | |
| { | |
| versionType: "tag" as VersionType, | |
| lastUpdate: 0, | |
| version: "unknown", | |
| remoteVersion: "", | |
| used: 0, | |
| subscription: 0, | |
| lastUpdateUsage: 0, | |
| }, | |
| (set, get) => ({ | |
| formatVersion(version: string) { | |
| if (get().versionType === "date") { | |
| version = formatVersionDate(version); | |
| } | |
| return version; | |
| }, | |
| async getLatestVersion(force = false) { | |
| const versionType = get().versionType; | |
| let version = | |
| versionType === "date" | |
| ? getClientConfig()?.commitDate | |
| : getClientConfig()?.version; | |
| set(() => ({ version })); | |
| const shouldCheck = Date.now() - get().lastUpdate > 2 * 60 * ONE_MINUTE; | |
| if (!force && !shouldCheck) return; | |
| set(() => ({ | |
| lastUpdate: Date.now(), | |
| })); | |
| try { | |
| const remoteId = await getVersion(versionType); | |
| set(() => ({ | |
| remoteVersion: remoteId, | |
| })); | |
| if (window.__TAURI__?.notification && isApp) { | |
| // Check if notification permission is granted | |
| await window.__TAURI__?.notification.isPermissionGranted().then((granted) => { | |
| if (!granted) { | |
| return; | |
| } else { | |
| // Request permission to show notifications | |
| window.__TAURI__?.notification.requestPermission().then((permission) => { | |
| if (permission === 'granted') { | |
| if (version === remoteId) { | |
| // Show a notification using Tauri | |
| window.__TAURI__?.notification.sendNotification({ | |
| title: "ChatGPT Next Web", | |
| body: `${Locale.Settings.Update.IsLatest}`, | |
| icon: `${ChatGptIcon.src}`, | |
| sound: "Default" | |
| }); | |
| } else { | |
| const updateMessage = Locale.Settings.Update.FoundUpdate(`${remoteId}`); | |
| // Show a notification for the new version using Tauri | |
| window.__TAURI__?.notification.sendNotification({ | |
| title: "ChatGPT Next Web", | |
| body: updateMessage, | |
| icon: `${ChatGptIcon.src}`, | |
| sound: "Default" | |
| }); | |
| } | |
| } | |
| }); | |
| } | |
| }); | |
| } | |
| 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) { | |
| console.error((e as Error).message); | |
| } | |
| }, | |
| }), | |
| { | |
| name: StoreKey.Update, | |
| version: 1, | |
| }, | |
| ); | |