import { useTranslation } from 'react-i18next'; import { Wifi, WifiOff, Server, Network, Shield, AlertTriangle, CircleDot, Inbox, Activity } from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { ScrollArea } from '@/components/ui/scroll-area'; import { EmptyState } from '@/components/ui/empty-state'; import { useLiveFeed } from '@/contexts/LiveFeedContext'; interface LiveFeedProps { compact?: boolean; showTypeLabel?: boolean; } const TYPE_ICONS = { host: Server, port: Network, service: Shield, vuln: AlertTriangle, } as const; export function LiveFeed({ compact = false, showTypeLabel = false }: LiveFeedProps) { const { t } = useTranslation(); const { isConnected, logs } = useLiveFeed(); const getTypeIcon = (type: string) => { const key = type?.toLowerCase() as keyof typeof TYPE_ICONS; return TYPE_ICONS[key] || CircleDot; }; const getTypeLabel = (type: string) => { switch (type?.toLowerCase()) { case 'host': return t('typeHost'); case 'port': return t('typePort'); case 'service': return t('typeService'); case 'vuln': return t('typeVuln'); default: return type; } }; return ( {t('liveFeed')}
{isConnected ? ( {t('liveFeedConnected')} ) : ( {t('liveFeedDisconnected')} )} {logs.length}/100
{logs.length === 0 ? ( ) : (
{logs.map((log) => { const TypeIcon = getTypeIcon(log.type); return (
{log.time} {showTypeLabel && getTypeLabel(log.type)} {log.target} {log.status}
); })}
)}
); }