diff --git a/App.tsx b/App.tsx index 3df5112..697b5bc 100644 --- a/App.tsx +++ b/App.tsx @@ -1,7 +1,8 @@ import React, { useState, useCallback, useEffect } from 'react'; -import { analyzeCertificate } from './services/geminiService'; +import { analyzeCertificate } from './services/aiService'; import { exportAsPdf } from './services/pdfService'; import type { ReportData } from './types'; +import type { AIProvider } from './types/providers'; import { Header } from './components/Header'; import { FileUpload } from './components/FileUpload'; import { Loader } from './components/Loader'; @@ -10,36 +11,45 @@ import { PrintableReport } from './components/PrintableReport'; import { DownloadIcon, EyeIcon } from './components/Icons'; import { ApiKeySetup } from './components/ApiKeySetup'; - const App: React.FC = () => { const [file, setFile] = useState(null); const [apiKey, setApiKey] = useState(''); + const [provider, setProvider] = useState('gemini'); + const [model, setModel] = useState('gemini-2.5-flash'); const [hasKey, setHasKey] = useState(false); const [reportData, setReportData] = useState(null); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { - const savedApiKey = localStorage.getItem('gemini-api-key'); + const savedApiKey = localStorage.getItem('api-key'); + const savedProvider = localStorage.getItem('ai-provider') as AIProvider; + const savedModel = localStorage.getItem('model-' + savedProvider); + if (savedApiKey) { setApiKey(savedApiKey); + if (savedProvider) setProvider(savedProvider); + if (savedModel) setModel(savedModel); setHasKey(true); } }, []); const handleFileChange = useCallback((selectedFile: File | null) => { setFile(selectedFile); - // Reset state if file is removed if (!selectedFile) { setReportData(null); setError(null); } }, []); - const handleKeySave = useCallback((key: string) => { + const handleKeySave = useCallback((key: string, newProvider: AIProvider, newModel: string) => { if (key) { setApiKey(key); - localStorage.setItem('gemini-api-key', key); + setProvider(newProvider); + setModel(newModel); + localStorage.setItem('api-key', key); + localStorage.setItem('ai-provider', newProvider); + localStorage.setItem('model-' + newProvider, newModel); setHasKey(true); } }, []); @@ -47,7 +57,7 @@ const App: React.FC = () => { const handleAnalyzeClick = async () => { if (!apiKey) { setError("A chave de API não foi encontrada. Por favor, configure-a novamente."); - setHasKey(false); // Force re-entry + setHasKey(false); return; } if (!file) { @@ -58,13 +68,18 @@ const App: React.FC = () => { setError(null); setReportData(null); try { - const data = await analyzeCertificate(file, apiKey); + const data = await analyzeCertificate({ + provider, + apiKey, + model, + file + }); setReportData(data); } catch (err) { if (err instanceof Error) { - if (err.message.includes('API key not valid')) { + if (err.message.includes('API key') || err.message.includes('not valid') || err.message.includes('invalid')) { setError('Erro: A chave de API fornecida não é válida. Por favor, insira uma nova chave.'); - handleClearKey(); // Clear invalid key + handleClearKey(); } else { setError(`Erro na análise: ${err.message}`); } @@ -85,22 +100,22 @@ const App: React.FC = () => { const handleClearKey = useCallback(() => { setApiKey(''); - localStorage.removeItem('gemini-api-key'); + localStorage.removeItem('api-key'); setHasKey(false); handleReset(); }, [handleReset]); const handleExport = (action: 'preview' | 'download') => { if (reportData) { - const fileName = `Relatorio_SteelBase_${reportData.identification.certificateNumber || 'analise'}`; + const fileName = `Relatorio_SteelCheck_${reportData.identification.certificateNumber || 'analise'}`; exportAsPdf('printable-report-container', fileName, action); } - } + }; return (
{isLoading && } -
+
{!hasKey ? ( @@ -115,6 +130,10 @@ const App: React.FC = () => {

Carregue seu certificado de qualidade e deixe nossa IA verificar a conformidade.

+
+ + {provider.toUpperCase()} • {model} +
@@ -163,7 +182,6 @@ const App: React.FC = () => { )} - {/* Hidden component for PDF generation */} {reportData && (