diff --git a/shared/index.tsx b/shared/index.tsx index 4c9142ac..c9bef224 100644 --- a/shared/index.tsx +++ b/shared/index.tsx @@ -141,6 +141,7 @@ export { version, } from './utils/environment'; export { getTextColorHex, isValidStr } from './utils/string-helper'; +export { MessageHelper } from './utils/message-helper'; export { uploadFile } from './utils/upload-helper'; export type { UploadFileResult } from './utils/upload-helper'; export { sleep } from './utils/utils'; diff --git a/shared/utils/message-helper.ts b/shared/utils/message-helper.ts index 5e3f1e31..b57cc506 100644 --- a/shared/utils/message-helper.ts +++ b/shared/utils/message-helper.ts @@ -5,6 +5,7 @@ import type { } from '../model/message'; import _isNil from 'lodash/isNil'; import _set from 'lodash/set'; +import _get from 'lodash/get'; import _pick from 'lodash/pick'; const replyMsgFields = ['_id', 'content', 'author'] as const; @@ -17,6 +18,18 @@ export class MessageHelper { this.payload = { ...origin }; } + /** + * 判断消息体内是否有回复信息 + */ + hasReply(): ReplyMsgType | false { + const reply = _get(this.payload, ['meta', 'reply']); + if (_isNil(reply)) { + return false; + } + + return reply; + } + setReplyMsg(replyMsg: ReplyMsgType) { if (_isNil(replyMsg)) { return; diff --git a/web/src/components/ChatBox/ChatMessageList/Item.tsx b/web/src/components/ChatBox/ChatMessageList/Item.tsx index 2f93dd3e..3939233b 100644 --- a/web/src/components/ChatBox/ChatMessageList/Item.tsx +++ b/web/src/components/ChatBox/ChatMessageList/Item.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useMemo } from 'react'; import { ChatMessage, formatShortTime, @@ -11,6 +11,9 @@ import { useRenderPluginMessageInterpreter } from './useRenderPluginMessageInter import { getMessageRender } from '@/plugin/common'; import { Icon } from '@iconify/react'; import { Dropdown, Menu } from 'antd'; +import { MessageHelper } from 'tailchat-shared'; +import { UserName } from '@/components/UserName'; +import './item.less'; /** * 消息的会话信息 @@ -29,6 +32,27 @@ function useChatMessageItemAction(payload: ChatMessage): React.ReactElement { ); } +const MessageQuote: React.FC<{ payload: ChatMessage }> = React.memo( + ({ payload }) => { + const quote = useMemo( + () => new MessageHelper(payload).hasReply(), + [payload] + ); + + if (quote === false) { + return null; + } + + return ( +