diff --git a/README.md b/README.md index 3ac537abca8..546171ca65b 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ One-Click to get a well-designed cross-platform ChatGPT web UI, with GPT3, GPT4 [MacOS-image]: https://img.shields.io/badge/-MacOS-black?logo=apple [Linux-image]: https://img.shields.io/badge/-Linux-333?logo=ubuntu -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FYidadaa%2FChatGPT-Next-Web&env=OPENAI_API_KEY&env=CODE&env=GOOGLE_API_KEY&project-name=chatgpt-next-web&repository-name=ChatGPT-Next-Web) +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fhtmambo%2FChatGPT-Next-Web&env=OPENAI_API_KEY&env=CODE&env=GOOGLE_API_KEY&project-name=chatgpt-next-web&repository-name=ChatGPT-Next-Web) [![Deploy on Zeabur](https://zeabur.com/button.svg)](https://zeabur.com/templates/ZBUEFA) diff --git a/README_CN.md b/README_CN.md index 4acefefa518..96ee2cd2d47 100644 --- a/README_CN.md +++ b/README_CN.md @@ -21,7 +21,7 @@ 1. 准备好你的 [OpenAI API Key](https://platform.openai.com/account/api-keys); 2. 点击右侧按钮开始部署: - [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FYidadaa%2FChatGPT-Next-Web&env=OPENAI_API_KEY&env=CODE&env=GOOGLE_API_KEY&project-name=chatgpt-next-web&repository-name=ChatGPT-Next-Web),直接使用 Github 账号登录即可,记得在环境变量页填入 API Key 和[页面访问密码](#配置页面访问密码) CODE; + [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fhtmambo%2FChatGPT-Next-Web&env=OPENAI_API_KEY&env=CODE&env=GOOGLE_API_KEY&project-name=chatgpt-next-web&repository-name=ChatGPT-Next-Web),直接使用 Github 账号登录即可,记得在环境变量页填入 API Key 和[页面访问密码](#配置页面访问密码) CODE; 3. 部署完毕后,即可开始使用; 4. (可选)[绑定自定义域名](https://vercel.com/docs/concepts/projects/domains/add-a-domain):Vercel 分配的域名 DNS 在某些区域被污染了,绑定自定义域名即可直连。 diff --git a/app/store/mask.ts b/app/store/mask.ts index dfd4089b757..4befeeef556 100644 --- a/app/store/mask.ts +++ b/app/store/mask.ts @@ -45,6 +45,27 @@ export const useMaskStore = createPersistStore( (set, get) => ({ create(mask?: Partial) { const masks = get().masks; + // 检查要导入的项目是否重复 + for (let existingMask of Object.values(masks)) { + if (existingMask.name === mask?.name) { + if ( + JSON.stringify(existingMask.context) === + JSON.stringify(mask?.context) + ) { + console.log( + "A mask with the same name and context already exists.", + ); + return existingMask; + } else { + // 只有name重复,给name加上今天的日期和时间 + let now = new Date(); + let year = String(now.getFullYear()).slice(-2); // 获取年份的最后两位 + mask.name = `${mask.name}@${year}-${ + now.getMonth() + 1 + }-${now.getDate()}@${now.getHours()}:${now.getMinutes()}`; + } + } + } const id = nanoid(); masks[id] = { ...createEmptyMask(), diff --git a/app/utils.ts b/app/utils.ts index ac7e80e7afd..e41dfa1fddd 100644 --- a/app/utils.ts +++ b/app/utils.ts @@ -6,7 +6,9 @@ export function trimTopic(topic: string) { // Fix an issue where double quotes still show in the Indonesian language // This will remove the specified punctuation from the end of the string // and also trim quotes from both the start and end if they exist. - return topic.replace(/^["“”]+|["“”]+$/g, "").replace(/[,。!?”“"、,.!?]*$/, ""); + return topic + .replace(/^["“”]+|["“”]+$/g, "") + .replace(/[,。!?”“"、,.!?]*$/, ""); } export async function copyToClipboard(text: string) { @@ -40,8 +42,8 @@ export async function downloadAs(text: string, filename: string) { defaultPath: `${filename}`, filters: [ { - name: `${filename.split('.').pop()} files`, - extensions: [`${filename.split('.').pop()}`], + name: `${filename.split(".").pop()} files`, + extensions: [`${filename.split(".").pop()}`], }, { name: "All Files", @@ -52,10 +54,14 @@ export async function downloadAs(text: string, filename: string) { if (result !== null) { try { - await window.__TAURI__.fs.writeBinaryFile( - result, - new Uint8Array([...text].map((c) => c.charCodeAt(0))) - ); + // await window.__TAURI__.fs.writeBinaryFile( + // result, + // new Uint8Array([...text].map((c) => c.charCodeAt(0))) + // ); + // 修复客户端导出json时的乱码现象 + const encoder = new TextEncoder(); + const data = encoder.encode(text); + await window.__TAURI__.fs.writeBinaryFile(result, new Uint8Array(data)); showToast(Locale.Download.Success); } catch (error) { showToast(Locale.Download.Failed); @@ -69,15 +75,15 @@ export async function downloadAs(text: string, filename: string) { "href", "data:text/plain;charset=utf-8," + encodeURIComponent(text), ); - element.setAttribute("download", filename); + element.setAttribute("download", filename); - element.style.display = "none"; - document.body.appendChild(element); + element.style.display = "none"; + document.body.appendChild(element); - element.click(); + element.click(); - document.body.removeChild(element); -} + document.body.removeChild(element); + } } export function readFromFile() { return new Promise((res, rej) => { @@ -212,8 +218,8 @@ export function getCSSVar(varName: string) { export function isMacOS(): boolean { if (typeof window !== "undefined") { let userAgent = window.navigator.userAgent.toLocaleLowerCase(); - const macintosh = /iphone|ipad|ipod|macintosh/.test(userAgent) - return !!macintosh + const macintosh = /iphone|ipad|ipod|macintosh/.test(userAgent); + return !!macintosh; } - return false + return false; } diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 75d6a0d0afa..bc5ba0e1139 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -91,7 +91,7 @@ "updater": { "active": true, "endpoints": [ - "https://github.com/Yidadaa/ChatGPT-Next-Web/releases/latest/download/latest.json" + "https://github.com/htmambo/ChatGPT-Next-Web/releases/latest/download/latest.json" ], "dialog": false, "windows": {