fix: 修复关键逻辑错误
- 修复 store 初始化的异步问题:构造函数中的异步方法现在正确等待 - 修复配置切换时删除原文件的严重 bug:使用 copyFile 替代 rename 避免文件丢失 - 简化代码实现,移除过度设计的部分
This commit is contained in:
@@ -62,12 +62,12 @@ app.on("window-all-closed", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// IPC handlers
|
// IPC handlers
|
||||||
ipcMain.handle("getProviders", () => {
|
ipcMain.handle("getProviders", async () => {
|
||||||
return store.get("providers", {} as Record<string, Provider>);
|
return await store.get("providers", {} as Record<string, Provider>);
|
||||||
});
|
});
|
||||||
|
|
||||||
ipcMain.handle("getCurrentProvider", () => {
|
ipcMain.handle("getCurrentProvider", async () => {
|
||||||
return store.get("current", "");
|
return await store.get("current", "");
|
||||||
});
|
});
|
||||||
|
|
||||||
ipcMain.handle("addProvider", async (_, provider: Provider) => {
|
ipcMain.handle("addProvider", async (_, provider: Provider) => {
|
||||||
@@ -79,7 +79,7 @@ ipcMain.handle("addProvider", async (_, provider: Provider) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 2. 更新应用配置
|
// 2. 更新应用配置
|
||||||
const providers = store.get("providers", {} as Record<string, Provider>);
|
const providers = await store.get("providers", {} as Record<string, Provider>);
|
||||||
providers[provider.id] = provider;
|
providers[provider.id] = provider;
|
||||||
await store.set("providers", providers);
|
await store.set("providers", providers);
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@ ipcMain.handle("addProvider", async (_, provider: Provider) => {
|
|||||||
|
|
||||||
ipcMain.handle("deleteProvider", async (_, id: string) => {
|
ipcMain.handle("deleteProvider", async (_, id: string) => {
|
||||||
try {
|
try {
|
||||||
const providers = store.get("providers", {} as Record<string, Provider>);
|
const providers = await store.get("providers", {} as Record<string, Provider>);
|
||||||
const provider = providers[id];
|
const provider = providers[id];
|
||||||
|
|
||||||
// 1. 删除供应商配置文件
|
// 1. 删除供应商配置文件
|
||||||
@@ -107,7 +107,7 @@ ipcMain.handle("deleteProvider", async (_, id: string) => {
|
|||||||
await store.set("providers", providers);
|
await store.set("providers", providers);
|
||||||
|
|
||||||
// 3. 如果删除的是当前供应商,清空当前选择
|
// 3. 如果删除的是当前供应商,清空当前选择
|
||||||
const currentProviderId = store.get("current", "");
|
const currentProviderId = await store.get("current", "");
|
||||||
if (currentProviderId === id) {
|
if (currentProviderId === id) {
|
||||||
await store.set("current", "");
|
await store.set("current", "");
|
||||||
}
|
}
|
||||||
@@ -121,8 +121,8 @@ ipcMain.handle("deleteProvider", async (_, id: string) => {
|
|||||||
|
|
||||||
ipcMain.handle("updateProvider", async (_, provider: Provider) => {
|
ipcMain.handle("updateProvider", async (_, provider: Provider) => {
|
||||||
try {
|
try {
|
||||||
const providers = store.get("providers", {} as Record<string, Provider>);
|
const providers = await store.get("providers", {} as Record<string, Provider>);
|
||||||
const currentProviderId = store.get("current", "");
|
const currentProviderId = await store.get("current", "");
|
||||||
const oldProvider = providers[provider.id];
|
const oldProvider = providers[provider.id];
|
||||||
|
|
||||||
// 1. 如果名字发生变化,需要重命名配置文件
|
// 1. 如果名字发生变化,需要重命名配置文件
|
||||||
@@ -181,9 +181,9 @@ ipcMain.handle("updateProvider", async (_, provider: Provider) => {
|
|||||||
|
|
||||||
ipcMain.handle("switchProvider", async (_, providerId: string) => {
|
ipcMain.handle("switchProvider", async (_, providerId: string) => {
|
||||||
try {
|
try {
|
||||||
const providers = store.get("providers", {} as Record<string, Provider>);
|
const providers = await store.get("providers", {} as Record<string, Provider>);
|
||||||
const provider = providers[providerId];
|
const provider = providers[providerId];
|
||||||
const currentProviderId = store.get("current", "");
|
const currentProviderId = await store.get("current", "");
|
||||||
|
|
||||||
if (!provider) {
|
if (!provider) {
|
||||||
console.error(`供应商不存在: ${providerId}`);
|
console.error(`供应商不存在: ${providerId}`);
|
||||||
@@ -214,7 +214,7 @@ ipcMain.handle("importCurrentConfigAsDefault", async () => {
|
|||||||
|
|
||||||
if (result.success && result.provider) {
|
if (result.success && result.provider) {
|
||||||
// 将默认供应商添加到store中
|
// 将默认供应商添加到store中
|
||||||
const providers = store.get("providers", {} as Record<string, Provider>);
|
const providers = await store.get("providers", {} as Record<string, Provider>);
|
||||||
providers[result.provider.id] = result.provider;
|
providers[result.provider.id] = result.provider;
|
||||||
await store.set("providers", providers);
|
await store.set("providers", providers);
|
||||||
|
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ export async function fileExists(filePath: string): Promise<boolean> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 切换供应商配置(基于文件重命名)
|
* 切换供应商配置(基于文件复制)
|
||||||
*/
|
*/
|
||||||
export async function switchProvider(
|
export async function switchProvider(
|
||||||
provider: Provider,
|
provider: Provider,
|
||||||
@@ -104,21 +104,14 @@ export async function switchProvider(
|
|||||||
currentProviderId,
|
currentProviderId,
|
||||||
currentProvider.name
|
currentProvider.name
|
||||||
);
|
);
|
||||||
await fs.rename(settingsPath, currentProviderPath);
|
// 使用复制而不是重命名,避免删除原文件
|
||||||
|
await fs.copyFile(settingsPath, currentProviderPath);
|
||||||
console.log(`已备份当前供应商配置: ${currentProvider.name}`);
|
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
|
// 2. 复制新配置到settings.json(保留原文件)
|
||||||
await fs.rename(newSettingsPath, settingsPath);
|
await fs.copyFile(newSettingsPath, settingsPath);
|
||||||
|
|
||||||
console.log(`成功切换到供应商: ${provider.name}`);
|
console.log(`成功切换到供应商: ${provider.name}`);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -7,11 +7,13 @@ export class SimpleStore {
|
|||||||
private configPath: string
|
private configPath: string
|
||||||
private configDir: string
|
private configDir: string
|
||||||
private data: AppConfig = { providers: {}, current: '' }
|
private data: AppConfig = { providers: {}, current: '' }
|
||||||
|
private initPromise: Promise<void>
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.configDir = path.join(os.homedir(), '.cc-switch')
|
this.configDir = path.join(os.homedir(), '.cc-switch')
|
||||||
this.configPath = path.join(this.configDir, 'config.json')
|
this.configPath = path.join(this.configDir, 'config.json')
|
||||||
this.loadData()
|
// 立即开始加载,但不阻塞构造函数
|
||||||
|
this.initPromise = this.loadData()
|
||||||
}
|
}
|
||||||
|
|
||||||
private async loadData(): Promise<void> {
|
private async loadData(): Promise<void> {
|
||||||
@@ -36,12 +38,14 @@ export class SimpleStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
get<T>(key: keyof AppConfig, defaultValue?: T): T {
|
async get<T>(key: keyof AppConfig, defaultValue?: T): Promise<T> {
|
||||||
|
await this.initPromise // 等待初始化完成
|
||||||
const value = this.data[key] as T
|
const value = this.data[key] as T
|
||||||
return value !== undefined ? value : (defaultValue as T)
|
return value !== undefined ? value : (defaultValue as T)
|
||||||
}
|
}
|
||||||
|
|
||||||
async set<K extends keyof AppConfig>(key: K, value: AppConfig[K]): Promise<void> {
|
async set<K extends keyof AppConfig>(key: K, value: AppConfig[K]): Promise<void> {
|
||||||
|
await this.initPromise // 等待初始化完成
|
||||||
this.data[key] = value
|
this.data[key] = value
|
||||||
await this.saveData()
|
await this.saveData()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user