import React, { useState, useCallback, useEffect } from 'react'; import { KeyIcon, SaveIcon, TestTubeIcon } from './Icons'; import { PROVIDERS, type AIProvider } from '../types/providers'; import { testApiKey, type ModelInfo } from '../services/apiTestService'; interface ApiKeySetupProps { onKeySave: (key: string, provider: AIProvider, model: string) => void; } const isValidApiKey = (key: string): boolean => { const trimmedKey = key.trim(); return trimmedKey.length > 10 && /^[A-Za-z0-9_-]+$/.test(trimmedKey); }; export const ApiKeySetup: React.FC = ({ onKeySave }) => { const [localApiKey, setLocalApiKey] = useState(''); const [endpoint, setEndpoint] = useState(''); const [error, setError] = useState(null); const [isValid, setIsValid] = useState(null); const [provider, setProvider] = useState('gemini'); const [model, setModel] = useState('gemini-2.5-flash'); const [availableModels, setAvailableModels] = useState([]); const [isTesting, setIsTesting] = useState(false); const [testStatus, setTestStatus] = useState<'idle' | 'success' | 'error'>('idle'); useEffect(() => { const savedProvider = localStorage.getItem('ai-provider') as AIProvider; if (savedProvider && PROVIDERS.find(p => p.id === savedProvider)) { setProvider(savedProvider); const savedModel = localStorage.getItem(`model-${savedProvider}`); const providerConfig = PROVIDERS.find(p => p.id === savedProvider); setModel(savedModel || providerConfig?.defaultModel || ''); } }, []); useEffect(() => { const providerConfig = PROVIDERS.find(p => p.id === provider); if (providerConfig && !providerConfig.models.includes(model)) { setModel(providerConfig.defaultModel); } setAvailableModels([]); setTestStatus('idle'); }, [provider, model]); const handleChange = useCallback((e: React.ChangeEvent) => { const value = e.target.value; setLocalApiKey(value); setTestStatus('idle'); if (value.trim() === '') { setIsValid(null); setError(null); } else { const valid = isValidApiKey(value); setIsValid(valid); setError(valid ? null : 'A chave de API parece inválida.'); } }, []); const getProviderLink = (provider: AIProvider): string => { switch (provider) { case 'gemini': return 'https://aistudio.google.com/app/apikey'; case 'openai': return 'https://platform.openai.com/api-keys'; case 'anthropic': return 'https://console.anthropic.com/keys'; case 'azure': return 'https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps'; default: return '#'; } }; const getProviderLabel = (provider: AIProvider): string => { switch (provider) { case 'gemini': return 'Google Gemini'; case 'openai': return 'OpenAI'; case 'anthropic': return 'Anthropic (Claude)'; case 'azure': return 'Azure OpenAI'; default: return 'API'; } }; const handleTestApi = async () => { if (!localApiKey.trim() || !isValidApiKey(localApiKey)) { setError('Insira uma chave de API válida para testar.'); return; } setIsTesting(true); setError(null); try { const result = await testApiKey(provider, localApiKey, endpoint); if (result.success && result.models && result.models.length > 0) { setAvailableModels(result.models); setModel(result.models[0].id); setTestStatus('success'); setError(null); } else { setTestStatus('error'); setError(result.error || 'Falha ao testar API'); } } catch (err) { setTestStatus('error'); setError(err instanceof Error ? err.message : 'Erro ao testar API'); } finally { setIsTesting(false); } }; const handleProviderChange = (newProvider: AIProvider) => { setProvider(newProvider); const providerConfig = PROVIDERS.find(p => p.id === newProvider); setModel(providerConfig?.defaultModel || ''); setAvailableModels([]); setTestStatus('idle'); }; const handleSave = () => { if (localApiKey.trim() && isValidApiKey(localApiKey)) { onKeySave(localApiKey.trim(), provider, model); } }; return (

Configurar API

Selecione o provedor e insira sua chave de API.

{/* Provider Selector */}
{PROVIDERS.map((p) => ( ))}
{/* Azure Endpoint (only show if Azure is selected) */} {provider === 'azure' && (
setEndpoint(e.target.value)} />
)} {/* API Key Input */}
e.key === 'Enter' && handleTestApi()} autoComplete="off" />
{error && (

{error}

)}

Não tem uma chave? Obtenha aqui.

{/* Model Selector */}
{availableModels.length > 0 ? ( ) : ( )} {testStatus === 'success' && availableModels.length > 0 && (

✓ {availableModels.length} modelos disponíveis detectados

)}
); };