diff --git a/src/main/index.ts b/src/main/index.ts index 82185c8..3cb3123 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow, ipcMain } from 'electron' +import { app, BrowserWindow, ipcMain, dialog } from 'electron' import path from 'path' import Store from 'electron-store' import { Provider, AppConfig } from '../shared/types' @@ -98,4 +98,24 @@ ipcMain.handle('switchProvider', async (_, providerId: string) => { ipcMain.handle('getClaudeCodeConfigPath', () => { return getClaudeCodeConfig().path +}) + +ipcMain.handle('selectConfigFile', async () => { + if (!mainWindow) return null + + const result = await dialog.showOpenDialog(mainWindow, { + properties: ['openFile'], + title: '选择 Claude Code 配置文件', + filters: [ + { name: 'JSON 文件', extensions: ['json'] }, + { name: '所有文件', extensions: ['*'] } + ], + defaultPath: 'settings.json' + }) + + if (result.canceled || result.filePaths.length === 0) { + return null + } + + return result.filePaths[0] }) \ No newline at end of file diff --git a/src/main/preload.ts b/src/main/preload.ts index 6854a8e..7b4b94f 100644 --- a/src/main/preload.ts +++ b/src/main/preload.ts @@ -9,5 +9,6 @@ contextBridge.exposeInMainWorld('electronAPI', { updateProvider: (provider: Provider) => ipcRenderer.invoke('updateProvider', provider), checkStatus: (provider: Provider) => ipcRenderer.invoke('checkStatus', provider), switchProvider: (providerId: string) => ipcRenderer.invoke('switchProvider', providerId), - getClaudeCodeConfigPath: () => ipcRenderer.invoke('getClaudeCodeConfigPath') + getClaudeCodeConfigPath: () => ipcRenderer.invoke('getClaudeCodeConfigPath'), + selectConfigFile: () => ipcRenderer.invoke('selectConfigFile') }) \ No newline at end of file diff --git a/src/renderer/App.css b/src/renderer/App.css index 53c640e..38fb59b 100644 --- a/src/renderer/App.css +++ b/src/renderer/App.css @@ -69,4 +69,23 @@ border-radius: 4px; font-size: 0.9rem; color: #7f8c8d; + display: flex; + justify-content: space-between; + align-items: center; +} + +.browse-btn { + padding: 0.5rem 1rem; + border: none; + border-radius: 4px; + background: #3498db; + color: white; + cursor: pointer; + font-size: 0.9rem; + transition: all 0.2s; + margin-left: 1rem; +} + +.browse-btn:hover { + background: #2980b9; } \ No newline at end of file diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 6f1890e..fb0fd50 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from 'react' +import { useState, useEffect } from 'react' import { Provider, ProviderStatus } from '../shared/types' import ProviderList from './components/ProviderList' import AddProviderModal from './components/AddProviderModal' @@ -99,6 +99,13 @@ function App() { } } + const handleSelectConfigFile = async () => { + const selectedPath = await window.electronAPI.selectConfigFile() + if (selectedPath) { + setConfigPath(selectedPath) + } + } + return (