stream-chat-react 6.7.0 → 6.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +1 -1
  2. package/dist/browser.full-bundle.js +3989 -1360
  3. package/dist/browser.full-bundle.js.map +1 -1
  4. package/dist/browser.full-bundle.min.js +10 -3
  5. package/dist/browser.full-bundle.min.js.map +1 -1
  6. package/dist/components/AutoCompleteTextarea/Textarea.js +1 -1
  7. package/dist/components/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/components/Avatar/Avatar.js +3 -1
  9. package/dist/components/Channel/Channel.d.ts +4 -0
  10. package/dist/components/Channel/Channel.d.ts.map +1 -1
  11. package/dist/components/Channel/Channel.js +69 -94
  12. package/dist/components/Channel/hooks/useCreateChannelStateContext.d.ts +15 -0
  13. package/dist/components/Channel/hooks/useCreateChannelStateContext.d.ts.map +1 -0
  14. package/dist/components/Channel/hooks/useCreateChannelStateContext.js +87 -0
  15. package/dist/components/Channel/hooks/useCreateTypingContext.d.ts +4 -0
  16. package/dist/components/Channel/hooks/useCreateTypingContext.d.ts.map +1 -0
  17. package/dist/components/Channel/hooks/useCreateTypingContext.js +9 -0
  18. package/dist/components/ChannelList/ChannelList.d.ts +3 -3
  19. package/dist/components/ChannelList/ChannelList.d.ts.map +1 -1
  20. package/dist/components/ChannelList/ChannelList.js +3 -3
  21. package/dist/components/ChannelList/hooks/useNotificationAddedToChannelListener.d.ts +1 -1
  22. package/dist/components/ChannelList/hooks/useNotificationAddedToChannelListener.d.ts.map +1 -1
  23. package/dist/components/ChannelList/hooks/useNotificationAddedToChannelListener.js +3 -2
  24. package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.d.ts +1 -1
  25. package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.d.ts.map +1 -1
  26. package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.js +4 -6
  27. package/dist/components/ChannelList/hooks/usePaginatedChannels.d.ts +0 -1
  28. package/dist/components/ChannelList/hooks/usePaginatedChannels.d.ts.map +1 -1
  29. package/dist/components/ChannelList/hooks/usePaginatedChannels.js +7 -15
  30. package/dist/components/ChannelPreview/ChannelPreview.d.ts.map +1 -1
  31. package/dist/components/ChannelPreview/ChannelPreview.js +10 -0
  32. package/dist/components/Chat/Chat.d.ts.map +1 -1
  33. package/dist/components/Chat/Chat.js +14 -12
  34. package/dist/components/Chat/hooks/useChat.js +1 -1
  35. package/dist/components/Chat/hooks/useCreateChatContext.d.ts +4 -0
  36. package/dist/components/Chat/hooks/useCreateChatContext.d.ts.map +1 -0
  37. package/dist/components/Chat/hooks/useCreateChatContext.js +21 -0
  38. package/dist/components/Message/hooks/useReactionHandler.d.ts +1 -1
  39. package/dist/components/Message/hooks/useReactionHandler.d.ts.map +1 -1
  40. package/dist/components/Message/hooks/useReactionHandler.js +1 -5
  41. package/dist/components/MessageInput/DefaultTriggerProvider.d.ts.map +1 -1
  42. package/dist/components/MessageInput/DefaultTriggerProvider.js +1 -0
  43. package/dist/components/MessageInput/MessageInput.d.ts +3 -1
  44. package/dist/components/MessageInput/MessageInput.d.ts.map +1 -1
  45. package/dist/components/MessageInput/MessageInput.js +2 -1
  46. package/dist/components/MessageInput/hooks/useCreateMessageInputContext.d.ts +4 -0
  47. package/dist/components/MessageInput/hooks/useCreateMessageInputContext.d.ts.map +1 -0
  48. package/dist/components/MessageInput/hooks/useCreateMessageInputContext.js +88 -0
  49. package/dist/components/MessageInput/hooks/useMessageInputState.d.ts +1 -0
  50. package/dist/components/MessageInput/hooks/useMessageInputState.d.ts.map +1 -1
  51. package/dist/components/MessageInput/hooks/useMessageInputState.js +6 -1
  52. package/dist/components/MessageInput/hooks/useMessageInputText.js +1 -1
  53. package/dist/components/MessageInput/hooks/useSubmitHandler.d.ts.map +1 -1
  54. package/dist/components/MessageInput/hooks/useSubmitHandler.js +2 -1
  55. package/dist/components/MessageInput/hooks/useUserTrigger.d.ts +1 -0
  56. package/dist/components/MessageInput/hooks/useUserTrigger.d.ts.map +1 -1
  57. package/dist/components/MessageInput/hooks/useUserTrigger.js +19 -13
  58. package/dist/components/MessageInput/hooks/utils.d.ts +15 -0
  59. package/dist/components/MessageInput/hooks/utils.d.ts.map +1 -0
  60. package/dist/components/MessageInput/hooks/utils.js +114 -0
  61. package/dist/components/MessageList/VirtualizedMessageList.d.ts +4 -2
  62. package/dist/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
  63. package/dist/components/MessageList/VirtualizedMessageList.js +2 -2
  64. package/dist/css/index.css +1 -7329
  65. package/dist/index.cjs.js +449 -175
  66. package/dist/index.cjs.js.map +1 -1
  67. package/dist/scss/ActionsBox.scss +2 -0
  68. package/dist/scss/Attachment.scss +4 -0
  69. package/dist/scss/AttachmentActions.scss +1 -0
  70. package/dist/scss/Audio.scss +2 -0
  71. package/dist/scss/Avatar.scss +2 -0
  72. package/dist/scss/Card.scss +6 -2
  73. package/dist/scss/ChannelHeader.scss +22 -3
  74. package/dist/scss/ChannelList.scss +5 -6
  75. package/dist/scss/ChannelSearch.scss +2 -4
  76. package/dist/scss/ChatDown.scss +1 -0
  77. package/dist/scss/DateSeparator.scss +3 -0
  78. package/dist/scss/EditMessageForm.scss +4 -0
  79. package/dist/scss/EventComponent.scss +4 -0
  80. package/dist/scss/Gallery.scss +7 -1
  81. package/dist/scss/LoadMoreButton.scss +1 -0
  82. package/dist/scss/Message.scss +78 -2
  83. package/dist/scss/MessageInput.scss +3 -0
  84. package/dist/scss/MessageInputFlat.scss +8 -1
  85. package/dist/scss/MessageList.scss +10 -0
  86. package/dist/scss/MessageRepliesCountButton.scss +1 -0
  87. package/dist/scss/MessageTeam.scss +3 -7
  88. package/dist/scss/Modal.scss +3 -0
  89. package/dist/scss/ReactionList.scss +18 -18
  90. package/dist/scss/ReactionSelector.scss +4 -0
  91. package/dist/scss/SimpleReactionsList.scss +2 -1
  92. package/dist/scss/Thread.scss +19 -0
  93. package/dist/scss/TypingIndicator.scss +7 -0
  94. package/dist/scss/VirtualMessage.scss +8 -7
  95. package/dist/scss/_base.scss +17 -2
  96. package/dist/utils.d.ts +2 -2
  97. package/dist/utils.d.ts.map +1 -1
  98. package/dist/utils.js +22 -15
  99. package/dist/version.d.ts +1 -1
  100. package/dist/version.js +1 -1
  101. package/package.json +10 -29
  102. package/CHANGELOG.md +0 -1534
  103. package/dist/css/index.js +0 -1
  104. package/dist/css/index.min.css +0 -1
package/dist/index.cjs.js CHANGED
@@ -778,24 +778,31 @@ function generateRandomId() {
778
778
  // prettier-ignore
779
779
  return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
780
780
  }
