import { Siren } from "lucide-react"; import type { ViolatorStat } from "../../../shared/api/client"; import { cn } from "../../../shared/lib/utils"; import { Badge, Card, CardContent, CardDescription, CardHeader, CardTitle, ScrollArea, } from "../../../shared/ui"; interface ViolatorTableProps { users: ViolatorStat[]; loading: boolean; } export function ViolatorTable({ users, loading }: ViolatorTableProps) { if (loading && !users?.length) { return ; } if (!users?.length) { return ( Tidak ada pelanggaran terdeteksi. ); } const maxScore = Math.max(...users.map((u) => u.violation_score), 1); function dangerLabel(score: number) { if (score >= 10) return { variant: "destructive" as const, text: "HIGH" }; if (score >= 5) return { variant: "warning" as const, text: "MED" }; return { variant: "secondary" as const, text: "LOW" }; } return (
Pelanggar Terbanyak Skor: flagged × 3 + warned. Flag terbanyak terakhir ditampilkan.
{users.length} pelanggar
{users.map((user, i) => { const danger = dangerLabel(user.violation_score); return ( ); })}
# User Flagged Warned Skor Flag
{i + 1}
{user.avatar_url ? ( ) : (
{user.username.charAt(0).toUpperCase()}
)} {user.username} {danger.text}
{user.flagged_count} {user.warned_count > 0 ? user.warned_count : "—"}
= 10 ? "bg-gradient-to-r from-accent to-pink-400" : user.violation_score >= 5 ? "bg-gradient-to-r from-pink-400 to-pink-300" : "bg-gradient-to-r from-pink-300 to-pink-200", )} style={{ width: `${(user.violation_score / maxScore) * 100}%`, }} />
{user.violation_score}
{user.worst_flags?.length > 0 ? ( user.worst_flags.slice(0, 3).map((flag) => ( {flag} )) ) : ( )}
); } function LoadingBox() { return ( Memuat data... ); }