import React, { useState, useCallback, useEffect } from 'react'; 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'; import { ReportDisplay } from './components/ReportDisplay'; 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 [endpoint, setEndpoint] = 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('api-key'); const savedProvider = localStorage.getItem('ai-provider') as AIProvider; const savedModel = localStorage.getItem('model-' + savedProvider); const savedEndpoint = localStorage.getItem('ollama-endpoint'); if (savedApiKey || savedEndpoint) { setApiKey(savedApiKey || ''); if (savedProvider) setProvider(savedProvider); if (savedModel) setModel(savedModel); if (savedEndpoint) setEndpoint(savedEndpoint); setHasKey(true); } }, []); const handleFileChange = useCallback((selectedFile: File | null) => { setFile(selectedFile); if (!selectedFile) { setReportData(null); setError(null); } }, []); const handleKeySave = useCallback((key: string, newProvider: AIProvider, newModel: string, newEndpoint?: string) => { setApiKey(key); setProvider(newProvider); setModel(newModel); if (newEndpoint) { setEndpoint(newEndpoint); localStorage.setItem('ollama-endpoint', newEndpoint); } if (key) { localStorage.setItem('api-key', key); } localStorage.setItem('ai-provider', newProvider); localStorage.setItem('model-' + newProvider, newModel); setHasKey(true); }, []); const handleAnalyzeClick = async () => { if (provider !== 'ollama' && !apiKey) { setError("A chave de API não foi encontrada. Por favor, configure-a novamente."); setHasKey(false); return; } if (provider === 'ollama' && !endpoint) { setError("O endereço do Ollama não foi configurado. Por favor, configure-o."); setHasKey(false); return; } if (!file) { setError("Por favor, selecione um arquivo primeiro."); return; } setIsLoading(true); setError(null); setReportData(null); try { const data = await analyzeCertificate({ provider, apiKey, model, file, endpoint: provider === 'ollama' ? endpoint : undefined }); setReportData(data); } catch (err) { if (err instanceof Error) { 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(); } else { setError(`Erro na análise: ${err.message}`); } } else { setError("Ocorreu um erro desconhecido durante a análise."); } } finally { setIsLoading(false); } }; const handleReset = useCallback(() => { setFile(null); setReportData(null); setIsLoading(false); setError(null); }, []); const handleClearKey = useCallback(() => { setApiKey(''); localStorage.removeItem('api-key'); setHasKey(false); handleReset(); }, [handleReset]); const handleExport = (action: 'preview' | 'download') => { if (reportData) { const fileName = `Relatorio_SteelCheck_${reportData.identification.certificateNumber || 'analise'}`; exportAsPdf('printable-report-container', fileName, action); } }; return (
{isLoading && }
{!hasKey ? ( ) : !reportData ? (

Análise Técnica Inteligente

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

{provider.toUpperCase()} • {model}
{file && ( )} {error && (

{error}

)}

IA Assistiva • Verificação profissional recomendada

) : (
)}
{reportData && ( )}
); }; export default App;