// src/views/AgentChat/components/ChatArea/MessageRenderer.js // 消息渲染器组件 import React from 'react'; import { motion } from 'framer-motion'; import { Card, CardBody, Avatar, Badge, Spinner, Tooltip, IconButton, HStack, Flex, Text, Box, } from '@chakra-ui/react'; import { Cpu, User, Copy, ThumbsUp, ThumbsDown, File } from 'lucide-react'; import { MessageTypes } from '../../constants/messageTypes'; import ExecutionStepsDisplay from './ExecutionStepsDisplay'; /** * MessageRenderer - 消息渲染器组件 * * @param {Object} props * @param {Object} props.message - 消息对象 * @param {string} props.userAvatar - 用户头像 URL * @returns {JSX.Element|null} */ const MessageRenderer = ({ message, userAvatar }) => { switch (message.type) { case MessageTypes.USER: return ( {message.content} {message.files && message.files.length > 0 && ( {message.files.map((file, idx) => ( {file.name} ))} )} } size="sm" bgGradient="linear(to-br, blue.500, purple.600)" boxShadow="0 0 12px rgba(139, 92, 246, 0.4)" /> ); case MessageTypes.AGENT_THINKING: return ( } size="sm" bgGradient="linear(to-br, purple.500, pink.500)" boxShadow="0 0 12px rgba(236, 72, 153, 0.4)" /> {message.content} ); case MessageTypes.AGENT_RESPONSE: return ( } size="sm" bgGradient="linear(to-br, purple.500, pink.500)" boxShadow="0 0 12px rgba(236, 72, 153, 0.4)" /> {message.content} {message.stepResults && message.stepResults.length > 0 && ( )} } onClick={() => navigator.clipboard.writeText(message.content)} bg="rgba(255, 255, 255, 0.05)" color="gray.400" _hover={{ color: 'white', bg: 'rgba(255, 255, 255, 0.1)', }} /> } bg="rgba(255, 255, 255, 0.05)" color="gray.400" _hover={{ color: 'green.400', bg: 'rgba(16, 185, 129, 0.1)', boxShadow: '0 0 12px rgba(16, 185, 129, 0.3)', }} /> } bg="rgba(255, 255, 255, 0.05)" color="gray.400" _hover={{ color: 'red.400', bg: 'rgba(239, 68, 68, 0.1)', boxShadow: '0 0 12px rgba(239, 68, 68, 0.3)', }} /> {new Date(message.timestamp).toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit', })} ); case MessageTypes.ERROR: return ( {message.content} ); default: return null; } }; export default MessageRenderer;