1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- // @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<Array<Object>> = [];
-
- (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);
- }
|