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 ( +
+ {t('回复')} :{' '} + {getMessageRender(quote.content)} +
+ ); + } +); +MessageQuote.displayName = 'MessageQuote'; + interface ChatMessageItemProps { showAvatar: boolean; payload: ChatMessage; @@ -41,7 +65,7 @@ export const ChatMessageItem: React.FC = React.memo( const actions = useChatMessageItemAction(payload); return ( -
+
{/* 头像 */}
{showAvatar ? ( @@ -65,6 +89,8 @@ export const ChatMessageItem: React.FC = React.memo( )}
+ + {getMessageRender(payload.content)} {/* 解释器按钮 */} diff --git a/web/src/components/ChatBox/ChatMessageList/item.less b/web/src/components/ChatBox/ChatMessageList/item.less new file mode 100644 index 00000000..dfac498d --- /dev/null +++ b/web/src/components/ChatBox/ChatMessageList/item.less @@ -0,0 +1,7 @@ +.chat-message-item { + .chat-message-item_quote { + img { + max-height: 60px !important; + } + } +} diff --git a/web/src/styles/antd/overwrite.less b/web/src/styles/antd/overwrite.less index 384bd6fa..950d0e7f 100644 --- a/web/src/styles/antd/overwrite.less +++ b/web/src/styles/antd/overwrite.less @@ -21,6 +21,12 @@ } } +.ant-image { + .ant-image-mask { + overflow: hidden; + } +} + .ant-image-preview-img { display: inline; }