From 3e1963564a58a325a748c2f3310079a35baa4697 Mon Sep 17 00:00:00 2001 From: musistudio Date: Wed, 6 Aug 2025 21:11:44 +0800 Subject: [PATCH] fix ui: add form validator --- src/utils/router.ts | 2 +- ui/src/components/Providers.tsx | 21 +++++++++++++++++++-- ui/src/locales/en.json | 5 +++-- ui/src/locales/zh.json | 7 ++++--- 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/utils/router.ts b/src/utils/router.ts index d78ee95..d3683dc 100644 --- a/src/utils/router.ts +++ b/src/utils/router.ts @@ -69,7 +69,7 @@ const getUseModel = async (req: any, tokenCount: number, config: any) => { (p: any) => p.name.toLowerCase() === provider ); const finalModel = finalProvider?.models?.find( - (m: any) => m.name.toLowerCase() === model + (m: any) => m.toLowerCase() === model ); if (finalProvider && finalModel) { return `${finalProvider.name},${finalModel}`; diff --git a/ui/src/components/Providers.tsx b/ui/src/components/Providers.tsx index 7aba55c..6a43bd7 100644 --- a/ui/src/components/Providers.tsx +++ b/ui/src/components/Providers.tsx @@ -36,6 +36,7 @@ export function Providers() { const [isNewProvider, setIsNewProvider] = useState(false); const [providerTemplates, setProviderTemplates] = useState([]); const [showApiKey, setShowApiKey] = useState>({}); + const [apiKeyError, setApiKeyError] = useState(null); const comboInputRef = useRef(null); useEffect(() => { @@ -93,11 +94,12 @@ export function Providers() { setEditingProviderIndex(config.Providers.length); setEditingProviderData(newProvider); setIsNewProvider(true); - // Reset API key visibility when adding new provider + // Reset API key visibility and error when adding new provider setShowApiKey(prev => ({ ...prev, [config.Providers.length]: false })); + setApiKeyError(null); }; const handleEditProvider = (index: number) => { @@ -105,14 +107,24 @@ export function Providers() { setEditingProviderIndex(index); setEditingProviderData(JSON.parse(JSON.stringify(provider))); // 深拷贝 setIsNewProvider(false); - // Reset API key visibility when opening edit dialog + // Reset API key visibility and error when opening edit dialog setShowApiKey(prev => ({ ...prev, [index]: false })); + setApiKeyError(null); }; const handleSaveProvider = () => { + // Validate API key + if (!editingProviderData || !editingProviderData.api_key || editingProviderData.api_key.trim() === '') { + setApiKeyError(t("providers.api_key_required")); + return; + } + + // Clear error if validation passes + setApiKeyError(null); + if (editingProviderIndex !== null && editingProviderData) { const newProviders = [...config.Providers]; if (isNewProvider) { @@ -153,6 +165,7 @@ export function Providers() { setEditingProviderIndex(null); setEditingProviderData(null); setIsNewProvider(false); + setApiKeyError(null); }; const handleRemoveProvider = (index: number) => { @@ -500,6 +513,7 @@ export function Providers() { type={showApiKey[editingProviderIndex || 0] ? "text" : "password"} value={editingProvider.api_key || ''} onChange={(e) => handleProviderChange(editingProviderIndex, 'api_key', e.target.value)} + className={apiKeyError ? "border-red-500" : ""} />