import React, { useState, useEffect, useRef } from 'react'; import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer } from 'recharts'; import { initLocalEngine, routeInference } from '../utils/inferenceRouter'; import HCaptcha from '@hcaptcha/react-hcaptcha'; import { supabase, useAuth, GATEWAY_URL, LEMON_CHECKOUT_URL } from '../context'; export default function BulkScannerSection({ apiKey }) { const [urls, setUrls] = useState(''); const [prompt, setPrompt] = useState('Extract main content'); const [apiChoice, setApiChoice] = useState('opticparse'); const [results, setResults] = useState([]); const [scanning, setScanning] = useState(false); const handleScan = async () => { if (!urls.trim()) return; setScanning(true); setResults([]); const urlList = urls.split('\n').map(u => u.trim()).filter(Boolean).slice(0, 10); for (const url of urlList) { try { let res, data, finalVerdict, confidence; if (apiChoice === 'opticparse') { res = await fetch('https://opticparse-python-sg.onrender.com/api/vision-scrape', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-API-Key': apiKey || 'YOUR_API_KEY' }, body: JSON.stringify({ target_url: url, extraction_query: prompt, response_schema: { "content": "string" } }) }); const rawData = await res.json(); // Try to stringify if it's an object, otherwise use the text finalVerdict = typeof rawData === 'string' ? rawData : JSON.stringify(rawData).substring(0, 50) + '...'; confidence = 100; } else { res = await fetch('https://opticparse-1opticparse-node-sg.onrender.com/api/phish-detect', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ url }) }); data = await res.json(); finalVerdict = data.verdict; confidence = data.confidence_score_percentage; } setResults(prev => [...prev, { url, verdict: finalVerdict, confidence, time: new Date().toLocaleTimeString() }]); } catch (err) { setResults(prev => [...prev, { url, verdict: 'error', confidence: 0, time: new Date().toLocaleTimeString() }]); } } setScanning(false); }; return (

Bulk Scanner

{apiChoice === 'opticparse' && ( setPrompt(e.target.value)} style={{ width: '100%', padding: '0.75rem', borderRadius: '4px', border: '1px solid var(--border)', background: '#1a1a24', color: 'white' }} /> )}