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

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

View File

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

View File

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

View File

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

View File

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

View File

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