781
- var smartRender = function (ElementOrComponentOrLiteral, props, fallback) {
782
- if (ElementOrComponentOrLiteral === undefined && fallback) {
783
- ElementOrComponentOrLiteral = fallback;
781
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt#getting_whole_characters
782
+ var getWholeChar = function (str, i) {
783
+ var code = str.charCodeAt(i);
784
+ if (Number.isNaN(code))
785
+ return '';
786
+ if (code < 0xd800 || code > 0xdfff)
787
+ return str.charAt(i);
788
+ if (0xd800 <= code && code <= 0xdbff) {
789
+ if (str.length <= i + 1) {
790
+ throw 'High surrogate without following low surrogate';
791
+ }
792
+ var next = str.charCodeAt(i + 1);
793
+ if (0xdc00 > next || next > 0xdfff) {
794
+ throw 'High surrogate without following low surrogate';
795
+ }
796
+ return str.charAt(i) + str.charAt(i + 1);
784
797
  }
785
- if (React__default['default'].isValidElement(ElementOrComponentOrLiteral)) {
786
- // Flow cast through any, to make flow believe it's a React.Element
787
- var element = ElementOrComponentOrLiteral;
788
- return element;
798
+ if (i === 0) {
799
+ throw 'Low surrogate without preceding high surrogate';
789
800
  }
790
- // Flow cast through any to remove React.Element after previous check
791
- var ComponentOrLiteral = ElementOrComponentOrLiteral;
792
- if (typeof ComponentOrLiteral === 'string' ||
793
- typeof ComponentOrLiteral === 'number' ||
794
- typeof ComponentOrLiteral === 'boolean' ||
795
- ComponentOrLiteral == null) {
796
- return ComponentOrLiteral;
801
+ var prev = str.charCodeAt(i - 1);
802
+ if (0xd800 > prev || prev > 0xdbff) {
803
+ throw 'Low surrogate without preceding high surrogate';
797
804
  }
798
- return React__default['default'].createElement(ComponentOrLiteral, __assign({}, props));
805
+ return '';
799
806
  };
800
807
 
801
808
  var DefaultSuggestionListHeader = function (_a) {
@@ -1377,7 +1384,7 @@ var ReactTextareaAutocomplete = /*#__PURE__*/function (_React$Component) {
1377
1384
  };
1378
1385
  }
1379
1386
 
1380
- if (!textToReplace.text) {
1387
+ if (!textToReplace.text && currentTrigger !== ':') {
1381
1388
  throw new Error("Output \"text\" is not defined! Object should has shape {text: string, caretPosition: string | number}. Check the implementation for trigger \"".concat(currentTrigger, "\" and its token \"").concat(actualToken, "\"\n"));
1382
1389
  }
1383
1390
 
@@ -1901,7 +1908,8 @@ var Avatar = function (props) {
1901
1908
  setError(false);
1902
1909
  setLoaded(false);
1903
1910
  }, [image]);
1904
- var initials = ((name === null || name === void 0 ? void 0 : name.toString()) || '').charAt(0);
1911
+ var nameStr = (name === null || name === void 0 ? void 0 : name.toString()) || '';
1912
+ var initials = getWholeChar(nameStr, 0);
1905
1913
  return (React__default['default'].createElement("div", { className: "str-chat__avatar str-chat__avatar--" + shape, "data-testid": 'avatar', onClick: onClick, onMouseOver: onMouseOver, style: {
1906
1914
  flexBasis: size + "px",
1907
1915
  fontSize: size / 2 + "px",
@@ -2018,6 +2026,101 @@ var defaultMinimalEmojis = [
2018
2026
  // use this only for small lists like in ReactionSelector
2019
2027
  var getStrippedEmojiData = function (data) { return (__assign(__assign({}, data), { emojis: {} })); };
2020
2028
 
2029
+ var useCreateChannelStateContext = function (value) {
2030
+ var _a;
2031
+ var acceptedFiles = value.acceptedFiles, channel = value.channel, channelConfig = value.channelConfig, error = value.error, hasMore = value.hasMore, loading = value.loading, loadingMore = value.loadingMore, maxNumberOfFiles = value.maxNumberOfFiles, members = value.members, _b = value.messages, messages = _b === void 0 ? [] : _b, multipleUploads = value.multipleUploads, mutes = value.mutes, notifications = value.notifications, pinnedMessages = value.pinnedMessages, quotedMessage = value.quotedMessage, _c = value.read, read = _c === void 0 ? {} : _c, skipMessageDataMemoization = value.skipMessageDataMemoization, thread = value.thread, threadHasMore = value.threadHasMore, threadLoadingMore = value.threadLoadingMore, _d = value.threadMessages, threadMessages = _d === void 0 ? [] : _d, watcherCount = value.watcherCount, watcher_count = value.watcher_count, watchers = value.watchers;
2032
+ var channelId = channel.cid;
2033
+ var lastRead = channel.initialized && ((_a = channel.lastRead()) === null || _a === void 0 ? void 0 : _a.getTime());
2034
+ var membersLength = Object.keys(members || []).length;
2035
+ var notificationsLength = notifications.length;
2036
+ var readUsers = Object.values(read);
2037
+ var readUsersLength = readUsers.length;
2038
+ var readUsersLastReads = readUsers.map(function (_a) {
2039
+ var last_read = _a.last_read;
2040
+ return last_read.toISOString();
2041
+ }).join();
2042
+ var threadMessagesLength = threadMessages === null || threadMessages === void 0 ? void 0 : threadMessages.length;
2043
+ var memoizedMessageData = skipMessageDataMemoization
2044
+ ? messages
2045
+ : messages
2046
+ .map(function (_a) {
2047
+ var deleted_at = _a.deleted_at, latest_reactions = _a.latest_reactions, pinned = _a.pinned, reply_count = _a.reply_count, status = _a.status, updated_at = _a.updated_at;
2048
+ return "" + deleted_at + (latest_reactions ? latest_reactions.map(function (_a) {
2049
+ var type = _a.type;
2050
+ return type;
2051
+ }).join() : '') + pinned + reply_count + status + (updated_at && (isDayOrMoment(updated_at) || isDate(updated_at))
2052
+ ? updated_at.toISOString()
2053
+ : updated_at || '');
2054
+ })
2055
+ .join();
2056
+ var memoizedThreadMessageData = threadMessages
2057
+ .map(function (_a) {
2058
+ var deleted_at = _a.deleted_at, latest_reactions = _a.latest_reactions, pinned = _a.pinned, status = _a.status, updated_at = _a.updated_at;
2059
+ return "" + deleted_at + (latest_reactions ? latest_reactions.map(function (_a) {
2060
+ var type = _a.type;
2061
+ return type;
2062
+ }).join() : '') + pinned + status + (updated_at && (isDayOrMoment(updated_at) || isDate(updated_at))
2063
+ ? updated_at.toISOString()
2064
+ : updated_at || '');
2065
+ })
2066
+ .join();
2067
+ var channelStateContext = React.useMemo(function () { return ({
2068
+ acceptedFiles: acceptedFiles,
2069
+ channel: channel,
2070
+ channelConfig: channelConfig,
2071
+ error: error,
2072
+ hasMore: hasMore,
2073
+ loading: loading,
2074
+ loadingMore: loadingMore,
2075
+ maxNumberOfFiles: maxNumberOfFiles,
2076
+ members: members,
2077
+ messages: messages,
2078
+ multipleUploads: multipleUploads,
2079
+ mutes: mutes,
2080
+ notifications: notifications,
2081
+ pinnedMessages: pinnedMessages,
2082
+ quotedMessage: quotedMessage,
2083
+ read: read,
2084
+ thread: thread,
2085
+ threadHasMore: threadHasMore,
2086
+ threadLoadingMore: threadLoadingMore,
2087
+ threadMessages: threadMessages,
2088
+ watcher_count: watcher_count,
2089
+ watcherCount: watcherCount,
2090
+ watchers: watchers,
2091
+ }); }, [
2092
+ channelId,
2093
+ error,
2094
+ hasMore,
2095
+ lastRead,
2096
+ loading,
2097
+ loadingMore,
2098
+ membersLength,
2099
+ memoizedMessageData,
2100
+ memoizedThreadMessageData,
2101
+ notificationsLength,
2102
+ quotedMessage,
2103
+ readUsersLength,
2104
+ readUsersLastReads,
2105
+ skipMessageDataMemoization,
2106
+ thread,
2107
+ threadHasMore,
2108
+ threadLoadingMore,
2109
+ threadMessagesLength,
2110
+ watcherCount,
2111
+ ]);
2112
+ return channelStateContext;
2113
+ };
2114
+
2115
+ var useCreateTypingContext = function (value) {
2116
+ var typing = value.typing;
2117
+ var typingValue = Object.keys(typing || {}).join();
2118
+ var typingContext = React.useMemo(function () { return ({
2119
+ typing: typing,
2120
+ }); }, [typingValue]);
2121
+ return typingContext;
2122
+ };
2123
+
2021
2124
  var ChatContext = React__default['default'].createContext({});
2022
2125
  var ChatProvider = function (_a) {
2023
2126
  var children = _a.children, value = _a.value;
@@ -3111,7 +3214,7 @@ var usePinHandler = function (message, permissions, notifications) {
3111
3214
  return { canPin: canPin(), handlePin: handlePin };
3112
3215
  };
3113
3216
 
3114
- var reactionHandlerWarning = "Reaction handler was called, but it is missing one of its required arguments. \nMake sure the ChannelAction and ChannelState contexts are properly set and the hook is initialized with a valid message.";
3217
+ var reactionHandlerWarning = "Reaction handler was called, but it is missing one of its required arguments.\nMake sure the ChannelAction and ChannelState contexts are properly set and the hook is initialized with a valid message.";
3115
3218
  var useReactionHandler = function (message) {
3116
3219
  var updateMessage = useChannelActionContext().updateMessage;
3117
3220
  var channel = useChannelStateContext().channel;
@@ -3250,14 +3353,12 @@ var useReactionClick = function (message, reactionSelectorRef, messageWrapperRef
3250
3353
  if (showDetailedReactions && !hasListener.current) {
3251
3354
  hasListener.current = true;
3252
3355
  document.addEventListener('click', closeDetailedReactions);
3253
- document.addEventListener('touchend', closeDetailedReactions);
3254
3356
  if (messageWrapper) {
3255
3357
  messageWrapper.addEventListener('mouseleave', closeDetailedReactions);
3256
3358
  }
3257
3359
  }
3258
3360
  if (!showDetailedReactions && hasListener.current) {
3259
3361
  document.removeEventListener('click', closeDetailedReactions);
3260
- document.removeEventListener('touchend', closeDetailedReactions);
3261
3362
  if (messageWrapper) {
3262
3363
  messageWrapper.removeEventListener('mouseleave', closeDetailedReactions);
3263
3364
  }
@@ -3266,7 +3367,6 @@ var useReactionClick = function (message, reactionSelectorRef, messageWrapperRef
3266
3367
  return function () {
3267
3368
  if (hasListener.current) {
3268
3369
  document.removeEventListener('click', closeDetailedReactions);
3269
- document.removeEventListener('touchend', closeDetailedReactions);
3270
3370
  if (messageWrapper) {
3271
3371
  messageWrapper.removeEventListener('mouseleave', closeDetailedReactions);
3272
3372
  }
@@ -3278,7 +3378,6 @@ var useReactionClick = function (message, reactionSelectorRef, messageWrapperRef
3278
3378
  var messageWrapper = messageWrapperRef === null || messageWrapperRef === void 0 ? void 0 : messageWrapperRef.current;
3279
3379
  if (messageDeleted && hasListener.current) {
3280
3380
  document.removeEventListener('click', closeDetailedReactions);
3281
- document.removeEventListener('touchend', closeDetailedReactions);
3282
3381
  if (messageWrapper) {
3283
3382
  messageWrapper.removeEventListener('mouseleave', closeDetailedReactions);
3284
3383
  }
@@ -3516,6 +3615,85 @@ var useEmojiTrigger = function (emojiIndex) { return ({
3516
3615
  }); },
3517
3616
  }); };
3518
3617
 
3618
+ var accentsMap = {
3619
+ a: 'á|à|ã|â|À|Á|Ã|Â',
3620
+ c: 'ç|Ç',
3621
+ e: 'é|è|ê|É|È|Ê',
3622
+ i: 'í|ì|î|Í|Ì|Î',
3623
+ n: 'ñ|Ñ',
3624
+ o: 'ó|ò|ô|õ|Ó|Ò|Ô|Õ',
3625
+ u: 'ú|ù|û|ü|Ú|Ù|Û|Ü',
3626
+ };
3627
+ var removeDiacritics = function (text) {
3628
+ if (!text)
3629
+ return '';
3630
+ return Object.keys(accentsMap).reduce(function (acc, current) { return acc.replace(new RegExp(accentsMap[current], 'g'), current); }, text);
3631
+ };
3632
+ var calculateLevenshtein = function (query, name) {
3633
+ if (query.length === 0)
3634
+ return name.length;
3635
+ if (name.length === 0)
3636
+ return query.length;
3637
+ var matrix = [];
3638
+ var i;
3639
+ for (i = 0; i <= name.length; i++) {
3640
+ matrix[i] = [i];
3641
+ }
3642
+ var j;
3643
+ for (j = 0; j <= query.length; j++) {
3644
+ matrix[0][j] = j;
3645
+ }
3646
+ for (i = 1; i <= name.length; i++) {
3647
+ for (j = 1; j <= query.length; j++) {
3648
+ if (name.charAt(i - 1) === query.charAt(j - 1)) {
3649
+ matrix[i][j] = matrix[i - 1][j - 1];
3650
+ }
3651
+ else {
3652
+ matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
3653
+ Math.min(matrix[i][j - 1] + 1, // insertion
3654
+ matrix[i - 1][j] + 1)); // deletion
3655
+ }
3656
+ }
3657
+ }
3658
+ return matrix[name.length][query.length];
3659
+ };
3660
+ var searchLocalUsers = function (params) {
3661
+ var ownUserId = params.ownUserId, query = params.query, useMentionsTransliteration = params.useMentionsTransliteration, users = params.users;
3662
+ var matchingUsers = users.filter(function (user) {
3663
+ if (user.id === ownUserId)
3664
+ return false;
3665
+ if (!query)
3666
+ return true;
3667
+ var updatedId = removeDiacritics(user.id).toLowerCase();
3668
+ var updatedName = removeDiacritics(user.name).toLowerCase();
3669
+ var updatedQuery = removeDiacritics(query).toLowerCase();
3670
+ if (useMentionsTransliteration) {
3671
+ (function () { return __awaiter(void 0, void 0, void 0, function () {
3672
+ var transliterate;
3673
+ return __generator(this, function (_a) {
3674
+ switch (_a.label) {
3675
+ case 0: return [4 /*yield*/, Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@sindresorhus/transliterate')); })];
3676
+ case 1:
3677
+ transliterate = (_a.sent()).default;
3678
+ updatedName = transliterate(user.name || '').toLowerCase();
3679
+ updatedQuery = transliterate(query).toLowerCase();
3680
+ updatedId = transliterate(user.id).toLowerCase();
3681
+ return [2 /*return*/];
3682
+ }
3683
+ });
3684
+ }); })();
3685
+ }
3686
+ if (updatedName) {
3687
+ var levenshtein_1 = calculateLevenshtein(updatedQuery, updatedName);
3688
+ if (updatedName.includes(updatedQuery) || levenshtein_1 <= 3)
3689
+ return true;
3690
+ }
3691
+ var levenshtein = calculateLevenshtein(updatedQuery, updatedId);
3692
+ return updatedId.includes(updatedQuery) || levenshtein <= 3;
3693
+ });
3694
+ return matchingUsers;
3695
+ };
3696
+
3519
3697
  /**
3520
3698
  * UI component for mentions rendered in suggestion list
3521
3699
  */
@@ -3538,7 +3716,7 @@ var UnMemoizedUserItem = function (props) {
3538
3716
  var UserItem = React__default['default'].memo(UnMemoizedUserItem);
3539
3717
 
3540
3718
  var useUserTrigger = function (params) {
3541
- var disableMentions = params.disableMentions, mentionAllAppUsers = params.mentionAllAppUsers, _a = params.mentionQueryParams, mentionQueryParams = _a === void 0 ? {} : _a, onSelectUser = params.onSelectUser;
3719
+ var disableMentions = params.disableMentions, mentionAllAppUsers = params.mentionAllAppUsers, _a = params.mentionQueryParams, mentionQueryParams = _a === void 0 ? {} : _a, onSelectUser = params.onSelectUser, useMentionsTransliteration = params.useMentionsTransliteration;
3542
3720
  var _b = React.useState(false), searching = _b[0], setSearching = _b[1];
3543
3721
  var _c = useChatContext(), client = _c.client, mutes = _c.mutes;
3544
3722
  var channel = useChannelStateContext().channel;
@@ -3622,14 +3800,22 @@ var useUserTrigger = function (params) {
3622
3800
  return {
3623
3801
  callback: function (item) { return onSelectUser(item); },
3624
3802
  component: UserItem,
3625
- dataProvider: function (query, _, onReady) {
3803
+ dataProvider: function (query, text, onReady) {
3626
3804
  var _a;
3627
3805
  if (disableMentions)
3628
3806
  return;
3629
3807
  var filterMutes = function (data) {
3808
+ if (text.includes('/unmute') && !mutes.length) {
3809
+ return [];
3810
+ }
3630
3811
  if (!mutes.length)
3631
3812
  return data;
3632
- return data.filter(function (suggestion) { return mutes.some(function (mute) { return mute.target.id === suggestion.id; }); });
3813
+ if (text.includes('/unmute')) {
3814
+ return data.filter(function (suggestion) {
3815
+ return mutes.some(function (mute) { return mute.target.id === suggestion.id; });
3816
+ });
3817
+ }
3818
+ return data.filter(function (suggestion) { return mutes.every(function (mute) { return mute.target.id !== suggestion.id; }); });
3633
3819
  };
3634
3820
  if (mentionAllAppUsers) {
3635
3821
  return queryUsersThrottled(query, function (data) {
@@ -3645,16 +3831,13 @@ var useUserTrigger = function (params) {
3645
3831
  */
3646
3832
  if (!query || Object.values(members || {}).length < 100) {
3647
3833
  var users = getMembersAndWatchers();
3648
- var matchingUsers = users.filter(function (user) {
3649
- if (user.id === client.userID)
3650
- return false;
3651
- if (!query)
3652
- return true;
3653
- if (user.name !== undefined && user.name.toLowerCase().includes(query.toLowerCase())) {
3654
- return true;
3655
- }
3656
- return user.id.toLowerCase().includes(query.toLowerCase());
3657
- });
3834
+ var params_1 = {
3835
+ ownUserId: client.userID,
3836
+ query: query,
3837
+ useMentionsTransliteration: useMentionsTransliteration,
3838
+ users: users,
3839
+ };
3840
+ var matchingUsers = searchLocalUsers(params_1);
3658
3841
  var usersToShow = ((_a = mentionQueryParams.options) === null || _a === void 0 ? void 0 : _a.limit) || 10;
3659
3842
  var data = matchingUsers.slice(0, usersToShow);
3660
3843
  if (onReady)
@@ -3701,6 +3884,7 @@ var DefaultTriggerProvider = function (_a) {
3701
3884
  mentionAllAppUsers: currentValue.mentionAllAppUsers,
3702
3885
  mentionQueryParams: currentValue.mentionQueryParams,
3703
3886
  onSelectUser: currentValue.onSelectUser,
3887
+ useMentionsTransliteration: currentValue.useMentionsTransliteration,
3704
3888
  }),
3705
3889
  };
3706
3890
  var newValue = __assign(__assign({}, currentValue), { autocompleteTriggers: defaultAutocompleteTriggers });
@@ -4198,7 +4382,7 @@ var useAttachments = function (props, state, dispatch) {
4198
4382
 
4199
4383
  var useMessageInputText = function (props, state, dispatch) {
4200
4384
  var channel = useChannelStateContext().channel;
4201
- var additionalTextareaProps = props.additionalTextareaProps, focus = props.focus, parent = props.parent, publishTypingEvent = props.publishTypingEvent;
4385
+ var additionalTextareaProps = props.additionalTextareaProps, focus = props.focus, parent = props.parent, _a = props.publishTypingEvent, publishTypingEvent = _a === void 0 ? true : _a;
4202
4386
  var text = state.text;
4203
4387
  var textareaRef = React.useRef();
4204
4388
  // Focus
@@ -4399,10 +4583,11 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
4399
4583
  text: text,
4400
4584
  };
4401
4585
  if (!message) return [3 /*break*/, 5];
4586
+ delete message.i18n;
4402
4587
  _a.label = 1;
4403
4588
  case 1:
4404
4589
  _a.trys.push([1, 3, , 4]);
4405
- return [4 /*yield*/, editMessage(__assign(__assign({}, updatedMessage), { id: message.id }))];
4590
+ return [4 /*yield*/, editMessage(__assign(__assign({}, message), updatedMessage))];
4406
4591
  case 2:
4407
4592
  _a.sent();
4408
4593
  if (clearEditingState)
@@ -4516,6 +4701,7 @@ var initState = function (message) {
4516
4701
  imageOrder: [],
4517
4702
  imageUploads: __assign({}, emptyImageUploads),
4518
4703
  mentioned_users: [],
4704
+ setText: function () { return null; },
4519
4705
  text: '',
4520
4706
  };
4521
4707
  }
@@ -4567,6 +4753,7 @@ var initState = function (message) {
4567
4753
  imageOrder: imageOrder,
4568
4754
  imageUploads: imageUploads,
4569
4755
  mentioned_users: mentioned_users,
4756
+ setText: function () { return null; },
4570
4757
  text: message.text || '',
4571
4758
  };
4572
4759
  };
@@ -4655,12 +4842,15 @@ var useMessageInputState = function (props) {
4655
4842
  var onSelectUser = React.useCallback(function (item) {
4656
4843
  dispatch({ type: 'addMentionedUser', user: item });
4657
4844
  }, []);
4845
+ var setText = React.useCallback(function (text) {
4846
+ dispatch({ getNewText: function () { return text; }, type: 'setText' });
4847
+ }, []);
4658
4848
  return __assign(__assign({}, state), { closeCommandsList: closeCommandsList,
4659
4849
  /**
4660
4850
  * TODO: fix the below at some point because this type casting is wrong
4661
4851
  * and just forced to not have warnings currently with the unknown casting
4662
4852
  */
4663
- closeEmojiPicker: closeEmojiPicker, emojiIndex: useEmojiIndex(), emojiPickerRef: emojiPickerRef, handleChange: handleChange, handleEmojiKeyDown: handleEmojiKeyDown, handleSubmit: handleSubmit, insertText: insertText, isUploadEnabled: isUploadEnabled, maxFilesLeft: maxFilesLeft, numberOfUploads: numberOfUploads, onPaste: onPaste, onSelectEmoji: onSelectEmoji, onSelectUser: onSelectUser, openCommandsList: openCommandsList, openEmojiPicker: openEmojiPicker, removeFile: removeFile, removeImage: removeImage, showCommandsList: showCommandsList, textareaRef: textareaRef, uploadFile: uploadFile, uploadImage: uploadImage, uploadNewFiles: uploadNewFiles });
4853
+ closeEmojiPicker: closeEmojiPicker, emojiIndex: useEmojiIndex(), emojiPickerRef: emojiPickerRef, handleChange: handleChange, handleEmojiKeyDown: handleEmojiKeyDown, handleSubmit: handleSubmit, insertText: insertText, isUploadEnabled: isUploadEnabled, maxFilesLeft: maxFilesLeft, numberOfUploads: numberOfUploads, onPaste: onPaste, onSelectEmoji: onSelectEmoji, onSelectUser: onSelectUser, openCommandsList: openCommandsList, openEmojiPicker: openEmojiPicker, removeFile: removeFile, removeImage: removeImage, setText: setText, showCommandsList: showCommandsList, textareaRef: textareaRef, uploadFile: uploadFile, uploadImage: uploadImage, uploadNewFiles: uploadNewFiles });
4664
4854
  };
4665
4855
 
4666
4856
  var QuotedMessagePreviewHeader = function () {
@@ -4722,13 +4912,101 @@ var MessageInputFlat = function () {
4722
4912
  !cooldownRemaining && React__default['default'].createElement(SendButton$1, { sendMessage: handleSubmit })))));
4723
4913
  };
4724
4914
 
4915
+ var useCreateMessageInputContext = function (value) {
4916
+ var additionalTextareaProps = value.additionalTextareaProps, attachments = value.attachments, autocompleteTriggers = value.autocompleteTriggers, clearEditingState = value.clearEditingState, closeCommandsList = value.closeCommandsList, closeEmojiPicker = value.closeEmojiPicker, cooldownInterval = value.cooldownInterval, disabled = value.disabled, disableMentions = value.disableMentions, doFileUploadRequest = value.doFileUploadRequest, doImageUploadRequest = value.doImageUploadRequest, emojiIndex = value.emojiIndex, emojiPickerIsOpen = value.emojiPickerIsOpen, emojiPickerRef = value.emojiPickerRef, errorHandler = value.errorHandler, fileOrder = value.fileOrder, fileUploads = value.fileUploads, focus = value.focus, grow = value.grow, handleChange = value.handleChange, handleEmojiKeyDown = value.handleEmojiKeyDown, handleSubmit = value.handleSubmit, imageOrder = value.imageOrder, imageUploads = value.imageUploads, insertText = value.insertText, isUploadEnabled = value.isUploadEnabled, keycodeSubmitKeys = value.keycodeSubmitKeys, maxFilesLeft = value.maxFilesLeft, maxRows = value.maxRows, mentionAllAppUsers = value.mentionAllAppUsers, mentioned_users = value.mentioned_users, mentionQueryParams = value.mentionQueryParams, message = value.message, noFiles = value.noFiles, numberOfUploads = value.numberOfUploads, onPaste = value.onPaste, onSelectEmoji = value.onSelectEmoji, onSelectUser = value.onSelectUser, openCommandsList = value.openCommandsList, openEmojiPicker = value.openEmojiPicker, overrideSubmitHandler = value.overrideSubmitHandler, parent = value.parent, publishTypingEvent = value.publishTypingEvent, removeFile = value.removeFile, removeImage = value.removeImage, setCooldownRemaining = value.setCooldownRemaining, setText = value.setText, showCommandsList = value.showCommandsList, text = value.text, textareaRef = value.textareaRef, uploadFile = value.uploadFile, uploadImage = value.uploadImage, uploadNewFiles = value.uploadNewFiles, useMentionsTransliteration = value.useMentionsTransliteration;
4917
+ var editing = message === null || message === void 0 ? void 0 : message.editing;
4918
+ var fileUploadsValue = Object.entries(fileUploads)
4919
+ // eslint-disable-next-line
4920
+ .map(function (_a) {
4921
+ _a[0]; var value = _a[1];
4922
+ return value.state;
4923
+ })
4924
+ .join();
4925
+ var imageUploadsValue = Object.entries(imageUploads)
4926
+ // eslint-disable-next-line
4927
+ .map(function (_a) {
4928
+ _a[0]; var value = _a[1];
4929
+ return value.state;
4930
+ })
4931
+ .join();
4932
+ var mentionedUsersLength = mentioned_users.length;
4933
+ var parentId = parent === null || parent === void 0 ? void 0 : parent.id;
4934
+ var messageInputContext = React.useMemo(function () { return ({
4935
+ additionalTextareaProps: additionalTextareaProps,
4936
+ attachments: attachments,
4937
+ autocompleteTriggers: autocompleteTriggers,
4938
+ clearEditingState: clearEditingState,
4939
+ closeCommandsList: closeCommandsList,
4940
+ closeEmojiPicker: closeEmojiPicker,
4941
+ cooldownInterval: cooldownInterval,
4942
+ disabled: disabled,
4943
+ disableMentions: disableMentions,
4944
+ doFileUploadRequest: doFileUploadRequest,
4945
+ doImageUploadRequest: doImageUploadRequest,
4946
+ emojiIndex: emojiIndex,
4947
+ emojiPickerIsOpen: emojiPickerIsOpen,
4948
+ emojiPickerRef: emojiPickerRef,
4949
+ errorHandler: errorHandler,
4950
+ fileOrder: fileOrder,
4951
+ fileUploads: fileUploads,
4952
+ focus: focus,
4953
+ grow: grow,
4954
+ handleChange: handleChange,
4955
+ handleEmojiKeyDown: handleEmojiKeyDown,
4956
+ handleSubmit: handleSubmit,
4957
+ imageOrder: imageOrder,
4958
+ imageUploads: imageUploads,
4959
+ insertText: insertText,
4960
+ isUploadEnabled: isUploadEnabled,
4961
+ keycodeSubmitKeys: keycodeSubmitKeys,
4962
+ maxFilesLeft: maxFilesLeft,
4963
+ maxRows: maxRows,
4964
+ mentionAllAppUsers: mentionAllAppUsers,
4965
+ mentioned_users: mentioned_users,
4966
+ mentionQueryParams: mentionQueryParams,
4967
+ message: message,
4968
+ noFiles: noFiles,
4969
+ numberOfUploads: numberOfUploads,
4970
+ onPaste: onPaste,
4971
+ onSelectEmoji: onSelectEmoji,
4972
+ onSelectUser: onSelectUser,
4973
+ openCommandsList: openCommandsList,
4974
+ openEmojiPicker: openEmojiPicker,
4975
+ overrideSubmitHandler: overrideSubmitHandler,
4976
+ parent: parent,
4977
+ publishTypingEvent: publishTypingEvent,
4978
+ removeFile: removeFile,
4979
+ removeImage: removeImage,
4980
+ setCooldownRemaining: setCooldownRemaining,
4981
+ setText: setText,
4982
+ showCommandsList: showCommandsList,
4983
+ text: text,
4984
+ textareaRef: textareaRef,
4985
+ uploadFile: uploadFile,
4986
+ uploadImage: uploadImage,
4987
+ uploadNewFiles: uploadNewFiles,
4988
+ useMentionsTransliteration: useMentionsTransliteration,
4989
+ }); }, [
4990
+ editing,
4991
+ emojiPickerIsOpen,
4992
+ fileUploadsValue,
4993
+ imageUploadsValue,
4994
+ isUploadEnabled,
4995
+ mentionedUsersLength,
4996
+ parentId,
4997
+ publishTypingEvent,
4998
+ text,
4999
+ ]);
5000
+ return messageInputContext;
5001
+ };
5002
+
4725
5003
  var UnMemoizedMessageInput = function (props) {
4726
5004
  var PropInput = props.Input;
4727
5005
  var _a = useComponentContext(), ContextInput = _a.Input, _b = _a.TriggerProvider, TriggerProvider = _b === void 0 ? DefaultTriggerProvider : _b;
4728
5006
  var Input = PropInput || ContextInput || MessageInputFlat;
4729
5007
  var messageInputState = useMessageInputState(props);
4730
5008
  var cooldownTimerState = useCooldownTimer();
4731
- var messageInputContextValue = __assign(__assign(__assign({}, cooldownTimerState), messageInputState), props);
5009
+ var messageInputContextValue = useCreateMessageInputContext(__assign(__assign(__assign({}, cooldownTimerState), messageInputState), props));
4732
5010
  return (React__default['default'].createElement(MessageInputContextProvider, { value: messageInputContextValue },
4733
5011
  React__default['default'].createElement(TriggerProvider, null,
4734
5012
  React__default['default'].createElement(Input, null))));
@@ -5120,7 +5398,7 @@ var UnMemoizedChannel = function (props) {
5120
5398
  return React__default['default'].createElement(ChannelInner, __assign({}, props, { channel: channel, key: channel.cid }));
5121
5399
  };
5122
5400
  var ChannelInner = function (props) {
5123
- var acceptedFiles = props.acceptedFiles, channel = props.channel, children = props.children, doMarkReadRequest = props.doMarkReadRequest, doSendMessageRequest = props.doSendMessageRequest, doUpdateMessageRequest = props.doUpdateMessageRequest, _a = props.emojiData, emojiData = _a === void 0 ? defaultEmojiData : _a, _b = props.LoadingErrorIndicator, LoadingErrorIndicator$1 = _b === void 0 ? LoadingErrorIndicator : _b, _c = props.LoadingIndicator, LoadingIndicator$1 = _c === void 0 ? LoadingIndicator : _c, maxNumberOfFiles = props.maxNumberOfFiles, _d = props.multipleUploads, multipleUploads = _d === void 0 ? true : _d, onMentionsClick = props.onMentionsClick, onMentionsHover = props.onMentionsHover;
5401
+ var acceptedFiles = props.acceptedFiles, activeUnreadHandler = props.activeUnreadHandler, channel = props.channel, children = props.children, doMarkReadRequest = props.doMarkReadRequest, doSendMessageRequest = props.doSendMessageRequest, doUpdateMessageRequest = props.doUpdateMessageRequest, _a = props.emojiData, emojiData = _a === void 0 ? defaultEmojiData : _a, _b = props.LoadingErrorIndicator, LoadingErrorIndicator$1 = _b === void 0 ? LoadingErrorIndicator : _b, _c = props.LoadingIndicator, LoadingIndicator$1 = _c === void 0 ? LoadingIndicator : _c, maxNumberOfFiles = props.maxNumberOfFiles, _d = props.multipleUploads, multipleUploads = _d === void 0 ? true : _d, onMentionsClick = props.onMentionsClick, onMentionsHover = props.onMentionsHover, skipMessageDataMemoization = props.skipMessageDataMemoization;
5124
5402
  var _e = useChatContext(), client = _e.client, customClasses = _e.customClasses, mutes = _e.mutes, theme = _e.theme, useImageFlagEmojisOnWindows = _e.useImageFlagEmojisOnWindows;
5125
5403
  var t = useTranslationContext().t;
5126
5404
  var _f = React.useState([]), notifications = _f[0], setNotifications = _f[1];
@@ -5138,14 +5416,12 @@ var ChannelInner = function (props) {
5138
5416
  emojiData: emojiData,
5139
5417
  emojiSetDef: emojiSetDef,
5140
5418
  };
5141
- var throttledCopyStateFromChannel = React.useCallback(throttle__default['default'](function () {
5142
- if (!channel)
5143
- return;
5144
- dispatch({ channel: channel, type: 'copyStateFromChannelOnEvent' });
5145
- }, 500, { leading: true, trailing: true }), [channel]);
5146
- var markRead = React.useCallback(function () {
5147
- var _a;
5148
- if (!channel || channel.disconnected || !((_a = channel.getConfig()) === null || _a === void 0 ? void 0 : _a.read_events)) {
5419
+ var throttledCopyStateFromChannel = throttle__default['default'](function () { return dispatch({ channel: channel, type: 'copyStateFromChannelOnEvent' }); }, 500, {
5420
+ leading: true,
5421
+ trailing: true,
5422
+ });
5423
+ var markRead = function () {
5424
+ if (channel.disconnected || !(channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.read_events)) {
5149
5425
  return;
5150
5426
  }
5151
5427
  lastRead.current = new Date();
@@ -5158,10 +5434,10 @@ var ChannelInner = function (props) {
5158
5434
  if (originalTitle.current) {
5159
5435
  document.title = originalTitle.current;
5160
5436
  }
5161
- }, [channel, doMarkReadRequest]);
5162
- var markReadThrottled = React.useCallback(throttle__default['default'](markRead, 500, { leading: true, trailing: true }), [markRead]);
5163
- var handleEvent = React.useCallback(function (event) {
5164
- var _a, _b, _c, _d, _e;
5437
+ };
5438
+ var markReadThrottled = throttle__default['default'](markRead, 500, { leading: true, trailing: true });
5439
+ var handleEvent = function (event) {
5440
+ var _a, _b, _c, _d;
5165
5441
  if (event.message) {
5166
5442
  dispatch({
5167
5443
  channel: channel,
@@ -5170,11 +5446,7 @@ var ChannelInner = function (props) {
5170
5446
  });
5171
5447
  }
5172
5448
  if (event.type === 'typing.start' || event.type === 'typing.stop') {
5173
- dispatch({
5174
- channel: channel,
5175
- type: 'setTyping',
5176
- });
5177
- return;
5449
+ return dispatch({ channel: channel, type: 'setTyping' });
5178
5450
  }
5179
5451
  if (event.type === 'connection.changed' && typeof event.online === 'boolean') {
5180
5452
  online.current = event.online;
@@ -5188,29 +5460,33 @@ var ChannelInner = function (props) {
5188
5460
  if (!document.hidden) {
5189
5461
  markReadThrottled();
5190
5462
  }
5191
- else if (((_e = channel.getConfig()) === null || _e === void 0 ? void 0 : _e.read_events) && !channel.muteStatus().muted) {
5463
+ else if ((channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.read_events) && !channel.muteStatus().muted) {
5192
5464
  var unread = channel.countUnread(lastRead.current);
5193
- document.title = "(" + unread + ") " + originalTitle.current;
5465
+ if (activeUnreadHandler) {
5466
+ activeUnreadHandler(unread, originalTitle.current);
5467
+ }
5468
+ else {
5469
+ document.title = "(" + unread + ") " + originalTitle.current;
5470
+ }
5194
5471
  }
5195
5472
  }
5196
5473
  }
5197
5474
  throttledCopyStateFromChannel();
5198
- }, [channel, client.userID, markReadThrottled, throttledCopyStateFromChannel]);
5475
+ };
5199
5476
  // useLayoutEffect here to prevent spinner. Use Suspense when it is available in stable release
5200
5477
  React.useLayoutEffect(function () {
5201
5478
  var errored = false;
5202
5479
  var done = false;
5203
5480
  var onVisibilityChange = function () {
5204
- if (!document.hidden) {
5481
+ if (!document.hidden)
5205
5482
  markRead();
5206
- }
5207
5483
  };
5208
5484
  (function () { return __awaiter(void 0, void 0, void 0, function () {
5209
5485
  var e_1;
5210
5486
  return __generator(this, function (_a) {
5211
5487
  switch (_a.label) {
5212
5488
  case 0:
5213
- if (!(channel && !channel.initialized)) return [3 /*break*/, 4];
5489
+ if (!!channel.initialized) return [3 /*break*/, 4];
5214
5490
  _a.label = 1;
5215
5491
  case 1:
5216
5492
  _a.trys.push([1, 3, , 4]);
@@ -5226,7 +5502,7 @@ var ChannelInner = function (props) {
5226
5502
  case 4:
5227
5503
  done = true;
5228
5504
  originalTitle.current = document.title;
5229
- if (channel && !errored) {
5505
+ if (!errored) {
5230
5506
  dispatch({ channel: channel, type: 'initStateFromChannel' });
5231
5507
  if (channel.countUnread() > 0)
5232
5508
  markRead();
@@ -5246,15 +5522,14 @@ var ChannelInner = function (props) {
5246
5522
  if (errored || !done)
5247
5523
  return;
5248
5524
  document.removeEventListener('visibilitychange', onVisibilityChange);
5249
- if (channel)
5250
- channel.off(handleEvent);
5525
+ channel === null || channel === void 0 ? void 0 : channel.off(handleEvent);
5251
5526
  client.off('connection.changed', handleEvent);
5252
5527
  client.off('connection.recovered', handleEvent);
5253
5528
  client.off('user.updated', handleEvent);
5254
5529
  client.off('user.deleted', handleEvent);
5255
5530
  notificationTimeouts.forEach(clearTimeout);
5256
5531
  };
5257
- }, [channel, client, handleEvent, markRead]);
5532
+ }, [channel.cid]);
5258
5533
  React.useEffect(function () {
5259
5534
  var _a;
5260
5535
  if (state.thread && ((_a = state.messages) === null || _a === void 0 ? void 0 : _a.length)) {
@@ -5281,17 +5556,15 @@ var ChannelInner = function (props) {
5281
5556
  }, 5000);
5282
5557
  notificationTimeouts.push(timeout);
5283
5558
  };
5284
- var loadMoreFinished = React.useCallback(debounce__default['default'](function (hasMore, messages) {
5559
+ var loadMoreFinished = debounce__default['default'](function (hasMore, messages) {
5285
5560
  if (!isMounted.current)
5286
5561
  return;
5287
5562
  dispatch({ hasMore: hasMore, messages: messages, type: 'loadMoreFinished' });
5288
5563
  }, 2000, {
5289
5564
  leading: true,
5290
5565
  trailing: true,
5291
- }), []);
5292
- var loadMore = React.useCallback(
5293
- // eslint-disable-next-line @typescript-eslint/no-inferrable-types
5294
- function (limit) {
5566
+ });
5567
+ var loadMore = function (limit) {
5295
5568
  if (limit === void 0) { limit = 100; }
5296
5569
  return __awaiter(void 0, void 0, void 0, function () {
5297
5570
  var oldestMessage, oldestID, perPage, queryResponse, e_2, hasMoreMessages;
@@ -5299,7 +5572,7 @@ var ChannelInner = function (props) {
5299
5572
  return __generator(this, function (_b) {
5300
5573
  switch (_b.label) {
5301
5574
  case 0:
5302
- if (!online.current || !window.navigator.onLine || !channel)
5575
+ if (!online.current || !window.navigator.onLine)
5303
5576
  return [2 /*return*/, 0];
5304
5577
  oldestMessage = (_a = state === null || state === void 0 ? void 0 : state.messages) === null || _a === void 0 ? void 0 : _a[0];
5305
5578
  if (state.loadingMore || (oldestMessage === null || oldestMessage === void 0 ? void 0 : oldestMessage.status) !== 'received')
@@ -5334,27 +5607,22 @@ var ChannelInner = function (props) {
5334
5607
  }
5335
5608
  });
5336
5609
  });
5337
- }, [channel, loadMoreFinished, online, state.loadingMore, state.messages]);
5338
- var updateMessage = React.useCallback(function (updatedMessage) {
5339
- if (!channel)
5340
- return;
5341
- // adds the message to the local channel state..
5342
- // this adds to both the main channel state as well as any reply threads
5610
+ };
5611
+ var updateMessage = function (updatedMessage) {
5612
+ // add the message to the local channel state
5343
5613
  channel.state.addMessageSorted(updatedMessage, true);
5344
5614
  dispatch({
5345
5615
  channel: channel,
5346
5616
  parentId: state.thread && updatedMessage.parent_id,
5347
5617
  type: 'copyMessagesFromChannel',
5348
5618
  });
5349
- }, [channel, state.thread]);
5619
+ };
5350
5620
  var isUserResponseArray = function (output) { var _a; return ((_a = output[0]) === null || _a === void 0 ? void 0 : _a.id) != null; };
5351
- var doSendMessage = React.useCallback(function (message, customMessageData) { return __awaiter(void 0, void 0, void 0, function () {
5621
+ var doSendMessage = function (message, customMessageData) { return __awaiter(void 0, void 0, void 0, function () {
5352
5622
  var attachments, id, _a, mentioned_users, parent_id, text, mentions, messageData, messageResponse, error_1, stringError, parsedError;
5353
5623
  return __generator(this, function (_b) {
5354
5624
  switch (_b.label) {
5355
5625
  case 0:
5356
- if (!channel)
5357
- return [2 /*return*/];
5358
5626
  attachments = message.attachments, id = message.id, _a = message.mentioned_users, mentioned_users = _a === void 0 ? [] : _a, parent_id = message.parent_id, text = message.text;
5359
5627
  mentions = isUserResponseArray(mentioned_users)
5360
5628
  ? mentioned_users.map(function (_a) {
@@ -5378,7 +5646,7 @@ var ChannelInner = function (props) {
5378
5646
  _b.label = 5;
5379
5647
  case 5:
5380
5648
  // replace it after send is completed
5381
- if (messageResponse && messageResponse.message) {
5649
+ if (messageResponse === null || messageResponse === void 0 ? void 0 : messageResponse.message) {
5382
5650
  updateMessage(__assign(__assign({}, messageResponse.message), { status: 'received' }));
5383
5651
  }
5384
5652
  if (quotedMessage)
@@ -5393,25 +5661,20 @@ var ChannelInner = function (props) {
5393
5661
  case 7: return [2 /*return*/];
5394
5662
  }
5395
5663
  });
5396
- }); }, [channel, doSendMessageRequest, quotedMessage, updateMessage]);
5397
- var createMessagePreview = React.useCallback(function (text, attachments, parent, mentioned_users) {
5398
- // create a preview of the message
5664
+ }); };
5665
+ var createMessagePreview = function (text, attachments, parent, mentioned_users) {
5399
5666
  var clientSideID = client.userID + "-" + uuid.v4();
5400
5667
  return __assign({ __html: text, attachments: attachments, created_at: new Date(), html: text, id: clientSideID, mentioned_users: mentioned_users, reactions: [], status: 'sending', text: text, type: 'regular', user: client.user }, ((parent === null || parent === void 0 ? void 0 : parent.id) ? { parent_id: parent.id } : null));
5401
- }, [client.user, client.userID]);
5402
- var sendMessage = React.useCallback(function (_a, customMessageData) {
5668
+ };
5669
+ var sendMessage = function (_a, customMessageData) {
5403
5670
  var _b = _a.attachments, attachments = _b === void 0 ? [] : _b, _c = _a.mentioned_users, mentioned_users = _c === void 0 ? [] : _c, _d = _a.parent, parent = _d === void 0 ? undefined : _d, _e = _a.text, text = _e === void 0 ? '' : _e;
5404
5671
  return __awaiter(void 0, void 0, void 0, function () {
5405
5672
  var messagePreview;
5406
5673
  return __generator(this, function (_f) {
5407
5674
  switch (_f.label) {
5408
5675
  case 0:
5409
- if (!channel)
5410
- return [2 /*return*/];
5411
- // remove error messages upon submit
5412
5676
  channel.state.filterErrorMessages();
5413
5677
  messagePreview = createMessagePreview(text, attachments, parent, mentioned_users);
5414
- // first we add the message to the UI
5415
5678
  updateMessage(messagePreview);
5416
5679
  return [4 /*yield*/, doSendMessage(messagePreview, customMessageData)];
5417
5680
  case 1:
@@ -5420,62 +5683,55 @@ var ChannelInner = function (props) {
5420
5683
  }
5421
5684
  });
5422
5685
  });
5423
- }, [channel === null || channel === void 0 ? void 0 : channel.state, createMessagePreview, doSendMessage, updateMessage]);
5424
- var retrySendMessage = React.useCallback(function (message) { return __awaiter(void 0, void 0, void 0, function () {
5686
+ };
5687
+ var retrySendMessage = function (message) { return __awaiter(void 0, void 0, void 0, function () {
5425
5688
  return __generator(this, function (_a) {
5426
5689
  switch (_a.label) {
5427
5690
  case 0:
5428
- // set the message status to sending
5429
5691
  updateMessage(__assign(__assign({}, message), { errorStatusCode: undefined, status: 'sending' }));
5430
- // actually try to send the message...
5431
5692
  return [4 /*yield*/, doSendMessage(message)];
5432
5693
  case 1:
5433
- // actually try to send the message...
5434
5694
  _a.sent();
5435
5695
  return [2 /*return*/];
5436
5696
  }
5437
5697
  });
5438
- }); }, [doSendMessage, updateMessage]);
5439
- var removeMessage = React.useCallback(function (message) {
5440
- if (!channel)
5441
- return;
5698
+ }); };
5699
+ var removeMessage = function (message) {
5442
5700
  channel.state.removeMessage(message);
5443
5701
  dispatch({
5444
5702
  channel: channel,
5445
5703
  parentId: state.thread && message.parent_id,
5446
5704
  type: 'copyMessagesFromChannel',
5447
5705
  });
5448
- }, [channel, state.thread]);
5706
+ };
5449
5707
  /** THREAD */
5450
- var openThread = React.useCallback(function (message, event) {
5451
- if (!channel)
5452
- return;
5453
- if (event && event.preventDefault) {
5454
- event.preventDefault();
5455
- }
5708
+ var openThread = function (message, event) {
5709
+ event.preventDefault();
5456
5710
  dispatch({ channel: channel, message: message, type: 'openThread' });
5457
- }, [channel]);
5458
- var loadMoreThreadFinished = React.useCallback(debounce__default['default'](function (threadHasMore, threadMessages) {
5711
+ };
5712
+ var closeThread = function (event) {
5713
+ event.preventDefault();
5714
+ dispatch({ type: 'closeThread' });
5715
+ };
5716
+ var loadMoreThreadFinished = debounce__default['default'](function (threadHasMore, threadMessages) {
5459
5717
  dispatch({
5460
5718
  threadHasMore: threadHasMore,
5461
5719
  threadMessages: threadMessages,
5462
5720
  type: 'loadMoreThreadFinished',
5463
5721
  });
5464
- }, 2000, { leading: true, trailing: true }), []);
5465
- var loadMoreThread = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
5722
+ }, 2000, { leading: true, trailing: true });
5723
+ var loadMoreThread = function () { return __awaiter(void 0, void 0, void 0, function () {
5466
5724
  var parentID, oldMessages, oldestMessageID, limit, queryResponse, threadHasMoreMessages, newThreadMessages;
5467
5725
  var _a;
5468
5726
  return __generator(this, function (_b) {
5469
5727
  switch (_b.label) {
5470
5728
  case 0:
5471
- // prevent duplicate loading events...
5472
- if (!channel || state.threadLoadingMore || !state.thread)
5729
+ if (state.threadLoadingMore || !state.thread)
5473
5730
  return [2 /*return*/];
5474
5731
  dispatch({ type: 'startLoadingThread' });
5475
5732
  parentID = state.thread.id;
5476
5733
  if (!parentID) {
5477
- dispatch({ type: 'closeThread' });
5478
- return [2 /*return*/];
5734
+ return [2 /*return*/, dispatch({ type: 'closeThread' })];
5479
5735
  }
5480
5736
  oldMessages = channel.state.threads[parentID] || [];
5481
5737
  oldestMessageID = (_a = oldMessages[0]) === null || _a === void 0 ? void 0 : _a.id;
@@ -5491,7 +5747,7 @@ var ChannelInner = function (props) {
5491
5747
  queryResponse = _b.sent();
5492
5748
  threadHasMoreMessages = queryResponse.messages.length === limit;
5493
5749
  newThreadMessages = channel.state.threads[parentID] || [];
5494
- // next set loadingMore to false so we can start asking for more data...
5750
+ // next set loadingMore to false so we can start asking for more data
5495
5751
  loadMoreThreadFinished(threadHasMoreMessages, newThreadMessages);
5496
5752
  return [3 /*break*/, 4];
5497
5753
  case 3:
@@ -5501,18 +5757,12 @@ var ChannelInner = function (props) {
5501
5757
  case 4: return [2 /*return*/];
5502
5758
  }
5503
5759
  });
5504
- }); }, [channel, loadMoreThreadFinished, state.thread, state.threadLoadingMore]);
5505
- var closeThread = React.useCallback(function (event) {
5506
- if (event && event.preventDefault) {
5507
- event.preventDefault();
5508
- }
5509
- dispatch({ type: 'closeThread' });
5510
- }, []);
5760
+ }); };
5511
5761
  var onMentionsHoverOrClick = useMentionsHandlers(onMentionsHover, onMentionsClick);
5512
5762
  var editMessage = useEditMessageHandler(doUpdateMessageRequest);
5513
5763
  var typing = state.typing, restState = __rest(state, ["typing"]);
5514
- var channelStateContextValue = __assign(__assign({}, restState), { acceptedFiles: acceptedFiles, channel: channel, channelConfig: channelConfig, maxNumberOfFiles: maxNumberOfFiles, multipleUploads: multipleUploads, mutes: mutes, notifications: notifications, quotedMessage: quotedMessage, watcher_count: state.watcherCount });
5515
- var channelActionContextValue = {
5764
+ var channelStateContextValue = useCreateChannelStateContext(__assign(__assign({}, restState), { acceptedFiles: acceptedFiles, channel: channel, channelConfig: channelConfig, maxNumberOfFiles: maxNumberOfFiles, multipleUploads: multipleUploads, mutes: mutes, notifications: notifications, quotedMessage: quotedMessage, watcher_count: state.watcherCount }));
5765
+ var channelActionContextValue = React.useMemo(function () { return ({
5516
5766
  addNotification: addNotification,
5517
5767
  closeThread: closeThread,
5518
5768
  dispatch: dispatch,
@@ -5526,8 +5776,9 @@ var ChannelInner = function (props) {
5526
5776
  retrySendMessage: retrySendMessage,
5527
5777
  sendMessage: sendMessage,
5528
5778
  setQuotedMessage: setQuotedMessage,
5779
+ skipMessageDataMemoization: skipMessageDataMemoization,
5529
5780
  updateMessage: updateMessage,
5530
- };
5781
+ }); }, [channel.cid, loadMore, quotedMessage]);
5531
5782
  var componentContextValue = React.useMemo(function () { return ({
5532
5783
  Attachment: props.Attachment || Attachment,
5533
5784
  AutocompleteSuggestionHeader: props.AutocompleteSuggestionHeader,
@@ -5571,13 +5822,13 @@ var ChannelInner = function (props) {
5571
5822
  EmojiIndex: props.EmojiIndex,
5572
5823
  EmojiPicker: props.EmojiPicker,
5573
5824
  }); }, []);
5574
- var typingContextValue = {
5825
+ var typingContextValue = useCreateTypingContext({
5575
5826
  typing: typing,
5576
- };
5827
+ });
5577
5828
  var chatClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.chat) || 'str-chat';
5578
5829
  var channelClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.channel) || 'str-chat-channel';
5579
5830
  var windowsEmojiClass = useImageFlagEmojisOnWindows && navigator.userAgent.match(/Win/)
5580
- ? ' str-chat--windows-flags'
5831
+ ? 'str-chat--windows-flags'
5581
5832
  : '';
5582
5833
  if (state.error) {
5583
5834
  return (React__default['default'].createElement("div", { className: chatClass + " " + channelClass + " " + theme },
@@ -5587,7 +5838,7 @@ var ChannelInner = function (props) {
5587
5838
  return (React__default['default'].createElement("div", { className: chatClass + " " + channelClass + " " + theme },
5588
5839
  React__default['default'].createElement(LoadingIndicator$1, { size: 25 })));
5589
5840
  }
5590
- if (!(channel === null || channel === void 0 ? void 0 : channel.watch)) {
5841
+ if (!channel.watch) {
5591
5842
  return (React__default['default'].createElement("div", { className: chatClass + " " + channelClass + " " + theme },
5592
5843
  React__default['default'].createElement("div", null, t('Channel Missing'))));
5593
5844
  }
@@ -5881,7 +6132,8 @@ var useMobileNavigation = function (channelListRef, navOpen, closeMobileNav) {
5881
6132
  }, [channelListRef, closeMobileNav, navOpen]);
5882
6133
  };
5883
6134
 
5884
- var useNotificationAddedToChannelListener = function (setChannels, customHandler) {
6135
+ var useNotificationAddedToChannelListener = function (setChannels, customHandler, allowNewMessagesFromUnfilteredChannels) {
6136
+ if (allowNewMessagesFromUnfilteredChannels === void 0) { allowNewMessagesFromUnfilteredChannels = true; }
5885
6137
  var client = useChatContext().client;
5886
6138
  React.useEffect(function () {
5887
6139
  var handleEvent = function (event) { return __awaiter(void 0, void 0, void 0, function () {
@@ -5894,7 +6146,7 @@ var useNotificationAddedToChannelListener = function (setChannels, customHandler
5894
6146
  customHandler(setChannels, event);
5895
6147
  return [3 /*break*/, 3];
5896
6148
  case 1:
5897
- if (!((_a = event.channel) === null || _a === void 0 ? void 0 : _a.type)) return [3 /*break*/, 3];
6149
+ if (!(allowNewMessagesFromUnfilteredChannels && ((_a = event.channel) === null || _a === void 0 ? void 0 : _a.type))) return [3 /*break*/, 3];
5898
6150
  return [4 /*yield*/, getChannel(client, event.channel.type, event.channel.id)];
5899
6151
  case 2:
5900
6152
  channel_1 = _b.sent();
@@ -5911,7 +6163,8 @@ var useNotificationAddedToChannelListener = function (setChannels, customHandler
5911
6163
  }, [customHandler]);
5912
6164
  };
5913
6165
 
5914
- var useNotificationMessageNewListener = function (setChannels, customHandler, setOffset) {
6166
+ var useNotificationMessageNewListener = function (setChannels, customHandler, allowNewMessagesFromUnfilteredChannels) {
6167
+ if (allowNewMessagesFromUnfilteredChannels === void 0) { allowNewMessagesFromUnfilteredChannels = true; }
5915
6168
  var client = useChatContext().client;
5916
6169
  React.useEffect(function () {
5917
6170
  var handleEvent = function (event) { return __awaiter(void 0, void 0, void 0, function () {
@@ -5924,16 +6177,13 @@ var useNotificationMessageNewListener = function (setChannels, customHandler, se
5924
6177
  customHandler(setChannels, event);
5925
6178
  return [3 /*break*/, 3];
5926
6179
  case 1:
5927
- if (!((_a = event.channel) === null || _a === void 0 ? void 0 : _a.type)) return [3 /*break*/, 3];
6180
+ if (!(allowNewMessagesFromUnfilteredChannels && ((_a = event.channel) === null || _a === void 0 ? void 0 : _a.type))) return [3 /*break*/, 3];
5928
6181
  return [4 /*yield*/, getChannel(client, event.channel.type, event.channel.id)];
5929
6182
  case 2:
5930
6183
  channel_1 = _b.sent();
5931
- // move channel to starting position
5932
6184
  setChannels(function (channels) { return uniqBy__default['default'](__spreadArray([channel_1], channels), 'cid'); });
5933
6185
  _b.label = 3;
5934
- case 3:
5935
- setOffset === null || setOffset === void 0 ? void 0 : setOffset(function (prevOffset) { return prevOffset + 1; });
5936
- return [2 /*return*/];
6186
+ case 3: return [2 /*return*/];
5937
6187
  }
5938
6188
  });
5939
6189
  }); };
@@ -5967,12 +6217,11 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
5967
6217
  var _b = React.useState(false), error = _b[0], setError = _b[1];
5968
6218
  var _c = React.useState(true), hasNextPage = _c[0], setHasNextPage = _c[1];
5969
6219
  var _d = React.useState(true), loadingChannels = _d[0], setLoadingChannels = _d[1];
5970
- var _e = React.useState(0), offset = _e[0], setOffset = _e[1];
5971
- var _f = React.useState(true), refreshing = _f[0], setRefreshing = _f[1];
6220
+ var _e = React.useState(true), refreshing = _e[0], setRefreshing = _e[1];
5972
6221
  var filterString = React.useMemo(function () { return JSON.stringify(filters); }, [filters]);
5973
6222
  var sortString = React.useMemo(function () { return JSON.stringify(sort); }, [sort]);
5974
6223
  var queryChannels = function (queryType) { return __awaiter(void 0, void 0, void 0, function () {
5975
- var newOptions, channelQueryResponse, newChannels, err_1;
6224
+ var offset, newOptions, channelQueryResponse, newChannels, err_1;
5976
6225
  var _a;
5977
6226
  return __generator(this, function (_b) {
5978
6227
  switch (_b.label) {
@@ -5982,27 +6231,21 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
5982
6231
  setLoadingChannels(true);
5983
6232
  }
5984
6233
  setRefreshing(true);
5985
- newOptions = __assign({ limit: (_a = options === null || options === void 0 ? void 0 : options.limit) !== null && _a !== void 0 ? _a : MAX_QUERY_CHANNELS_LIMIT, offset: queryType === 'reload' ? 0 : offset }, options);
6234
+ offset = queryType === 'reload' ? 0 : channels.length;
6235
+ newOptions = __assign({ limit: (_a = options === null || options === void 0 ? void 0 : options.limit) !== null && _a !== void 0 ? _a : MAX_QUERY_CHANNELS_LIMIT, offset: offset }, options);
5986
6236
  _b.label = 1;
5987
6237
  case 1:
5988
6238
  _b.trys.push([1, 3, , 4]);
5989
6239
  return [4 /*yield*/, client.queryChannels(filters, sort || {}, newOptions)];
5990
6240
  case 2:
5991
6241
  channelQueryResponse = _b.sent();
5992
- newChannels = void 0;
5993
- if (queryType === 'reload') {
5994
- newChannels = channelQueryResponse;
5995
- }
5996
- else {
5997
- newChannels = __spreadArray(__spreadArray([], channels), channelQueryResponse);
5998
- }
6242
+ newChannels = queryType === 'reload' ? channelQueryResponse : __spreadArray(__spreadArray([], channels), channelQueryResponse);
5999
6243
  setChannels(newChannels);
6000
6244
  setHasNextPage(channelQueryResponse.length >= newOptions.limit);
6001
- // Set active channel only after first page.
6002
- if (offset === 0 && activeChannelHandler) {
6245
+ // Set active channel only on load of first page
6246
+ if (!offset && activeChannelHandler) {
6003
6247
  activeChannelHandler(newChannels, setChannels);
6004
6248
  }
6005
- setOffset(newChannels.length);
6006
6249
  return [3 /*break*/, 4];
6007
6250
  case 3:
6008
6251
  err_1 = _b.sent();
@@ -6027,7 +6270,6 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
6027
6270
  hasNextPage: hasNextPage,
6028
6271
  loadNextPage: loadNextPage,
6029
6272
  setChannels: setChannels,
6030
- setOffset: setOffset,
6031
6273
  status: {
6032
6274
  error: error,
6033
6275
  loadingChannels: loadingChannels,
@@ -6158,6 +6400,16 @@ var ChannelPreview = function (props) {
6158
6400
  var _e = React.useState(0), unread = _e[0], setUnread = _e[1];
6159
6401
  var isActive = (activeChannel === null || activeChannel === void 0 ? void 0 : activeChannel.cid) === channel.cid;
6160
6402
  var muted = useIsChannelMuted(channel).muted;
6403
+ React.useEffect(function () {
6404
+ var handleEvent = function (event) {
6405
+ if (!event.cid)
6406
+ return setUnread(0);
6407
+ if (channel.cid === event.cid)
6408
+ setUnread(0);
6409
+ };
6410
+ client.on('notification.mark_read', handleEvent);
6411
+ return function () { return client.off('notification.mark_read', handleEvent); };
6412
+ }, []);
6161
6413
  React.useEffect(function () {
6162
6414
  if (isActive || muted) {
6163
6415
  setUnread(0);
@@ -6467,12 +6719,12 @@ var UnMemoizedChannelList = function (props) {
6467
6719
  * force a re-render. Incrementing this dummy variable ensures the channel previews update.
6468
6720
  */
6469
6721
  var forceUpdate = function () { return setChannelUpdateCount(function (count) { return count + 1; }); };
6470
- var _r = usePaginatedChannels(client, filters || DEFAULT_FILTERS, sort || DEFAULT_SORT, options || DEFAULT_OPTIONS, activeChannelHandler), channels = _r.channels, hasNextPage = _r.hasNextPage, loadNextPage = _r.loadNextPage, setChannels = _r.setChannels, setOffset = _r.setOffset, status = _r.status;
6722
+ var _r = usePaginatedChannels(client, filters || DEFAULT_FILTERS, sort || DEFAULT_SORT, options || DEFAULT_OPTIONS, activeChannelHandler), channels = _r.channels, hasNextPage = _r.hasNextPage, loadNextPage = _r.loadNextPage, setChannels = _r.setChannels, status = _r.status;
6471
6723
  var loadedChannels = channelRenderFilterFn ? channelRenderFilterFn(channels) : channels;
6472
6724
  useMobileNavigation(channelListRef, navOpen, closeMobileNav);
6473
6725
  useMessageNewListener(setChannels, lockChannelOrder, allowNewMessagesFromUnfilteredChannels);
6474
- useNotificationMessageNewListener(setChannels, onMessageNew, setOffset);
6475
- useNotificationAddedToChannelListener(setChannels, onAddedToChannel);
6726
+ useNotificationMessageNewListener(setChannels, onMessageNew, allowNewMessagesFromUnfilteredChannels);
6727
+ useNotificationAddedToChannelListener(setChannels, onAddedToChannel, allowNewMessagesFromUnfilteredChannels);
6476
6728
  useNotificationRemovedFromChannelListener(setChannels, onRemovedFromChannel);
6477
6729
  useChannelDeletedListener(setChannels, onChannelDeleted);
6478
6730
  useChannelHiddenListener(setChannels, onChannelHidden);
@@ -7149,7 +7401,7 @@ var Streami18n = /** @class */ (function () {
7149
7401
  return Streami18n;
7150
7402
  }());
7151
7403
 
7152
- var version = '6.7.0';
7404
+ var version = '6.9.0';
7153
7405
 
7154
7406
  var useChat = function (_a) {
7155
7407
  var _b;
@@ -7162,7 +7414,7 @@ var useChat = function (_a) {
7162
7414
  var _e = React.useState(), channel = _e[0], setChannel = _e[1];
7163
7415
  var _f = React.useState([]), mutes = _f[0], setMutes = _f[1];
7164
7416
  var _g = React.useState(initialNavOpen), navOpen = _g[0], setNavOpen = _g[1];
7165
- var clientMutes = (_b = client === null || client === void 0 ? void 0 : client.user) === null || _b === void 0 ? void 0 : _b.mutes;
7417
+ var clientMutes = (_b = client.user) === null || _b === void 0 ? void 0 : _b.mutes;
7166
7418
  var closeMobileNav = function () { return setNavOpen(false); };
7167
7419
  var openMobileNav = function () { return setTimeout(function () { return setNavOpen(true); }, 100); };
7168
7420
  React.useEffect(function () {
@@ -7232,6 +7484,27 @@ var useChat = function (_a) {
7232
7484
  };
7233
7485
  };
7234
7486
 
7487
+ var useCreateChatContext = function (value) {
7488
+ var _a;
7489
+ var channel = value.channel, client = value.client, closeMobileNav = value.closeMobileNav, customClasses = value.customClasses, mutes = value.mutes, navOpen = value.navOpen, openMobileNav = value.openMobileNav, setActiveChannel = value.setActiveChannel, theme = value.theme, useImageFlagEmojisOnWindows = value.useImageFlagEmojisOnWindows;
7490
+ var channelCid = channel === null || channel === void 0 ? void 0 : channel.cid;
7491
+ var clientValues = "" + client.clientID + Object.keys(client.activeChannels).length + Object.keys(client.listeners).length + client.mutedChannels.length + "\n " + ((_a = client.user) === null || _a === void 0 ? void 0 : _a.id);
7492
+ var mutedUsersLength = mutes.length;
7493
+ var chatContext = React.useMemo(function () { return ({
7494
+ channel: channel,
7495
+ client: client,
7496
+ closeMobileNav: closeMobileNav,
7497
+ customClasses: customClasses,
7498
+ mutes: mutes,
7499
+ navOpen: navOpen,
7500
+ openMobileNav: openMobileNav,
7501
+ setActiveChannel: setActiveChannel,
7502
+ theme: theme,
7503
+ useImageFlagEmojisOnWindows: useImageFlagEmojisOnWindows,
7504
+ }); }, [channelCid, clientValues, mutedUsersLength, navOpen]);
7505
+ return chatContext;
7506
+ };
7507
+
7235
7508
  var darkModeTheme = {
7236
7509
  '--bg-gradient-end': '#101214',
7237
7510
  '--bg-gradient-start': '#070a0d',
@@ -7270,20 +7543,21 @@ var Chat = function (props) {
7270
7543
  var children = props.children, client = props.client, customClasses = props.customClasses, customStyles = props.customStyles, _a = props.darkMode, darkMode = _a === void 0 ? false : _a, defaultLanguage = props.defaultLanguage, i18nInstance = props.i18nInstance, _b = props.initialNavOpen, initialNavOpen = _b === void 0 ? true : _b, _c = props.theme, theme = _c === void 0 ? 'messaging light' : _c, _d = props.useImageFlagEmojisOnWindows, useImageFlagEmojisOnWindows = _d === void 0 ? false : _d;
7271
7544
  var _e = useChat({ client: client, defaultLanguage: defaultLanguage, i18nInstance: i18nInstance, initialNavOpen: initialNavOpen }), channel = _e.channel, closeMobileNav = _e.closeMobileNav, mutes = _e.mutes, navOpen = _e.navOpen, openMobileNav = _e.openMobileNav, setActiveChannel = _e.setActiveChannel, translators = _e.translators;
7272
7545
  useCustomStyles(darkMode ? darkModeTheme : customStyles);
7546
+ var chatContextValue = useCreateChatContext({
7547
+ channel: channel,
7548
+ client: client,
7549
+ closeMobileNav: closeMobileNav,
7550
+ customClasses: customClasses,
7551
+ mutes: mutes,
7552
+ navOpen: navOpen,
7553
+ openMobileNav: openMobileNav,
7554
+ setActiveChannel: setActiveChannel,
7555
+ theme: theme,
7556
+ useImageFlagEmojisOnWindows: useImageFlagEmojisOnWindows,
7557
+ });
7273
7558
  if (!translators.t)
7274
7559
  return null;
7275
- return (React__default['default'].createElement(ChatProvider, { value: {
7276
- channel: channel,
7277
- client: client,
7278
- closeMobileNav: closeMobileNav,
7279
- customClasses: customClasses,
7280
- mutes: mutes,
7281
- navOpen: navOpen,
7282
- openMobileNav: openMobileNav,
7283
- setActiveChannel: setActiveChannel,
7284
- theme: theme,
7285
- useImageFlagEmojisOnWindows: useImageFlagEmojisOnWindows,
7286
- } },
7560
+ return (React__default['default'].createElement(ChatProvider, { value: chatContextValue },
7287
7561
  React__default['default'].createElement(TranslationProvider, { value: translators }, children)));
7288
7562
  };
7289
7563
 
@@ -8551,7 +8825,7 @@ function useShouldForceScrollToBottom(messages, currentUserId) {
8551
8825
 
8552
8826
  var PREPEND_OFFSET = Math.pow(10, 7);
8553
8827
  var VirtualizedMessageListWithContext = function (props) {
8554
- var channel = props.channel, closeReactionSelectorOnClick = props.closeReactionSelectorOnClick, customMessageRenderer = props.customMessageRenderer, defaultItemHeight = props.defaultItemHeight, _a = props.disableDateSeparator, disableDateSeparator = _a === void 0 ? true : _a, hasMore = props.hasMore, _b = props.hideDeletedMessages, hideDeletedMessages = _b === void 0 ? false : _b, _c = props.hideNewMessageSeparator, hideNewMessageSeparator = _c === void 0 ? false : _c, loadingMore = props.loadingMore, loadMore = props.loadMore, propMessage = props.Message, _d = props.messageLimit, messageLimit = _d === void 0 ? 100 : _d, messages = props.messages, _e = props.overscan, overscan = _e === void 0 ? 0 : _e,
8828
+ var additionalVirtuosoProps = props.additionalVirtuosoProps, channel = props.channel, closeReactionSelectorOnClick = props.closeReactionSelectorOnClick, customMessageRenderer = props.customMessageRenderer, defaultItemHeight = props.defaultItemHeight, _a = props.disableDateSeparator, disableDateSeparator = _a === void 0 ? true : _a, hasMore = props.hasMore, _b = props.hideDeletedMessages, hideDeletedMessages = _b === void 0 ? false : _b, _c = props.hideNewMessageSeparator, hideNewMessageSeparator = _c === void 0 ? false : _c, loadingMore = props.loadingMore, loadMore = props.loadMore, propMessage = props.Message, _d = props.messageLimit, messageLimit = _d === void 0 ? 100 : _d, messages = props.messages, _e = props.overscan, overscan = _e === void 0 ? 0 : _e,
8555
8829
  // TODO: refactor to scrollSeekPlaceHolderConfiguration and components.ScrollSeekPlaceholder, like the Virtuoso Component
8556
8830
  scrollSeekPlaceHolder = props.scrollSeekPlaceHolder, _f = props.scrollToLatestMessageOnFocus, scrollToLatestMessageOnFocus = _f === void 0 ? false : _f, _g = props.separateGiphyPreview, separateGiphyPreview = _g === void 0 ? false : _g, _h = props.shouldGroupByUser, shouldGroupByUser = _h === void 0 ? false : _h, _j = props.stickToBottomScrollBehavior, stickToBottomScrollBehavior = _j === void 0 ? 'smooth' : _j;
8557
8831
  var _k = useComponentContext(), _l = _k.DateSeparator, DateSeparator$1 = _l === void 0 ? DateSeparator : _l, _m = _k.EmptyStateIndicator, EmptyStateIndicator$1 = _m === void 0 ? EmptyStateIndicator : _m, _o = _k.GiphyPreviewMessage, GiphyPreviewMessage$1 = _o === void 0 ? GiphyPreviewMessage : _o, _p = _k.LoadingIndicator, LoadingIndicator$1 = _p === void 0 ? LoadingIndicator : _p, _q = _k.MessageNotification, MessageNotification$1 = _q === void 0 ? MessageNotification : _q, _r = _k.MessageSystem, MessageSystem = _r === void 0 ? EventComponent : _r, _s = _k.TypingIndicator, TypingIndicator = _s === void 0 ? null : _s, _t = _k.VirtualMessage, contextMessage = _t === void 0 ? MessageSimple : _t;
@@ -8679,7 +8953,7 @@ var VirtualizedMessageListWithContext = function (props) {
8679
8953
  var virtualizedMessageListClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.virtualizedMessageList) || 'str-chat__virtual-list';
8680
8954
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
8681
8955
  React__default['default'].createElement("div", { className: virtualizedMessageListClass },
8682
- React__default['default'].createElement(reactVirtuoso.Virtuoso, __assign({ atBottomStateChange: atBottomStateChange, components: virtuosoComponents, firstItemIndex: PREPEND_OFFSET - numItemsPrepended, followOutput: followOutput, initialTopMostItemIndex: processedMessages.length ? processedMessages.length - 1 : 0, itemContent: function (i) { return messageRenderer(processedMessages, i); }, overscan: overscan, ref: virtuoso, startReached: startReached, style: { overflowX: 'hidden' }, totalCount: processedMessages.length }, (scrollSeekPlaceHolder ? { scrollSeek: scrollSeekPlaceHolder } : {}), (defaultItemHeight ? { defaultItemHeight: defaultItemHeight } : {}))),
8956
+ React__default['default'].createElement(reactVirtuoso.Virtuoso, __assign({ atBottomStateChange: atBottomStateChange, components: virtuosoComponents, firstItemIndex: PREPEND_OFFSET - numItemsPrepended, followOutput: followOutput, initialTopMostItemIndex: processedMessages.length ? processedMessages.length - 1 : 0, itemContent: function (i) { return messageRenderer(processedMessages, i); }, overscan: overscan, ref: virtuoso, startReached: startReached, style: { overflowX: 'hidden' }, totalCount: processedMessages.length }, additionalVirtuosoProps, (scrollSeekPlaceHolder ? { scrollSeek: scrollSeekPlaceHolder } : {}), (defaultItemHeight ? { defaultItemHeight: defaultItemHeight } : {}))),
8683
8957
  React__default['default'].createElement("div", { className: 'str-chat__list-notifications' },
8684
8958
  React__default['default'].createElement(MessageNotification$1, { onClick: scrollToBottom, showNotification: newMessagesNotification }, t('New Messages!')))),
8685
8959
  giphyPreviewMessage && React__default['default'].createElement(GiphyPreviewMessage$1, { message: giphyPreviewMessage })));
@@ -8916,6 +9190,7 @@ exports.getLatestMessagePreview = getLatestMessagePreview;
8916
9190
  exports.getMessageActions = getMessageActions;
8917
9191
  exports.getNonImageAttachments = getNonImageAttachments;
8918
9192
  exports.getReadByTooltipText = getReadByTooltipText;
9193
+ exports.getWholeChar = getWholeChar;
8919
9194
  exports.handleActionWarning = handleActionWarning;
8920
9195
  exports.hiTranslations = hiTranslations;
8921
9196
  exports.isAudioAttachment = isAudioAttachment;
@@ -8956,7 +9231,6 @@ exports.renderPreviewText = renderPreviewText;
8956
9231
  exports.renderText = renderText;
8957
9232
  exports.ruTranslations = ruTranslations;
8958
9233
  exports.showMessageActionsBox = showMessageActionsBox;
8959
- exports.smartRender = smartRender;
8960
9234
  exports.trTranslations = trTranslations;
8961
9235
  exports.useActionHandler = useActionHandler;
8962
9236
  exports.useBreakpoint = useBreakpoint;