import { useState, useEffect, useCallback } from 'react' import { scrapingApi } from '../api' const JOB_STATUS_COLOR = { pending: '#f59e0b', running: '#3b82f6', completed: '#22c55e', failed: '#ef4444' } function JobRow({ job, onRefresh }) { return ( {job.url} {job.status === 'running' && } {job.status.toUpperCase()} {job.leads_found || 0} {job.error ? {job.error.slice(0, 60)} : '—'} {job.created_at ? new Date(job.created_at).toLocaleString() : '—'} ) } export default function ScraperConfig() { const [url, setUrl] = useState('') const [bulkUrls, setBulkUrls] = useState('') const [mode, setMode] = useState('single') const [config, setConfig] = useState({ extract_emails: true, extract_phones: true, extract_company_name: true, follow_links: false, max_pages: 3, }) const [jobs, setJobs] = useState([]) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const [success, setSuccess] = useState(null) const fetchJobs = useCallback(async () => { try { const data = await scrapingApi.listJobs() setJobs(data) } catch {} }, []) useEffect(() => { fetchJobs() const interval = setInterval(fetchJobs, 3000) return () => clearInterval(interval) }, [fetchJobs]) const handleScrape = async () => { setLoading(true) setError(null) setSuccess(null) try { if (mode === 'single') { const trimmed = url.trim() if (!trimmed) throw new Error('Please enter a URL') await scrapingApi.scrapeUrl({ ...config, url: trimmed }) setSuccess('Scraping job started! Check the jobs table below.') setUrl('') } else { const urls = bulkUrls.split('\n').map(u => u.trim()).filter(Boolean) if (urls.length === 0) throw new Error('Please enter at least one URL') await scrapingApi.scrapeBulk(urls) setSuccess(`${urls.length} scraping jobs started!`) setBulkUrls('') } fetchJobs() } catch (e) { setError(e.message) } finally { setLoading(false) } } const running = jobs.filter(j => ['pending', 'running'].includes(j.status)).length const totalLeads = jobs.reduce((a, j) => a + (j.leads_found || 0), 0) return (

Web Scraper

{running > 0 && ( {running} job{running > 1 ? 's' : ''} running )}
Total Jobs
{jobs.length}
Leads Found
{totalLeads}
Configure & Run Scraper
{/* Mode toggle */}
{mode === 'single' ? (
setUrl(e.target.value)} placeholder="https://example.com" onKeyDown={e => e.key === 'Enter' && handleScrape()} />
) : (