优化用户体验:简化数据结构并改进文件夹访问

- 移除 Provider 中无用的 createdAt 和 updatedAt 字段
- 简化数据结构,去除冗余的时间戳设置代码
- 将底部"浏览"按钮改为"打开",直接打开配置文件夹
- 新增 openConfigFolder API,使用 shell.openPath 打开文件夹
- 优化用户体验,方便用户查看和管理所有配置文件
This commit is contained in:
farion1231
2025-08-07 22:08:47 +08:00
parent 45c75e826a
commit db28ccb27b
6 changed files with 22 additions and 27 deletions

View File

@@ -76,11 +76,7 @@ ipcMain.handle("addProvider", async (_, provider: Provider) => {
// 2. 更新应用配置
const providers = store.get("providers", {} as Record<string, Provider>);
providers[provider.id] = {
...provider,
createdAt: Date.now(),
updatedAt: Date.now(),
};
providers[provider.id] = provider;
await store.set("providers", providers);
return true;
@@ -150,19 +146,13 @@ ipcMain.handle("updateProvider", async (_, provider: Provider) => {
}
// 2. 保存更新后的配置到文件
const saveSuccess = await saveProviderConfig({
...provider,
updatedAt: Date.now(),
});
const saveSuccess = await saveProviderConfig(provider);
if (!saveSuccess) {
return false;
}
// 3. 更新应用配置
providers[provider.id] = {
...provider,
updatedAt: Date.now(),
};
providers[provider.id] = provider;
await store.set("providers", providers);
// 4. 如果编辑的是当前激活的供应商,需要重新切换以应用更改
@@ -261,6 +251,17 @@ ipcMain.handle("selectConfigFile", async () => {
return result.filePaths[0];
});
ipcMain.handle("openConfigFolder", async () => {
try {
const { dir } = getClaudeCodeConfig();
await shell.openPath(dir);
return true;
} catch (error) {
console.error("打开配置文件夹失败:", error);
return false;
}
});
ipcMain.handle("openExternal", async (_, url: string) => {
try {
await shell.openExternal(url);

View File

@@ -11,5 +11,6 @@ contextBridge.exposeInMainWorld('electronAPI', {
importCurrentConfigAsDefault: () => ipcRenderer.invoke('importCurrentConfigAsDefault'),
getClaudeCodeConfigPath: () => ipcRenderer.invoke('getClaudeCodeConfigPath'),
selectConfigFile: () => ipcRenderer.invoke('selectConfigFile'),
openConfigFolder: () => ipcRenderer.invoke('openConfigFolder'),
openExternal: (url: string) => ipcRenderer.invoke('openExternal', url)
})

View File

@@ -149,8 +149,6 @@ export async function importCurrentConfigAsDefault(): Promise<{ success: boolean
id: "default",
name: "默认",
settingsConfig: settingsConfig,
createdAt: Date.now(),
updatedAt: Date.now(),
};
// 保存默认供应商的配置到独立文件

View File

@@ -160,11 +160,8 @@ function App() {
}
}
const handleSelectConfigFile = async () => {
const selectedPath = await window.electronAPI.selectConfigFile();
if (selectedPath) {
setConfigPath(selectedPath);
}
const handleOpenConfigFolder = async () => {
await window.electronAPI.openConfigFolder();
};
return (
@@ -207,10 +204,10 @@ function App() {
<span>: {configPath}</span>
<button
className="browse-btn"
onClick={handleSelectConfigFile}
title="浏览选择配置文件"
onClick={handleOpenConfigFolder}
title="打开配置文件"
>
</button>
</div>
)}

View File

@@ -53,7 +53,6 @@ const EditProviderModal: React.FC<EditProviderModalProps> = ({ provider, onSave,
name: formData.name,
websiteUrl: formData.websiteUrl,
settingsConfig,
updatedAt: Date.now()
})
}

View File

@@ -3,8 +3,6 @@ export interface Provider {
name: string
settingsConfig: object // 完整的Claude Code settings.json配置
websiteUrl?: string
createdAt?: number
updatedAt?: number
}
export interface AppConfig {
@@ -21,9 +19,10 @@ declare global {
deleteProvider: (id: string) => Promise<boolean>
updateProvider: (provider: Provider) => Promise<boolean>
switchProvider: (providerId: string) => Promise<boolean>
importCurrentConfig: (name: string) => Promise<{ success: boolean; providerId?: string }>
importCurrentConfigAsDefault: () => Promise<{ success: boolean; providerId?: string }>
getClaudeCodeConfigPath: () => Promise<string>
selectConfigFile: () => Promise<string | null>
openConfigFolder: () => Promise<boolean>
openExternal: (url: string) => Promise<boolean>
}
}