import { useEffect, useState } from 'react' import { Card, Form, Button, Switch, Input, InputNumber, message, Typography, Space, Alert } from 'antd' import { SaveOutlined, CheckCircleOutlined, ReloadOutlined } from '@ant-design/icons' import { apiService } from '../services/api' import { useTranslation } from 'react-i18next' import { useMediaQuery } from 'react-responsive' const { Title, Text } = Typography interface ProxyConfig { id?: number type: string enabled: boolean host?: string port?: number username?: string subscriptionUrl?: string lastSubscriptionUpdate?: number createdAt: number updatedAt: number } interface ProxyCheckResponse { success: boolean message: string responseTime?: number latency?: number } const ProxySettings: React.FC = () => { const { t } = useTranslation() const isMobile = useMediaQuery({ maxWidth: 768 }) const [form] = Form.useForm() const [loading, setLoading] = useState(false) const [checking, setChecking] = useState(false) const [checkResult, setCheckResult] = useState(null) const [currentConfig, setCurrentConfig] = useState(null) useEffect(() => { fetchConfig() }, []) const fetchConfig = async () => { try { const response = await apiService.proxyConfig.get() if (response.data.code === 0) { const data = response.data.data setCurrentConfig(data) if (data) { form.setFieldsValue({ enabled: data.enabled, host: data.host || '', port: data.port || undefined, username: data.username || '', password: '', // 密码不预填充 }) } else { form.resetFields() } } else { message.error(response.data.msg || t('proxySettings.getFailed') || '获取代理配置失败') } } catch (error: any) { message.error(error.message || t('proxySettings.getFailed') || '获取代理配置失败') } } const handleSubmit = async (values: any) => { setLoading(true) try { const requestData: any = { enabled: values.enabled || false, host: values.host, port: values.port, username: values.username || undefined, } // 只有在输入了新密码时才包含密码字段 if (values.password && values.password.trim()) { requestData.password = values.password } const response = await apiService.proxyConfig.saveHttp(requestData) if (response.data.code === 0) { message.success(t('proxySettings.saveSuccess') || '保存配置成功') setCheckResult(null) fetchConfig() } else { message.error(response.data.msg || t('proxySettings.saveFailed') || '保存配置失败') } } catch (error: any) { message.error(error.message || t('proxySettings.saveFailed') || '保存配置失败') } finally { setLoading(false) } } const handleCheck = async () => { setChecking(true) setCheckResult(null) try { const response = await apiService.proxyConfig.check() if (response.data.code === 0 && response.data.data) { setCheckResult(response.data.data) } else { setCheckResult({ success: false, message: response.data.msg || t('proxySettings.checkFailed') || '代理检查失败' }) } } catch (error: any) { setCheckResult({ success: false, message: error.message || t('proxySettings.checkFailed') || '代理检查失败' }) } finally { setChecking(false) } } return (
{t('proxySettings.title') || '代理设置'}
{checkResult && ( )}
{checkResult && ( {checkResult.message} {(checkResult.responseTime !== undefined || checkResult.latency !== undefined) && (
{t('proxySettings.latency') || '延迟'}: {(checkResult.latency ?? checkResult.responseTime) ?? 0}ms
)}
} style={{ marginTop: '16px' }} showIcon /> )} ) } export default ProxySettings