简化界面:删除导入当前配置功能
- 移除 ImportConfigModal 组件及相关文件 - 删除头部的导入当前配置按钮 - 移除 importCurrentConfig 相关的 API 和 IPC 处理器 - 保留 importCurrentConfigAsDefault 功能用于首次启动 - 界面更简洁,专注核心功能:添加、编辑、切换、删除供应商 - 减少用户困惑,因为自动创建的默认供应商已经满足大部分需求
This commit is contained in:
@@ -8,7 +8,6 @@ import {
|
|||||||
saveProviderConfig,
|
saveProviderConfig,
|
||||||
deleteProviderConfig,
|
deleteProviderConfig,
|
||||||
sanitizeProviderName,
|
sanitizeProviderName,
|
||||||
importCurrentConfig,
|
|
||||||
importCurrentConfigAsDefault,
|
importCurrentConfigAsDefault,
|
||||||
getProviderConfigPath,
|
getProviderConfigPath,
|
||||||
fileExists,
|
fileExists,
|
||||||
@@ -215,26 +214,6 @@ ipcMain.handle("switchProvider", async (_, providerId: string) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
ipcMain.handle("importCurrentConfig", async (_, name: string) => {
|
|
||||||
try {
|
|
||||||
const result = await importCurrentConfig(name);
|
|
||||||
|
|
||||||
if (result.success && result.provider) {
|
|
||||||
// 将导入的供应商添加到store中
|
|
||||||
const providers = store.get("providers", {} as Record<string, Provider>);
|
|
||||||
providers[result.provider.id] = result.provider;
|
|
||||||
await store.set("providers", providers);
|
|
||||||
|
|
||||||
return { success: true, providerId: result.provider.id };
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
} catch (error: any) {
|
|
||||||
console.error("导入配置失败:", error);
|
|
||||||
return { success: false };
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
ipcMain.handle("importCurrentConfigAsDefault", async () => {
|
ipcMain.handle("importCurrentConfigAsDefault", async () => {
|
||||||
try {
|
try {
|
||||||
const result = await importCurrentConfigAsDefault();
|
const result = await importCurrentConfigAsDefault();
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ contextBridge.exposeInMainWorld('electronAPI', {
|
|||||||
deleteProvider: (id: string) => ipcRenderer.invoke('deleteProvider', id),
|
deleteProvider: (id: string) => ipcRenderer.invoke('deleteProvider', id),
|
||||||
updateProvider: (provider: Provider) => ipcRenderer.invoke('updateProvider', provider),
|
updateProvider: (provider: Provider) => ipcRenderer.invoke('updateProvider', provider),
|
||||||
switchProvider: (providerId: string) => ipcRenderer.invoke('switchProvider', providerId),
|
switchProvider: (providerId: string) => ipcRenderer.invoke('switchProvider', providerId),
|
||||||
importCurrentConfig: (name: string) => ipcRenderer.invoke('importCurrentConfig', name),
|
|
||||||
importCurrentConfigAsDefault: () => ipcRenderer.invoke('importCurrentConfigAsDefault'),
|
importCurrentConfigAsDefault: () => ipcRenderer.invoke('importCurrentConfigAsDefault'),
|
||||||
getClaudeCodeConfigPath: () => ipcRenderer.invoke('getClaudeCodeConfigPath'),
|
getClaudeCodeConfigPath: () => ipcRenderer.invoke('getClaudeCodeConfigPath'),
|
||||||
selectConfigFile: () => ipcRenderer.invoke('selectConfigFile'),
|
selectConfigFile: () => ipcRenderer.invoke('selectConfigFile'),
|
||||||
|
|||||||
@@ -136,60 +136,6 @@ export async function switchProvider(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 导入当前 settings.json 配置为一个供应商
|
|
||||||
*/
|
|
||||||
export async function importCurrentConfig(
|
|
||||||
name: string
|
|
||||||
): Promise<{ success: boolean; provider?: Provider }> {
|
|
||||||
try {
|
|
||||||
const { path: settingsPath } = getClaudeCodeConfig();
|
|
||||||
|
|
||||||
// 检查当前配置是否存在
|
|
||||||
if (!(await fileExists(settingsPath))) {
|
|
||||||
return { success: false };
|
|
||||||
}
|
|
||||||
|
|
||||||
// 读取当前配置
|
|
||||||
const configContent = await fs.readFile(settingsPath, "utf-8");
|
|
||||||
const settingsConfig = JSON.parse(configContent);
|
|
||||||
|
|
||||||
// 生成唯一的供应商ID
|
|
||||||
let providerId = name.toLowerCase().replace(/[^a-z0-9]/g, "-");
|
|
||||||
let counter = 1;
|
|
||||||
|
|
||||||
// 检查ID是否已存在,如果存在则添加数字后缀
|
|
||||||
while (await fileExists(getProviderConfigPath(providerId, name))) {
|
|
||||||
providerId = `${name
|
|
||||||
.toLowerCase()
|
|
||||||
.replace(/[^a-z0-9]/g, "-")}-${counter}`;
|
|
||||||
counter++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建供应商对象
|
|
||||||
const provider: Provider = {
|
|
||||||
id: providerId,
|
|
||||||
name: name,
|
|
||||||
settingsConfig: settingsConfig,
|
|
||||||
createdAt: Date.now(),
|
|
||||||
updatedAt: Date.now(),
|
|
||||||
};
|
|
||||||
|
|
||||||
// 保存为供应商配置
|
|
||||||
const success = await saveProviderConfig(provider);
|
|
||||||
|
|
||||||
if (success) {
|
|
||||||
console.log(`已导入当前配置为供应商: ${name} (${providerId})`);
|
|
||||||
return { success: true, provider };
|
|
||||||
} else {
|
|
||||||
return { success: false };
|
|
||||||
}
|
|
||||||
} catch (error: any) {
|
|
||||||
console.error("导入当前配置失败:", error);
|
|
||||||
return { success: false };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导入当前配置为默认供应商(不生成独立配置文件)
|
* 导入当前配置为默认供应商(不生成独立配置文件)
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { Provider } from "../shared/types";
|
|||||||
import ProviderList from "./components/ProviderList";
|
import ProviderList from "./components/ProviderList";
|
||||||
import AddProviderModal from "./components/AddProviderModal";
|
import AddProviderModal from "./components/AddProviderModal";
|
||||||
import EditProviderModal from "./components/EditProviderModal";
|
import EditProviderModal from "./components/EditProviderModal";
|
||||||
import ImportConfigModal from "./components/ImportConfigModal";
|
|
||||||
import { ConfirmDialog } from "./components/ConfirmDialog";
|
import { ConfirmDialog } from "./components/ConfirmDialog";
|
||||||
import "./App.css";
|
import "./App.css";
|
||||||
|
|
||||||
@@ -11,7 +10,6 @@ function App() {
|
|||||||
const [providers, setProviders] = useState<Record<string, Provider>>({});
|
const [providers, setProviders] = useState<Record<string, Provider>>({});
|
||||||
const [currentProviderId, setCurrentProviderId] = useState<string>("");
|
const [currentProviderId, setCurrentProviderId] = useState<string>("");
|
||||||
const [isAddModalOpen, setIsAddModalOpen] = useState(false);
|
const [isAddModalOpen, setIsAddModalOpen] = useState(false);
|
||||||
const [isImportModalOpen, setIsImportModalOpen] = useState(false);
|
|
||||||
const [configPath, setConfigPath] = useState<string>("");
|
const [configPath, setConfigPath] = useState<string>("");
|
||||||
const [editingProviderId, setEditingProviderId] = useState<string | null>(
|
const [editingProviderId, setEditingProviderId] = useState<string | null>(
|
||||||
null
|
null
|
||||||
@@ -146,23 +144,6 @@ function App() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleImportCurrentConfig = async (name: string) => {
|
|
||||||
try {
|
|
||||||
const result = await window.electronAPI.importCurrentConfig(name)
|
|
||||||
|
|
||||||
if (result.success) {
|
|
||||||
await loadProviders()
|
|
||||||
setIsImportModalOpen(false)
|
|
||||||
showNotification(`成功导入当前配置为供应商: ${name}`, "success", 3000)
|
|
||||||
} else {
|
|
||||||
showNotification("导入失败,请检查当前是否有有效的配置文件", "error")
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error('导入配置失败:', error)
|
|
||||||
showNotification("导入配置时发生错误", "error")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 自动导入现有配置为"默认"供应商
|
// 自动导入现有配置为"默认"供应商
|
||||||
const handleAutoImportDefault = async () => {
|
const handleAutoImportDefault = async () => {
|
||||||
try {
|
try {
|
||||||
@@ -191,9 +172,6 @@ function App() {
|
|||||||
<header className="app-header">
|
<header className="app-header">
|
||||||
<h1>Claude Code 供应商切换器</h1>
|
<h1>Claude Code 供应商切换器</h1>
|
||||||
<div className="header-actions">
|
<div className="header-actions">
|
||||||
<button className="import-btn" onClick={() => setIsImportModalOpen(true)}>
|
|
||||||
导入当前配置
|
|
||||||
</button>
|
|
||||||
<button className="add-btn" onClick={() => setIsAddModalOpen(true)}>
|
<button className="add-btn" onClick={() => setIsAddModalOpen(true)}>
|
||||||
添加供应商
|
添加供应商
|
||||||
</button>
|
</button>
|
||||||
@@ -245,13 +223,6 @@ function App() {
|
|||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{isImportModalOpen && (
|
|
||||||
<ImportConfigModal
|
|
||||||
onImport={handleImportCurrentConfig}
|
|
||||||
onClose={() => setIsImportModalOpen(false)}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{editingProviderId && providers[editingProviderId] && (
|
{editingProviderId && providers[editingProviderId] && (
|
||||||
<EditProviderModal
|
<EditProviderModal
|
||||||
provider={providers[editingProviderId]}
|
provider={providers[editingProviderId]}
|
||||||
|
|||||||
@@ -1,67 +0,0 @@
|
|||||||
import React, { useState } from 'react'
|
|
||||||
import './AddProviderModal.css'
|
|
||||||
|
|
||||||
interface ImportConfigModalProps {
|
|
||||||
onImport: (name: string) => void
|
|
||||||
onClose: () => void
|
|
||||||
}
|
|
||||||
|
|
||||||
const ImportConfigModal: React.FC<ImportConfigModalProps> = ({ onImport, onClose }) => {
|
|
||||||
const [name, setName] = useState('')
|
|
||||||
const [error, setError] = useState('')
|
|
||||||
|
|
||||||
const handleSubmit = (e: React.FormEvent) => {
|
|
||||||
e.preventDefault()
|
|
||||||
setError('')
|
|
||||||
|
|
||||||
if (!name.trim()) {
|
|
||||||
setError('请输入供应商名称')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
onImport(name.trim())
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="modal-overlay">
|
|
||||||
<div className="modal-content">
|
|
||||||
<h2>导入当前配置</h2>
|
|
||||||
|
|
||||||
<p style={{marginBottom: '1.5rem', color: '#666', fontSize: '0.9rem'}}>
|
|
||||||
将当前的 <code>~/.claude/settings.json</code> 配置文件导入为一个新的供应商。
|
|
||||||
<br />
|
|
||||||
<strong>注意:</strong>这不会修改您当前的配置文件。
|
|
||||||
</p>
|
|
||||||
|
|
||||||
{error && <div className="error-message">{error}</div>}
|
|
||||||
|
|
||||||
<form onSubmit={handleSubmit}>
|
|
||||||
<div className="form-group">
|
|
||||||
<label htmlFor="name">供应商名称 *</label>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
id="name"
|
|
||||||
name="name"
|
|
||||||
value={name}
|
|
||||||
onChange={(e) => setName(e.target.value)}
|
|
||||||
placeholder="例如:我的当前配置"
|
|
||||||
required
|
|
||||||
autoFocus
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="form-actions">
|
|
||||||
<button type="button" className="cancel-btn" onClick={onClose}>
|
|
||||||
取消
|
|
||||||
</button>
|
|
||||||
<button type="submit" className="submit-btn">
|
|
||||||
导入
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export default ImportConfigModal
|
|
||||||
Reference in New Issue
Block a user