import { MessageType } from 'tuikit-atomicx-react/chat'; import { useUIKit } from '@tencentcloud/uikit-base-component-react'; import { useUIContext } from 'tuikit-atomicx-react/chat'; import { useChatUIState } from '../../../../../context/useChatUIState'; import { SearchType } from '../../../../../types/search'; import { highlightText, transformTextWithEmojiKeyToName } from '../../../../../utils'; import { Avatar } from 'tuikit-atomicx-react/chat'; import styles from './Message.module.scss'; import type { ResultItemProps } from '../../../../../types/search'; import type { MessageInfo } from 'tuikit-atomicx-react/chat'; function renderTextContent(payload: any, keyword: string) { const text = payload?.text; if (text && Array.isArray(text)) { return ( <> {text.map((item: any, idx: number) => { if (item.name === 'text') { return ( ); } if (item.name === 'img') { return ( {item.emojiKey ); } return null; })} ); } return ( ); } export function Message({ data, keyword, onClick }: ResultItemProps) { const { t } = useUIKit(); const message = data as unknown as MessageInfo; const senderName = message.from?.nameCard || message.from?.nickname || message.from?.userID || ''; const senderAvatar = message.from?.avatarURL; const messageTime = message.timestamp; // --- Navigate to message via UIContext (Channel) + ChatUIState --- const { setActiveConversation } = useUIContext(); const { setPendingLocateMessage } = useChatUIState(); const renderMessageContent = (msg: MessageInfo, searchKeyword: string) => { switch (msg.messageType) { case MessageType.Text: return (
{renderTextContent(msg.messagePayload, searchKeyword)}
); case MessageType.Image: return ( {t('Search.Image ); case MessageType.Video: return (
{t('Search.Video
); case MessageType.File: return (
{msg.messagePayload?.fileName} {msg.messagePayload?.fileSize}
); case MessageType.Audio: return (
{`${msg.messagePayload?.audioDuration ?? 0}s`}
); default: return {t('Search.Unsupported Message')}; } }; const handleClick = async () => { const messageID = message.msgID || (message as any).messageID || (message as any).ID; const conversationID = (message as any).conversationID || (message.conversationType === 'c2c' ? `C2C${message.isSentBySelf ? (message as any).to : message.from?.userID}` : `GROUP${(message as any).to}`); if (conversationID && messageID) { const locateMessage = { ...message, msgID: messageID, sequence: message.sequence, }; setPendingLocateMessage(locateMessage); setActiveConversation(conversationID); } onClick?.(data, SearchType.CHAT_MESSAGE); }; return (
{senderName} {messageTime && ( {messageTime.toLocaleString()} )}
{renderMessageContent(message, keyword)}
{t('Search.Locate to Chat')}
); } export default Message;