import s from 'underscore.string'; import { Meteor } from 'meteor/meteor'; import { Tracker } from 'meteor/tracker'; import { getUserPreference } from '../../utils'; import { callbacks } from '../../callbacks'; import { emoji } from '../lib/rocketchat'; /* * emojiParser is a function that will replace emojis * @param {Object} message - The message object */ Tracker.autorun(() => { if (!getUserPreference(Meteor.userId(), 'useEmojis')) { return callbacks.remove('renderMessage', 'emoji'); } callbacks.add('renderMessage', (message) => { let html = s.trim(message.html); if (html) { // ' to apostrophe (') for emojis such as :') html = html.replace(/'/g, '\''); // '
' to '
' for emojis such at line breaks html = html.replace(/
/g, '
'); html = Object.entries(emoji.packages).reduce((value, [, emojiPackage]) => emojiPackage.render(value), html); const checkEmojiOnly = document.createElement('div'); checkEmojiOnly.innerHTML = html; const emojis = Array.from(checkEmojiOnly.querySelectorAll('.emoji:not(:empty), .emojione:not(:empty)')); const emojiOnly = emojis.length && !Array.from(checkEmojiOnly.childNodes).filter((node) => node.nodeType === Node.TEXT_NODE).map((el) => el.nodeValue).join('').trim(); if (emojiOnly) { for (let i = 0, len = emojis.length; i < len; i++) { const { classList } = emojis[i]; classList.add('big'); } html = checkEmojiOnly.innerHTML; } // apostrophe (') back to ' html = html.replace(/\'/g, '''); // apostrophe '
' back to '
' html = html.replace(/
/g, '
'); } return { ...message, html }; }, callbacks.priority.LOW, 'emoji'); });