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; }