Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

functions.js 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // @flow
  2. import aliases from 'react-emoji-render/data/aliases';
  3. import emojiAsciiAliases from 'react-emoji-render/data/asciiAliases';
  4. import { escapeRegexp } from '../base/util';
  5. /**
  6. * An ASCII emoticon regexp array to find and replace old-style ASCII
  7. * emoticons (such as :O) to new Unicode representation, so then devices
  8. * and browsers that support them can render these natively without
  9. * a 3rd party component.
  10. *
  11. * NOTE: this is currently only used on mobile, but it can be used
  12. * on web too once we drop support for browsers that don't support
  13. * unicode emoji rendering.
  14. */
  15. const EMOTICON_REGEXP_ARRAY: Array<Array<Object>> = [];
  16. (function() {
  17. for (const [ key, value ] of Object.entries(aliases)) {
  18. let escapedValues;
  19. const asciiEmojies = emojiAsciiAliases[key];
  20. // Adding ascii emoticons
  21. if (asciiEmojies) {
  22. escapedValues = asciiEmojies.map(v => escapeRegexp(v));
  23. } else {
  24. escapedValues = [];
  25. }
  26. // Adding slack-type emoji format
  27. escapedValues.push(escapeRegexp(`:${key}:`));
  28. const regexp = `\\B(${escapedValues.join('|')})\\B`;
  29. EMOTICON_REGEXP_ARRAY.push([ new RegExp(regexp, 'g'), value ]);
  30. }
  31. })();
  32. /**
  33. * Replaces ascii and other non-unicode emoticons with unicode emojis to let the emojis be rendered
  34. * by the platform native renderer.
  35. *
  36. * @param {string} message - The message to parse and replace.
  37. * @returns {string}
  38. */
  39. export function replaceNonUnicodeEmojis(message: string) {
  40. let replacedMessage = message;
  41. for (const [ regexp, replaceValue ] of EMOTICON_REGEXP_ARRAY) {
  42. replacedMessage = replacedMessage.replace(regexp, replaceValue);
  43. }
  44. return replacedMessage;
  45. }
  46. /**
  47. * Selector for calculating the number of unread chat messages.
  48. *
  49. * @param {Object} state - The redux state.
  50. * @returns {number} The number of unread messages.
  51. */
  52. export function getUnreadCount(state: Object) {
  53. const { lastReadMessage, messages } = state['features/chat'];
  54. const messagesCount = messages.length;
  55. if (!messagesCount) {
  56. return 0;
  57. }
  58. let reactionMessages = 0;
  59. if (navigator.product === 'ReactNative') {
  60. // React native stores the messages in a reversed order.
  61. const lastReadIndex = messages.indexOf(lastReadMessage);
  62. for (let i = 0; i < lastReadIndex; i++) {
  63. if (messages[i].isReaction) {
  64. reactionMessages++;
  65. }
  66. }
  67. return lastReadIndex - reactionMessages;
  68. }
  69. const lastReadIndex = messages.lastIndexOf(lastReadMessage);
  70. for (let i = lastReadIndex + 1; i < messagesCount; i++) {
  71. if (messages[i].isReaction) {
  72. reactionMessages++;
  73. }
  74. }
  75. return messagesCount - (lastReadIndex + 1) - reactionMessages;
  76. }
  77. /**
  78. * Selector for calculating the number of unread chat messages.
  79. *
  80. * @param {Object} state - The redux state.
  81. * @returns {number} The number of unread messages.
  82. */
  83. export function getUnreadMessagesCount(state: Object) {
  84. const { nbUnreadMessages } = state['features/chat'];
  85. return nbUnreadMessages;
  86. }
  87. /**
  88. * Get whether the chat smileys are disabled or not.
  89. *
  90. * @param {Object} state - The redux state.
  91. * @returns {boolean} The disabled flag.
  92. */
  93. export function areSmileysDisabled(state: Object) {
  94. const disableChatSmileys = state['features/base/config']?.disableChatSmileys === true;
  95. return disableChatSmileys;
  96. }