// @flow import aliases from 'react-emoji-render/data/aliases'; import emojiAsciiAliases from 'react-emoji-render/data/asciiAliases'; import { escapeRegexp } from '../base/util'; /** * An ASCII emoticon regexp array to find and replace old-style ASCII * emoticons (such as :O) to new Unicode representation, so then devices * and browsers that support them can render these natively without * a 3rd party component. * * NOTE: this is currently only used on mobile, but it can be used * on web too once we drop support for browsers that don't support * unicode emoji rendering. */ const EMOTICON_REGEXP_ARRAY: Array> = []; (function() { for (const [ key, value ] of Object.entries(aliases)) { let escapedValues; const asciiEmojies = emojiAsciiAliases[key]; // Adding ascii emoticons if (asciiEmojies) { escapedValues = asciiEmojies.map(v => escapeRegexp(v)); } else { escapedValues = []; } // Adding slack-type emoji format escapedValues.push(escapeRegexp(`:${key}:`)); const regexp = `\\B(${escapedValues.join('|')})\\B`; EMOTICON_REGEXP_ARRAY.push([ new RegExp(regexp, 'g'), value ]); } })(); /** * Replaces ascii and other non-unicode emoticons with unicode emojis to let the emojis be rendered * by the platform native renderer. * * @param {string} message - The message to parse and replace. * @returns {string} */ export function replaceNonUnicodeEmojis(message: string) { let replacedMessage = message; for (const [ regexp, replaceValue ] of EMOTICON_REGEXP_ARRAY) { replacedMessage = replacedMessage.replace(regexp, replaceValue); } return replacedMessage; } /** * Selector for calculating the number of unread chat messages. * * @param {Object} state - The redux state. * @returns {number} The number of unread messages. */ export function getUnreadCount(state: Object) { const { lastReadMessage, messages } = state['features/chat']; const messagesCount = messages.length; if (!messagesCount) { return 0; } if (navigator.product === 'ReactNative') { // React native stores the messages in a reversed order. return messages.indexOf(lastReadMessage); } const lastReadIndex = messages.lastIndexOf(lastReadMessage); return messagesCount - (lastReadIndex + 1); }