Files
cc-switch/src/renderer/components/ProviderList.tsx

125 lines
4.0 KiB
TypeScript
Raw Normal View History

2025-08-04 22:16:26 +08:00
import React from 'react'
import { Provider, ProviderStatus } from '../../shared/types'
import './ProviderList.css'
interface ProviderListProps {
providers: Record<string, Provider>
currentProviderId: string
statuses: Record<string, ProviderStatus>
checkingStatus: Record<string, boolean>
2025-08-04 22:16:26 +08:00
onSwitch: (id: string) => void
onDelete: (id: string) => void
onEdit: (id: string) => void
onCheckStatus: (id: string) => void
2025-08-04 22:16:26 +08:00
}
const ProviderList: React.FC<ProviderListProps> = ({
providers,
currentProviderId,
statuses,
checkingStatus,
2025-08-04 22:16:26 +08:00
onSwitch,
onDelete,
onEdit,
onCheckStatus
2025-08-04 22:16:26 +08:00
}) => {
const formatResponseTime = (time: number) => {
if (time < 0) return '-'
return `${time}ms`
}
const getStatusIcon = (status?: ProviderStatus) => {
if (!status) return '⏳'
return status.isOnline ? '✅' : '❌'
}
const getStatusText = (status?: ProviderStatus, isChecking?: boolean) => {
if (isChecking) return '检查中...'
if (!status) return '未检查'
2025-08-04 22:16:26 +08:00
if (status.isOnline) return '正常'
return status.error || '连接失败'
}
return (
<div className="provider-list">
{Object.values(providers).length === 0 ? (
<div className="empty-state">
<p></p>
<p>"添加供应商"</p>
</div>
) : (
<div className="provider-items">
{Object.values(providers).map((provider) => {
const status = statuses[provider.id]
const isChecking = checkingStatus[provider.id]
2025-08-04 22:16:26 +08:00
const isCurrent = provider.id === currentProviderId
return (
<div
key={provider.id}
className={`provider-item ${isCurrent ? 'current' : ''}`}
>
<div className="provider-info">
<div className="provider-name">
<input
type="radio"
name="provider"
checked={isCurrent}
onChange={() => onSwitch(provider.id)}
disabled={!status?.isOnline}
/>
<span>{provider.name}</span>
{isCurrent && <span className="current-badge">使</span>}
</div>
<div className="provider-url">{provider.apiUrl}</div>
</div>
<div className="provider-status">
<span className="status-icon">{isChecking ? '🔄' : getStatusIcon(status)}</span>
<span className="status-text">{getStatusText(status, isChecking)}</span>
{status?.isOnline && !isChecking && (
2025-08-04 22:16:26 +08:00
<span className="response-time">
{formatResponseTime(status.responseTime)}
</span>
)}
</div>
<div className="provider-actions">
<button
className="check-btn"
onClick={() => onCheckStatus(provider.id)}
disabled={true}
>
{isChecking ? '检查中' : '检查状态'}
</button>
<button
className="enable-btn"
onClick={() => onSwitch(provider.id)}
disabled={isCurrent}
>
</button>
<button
className="edit-btn"
onClick={() => onEdit(provider.id)}
>
</button>
2025-08-04 22:16:26 +08:00
<button
className="delete-btn"
onClick={() => onDelete(provider.id)}
disabled={isCurrent}
>
</button>
</div>
</div>
)
})}
</div>
)}
</div>
)
}
export default ProviderList