import { RotateCw, AlertCircle, CheckCircle2, AlertTriangle } from "lucide-react"; import type { MessageRecord } from "../../types/messages"; import { Badge } from "../ui/badge"; import { Button } from "../ui/button"; import { useState } from "react"; export interface MessageCardProps { message: MessageRecord; onReanalyze: (id: string) => void; } function aiVariant(status: string) { if (status === "clean") return "success"; if (status === "warn") return "warning"; if (status === "flagged" || status === "error") return "destructive"; return "secondary"; } function getAiIcon(status: string) { if (status === "clean") return ; if (status === "warn") return ; if (status === "flagged") return ; if (status === "error") return ; return null; } function parseStringList(value?: string | null): string[] { if (!value) return []; try { const parsed = JSON.parse(value) as unknown; return Array.isArray(parsed) ? parsed.filter((item): item is string => typeof item === "string") : []; } catch { return value .split(",") .map((item) => item.trim()) .filter(Boolean); } } export function MessageCard({ message, onReanalyze }: MessageCardProps) { const displayContent = message.edited_content ?? message.content; const aiStatus = message.ai_status ?? "pending"; const categories = parseStringList(message.ai_categories ?? message.ai_moderation_flags); const evidence = parseStringList(message.ai_evidence); const confidence = message.ai_confidence ?? message.ai_moderation_score ?? null; const [isReanalyzing, setIsReanalyzing] = useState(false); const handleReanalyze = async () => { setIsReanalyzing(true); try { onReanalyze(message.id); } finally { setIsReanalyzing(false); } }; return (
{message.username || message.user_id} {new Date(message.created_at).toLocaleString()} {message.edited_at ? edited : null} {message.deleted_at ? deleted : null} {getAiIcon(aiStatus)} {aiStatus}

{displayContent || "(empty message)"}

{message.ai_severity ? severity: {message.ai_severity} : null} {message.ai_recommended_action ? action: {message.ai_recommended_action} : null} {confidence != null ? confidence: {Math.round(confidence * 100)}% : null} {message.ai_policy_version ? policy: {message.ai_policy_version} : null} {categories.slice(0, 6).map((category) => ( {category} ))}
{message.ai_analysis ? (
{message.ai_analysis}
) : null} {evidence.length > 0 ? (
Evidence
    {evidence.slice(0, 4).map((item, index) => (
  • {item}
  • ))}
) : null} {message.ai_error ? (
AI error: {message.ai_error}
) : null}
{aiStatus === "error" && ( Click to retry analysis )}
); }