import { useEffect, useState, useCallback } from 'react'; import { Form, Input, Switch, Button, Card, Select, Row, Col } from 'antd'; import { message } from '../utils/antdMessage'; import { proxyApi, type ProxyConfig, type PlatformInfo } from '../api/modules'; import RealtimeLogPanel from '../components/RealtimeLogPanel'; import { useWebSocketLogs } from '../hooks/useWebSocketLogs'; import { getErrorMessage } from '../utils/error'; export default function ProxyPage() { const [form] = Form.useForm(); const [loading, setLoading] = useState(false); const [testing, setTesting] = useState(false); const [testingWl, setTestingWl] = useState(false); const [configLoaded, setConfigLoaded] = useState(false); const { logs, connect: connectLogs, close: closeLogs } = useWebSocketLogs(); // 平台相关状态 const [platforms, setPlatforms] = useState([]); const [selectedPlatform, setSelectedPlatform] = useState('xiequ'); const [credentials, setCredentials] = useState>({}); // 加载平台列表 useEffect(() => { proxyApi.getPlatforms().then(setPlatforms).catch(() => {}); }, []); // 当前平台的凭据字段定义 const currentPlatformFields = platforms.find(p => p.name === selectedPlatform)?.credential_fields ?? []; const loadConfig = useCallback(async () => { try { const data = await proxyApi.get(); form.setFieldsValue({ enabled: data.enabled ?? false, api_url: data.api_url ?? '', http: data.http ?? '', https: data.https ?? '', whitelist_enabled: data.whitelist_enabled ?? false, }); // 恢复平台和凭据 const platform = data.whitelist_platform || 'xiequ'; setSelectedPlatform(platform); if (data.whitelist_credentials && Object.keys(data.whitelist_credentials).length > 0) { setCredentials(data.whitelist_credentials); } else if (data.whitelist_uid || data.whitelist_ukey) { // 向后兼容:旧字段迁移到凭据 setCredentials({ uid: data.whitelist_uid || '', ukey: data.whitelist_ukey || '' }); } else { setCredentials({}); } } catch (e: unknown) { message.error(getErrorMessage(e)); } finally { setConfigLoaded(true); } }, [form]); useEffect(() => { loadConfig(); return () => { closeLogs(); }; }, [loadConfig, closeLogs]); const connectWs = (testId: string) => { connectLogs(`/api/proxy/ws/test/${testId}`, { onClose: () => { setTesting(false); setTestingWl(false); }, onResult: () => { setTesting(false); setTestingWl(false); }, }); }; const handleSave = async () => { setLoading(true); try { const values = await form.validateFields(); const submitData: ProxyConfig = { ...values, whitelist_platform: selectedPlatform, whitelist_credentials: credentials, // 旧字段:协固平台双写,其他平台清空 whitelist_uid: selectedPlatform === 'xiequ' ? (credentials.uid || '') : '', whitelist_ukey: selectedPlatform === 'xiequ' ? (credentials.ukey || '') : '', }; await proxyApi.update(submitData); message.success('已保存'); } catch (e: unknown) { message.error(getErrorMessage(e)); } finally { setLoading(false); } }; const handleTestProxy = async () => { setTesting(true); try { const result = await proxyApi.test(); if (result.test_id) connectWs(result.test_id); } catch (e: unknown) { message.error(getErrorMessage(e)); setTesting(false); } }; const handleTestWhitelist = async () => { setTestingWl(true); try { const result = await proxyApi.testWhitelist(); if (result.test_id) connectWs(result.test_id); } catch (e: unknown) { message.error(getErrorMessage(e)); setTestingWl(false); } }; const handlePlatformChange = (value: string) => { setSelectedPlatform(value); setCredentials({}); }; const handleCredentialChange = (key: string, value: string) => { setCredentials(prev => ({ ...prev, [key]: value })); }; return (

代理配置

{/* 平台选择 */}
代理平台
handleCredentialChange(field.key, e.target.value)} />
))}
); }