import { useState, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Save, Loader2, Info } from "lucide-react"; import { toast } from "sonner"; import { useCircuitBreakerConfig, useUpdateCircuitBreakerConfig, } from "@/lib/query/failover"; export interface AutoFailoverConfigPanelProps { enabled: boolean; onEnabledChange: (enabled: boolean) => void; } export function AutoFailoverConfigPanel({ enabled, onEnabledChange: _onEnabledChange, }: AutoFailoverConfigPanelProps) { // Note: onEnabledChange is currently unused but kept in the interface // for potential future use by parent components void _onEnabledChange; const { t } = useTranslation(); const { data: config, isLoading, error } = useCircuitBreakerConfig(); const updateConfig = useUpdateCircuitBreakerConfig(); const [formData, setFormData] = useState({ failureThreshold: 5, successThreshold: 2, timeoutSeconds: 60, errorRateThreshold: 0.5, minRequests: 10, }); useEffect(() => { if (config) { setFormData({ ...config, }); } }, [config]); const handleSave = async () => { try { await updateConfig.mutateAsync({ failureThreshold: formData.failureThreshold, successThreshold: formData.successThreshold, timeoutSeconds: formData.timeoutSeconds, errorRateThreshold: formData.errorRateThreshold, minRequests: formData.minRequests, }); toast.success( t("proxy.autoFailover.configSaved", "自动故障转移配置已保存"), { closeButton: true }, ); } catch (e) { toast.error( t("proxy.autoFailover.configSaveFailed", "保存失败") + ": " + String(e), ); } }; const handleReset = () => { if (config) { setFormData({ ...config, }); } }; if (isLoading) { return (
{t( "proxy.autoFailover.failureThresholdHint", "连续失败多少次后打开熔断器(建议: 3-10)", )}
{t( "proxy.autoFailover.timeoutHint", "熔断器打开后,等待多久后尝试恢复(建议: 30-120)", )}
{t( "proxy.autoFailover.successThresholdHint", "半开状态下成功多少次后关闭熔断器", )}
{t( "proxy.autoFailover.errorRateHint", "错误率超过此值时打开熔断器", )}
{t( "proxy.autoFailover.minRequestsHint", "计算错误率前的最小请求数", )}