Files
cc-switch/src/renderer/App.tsx

201 lines
5.4 KiB
TypeScript
Raw Normal View History

import { useState, useEffect } from 'react'
import { Provider } from '../shared/types'
2025-08-04 22:16:26 +08:00
import ProviderList from './components/ProviderList'
import AddProviderModal from './components/AddProviderModal'
import EditProviderModal from './components/EditProviderModal'
import ConfirmModal from './components/ConfirmModal'
import MessageModal from './components/MessageModal'
2025-08-04 22:16:26 +08:00
import './App.css'
function App() {
const [providers, setProviders] = useState<Record<string, Provider>>({})
const [currentProviderId, setCurrentProviderId] = useState<string>('')
const [isAddModalOpen, setIsAddModalOpen] = useState(false)
const [configPath, setConfigPath] = useState<string>('')
const [editingProviderId, setEditingProviderId] = useState<string | null>(null)
// Modal states
const [confirmModal, setConfirmModal] = useState<{
show: boolean
title: string
message: string
onConfirm: () => void
} | null>(null)
const [messageModal, setMessageModal] = useState<{
show: boolean
title: string
message: string
type: 'success' | 'error' | 'info'
} | null>(null)
2025-08-04 22:16:26 +08:00
// 加载供应商列表
useEffect(() => {
loadProviders()
loadConfigPath()
}, [])
const loadProviders = async () => {
const loadedProviders = await window.electronAPI.getProviders()
const currentId = await window.electronAPI.getCurrentProvider()
setProviders(loadedProviders)
setCurrentProviderId(currentId)
}
const loadConfigPath = async () => {
const path = await window.electronAPI.getClaudeCodeConfigPath()
setConfigPath(path)
}
// 生成唯一ID
const generateId = () => {
return Date.now().toString(36) + Math.random().toString(36).substr(2, 9)
}
2025-08-04 22:16:26 +08:00
const handleAddProvider = async (provider: Omit<Provider, 'id'>) => {
const newProvider: Provider = {
...provider,
id: generateId()
2025-08-04 22:16:26 +08:00
}
await window.electronAPI.addProvider(newProvider)
await loadProviders()
setIsAddModalOpen(false)
}
const handleDeleteProvider = async (id: string) => {
setConfirmModal({
show: true,
title: '删除供应商',
message: '确定要删除这个供应商吗?',
onConfirm: async () => {
await window.electronAPI.deleteProvider(id)
await loadProviders()
setConfirmModal(null)
}
})
2025-08-04 22:16:26 +08:00
}
const handleSwitchProvider = async (id: string) => {
const success = await window.electronAPI.switchProvider(id)
if (success) {
setCurrentProviderId(id)
setMessageModal({
show: true,
title: '切换成功',
message: '供应商已成功切换!',
type: 'success'
})
2025-08-04 22:16:26 +08:00
} else {
setMessageModal({
show: true,
title: '切换失败',
message: '切换失败,请检查配置',
type: 'error'
})
2025-08-04 22:16:26 +08:00
}
}
const handleEditProvider = async (provider: Provider) => {
try {
await window.electronAPI.updateProvider(provider)
await loadProviders()
setEditingProviderId(null)
setMessageModal({
show: true,
title: '保存成功',
message: '供应商信息已更新!',
type: 'success'
})
} catch (error) {
console.error('更新供应商失败:', error)
setMessageModal({
show: true,
title: '保存失败',
message: '保存失败,请重试',
type: 'error'
})
}
}
const handleSelectConfigFile = async () => {
const selectedPath = await window.electronAPI.selectConfigFile()
if (selectedPath) {
setConfigPath(selectedPath)
}
}
2025-08-04 22:16:26 +08:00
return (
<div className="app">
<header className="app-header">
<h1>Claude Code </h1>
<div className="header-actions">
<button
className="add-btn"
onClick={() => setIsAddModalOpen(true)}
>
</button>
</div>
</header>
<main className="app-main">
<ProviderList
providers={providers}
currentProviderId={currentProviderId}
onSwitch={handleSwitchProvider}
onDelete={handleDeleteProvider}
onEdit={setEditingProviderId}
2025-08-04 22:16:26 +08:00
/>
{configPath && (
<div className="config-path">
<span>: {configPath}</span>
<button
className="browse-btn"
onClick={handleSelectConfigFile}
title="浏览选择配置文件"
>
</button>
2025-08-04 22:16:26 +08:00
</div>
)}
</main>
{isAddModalOpen && (
<AddProviderModal
onAdd={handleAddProvider}
onClose={() => setIsAddModalOpen(false)}
/>
)}
{editingProviderId && providers[editingProviderId] && (
<EditProviderModal
provider={providers[editingProviderId]}
onSave={handleEditProvider}
onClose={() => setEditingProviderId(null)}
/>
)}
{confirmModal && (
<ConfirmModal
title={confirmModal.title}
message={confirmModal.message}
onConfirm={confirmModal.onConfirm}
onCancel={() => setConfirmModal(null)}
/>
)}
{messageModal && (
<MessageModal
title={messageModal.title}
message={messageModal.message}
type={messageModal.type}
onClose={() => setMessageModal(null)}
/>
)}
2025-08-04 22:16:26 +08:00
</div>
)
}
export default App