import { useState, useEffect } from 'react' import axios from 'axios' import ScreenCapture from './ScreenCapture' import './App.css' const API_BASE = import.meta.env.VITE_API_URL || (window.location.hostname === 'localhost' ? 'http://localhost:8000' : '/api') function App() { const [isCapturing, setIsCapturing] = useState(false) const [analysis, setAnalysis] = useState(null) const [logs, setLogs] = useState([]) const [includeThumbnail, setIncludeThumbnail] = useState(false) const [autoCapture, setAutoCapture] = useState(false) const [captureInterval, setCaptureInterval] = useState(5000) const [demoStatus, setDemoStatus] = useState('') useEffect(() => { const eventSource = new EventSource(`${API_BASE}/logs/stream`) eventSource.onmessage = (event) => { try { const log = JSON.parse(event.data) setLogs(prev => [...prev, log].slice(-50)) } catch (e) { console.error('Log parsing error:', e) } } return () => eventSource.close() }, []) useEffect(() => { let intervalId if (autoCapture) { intervalId = setInterval(() => { captureScreen() }, captureInterval) } return () => clearInterval(intervalId) }, [autoCapture, captureInterval]) const captureScreen = async () => { setIsCapturing(true) try { const response = await axios.post(`${API_BASE}/analyze`, { capture_screen: true, include_thumbnail: includeThumbnail }) // Check if the response indicates an error if (response.data.risk_flags && response.data.risk_flags.includes('ANALYSIS_ERROR')) { // Handle model error gracefully setAnalysis({ summary: 'Model is loading or experiencing memory constraints. The system is configured correctly but requires more RAM for full operation.', ui_elements: [], text_snippets: [], risk_flags: [], // Don't show error as a risk flag timestamp: response.data.timestamp || new Date().toISOString(), model_info: response.data.model_info }) } else { setAnalysis(response.data) } } catch (error) { console.error('Capture error:', error) setAnalysis({ summary: 'Error capturing screen', ui_elements: [], text_snippets: [], risk_flags: [], timestamp: new Date().toISOString() }) } finally { setIsCapturing(false) } } const handleScreenCapture = async (captureData) => { setIsCapturing(true) try { // Send the captured image to backend for analysis const response = await axios.post(`${API_BASE}/analyze`, { image_data: captureData.dataUrl, include_thumbnail: includeThumbnail, width: captureData.width, height: captureData.height, timestamp: captureData.timestamp }) // Check if the response indicates an error if (response.data.risk_flags && response.data.risk_flags.includes('ANALYSIS_ERROR')) { // Handle model error gracefully setAnalysis({ summary: 'Model is loading or experiencing memory constraints. The system is configured correctly but requires more RAM for full operation.', ui_elements: [], text_snippets: [], risk_flags: [], // Don't show error as a risk flag timestamp: response.data.timestamp || new Date().toISOString(), model_info: response.data.model_info }) } else { setAnalysis(response.data) } } catch (error) { console.error('Analysis error:', error) setAnalysis({ summary: 'Unable to connect to analysis service. Please ensure the backend is running.', ui_elements: [], text_snippets: [], risk_flags: [], timestamp: new Date().toISOString() }) } finally { setIsCapturing(false) } } const handleCaptureError = (error) => { console.error('Screen capture error:', error) setAnalysis({ summary: error.userMessage || 'Screen capture failed', ui_elements: [], text_snippets: [], risk_flags: ['CAPTURE_ERROR'], error_details: error.technicalDetails, timestamp: new Date().toISOString() }) } const runDemo = async () => { setDemoStatus('Starting demo...') try { const response = await axios.post(`${API_BASE}/demo`, { url: 'https://example.com', text_to_type: 'test' }) setDemoStatus(`Demo ${response.data.status}`) setTimeout(() => { setDemoStatus('') }, 5000) } catch (error) { console.error('Demo error:', error) setDemoStatus('Demo failed') } } const exportLogs = async () => { try { const response = await axios.get(`${API_BASE}/export`, { responseType: 'blob' }) const url = window.URL.createObjectURL(new Blob([response.data])) const link = document.createElement('a') link.href = url link.setAttribute('download', `screen_observer_export_${Date.now()}.zip`) document.body.appendChild(link) link.click() link.remove() window.URL.revokeObjectURL(url) } catch (error) { console.error('Export error:', error) } } return (
{analysis.summary}