import { useWebSocket } from '../hooks/useWebSocket'; export const RealTimeScanProgress = ({ scanId }) => { const { isConnected, logs, vulnerabilities, scanProgress } = useWebSocket(scanId); const getSeverityColor = (severity) => { switch (severity?.toLowerCase()) { case 'critical': return 'text-red-600 bg-red-50 border-red-200'; case 'high': return 'text-orange-600 bg-orange-50 border-orange-200'; case 'medium': return 'text-yellow-600 bg-yellow-50 border-yellow-200'; case 'low': return 'text-blue-600 bg-blue-50 border-blue-200'; default: return 'text-gray-600 bg-gray-50 border-gray-200'; } }; const getLevelColor = (level) => { switch (level?.toUpperCase()) { case 'CRITICAL': return 'text-red-600'; case 'WARNING': return 'text-yellow-600'; case 'ERROR': return 'text-red-600'; case 'SUCCESS': return 'text-green-600'; case 'INFO': return 'text-blue-600'; default: return 'text-gray-600'; } }; if (!scanId) { return (
No scan ID provided
); } return (
{/* Connection Status */}
{isConnected ? 'Connected' : 'Disconnected'}
{/* Vulnerability Feed */} {vulnerabilities.length > 0 && (

Vulnerabilities Found ({vulnerabilities.length})

{vulnerabilities.map((vuln, index) => (
{vuln.title}
{vuln.category} • CVSS: {vuln.cvss_score}
Scanner: {vuln.scanner_key}
{vuln.severity}
))}
)} {/* Live Logs */} {logs.length > 0 && (

Live Logs

{logs.map((log, index) => (
[{log.level}] {log.message} {new Date(log.timestamp).toLocaleTimeString()}
))}
)} {/* Scan Progress */} {Object.keys(scanProgress).length > 0 && (

Scan Progress

{Object.entries(scanProgress).map(([key, value]) => (
{key.replace(/_/g, ' ')} {typeof value === 'number' ? value.toFixed(2) : value}
))}
)} {/* Empty State */} {vulnerabilities.length === 0 && logs.length === 0 && Object.keys(scanProgress).length === 0 && (
Waiting for scan data...
Vulnerabilities and logs will appear here as the scan progresses
)}
); };