import * as React from 'react'; const { useRef } = React; import { Box, Paper, Typography, Avatar, useMediaQuery, useTheme, Theme } from '@mui/material'; import ReactMarkdown from 'react-markdown'; import rehypeRaw from 'rehype-raw'; import remarkGfm from 'remark-gfm'; import type { Message as MessageType } from '../types/types'; interface MessageProps { message: MessageType; isLast?: boolean; } const Message: React.FC = ({ message, isLast = false }) => { const isUser = message.sender === 'user'; const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down('sm')); const paperRef = useRef(null); // 计算气泡的borderRadius const borderRadius = isUser ? '18px 18px 4px 18px' : '18px 18px 18px 4px'; return ( {!isUser && ( 🤖 )}
{isUser ? ( // 用户消息仍然使用普通文本展示 message.content.split('\n').map((line: string, index: number) => ( {line} {index < message.content.split('\n').length - 1 &&
}
)) ) : ( // 大模型回复使用markdown格式展示 ) => (

), h2: (props: React.ComponentProps<'h2'>) => (

), h3: (props: React.ComponentProps<'h3'>) => (

), // 自定义列表样式 ul: (props: React.ComponentProps<'ul'>) => (
    ), ol: (props: React.ComponentProps<'ol'>) => (
      ), li: (props: React.ComponentProps<'li'>) => (
    1. ), // 自定义代码块样式 code: (props: React.ComponentProps<'code'>) => ( ), pre: (props: React.ComponentProps<'pre'>) => (
                        ),
                        // 自定义引用样式
                        blockquote: (props: React.ComponentProps<'blockquote'>) => (
                          
      ), // 自定义链接样式 a: (props: React.ComponentProps<'a'>) => ( ) }} > {message.content} )}

{message.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}
{isUser && ( 👤 )}
); }; export default Message;