q'weqwe
This commit is contained in:
@ -1,5 +1,8 @@
|
|||||||
import React, { useRef } from 'react';
|
import React, { useRef } from 'react';
|
||||||
import { Box, Paper, Typography, Avatar, useMediaQuery, useTheme } from '@mui/material';
|
import { Box, Paper, Typography, Avatar, useMediaQuery, useTheme } 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';
|
import type { Message as MessageType } from '../types/types';
|
||||||
|
|
||||||
interface MessageProps {
|
interface MessageProps {
|
||||||
@ -11,7 +14,7 @@ const Message: React.FC<MessageProps> = ({ message, isLast = false }) => {
|
|||||||
const isUser = message.sender === 'user';
|
const isUser = message.sender === 'user';
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const isMobile = useMediaQuery(theme.breakpoints.down('sm'));
|
const isMobile = useMediaQuery(theme.breakpoints.down('sm'));
|
||||||
const paperRef = useRef(null);
|
const paperRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
// 计算气泡的borderRadius
|
// 计算气泡的borderRadius
|
||||||
const borderRadius = isUser
|
const borderRadius = isUser
|
||||||
@ -67,12 +70,61 @@ const Message: React.FC<MessageProps> = ({ message, isLast = false }) => {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div style={{ lineHeight: 1.6 }}>
|
<div style={{ lineHeight: 1.6 }}>
|
||||||
{message.content.split('\n').map((line, index) => (
|
{isUser ? (
|
||||||
<React.Fragment key={index}>
|
// 用户消息仍然使用普通文本展示
|
||||||
{line}
|
message.content.split('\n').map((line: string, index: number) => (
|
||||||
{index < message.content.split('\n').length - 1 && <br />}
|
<React.Fragment key={index}>
|
||||||
</React.Fragment>
|
{line}
|
||||||
))}
|
{index < message.content.split('\n').length - 1 && <br />}
|
||||||
|
</React.Fragment>
|
||||||
|
))
|
||||||
|
) : (
|
||||||
|
// 大模型回复使用markdown格式展示
|
||||||
|
<ReactMarkdown
|
||||||
|
rehypePlugins={[rehypeRaw]}
|
||||||
|
remarkPlugins={[remarkGfm]}
|
||||||
|
components={{
|
||||||
|
// 自定义标题样式
|
||||||
|
h1: (props: any) => (
|
||||||
|
<h1 style={{ fontSize: '1.4rem', fontWeight: 'bold', margin: '12px 0 8px 0' }} {...props} />
|
||||||
|
),
|
||||||
|
h2: (props: any) => (
|
||||||
|
<h2 style={{ fontSize: '1.2rem', fontWeight: 'bold', margin: '10px 0 6px 0' }} {...props} />
|
||||||
|
),
|
||||||
|
h3: (props: any) => (
|
||||||
|
<h3 style={{ fontSize: '1.1rem', fontWeight: 'bold', margin: '8px 0 4px 0' }} {...props} />
|
||||||
|
),
|
||||||
|
// 自定义列表样式
|
||||||
|
ul: (props: any) => (
|
||||||
|
<ul style={{ paddingLeft: '20px', margin: '6px 0' }} {...props} />
|
||||||
|
),
|
||||||
|
ol: (props: any) => (
|
||||||
|
<ol style={{ paddingLeft: '20px', margin: '6px 0' }} {...props} />
|
||||||
|
),
|
||||||
|
li: (props: any) => (
|
||||||
|
<li style={{ margin: '4px 0' }} {...props} />
|
||||||
|
),
|
||||||
|
// 自定义代码块样式
|
||||||
|
// 简化代码块处理,移除对 node 对象内部属性的访问
|
||||||
|
code: (props: any) => (
|
||||||
|
<code style={{ backgroundColor: '#f5f5f5', padding: '2px 4px', borderRadius: '3px', fontFamily: 'monospace' }} {...props} />
|
||||||
|
),
|
||||||
|
pre: (props: any) => (
|
||||||
|
<pre style={{ backgroundColor: '#f5f5f5', padding: '12px', borderRadius: '6px', overflowX: 'auto', fontFamily: 'monospace', fontSize: '0.9rem' }} {...props} />
|
||||||
|
),
|
||||||
|
// 自定义引用样式
|
||||||
|
blockquote: (props: any) => (
|
||||||
|
<blockquote style={{ borderLeft: '4px solid #ccc', margin: '10px 0', paddingLeft: '12px', color: '#666' }} {...props} />
|
||||||
|
),
|
||||||
|
// 自定义链接样式
|
||||||
|
a: (props: any) => (
|
||||||
|
<a style={{ color: theme.palette.primary.main, textDecoration: 'underline' }} {...props} />
|
||||||
|
)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{message.content}
|
||||||
|
</ReactMarkdown>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Typography
|
<Typography
|
||||||
|
|||||||
1660
package-lock.json
generated
1660
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -16,7 +16,10 @@
|
|||||||
"@mui/material": "^7.3.4",
|
"@mui/material": "^7.3.4",
|
||||||
"next": "15.5.5",
|
"next": "15.5.5",
|
||||||
"react": "19.1.0",
|
"react": "19.1.0",
|
||||||
"react-dom": "19.1.0"
|
"react-dom": "19.1.0",
|
||||||
|
"react-markdown": "^10.1.0",
|
||||||
|
"rehype-raw": "^7.0.0",
|
||||||
|
"remark-gfm": "^4.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/eslintrc": "^3",
|
"@eslint/eslintrc": "^3",
|
||||||
|
|||||||
Reference in New Issue
Block a user