import type { IMessage } from '@rocket.chat/core-typings'; import { escapeHTML } from '@rocket.chat/string-helpers'; import { Meteor } from 'meteor/meteor'; import { emojiParser } from '../../app/emoji/client/emojiParser'; import { filterMarkdown } from '../../app/markdown/lib/markdown'; import { MentionsParser } from '../../app/mentions/lib/MentionsParser'; import { settings } from '../../app/settings/client'; import { Users } from '../stores'; export function normalizeThreadTitle({ ...message }: Readonly) { if (message.msg) { const filteredMessage = filterMarkdown(escapeHTML(message.msg)); if (!message.channels && !message.mentions) { return filteredMessage; } const uid = Meteor.userId(); const me = (uid && Users.state.get(uid)?.username) || ''; const pattern = settings.get('UTF8_User_Names_Validation'); const useRealName = settings.get('UI_Use_Real_Name'); const instance = new MentionsParser({ pattern: () => pattern, useRealName: () => useRealName, me: () => me, userTemplate: ({ label }) => ` ${label} `, roomTemplate: ({ prefix, mention }) => `${prefix} ${mention} `, }); const html = emojiParser(filteredMessage); return instance.parse({ ...message, msg: filteredMessage, html }).html; } if (message.attachments) { const attachment = message.attachments.find((attachment) => attachment.title || attachment.description); if (attachment?.description) { return escapeHTML(attachment.description); } if (attachment?.title) { return escapeHTML(attachment.title); } } }