From 9dac53b754266bae15a95184b901a656dc78d380 Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 10 Aug 2025 20:36:17 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=85=B3=E9=94=AE?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复 store 初始化的异步问题:构造函数中的异步方法现在正确等待 - 修复配置切换时删除原文件的严重 bug:使用 copyFile 替代 rename 避免文件丢失 - 简化代码实现,移除过度设计的部分 --- src/main/index.ts | 24 ++++++++++++------------ src/main/services.ts | 17 +++++------------ src/main/store.ts | 8 ++++++-- 3 files changed, 23 insertions(+), 26 deletions(-) diff --git a/src/main/index.ts b/src/main/index.ts index 071a1a0..beb229e 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -62,12 +62,12 @@ app.on("window-all-closed", () => { }); // IPC handlers -ipcMain.handle("getProviders", () => { - return store.get("providers", {} as Record); +ipcMain.handle("getProviders", async () => { + return await store.get("providers", {} as Record); }); -ipcMain.handle("getCurrentProvider", () => { - return store.get("current", ""); +ipcMain.handle("getCurrentProvider", async () => { + return await store.get("current", ""); }); ipcMain.handle("addProvider", async (_, provider: Provider) => { @@ -79,7 +79,7 @@ ipcMain.handle("addProvider", async (_, provider: Provider) => { } // 2. 更新应用配置 - const providers = store.get("providers", {} as Record); + const providers = await store.get("providers", {} as Record); providers[provider.id] = provider; await store.set("providers", providers); @@ -92,7 +92,7 @@ ipcMain.handle("addProvider", async (_, provider: Provider) => { ipcMain.handle("deleteProvider", async (_, id: string) => { try { - const providers = store.get("providers", {} as Record); + const providers = await store.get("providers", {} as Record); const provider = providers[id]; // 1. 删除供应商配置文件 @@ -107,7 +107,7 @@ ipcMain.handle("deleteProvider", async (_, id: string) => { await store.set("providers", providers); // 3. 如果删除的是当前供应商,清空当前选择 - const currentProviderId = store.get("current", ""); + const currentProviderId = await store.get("current", ""); if (currentProviderId === id) { await store.set("current", ""); } @@ -121,8 +121,8 @@ ipcMain.handle("deleteProvider", async (_, id: string) => { ipcMain.handle("updateProvider", async (_, provider: Provider) => { try { - const providers = store.get("providers", {} as Record); - const currentProviderId = store.get("current", ""); + const providers = await store.get("providers", {} as Record); + const currentProviderId = await store.get("current", ""); const oldProvider = providers[provider.id]; // 1. 如果名字发生变化,需要重命名配置文件 @@ -181,9 +181,9 @@ ipcMain.handle("updateProvider", async (_, provider: Provider) => { ipcMain.handle("switchProvider", async (_, providerId: string) => { try { - const providers = store.get("providers", {} as Record); + const providers = await store.get("providers", {} as Record); const provider = providers[providerId]; - const currentProviderId = store.get("current", ""); + const currentProviderId = await store.get("current", ""); if (!provider) { console.error(`供应商不存在: ${providerId}`); @@ -214,7 +214,7 @@ ipcMain.handle("importCurrentConfigAsDefault", async () => { if (result.success && result.provider) { // 将默认供应商添加到store中 - const providers = store.get("providers", {} as Record); + const providers = await store.get("providers", {} as Record); providers[result.provider.id] = result.provider; await store.set("providers", providers); diff --git a/src/main/services.ts b/src/main/services.ts index 84081fa..643bea0 100644 --- a/src/main/services.ts +++ b/src/main/services.ts @@ -75,7 +75,7 @@ export async function fileExists(filePath: string): Promise { } /** - * 切换供应商配置(基于文件重命名) + * 切换供应商配置(基于文件复制) */ export async function switchProvider( provider: Provider, @@ -104,21 +104,14 @@ export async function switchProvider( currentProviderId, currentProvider.name ); - await fs.rename(settingsPath, currentProviderPath); + // 使用复制而不是重命名,避免删除原文件 + await fs.copyFile(settingsPath, currentProviderPath); console.log(`已备份当前供应商配置: ${currentProvider.name}`); - } else { - // 如果没有当前供应商ID,创建临时备份 - const backupPath = path.join( - configDir, - `settings-backup-${Date.now()}.json` - ); - await fs.rename(settingsPath, backupPath); - console.log(`已备份当前配置到: ${backupPath}`); } } - // 2. 将目标供应商配置重命名为settings.json - await fs.rename(newSettingsPath, settingsPath); + // 2. 复制新配置到settings.json(保留原文件) + await fs.copyFile(newSettingsPath, settingsPath); console.log(`成功切换到供应商: ${provider.name}`); return true; diff --git a/src/main/store.ts b/src/main/store.ts index 056fa9b..2b57c60 100644 --- a/src/main/store.ts +++ b/src/main/store.ts @@ -7,11 +7,13 @@ export class SimpleStore { private configPath: string private configDir: string private data: AppConfig = { providers: {}, current: '' } + private initPromise: Promise constructor() { this.configDir = path.join(os.homedir(), '.cc-switch') this.configPath = path.join(this.configDir, 'config.json') - this.loadData() + // 立即开始加载,但不阻塞构造函数 + this.initPromise = this.loadData() } private async loadData(): Promise { @@ -36,12 +38,14 @@ export class SimpleStore { } } - get(key: keyof AppConfig, defaultValue?: T): T { + async get(key: keyof AppConfig, defaultValue?: T): Promise { + await this.initPromise // 等待初始化完成 const value = this.data[key] as T return value !== undefined ? value : (defaultValue as T) } async set(key: K, value: AppConfig[K]): Promise { + await this.initPromise // 等待初始化完成 this.data[key] = value await this.saveData() }