import React, { useState, useEffect, useRef } from 'react'; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from "recharts"; type ChatMessage = { role: 'user' | 'system'; content: string; }; const App: React.FC = () => { const [urlInput, setUrlInput] = useState('https://www.example.com'); const [bulkToggle, setBulkToggle] = useState(false); const [actionRadio, setActionRadio] = useState<'Scrape data' | 'Capture image' | 'Both'>('Both'); const [maxUrls, setMaxUrls] = useState(5); const [crawlDepth, setCrawlDepth] = useState(1); const [scrapedDataOutput, setScrapedDataOutput] = useState(''); const [screenshotOutput, setScreenshotOutput] = useState(null); const [monitorUrlInput, setMonitorUrlInput] = useState(''); const [intervalInput, setIntervalInput] = useState(300); const [changeOutput, setChangeOutput] = useState(''); const [chatHistory, setChatHistory] = useState([]); const [isMonitoring, setIsMonitoring] = useState(false); const [monitoringData, setMonitoringData] = useState<{ time: string; changes: number }[]>([]); const [isProcessing, setIsProcessing] = useState(false); const [error, setError] = useState(null); const wsRef = useRef(null); useEffect(() => { let ws: WebSocket | null = null; if (isMonitoring) { ws = new WebSocket('ws://localhost:8000/ws'); wsRef.current = ws; ws.onopen = () => { console.log("Connected to WebSocket server."); }; ws.onmessage = (event) => { const message = JSON.parse(event.data); if (message.type === "change_detected") { setChangeOutput(prev => prev + `Change detected at ${message.url}\n`); setChatHistory(prev => [...prev, { role: 'system', content: `Change detected at ${message.url}` }]); setMonitoringData(prev => { const now = new Date(); const time = now.toLocaleTimeString(); return [...prev, { time, changes: 1 }]; }); } else if (message.type === "server_log") { console.log("Server Log:", message.log); } else if (message.type === "server_error") { setError(message.error); } }; ws.onclose = () => { console.log("Disconnected from WebSocket server."); }; ws.onerror = (error) => { console.error("WebSocket error:", error); setError("WebSocket connection error."); }; } else if (wsRef.current) { wsRef.current.close(); wsRef.current = null; } return () => { if (wsRef.current) { wsRef.current.close(); } }; }, [isMonitoring]); const handleProcessUrls = async () => { setIsProcessing(true); setError(null); try { const response = await fetch('http://localhost:8000/process_urls', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ url_input: urlInput, bulk_toggle: bulkToggle, action_radio: actionRadio, max_urls: maxUrls, crawl_depth: crawlDepth, }), }); if (!response.ok) { const errorData = await response.json(); throw new Error(`HTTP error! Status: ${response.status}, Message: ${errorData.message || 'Unknown error'}`); } const data = await response.json(); setScrapedDataOutput(JSON.stringify(data.scraped_data, null, 2)); if (data.screenshot_data) { setScreenshotOutput(data.screenshot_data); } else { setScreenshotOutput(null); } setError(null); } catch (e: any) { console.error("Error processing URLs:", e); setError(e.message); setScrapedDataOutput(''); setScreenshotOutput(null); } finally { setIsProcessing(false); } }; const handleChatSubmit = async (user_input: string) => { setChatHistory(prev => [...prev, { role: 'user', content: user_input }]); if (user_input.toLowerCase().includes("start monitoring")) { setIsMonitoring(true); setChatHistory(prev => [...prev, { role: 'system', content: "Monitoring started." }]); } else if (user_input.toLowerCase().includes("stop monitoring")) { setIsMonitoring(false); setChatHistory(prev => [...prev, { role: 'system', content: "Monitoring stopped." }]); } else if (user_input.toLowerCase().includes("help")) { setChatHistory(prev => [...prev, { role: 'system', content: "Commands: 'Start monitoring', 'Stop monitoring', 'Help'" }]); } else { setChatHistory(prev => [...prev, { role: 'system', content: "Unknown command. Type 'Help' for available commands." }]); } }; const handleStartMonitoring = () => { setIsMonitoring(true); setChatHistory(prev => [...prev, { role: 'system', content: "Monitoring started." }]); }; const handleStopMonitoring = () => { setIsMonitoring(false); setChatHistory(prev => [...prev, { role: 'system', content: "Monitoring stopped." }]); setMonitoringData([]); }; return (

Smart Scraper with Change Detection

{error &&
{error}
}

URL Scrape/Screenshot