import { MessageType, MessageStatus, ConversationType } from 'tuikit-atomicx-react/chat'; import { isCallMessage, isCreateGroupMessage, parseCallMessageText } from '../../../utils/call'; import { transformTextWithEmojiKeyToName } from '../../../utils/emoji'; import { JSONStringToParse } from '../../../utils/json'; import { markdownToPlainText } from '../../../utils/markdown'; import { resolveGroupTipMessage } from '../../MessageList/Message/GroupTipMessage/resolveGroupTipMessage'; import type { ConversationInfo, CustomMessageInfo, StreamMessagePayload, TipsMessageInfo, } from 'tuikit-atomicx-react/chat'; export const generateHighlightTitle = ( conversation: ConversationInfo, highlightMatchString?: string, ): Array<{ text: string; isHighlight: boolean }> => { const title = conversation?.title || ''; if (!highlightMatchString) { return [{ text: title, isHighlight: false }]; } const regex = new RegExp(`(${highlightMatchString})`, 'gi'); const parts = title.split(regex); return parts.map(part => ({ text: part, isHighlight: part.toLowerCase() === highlightMatchString.toLowerCase(), })); }; /** * Get latest message preview text for conversation * @param conversation - Conversation info * @param t - Translation function * @returns Preview text with sender prefix for group conversations */ export const getLatestMessagePreview = ( conversation: ConversationInfo, t: (key: string) => string, options: { ignoreDraft?: boolean } = {}, ): string => { // Handle draft message const { draft: draftText } = conversation || {}; if (draftText && !options.ignoreDraft) { if (typeof draftText === 'string') { const draftInfo = JSONStringToParse(draftText); return ((draftInfo as any)?.abstract || draftText) as string; } return ''; } const { lastMessage } = conversation; if (!lastMessage) { return ''; } const isGroupConversation = conversation.type === ConversationType.Group; let messageContent = ''; if (lastMessage.status === MessageStatus.Recalled) { messageContent = t('TUIConversation.recalled_a_message'); } else { switch (lastMessage.messageType) { case MessageType.Text: messageContent = transformTextWithEmojiKeyToName((lastMessage as any).messagePayload?.text || ''); break; case MessageType.Image: messageContent = `[${t('TUIConversation.Image')}]`; break; case MessageType.Audio: messageContent = `[${t('TUIConversation.Audio')}]`; break; case MessageType.Video: messageContent = `[${t('TUIConversation.Video')}]`; break; case MessageType.File: messageContent = `[${t('TUIConversation.File')}]`; break; case MessageType.Custom: { if (isCallMessage(lastMessage)) { try { messageContent = parseCallMessageText(lastMessage); } catch { messageContent = `[${t('TUIConversation.call_message')}]`; } } else if (isCreateGroupMessage(lastMessage)) { messageContent = `${lastMessage.from.nickname || lastMessage.from.userID} ${t('MessageList.create_group')}`; } else { const { description = '' } = (lastMessage as CustomMessageInfo).messagePayload; messageContent = description || `[${t('TUIConversation.Custom')}]`; } break; } case MessageType.Face: messageContent = `[${t('TUIConversation.Face')}]`; break; case MessageType.Merged: messageContent = `[${t('TUIConversation.Chat History')}]`; break; case MessageType.Tips: messageContent = resolveGroupTipMessage(lastMessage as TipsMessageInfo).text; break; case MessageType.Stream: { const streamPayload = lastMessage.messagePayload as StreamMessagePayload | undefined; // SDK conversation lastMessage may omit markdown / isStreamEnded on init. // Prefer markdown when present; otherwise fall back to a generic label. messageContent = markdownToPlainText(streamPayload?.markdown || '') || `[${t('TUIConversation.stream_message')}]`; break; } default: messageContent = `[${t('TUIConversation.unknown_message')}]`; break; } } if (isGroupConversation) { if (lastMessage.messageType === MessageType.Tips || isCreateGroupMessage(lastMessage)) { return messageContent; } const { from } = lastMessage; const isSelf = lastMessage.isSentBySelf; const senderName = isSelf ? t('TUIConversation.me') : from.friendRemark || from.nameCard || from.nickname || from.userID; return senderName ? `${senderName}: ${messageContent}` : messageContent; } return messageContent; };