import { useEffect, useState } from 'react'; interface UserAgentData { value: string; count: number; percentage: number; classification: 'normal' | 'bot' | 'script'; } interface UserAgentAnalysis { ip_user_agents: UserAgentData[]; ja4_user_agents: UserAgentData[]; bot_percentage: number; alert: boolean; } interface UserAgentAnalysisProps { ip: string; } export function UserAgentAnalysis({ ip }: UserAgentAnalysisProps) { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [showAllIpUA, setShowAllIpUA] = useState(false); const [showAllJa4UA, setShowAllJa4UA] = useState(false); useEffect(() => { const fetchUserAgentAnalysis = async () => { setLoading(true); try { const response = await fetch(`/api/analysis/${encodeURIComponent(ip)}/user-agents`); if (!response.ok) throw new Error('Erreur chargement User-Agents'); const result = await response.json(); setData(result); } catch (err) { setError(err instanceof Error ? err.message : 'Erreur inconnue'); } finally { setLoading(false); } }; fetchUserAgentAnalysis(); }, [ip]); if (loading) { return (
Chargement...
); } if (error || !data) { return (
User-Agents non disponibles
); } const getClassificationBadge = (classification: string) => { switch (classification) { case 'normal': return ✅ Normal; case 'bot': return ⚠️ Bot; case 'script': return ❌ Script; default: return null; } }; const INITIAL_COUNT = 5; return (

4. USER-AGENT ANALYSIS

{data.alert && ( ⚠️ {data.bot_percentage.toFixed(0)}% bots/scripts )}
{/* User-Agents pour cette IP */}
User-Agents pour cette IP ({data.ip_user_agents.length})
{(showAllIpUA ? data.ip_user_agents : data.ip_user_agents.slice(0, INITIAL_COUNT)).map((ua, idx) => (
{ua.value}
{getClassificationBadge(ua.classification)}
{ua.count} requêtes
{ua.percentage.toFixed(1)}%
))} {data.ip_user_agents.length === 0 && (
Aucun User-Agent trouvé
)}
{data.ip_user_agents.length > INITIAL_COUNT && ( )}
{/* User-Agents pour le JA4 */}
User-Agents pour le JA4 (toutes IPs)
{(showAllJa4UA ? data.ja4_user_agents : data.ja4_user_agents.slice(0, INITIAL_COUNT)).map((ua, idx) => (
{ua.value}
{getClassificationBadge(ua.classification)}
{ua.count} IPs
{ua.percentage.toFixed(1)}%
))}
{data.ja4_user_agents.length > INITIAL_COUNT && ( )}
{/* Stats bots */}
Pourcentage de bots/scripts
20 ? 'text-threat-high' : 'text-text-primary'}`}> {data.bot_percentage.toFixed(1)}%
50 ? 'bg-threat-high' : data.bot_percentage > 20 ? 'bg-threat-medium' : 'bg-threat-low' }`} style={{ width: `${Math.min(data.bot_percentage, 100)}%` }} />
{data.bot_percentage > 20 && (
⚠️ ALERT: {data.bot_percentage.toFixed(0)}% d'UAs bots/scripts
)}
); }