"use client"; import { Hash, RefreshCw } from "lucide-react"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Progress } from "@/components/ui/progress"; import { getMessageChannelLabel, renderMessageContent, safeParseJsonArray, } from "@/lib/format"; import type { MessageRecord } from "@/lib/types"; import { cn } from "@/lib/utils"; import { AiStatusBadge } from "./ai-status-badge"; export function MessageCard({ message: msg, onClick, onReanalyze, }: { message: MessageRecord; onClick: (id: string) => void; onReanalyze: (id: string) => void; }) { const severity = ( { low: "border-l-cyan-500/40", medium: "border-l-amber-500/60", high: "border-l-orange-500/70", critical: "border-l-red-500/80", } as Record )[msg.ai_severity ?? ""]; return ( onClick(msg.id)} >
{msg.username?.charAt(0).toUpperCase() ?? "?"}
{msg.username} {msg.created_at ? new Date(msg.created_at).toLocaleString() : ""} {getMessageChannelLabel(msg)} {msg.ai_severity && msg.ai_severity !== "none" && ( {msg.ai_severity} )} {msg.type === "deleted" && ( deleted )} {(msg.type === "edited" || msg.edited_content) && ( edited )}

{renderMessageContent( msg.edited_content ?? msg.content, msg.metadata, )}

{(() => { const u = extractFirstImage(msg.metadata); if (!u) return null; return ( ); })()} {msg.ai_moderation_flags && msg.ai_moderation_flags !== "[]" && (
{safeParseJsonArray(msg.ai_moderation_flags).map((f) => ( {f} ))}
)} {msg.ai_analysis && (

{msg.ai_analysis}

)} {msg.ai_confidence != null && (
{(msg.ai_confidence * 100).toFixed(0)}%
)}
); } export function extractFirstImage( metadata: string | null | undefined, ): string | null { if (!metadata) return null; try { const m = JSON.parse(metadata); const atts: Array<{ url: string; contentType?: string }> = m.attachments ?? []; return atts.find((a) => a.contentType?.startsWith("image/"))?.url ?? null; } catch { return null; } }