/** * Medical Report Analysis Platform - Main Application * Professional medical-grade interface for AI-powered document analysis */ import { useState } from 'react'; import { FileUpload } from './components/FileUpload'; import { AnalysisStatus } from './components/AnalysisStatus'; import { AnalysisResults } from './components/AnalysisResults'; import { Header } from './components/Header'; import { ModelInfo } from './components/ModelInfo'; import './App.css'; interface JobStatus { jobId: string; status: 'idle' | 'uploading' | 'processing' | 'completed' | 'failed'; progress: number; message: string; } interface AnalysisResult { job_id: string; document_type: string; confidence: number; analysis: any; specialized_results: any[]; summary: string; timestamp: string; } function App() { const [jobStatus, setJobStatus] = useState({ jobId: '', status: 'idle', progress: 0, message: '' }); const [analysisResult, setAnalysisResult] = useState(null); const [showModelInfo, setShowModelInfo] = useState(false); // Use relative URL in production (HuggingFace Spaces), localhost in development const getApiUrl = () => { // If VITE_API_URL is explicitly set, use it if (import.meta.env.VITE_API_URL) { return import.meta.env.VITE_API_URL; } // In production (HuggingFace Spaces), use relative path if (import.meta.env.PROD) { return ''; // Relative path - same origin } // In development, use localhost return 'http://localhost:7860'; }; const [apiUrl] = useState(getApiUrl()); const handleFileUpload = async (file: File) => { try { setJobStatus({ jobId: '', status: 'uploading', progress: 0, message: 'Uploading document...' }); // Upload file const formData = new FormData(); formData.append('file', file); const uploadResponse = await fetch(`${apiUrl}/analyze`, { method: 'POST', body: formData }); if (!uploadResponse.ok) { throw new Error('Upload failed'); } const uploadData = await uploadResponse.json(); const jobId = uploadData.job_id; setJobStatus({ jobId, status: 'processing', progress: uploadData.progress || 0, message: uploadData.message || 'Analysis started...' }); // Poll for status pollJobStatus(jobId); } catch (error) { console.error('Upload error:', error); setJobStatus({ jobId: '', status: 'failed', progress: 0, message: error instanceof Error ? error.message : 'Upload failed' }); } }; const pollJobStatus = async (jobId: string) => { try { const statusResponse = await fetch(`${apiUrl}/status/${jobId}`); if (!statusResponse.ok) { throw new Error('Status check failed'); } const statusData = await statusResponse.json(); setJobStatus({ jobId, status: statusData.status, progress: statusData.progress || 0, message: statusData.message || 'Processing...' }); if (statusData.status === 'completed') { // Fetch results const resultsResponse = await fetch(`${apiUrl}/results/${jobId}`); if (!resultsResponse.ok) { throw new Error('Failed to fetch results'); } const resultsData = await resultsResponse.json(); setAnalysisResult(resultsData); } else if (statusData.status === 'processing') { // Continue polling setTimeout(() => pollJobStatus(jobId), 2000); } else if (statusData.status === 'failed') { setJobStatus(prev => ({ ...prev, status: 'failed', message: 'Analysis failed. Please try again.' })); } } catch (error) { console.error('Status polling error:', error); setJobStatus(prev => ({ ...prev, status: 'failed', message: error instanceof Error ? error.message : 'Status check failed' })); } }; const handleReset = () => { setJobStatus({ jobId: '', status: 'idle', progress: 0, message: '' }); setAnalysisResult(null); }; return (
setShowModelInfo(true)} onReset={handleReset} hasActiveAnalysis={jobStatus.status !== 'idle'} />
{/* Hero Section */}

Medical Report Analysis Platform

Advanced AI-powered analysis using 50+ specialized medical models across 9 clinical domains

HIPAA Compliant
GDPR Compliant
FDA Guidance Aligned
{/* Main Content */}
{jobStatus.status === 'idle' && ( )} {(jobStatus.status === 'uploading' || jobStatus.status === 'processing') && ( )} {jobStatus.status === 'completed' && analysisResult && ( )} {jobStatus.status === 'failed' && (

Analysis Failed

{jobStatus.message}

)}
{/* Information Cards */} {jobStatus.status === 'idle' && (

Multi-Format Support

Process all types of medical reports: radiology, pathology, lab results, clinical notes, and more

Specialized AI Models

Leverages 50+ domain-specific models including MedGemma, MONAI, and specialized clinical AI

Secure & Compliant

Built with medical-grade security, HIPAA compliance, and regulatory alignment (FDA, GDPR)

)}
{/* Model Info Modal */} {showModelInfo && ( setShowModelInfo(false)} /> )} {/* Footer */}
); } export default App;