forked from XiaoMo/ChatGPT-Next-Web
b558d1afc6
[+] feat(update.ts): add support for localization in update notifications [+] fix(update.ts): add missing semicolon in useUpdateStore function
151 lines
4.3 KiB
TypeScript
151 lines
4.3 KiB
TypeScript
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,
|
|
},
|
|
);
|