import { cn } from '@/lib/utils' import type { ChatMessage, MessageSegment } from './types' // 渲染单个消息段 export function RenderMessageSegment({ segment }: { segment: MessageSegment }) { switch (segment.type) { case 'text': return {String(segment.data)} case 'image': case 'emoji': return ( {segment.type { // 图片加载失败时显示占位符 const target = e.target as HTMLImageElement target.style.display = 'none' target.parentElement?.insertAdjacentHTML( 'beforeend', `[${segment.type === 'emoji' ? '表情包' : '图片'}加载失败]` ) }} /> ) case 'voice': return (
) case 'video': return ( ) case 'face': // QQ 原生表情,显示为文本 return [表情:{String(segment.data)}] case 'music': return [音乐分享] case 'file': return [文件: {String(segment.data)}] case 'reply': return [回复消息] case 'forward': return [转发消息] case 'unknown': default: return [{segment.original_type || '未知消息'}] } } // 渲染消息内容(支持富文本) // eslint-disable-next-line @typescript-eslint/no-unused-vars export function RenderMessageContent({ message, isBot: _isBot }: { message: ChatMessage; isBot: boolean }) { // 如果是富文本消息,渲染消息段 if (message.message_type === 'rich' && message.segments && message.segments.length > 0) { return (
{message.segments.map((segment, index) => ( ))}
) } // 普通文本消息 return {message.content} }