import React, { useMemo } from "react"; import { motion } from "framer-motion"; import { ChatMessage } from "./types"; import { bubbleVariants, hhmm } from "./utils"; import { ProgressBar } from "./ProgressBar"; import { Loader2, AlertCircle, CheckCircle2 } from "lucide-react"; import { Image } from 'antd'; interface MessageRendererProps { msg: ChatMessage; } export function MessageRenderer({ msg }: MessageRendererProps) { // Decide bubble style const isUser = msg.role === "user"; const isSystem = msg.role === "system"; const bubbleClass = useMemo(() => { if (isSystem) return "bg-amber-50 text-amber-900 border border-amber-200"; if (isUser) return "bg-blue-500/30 text-white"; return "bg-gray-800 text-gray-100"; // assistant }, [isSystem, isUser]); const badge = isSystem ? ( 系统流程 ) : msg.role === "assistant" ? ( 助手 ) : null; // 状态图标和颜色 const statusIcon = useMemo(() => { if (!isUser) return null; switch (msg.status) { case 'pending': return ; case 'success': return ; case 'error': return ; default: return null; } }, [isUser, msg.status]); // 消息类型标签 const typeLabel = useMemo(() => { if (!isUser) return null; const isTask = msg.chatType !== 'chat'; if (isTask) { return ( 任务 ); } return ( 聊天 ); }, [isUser, msg.chatType]); return ( {/* Header */} {badge} {typeLabel} {hhmm(msg.createdAt)} {statusIcon} {/* Content blocks */} {msg.blocks.map((b, idx) => { switch (b.type) { case "text": return ( {b.text} ); case "image": return ( ); case "video": return ( ); case "audio": return ( ); case "progress": return ; default: return null; } })} ); }
{b.text}