diff --git a/ui/desktop/src/components/welcome_screen/ProviderGrid.tsx b/ui/desktop/src/components/welcome_screen/ProviderGrid.tsx index 60992f74..c5e8f54d 100644 --- a/ui/desktop/src/components/welcome_screen/ProviderGrid.tsx +++ b/ui/desktop/src/components/welcome_screen/ProviderGrid.tsx @@ -70,64 +70,77 @@ export function ProviderGrid({ onSubmit }: ProviderGridProps) { setShowSetupModal(true); }; - const handleModalSubmit = async (apiKey: string) => { + const handleModalSubmit = async (configValues: { [key: string]: string }) => { if (!selectedId) return; const provider = providers.find((p) => p.id === selectedId)?.name; - const keyName = required_keys[provider]?.[0]; + if (!provider) return; - if (!keyName) { - console.error(`No key found for provider ${provider}`); + const requiredKeys = required_keys[provider]; + if (!requiredKeys || requiredKeys.length === 0) { + console.error(`No keys found for provider ${provider}`); return; } - const isSecret = isSecretKey(keyName); try { - if (selectedId && providers.find((p) => p.id === selectedId)?.isConfigured) { - const deleteResponse = await fetch(getApiUrl('/configs/delete'), { - method: 'DELETE', + // Delete existing keys if provider is already configured + const isUpdate = providers.find((p) => p.id === selectedId)?.isConfigured; + if (isUpdate) { + for (const keyName of requiredKeys) { + const isSecret = isSecretKey(keyName); + const deleteResponse = await fetch(getApiUrl('/configs/delete'), { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + 'X-Secret-Key': getSecretKey(), + }, + body: JSON.stringify({ + key: keyName, + isSecret, + }), + }); + + if (!deleteResponse.ok) { + const errorText = await deleteResponse.text(); + console.error('Delete response error:', errorText); + throw new Error(`Failed to delete old key: ${keyName}`); + } + } + } + + // Store new keys + for (const keyName of requiredKeys) { + const value = configValues[keyName]; + if (!value) { + console.error(`Missing value for required key: ${keyName}`); + continue; + } + + const isSecret = isSecretKey(keyName); + const storeResponse = await fetch(getApiUrl('/configs/store'), { + method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Secret-Key': getSecretKey(), }, - body: JSON.stringify({ - key: keyName, + body: JSON.stringify({ + key: keyName, + value: value, isSecret, }), }); - if (!deleteResponse.ok) { - const errorText = await deleteResponse.text(); - console.error('Delete response error:', errorText); - throw new Error('Failed to delete old key'); + if (!storeResponse.ok) { + const errorText = await storeResponse.text(); + console.error('Store response error:', errorText); + throw new Error(`Failed to store new key: ${keyName}`); } } - const storeResponse = await fetch(getApiUrl('/configs/store'), { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Secret-Key': getSecretKey(), - }, - body: JSON.stringify({ - key: keyName, - value: apiKey.trim(), - isSecret, - }), - }); - - if (!storeResponse.ok) { - const errorText = await storeResponse.text(); - console.error('Store response error:', errorText); - throw new Error('Failed to store new key'); - } - - const isUpdate = selectedId && providers.find((p) => p.id === selectedId)?.isConfigured; - const toastInfo = isSecret ? 'API key' : 'host'; toast.success( isUpdate - ? `Successfully updated ${toastInfo} for ${provider}` - : `Successfully added ${toastInfo} for ${provider}` + ? `Successfully updated configuration for ${provider}` + : `Successfully added configuration for ${provider}` ); const updatedKeys = await getActiveProviders(); @@ -138,7 +151,7 @@ export function ProviderGrid({ onSubmit }: ProviderGridProps) { } catch (error) { console.error('Error handling modal submit:', error); toast.error( - `Failed to ${selectedId && providers.find((p) => p.id === selectedId)?.isConfigured ? 'update' : 'add'} API key for ${provider}` + `Failed to ${providers.find((p) => p.id === selectedId)?.isConfigured ? 'update' : 'add'} configuration for ${provider}` ); } };