stream-chat-react 6.8.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 (46) hide show
  1. package/dist/browser.full-bundle.js +1372 -1201
  2. package/dist/browser.full-bundle.js.map +1 -1
  3. package/dist/browser.full-bundle.min.js +2 -2
  4. package/dist/browser.full-bundle.min.js.map +1 -1
  5. package/dist/components/Avatar/Avatar.d.ts.map +1 -1
  6. package/dist/components/Avatar/Avatar.js +3 -1
  7. package/dist/components/Channel/Channel.d.ts +2 -0
  8. package/dist/components/Channel/Channel.d.ts.map +1 -1
  9. package/dist/components/Channel/Channel.js +62 -92
  10. package/dist/components/Channel/hooks/useCreateChannelStateContext.d.ts +15 -0
  11. package/dist/components/Channel/hooks/useCreateChannelStateContext.d.ts.map +1 -0
  12. package/dist/components/Channel/hooks/useCreateChannelStateContext.js +87 -0
  13. package/dist/components/Channel/hooks/useCreateTypingContext.d.ts +4 -0
  14. package/dist/components/Channel/hooks/useCreateTypingContext.d.ts.map +1 -0
  15. package/dist/components/Channel/hooks/useCreateTypingContext.js +9 -0
  16. package/dist/components/ChannelList/ChannelList.d.ts.map +1 -1
  17. package/dist/components/ChannelList/ChannelList.js +2 -2
  18. package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.d.ts +1 -1
  19. package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.d.ts.map +1 -1
  20. package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.js +2 -4
  21. package/dist/components/ChannelList/hooks/usePaginatedChannels.d.ts +0 -1
  22. package/dist/components/ChannelList/hooks/usePaginatedChannels.d.ts.map +1 -1
  23. package/dist/components/ChannelList/hooks/usePaginatedChannels.js +7 -15
  24. package/dist/components/Chat/Chat.d.ts.map +1 -1
  25. package/dist/components/Chat/Chat.js +14 -12
  26. package/dist/components/Chat/hooks/useChat.js +1 -1
  27. package/dist/components/Chat/hooks/useCreateChatContext.d.ts +4 -0
  28. package/dist/components/Chat/hooks/useCreateChatContext.d.ts.map +1 -0
  29. package/dist/components/Chat/hooks/useCreateChatContext.js +21 -0
  30. package/dist/components/MessageInput/MessageInput.d.ts +1 -1
  31. package/dist/components/MessageInput/MessageInput.d.ts.map +1 -1
  32. package/dist/components/MessageInput/MessageInput.js +2 -1
  33. package/dist/components/MessageInput/hooks/useCreateMessageInputContext.d.ts +4 -0
  34. package/dist/components/MessageInput/hooks/useCreateMessageInputContext.d.ts.map +1 -0
  35. package/dist/components/MessageInput/hooks/useCreateMessageInputContext.js +88 -0
  36. package/dist/components/MessageList/VirtualizedMessageList.d.ts +4 -2
  37. package/dist/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
  38. package/dist/components/MessageList/VirtualizedMessageList.js +2 -2
  39. package/dist/index.cjs.js +317 -146
  40. package/dist/index.cjs.js.map +1 -1
  41. package/dist/utils.d.ts +2 -2
  42. package/dist/utils.d.ts.map +1 -1
  43. package/dist/utils.js +22 -15
  44. package/dist/version.d.ts +1 -1
  45. package/dist/version.js +1 -1
  46. package/package.json +2 -2
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) {
@@ -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;
@@ -4809,13 +4912,101 @@ var MessageInputFlat = function () {
4809
4912
  !cooldownRemaining && React__default['default'].createElement(SendButton$1, { sendMessage: handleSubmit })))));
4810
4913
  };
4811
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
+
4812
5003
  var UnMemoizedMessageInput = function (props) {
4813
5004
  var PropInput = props.Input;
4814
5005
  var _a = useComponentContext(), ContextInput = _a.Input, _b = _a.TriggerProvider, TriggerProvider = _b === void 0 ? DefaultTriggerProvider : _b;
4815
5006
  var Input = PropInput || ContextInput || MessageInputFlat;
4816
5007
  var messageInputState = useMessageInputState(props);
4817
5008
  var cooldownTimerState = useCooldownTimer();
4818
- var messageInputContextValue = __assign(__assign(__assign({}, cooldownTimerState), messageInputState), props);
5009
+ var messageInputContextValue = useCreateMessageInputContext(__assign(__assign(__assign({}, cooldownTimerState), messageInputState), props));
4819
5010
  return (React__default['default'].createElement(MessageInputContextProvider, { value: messageInputContextValue },
4820
5011
  React__default['default'].createElement(TriggerProvider, null,
4821
5012
  React__default['default'].createElement(Input, null))));
@@ -5207,7 +5398,7 @@ var UnMemoizedChannel = function (props) {
5207
5398
  return React__default['default'].createElement(ChannelInner, __assign({}, props, { channel: channel, key: channel.cid }));
5208
5399
  };
5209
5400
  var ChannelInner = function (props) {
5210
- 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;
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;
5211
5402
  var _e = useChatContext(), client = _e.client, customClasses = _e.customClasses, mutes = _e.mutes, theme = _e.theme, useImageFlagEmojisOnWindows = _e.useImageFlagEmojisOnWindows;
5212
5403
  var t = useTranslationContext().t;
5213
5404
  var _f = React.useState([]), notifications = _f[0], setNotifications = _f[1];
@@ -5225,14 +5416,12 @@ var ChannelInner = function (props) {
5225
5416
  emojiData: emojiData,
5226
5417
  emojiSetDef: emojiSetDef,
5227
5418
  };
5228
- var throttledCopyStateFromChannel = React.useCallback(throttle__default['default'](function () {
5229
- if (!channel)
5230
- return;
5231
- dispatch({ channel: channel, type: 'copyStateFromChannelOnEvent' });
5232
- }, 500, { leading: true, trailing: true }), [channel]);
5233
- var markRead = React.useCallback(function () {
5234
- var _a;
5235
- 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)) {
5236
5425
  return;
5237
5426
  }
5238
5427
  lastRead.current = new Date();
@@ -5245,10 +5434,10 @@ var ChannelInner = function (props) {
5245
5434
  if (originalTitle.current) {
5246
5435
  document.title = originalTitle.current;
5247
5436
  }
5248
- }, [channel, doMarkReadRequest]);
5249
- var markReadThrottled = React.useCallback(throttle__default['default'](markRead, 500, { leading: true, trailing: true }), [markRead]);
5250
- var handleEvent = React.useCallback(function (event) {
5251
- 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;
5252
5441
  if (event.message) {
5253
5442
  dispatch({
5254
5443
  channel: channel,
@@ -5257,11 +5446,7 @@ var ChannelInner = function (props) {
5257
5446
  });
5258
5447
  }
5259
5448
  if (event.type === 'typing.start' || event.type === 'typing.stop') {
5260
- dispatch({
5261
- channel: channel,
5262
- type: 'setTyping',
5263
- });
5264
- return;
5449
+ return dispatch({ channel: channel, type: 'setTyping' });
5265
5450
  }
5266
5451
  if (event.type === 'connection.changed' && typeof event.online === 'boolean') {
5267
5452
  online.current = event.online;
@@ -5275,7 +5460,7 @@ var ChannelInner = function (props) {
5275
5460
  if (!document.hidden) {
5276
5461
  markReadThrottled();
5277
5462
  }
5278
- 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) {
5279
5464
  var unread = channel.countUnread(lastRead.current);
5280
5465
  if (activeUnreadHandler) {
5281
5466
  activeUnreadHandler(unread, originalTitle.current);
@@ -5287,22 +5472,21 @@ var ChannelInner = function (props) {
5287
5472
  }
5288
5473
  }
5289
5474
  throttledCopyStateFromChannel();
5290
- }, [channel, client.userID, markReadThrottled, throttledCopyStateFromChannel]);
5475
+ };
5291
5476
  // useLayoutEffect here to prevent spinner. Use Suspense when it is available in stable release
5292
5477
  React.useLayoutEffect(function () {
5293
5478
  var errored = false;
5294
5479
  var done = false;
5295
5480
  var onVisibilityChange = function () {
5296
- if (!document.hidden) {
5481
+ if (!document.hidden)
5297
5482
  markRead();
5298
- }
5299
5483
  };
5300
5484
  (function () { return __awaiter(void 0, void 0, void 0, function () {
5301
5485
  var e_1;
5302
5486
  return __generator(this, function (_a) {
5303
5487
  switch (_a.label) {
5304
5488
  case 0:
5305
- if (!(channel && !channel.initialized)) return [3 /*break*/, 4];
5489
+ if (!!channel.initialized) return [3 /*break*/, 4];
5306
5490
  _a.label = 1;
5307
5491
  case 1:
5308
5492
  _a.trys.push([1, 3, , 4]);
@@ -5318,7 +5502,7 @@ var ChannelInner = function (props) {
5318
5502
  case 4:
5319
5503
  done = true;
5320
5504
  originalTitle.current = document.title;
5321
- if (channel && !errored) {
5505
+ if (!errored) {
5322
5506
  dispatch({ channel: channel, type: 'initStateFromChannel' });
5323
5507
  if (channel.countUnread() > 0)
5324
5508
  markRead();
@@ -5338,15 +5522,14 @@ var ChannelInner = function (props) {
5338
5522
  if (errored || !done)
5339
5523
  return;
5340
5524
  document.removeEventListener('visibilitychange', onVisibilityChange);
5341
- if (channel)
5342
- channel.off(handleEvent);
5525
+ channel === null || channel === void 0 ? void 0 : channel.off(handleEvent);
5343
5526
  client.off('connection.changed', handleEvent);
5344
5527
  client.off('connection.recovered', handleEvent);
5345
5528
  client.off('user.updated', handleEvent);
5346
5529
  client.off('user.deleted', handleEvent);
5347
5530
  notificationTimeouts.forEach(clearTimeout);
5348
5531
  };
5349
- }, [channel, client, handleEvent, markRead]);
5532
+ }, [channel.cid]);
5350
5533
  React.useEffect(function () {
5351
5534
  var _a;
5352
5535
  if (state.thread && ((_a = state.messages) === null || _a === void 0 ? void 0 : _a.length)) {
@@ -5373,17 +5556,15 @@ var ChannelInner = function (props) {
5373
5556
  }, 5000);
5374
5557
  notificationTimeouts.push(timeout);
5375
5558
  };
5376
- var loadMoreFinished = React.useCallback(debounce__default['default'](function (hasMore, messages) {
5559
+ var loadMoreFinished = debounce__default['default'](function (hasMore, messages) {
5377
5560
  if (!isMounted.current)
5378
5561
  return;
5379
5562
  dispatch({ hasMore: hasMore, messages: messages, type: 'loadMoreFinished' });
5380
5563
  }, 2000, {
5381
5564
  leading: true,
5382
5565
  trailing: true,
5383
- }), []);
5384
- var loadMore = React.useCallback(
5385
- // eslint-disable-next-line @typescript-eslint/no-inferrable-types
5386
- function (limit) {
5566
+ });
5567
+ var loadMore = function (limit) {
5387
5568
  if (limit === void 0) { limit = 100; }
5388
5569
  return __awaiter(void 0, void 0, void 0, function () {
5389
5570
  var oldestMessage, oldestID, perPage, queryResponse, e_2, hasMoreMessages;
@@ -5391,7 +5572,7 @@ var ChannelInner = function (props) {
5391
5572
  return __generator(this, function (_b) {
5392
5573
  switch (_b.label) {
5393
5574
  case 0:
5394
- if (!online.current || !window.navigator.onLine || !channel)
5575
+ if (!online.current || !window.navigator.onLine)
5395
5576
  return [2 /*return*/, 0];
5396
5577
  oldestMessage = (_a = state === null || state === void 0 ? void 0 : state.messages) === null || _a === void 0 ? void 0 : _a[0];
5397
5578
  if (state.loadingMore || (oldestMessage === null || oldestMessage === void 0 ? void 0 : oldestMessage.status) !== 'received')
@@ -5426,27 +5607,22 @@ var ChannelInner = function (props) {
5426
5607
  }
5427
5608
  });
5428
5609
  });
5429
- }, [channel, loadMoreFinished, online, state.loadingMore, state.messages]);
5430
- var updateMessage = React.useCallback(function (updatedMessage) {
5431
- if (!channel)
5432
- return;
5433
- // adds the message to the local channel state..
5434
- // 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
5435
5613
  channel.state.addMessageSorted(updatedMessage, true);
5436
5614
  dispatch({
5437
5615
  channel: channel,
5438
5616
  parentId: state.thread && updatedMessage.parent_id,
5439
5617
  type: 'copyMessagesFromChannel',
5440
5618
  });
5441
- }, [channel, state.thread]);
5619
+ };
5442
5620
  var isUserResponseArray = function (output) { var _a; return ((_a = output[0]) === null || _a === void 0 ? void 0 : _a.id) != null; };
5443
- 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 () {
5444
5622
  var attachments, id, _a, mentioned_users, parent_id, text, mentions, messageData, messageResponse, error_1, stringError, parsedError;
5445
5623
  return __generator(this, function (_b) {
5446
5624
  switch (_b.label) {
5447
5625
  case 0:
5448
- if (!channel)
5449
- return [2 /*return*/];
5450
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;
5451
5627
  mentions = isUserResponseArray(mentioned_users)
5452
5628
  ? mentioned_users.map(function (_a) {
@@ -5470,7 +5646,7 @@ var ChannelInner = function (props) {
5470
5646
  _b.label = 5;
5471
5647
  case 5:
5472
5648
  // replace it after send is completed
5473
- if (messageResponse && messageResponse.message) {
5649
+ if (messageResponse === null || messageResponse === void 0 ? void 0 : messageResponse.message) {
5474
5650
  updateMessage(__assign(__assign({}, messageResponse.message), { status: 'received' }));
5475
5651
  }
5476
5652
  if (quotedMessage)
@@ -5485,25 +5661,20 @@ var ChannelInner = function (props) {
5485
5661
  case 7: return [2 /*return*/];
5486
5662
  }
5487
5663
  });
5488
- }); }, [channel, doSendMessageRequest, quotedMessage, updateMessage]);
5489
- var createMessagePreview = React.useCallback(function (text, attachments, parent, mentioned_users) {
5490
- // create a preview of the message
5664
+ }); };
5665
+ var createMessagePreview = function (text, attachments, parent, mentioned_users) {
5491
5666
  var clientSideID = client.userID + "-" + uuid.v4();
5492
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));
5493
- }, [client.user, client.userID]);
5494
- var sendMessage = React.useCallback(function (_a, customMessageData) {
5668
+ };
5669
+ var sendMessage = function (_a, customMessageData) {
5495
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;
5496
5671
  return __awaiter(void 0, void 0, void 0, function () {
5497
5672
  var messagePreview;
5498
5673
  return __generator(this, function (_f) {
5499
5674
  switch (_f.label) {
5500
5675
  case 0:
5501
- if (!channel)
5502
- return [2 /*return*/];
5503
- // remove error messages upon submit
5504
5676
  channel.state.filterErrorMessages();
5505
5677
  messagePreview = createMessagePreview(text, attachments, parent, mentioned_users);
5506
- // first we add the message to the UI
5507
5678
  updateMessage(messagePreview);
5508
5679
  return [4 /*yield*/, doSendMessage(messagePreview, customMessageData)];
5509
5680
  case 1:
@@ -5512,62 +5683,55 @@ var ChannelInner = function (props) {
5512
5683
  }
5513
5684
  });
5514
5685
  });
5515
- }, [channel === null || channel === void 0 ? void 0 : channel.state, createMessagePreview, doSendMessage, updateMessage]);
5516
- 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 () {
5517
5688
  return __generator(this, function (_a) {
5518
5689
  switch (_a.label) {
5519
5690
  case 0:
5520
- // set the message status to sending
5521
5691
  updateMessage(__assign(__assign({}, message), { errorStatusCode: undefined, status: 'sending' }));
5522
- // actually try to send the message...
5523
5692
  return [4 /*yield*/, doSendMessage(message)];
5524
5693
  case 1:
5525
- // actually try to send the message...
5526
5694
  _a.sent();
5527
5695
  return [2 /*return*/];
5528
5696
  }
5529
5697
  });
5530
- }); }, [doSendMessage, updateMessage]);
5531
- var removeMessage = React.useCallback(function (message) {
5532
- if (!channel)
5533
- return;
5698
+ }); };
5699
+ var removeMessage = function (message) {
5534
5700
  channel.state.removeMessage(message);
5535
5701
  dispatch({
5536
5702
  channel: channel,
5537
5703
  parentId: state.thread && message.parent_id,
5538
5704
  type: 'copyMessagesFromChannel',
5539
5705
  });
5540
- }, [channel, state.thread]);
5706
+ };
5541
5707
  /** THREAD */
5542
- var openThread = React.useCallback(function (message, event) {
5543
- if (!channel)
5544
- return;
5545
- if (event && event.preventDefault) {
5546
- event.preventDefault();
5547
- }
5708
+ var openThread = function (message, event) {
5709
+ event.preventDefault();
5548
5710
  dispatch({ channel: channel, message: message, type: 'openThread' });
5549
- }, [channel]);
5550
- 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) {
5551
5717
  dispatch({
5552
5718
  threadHasMore: threadHasMore,
5553
5719
  threadMessages: threadMessages,
5554
5720
  type: 'loadMoreThreadFinished',
5555
5721
  });
5556
- }, 2000, { leading: true, trailing: true }), []);
5557
- 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 () {
5558
5724
  var parentID, oldMessages, oldestMessageID, limit, queryResponse, threadHasMoreMessages, newThreadMessages;
5559
5725
  var _a;
5560
5726
  return __generator(this, function (_b) {
5561
5727
  switch (_b.label) {
5562
5728
  case 0:
5563
- // prevent duplicate loading events...
5564
- if (!channel || state.threadLoadingMore || !state.thread)
5729
+ if (state.threadLoadingMore || !state.thread)
5565
5730
  return [2 /*return*/];
5566
5731
  dispatch({ type: 'startLoadingThread' });
5567
5732
  parentID = state.thread.id;
5568
5733
  if (!parentID) {
5569
- dispatch({ type: 'closeThread' });
5570
- return [2 /*return*/];
5734
+ return [2 /*return*/, dispatch({ type: 'closeThread' })];
5571
5735
  }
5572
5736
  oldMessages = channel.state.threads[parentID] || [];
5573
5737
  oldestMessageID = (_a = oldMessages[0]) === null || _a === void 0 ? void 0 : _a.id;
@@ -5583,7 +5747,7 @@ var ChannelInner = function (props) {
5583
5747
  queryResponse = _b.sent();
5584
5748
  threadHasMoreMessages = queryResponse.messages.length === limit;
5585
5749
  newThreadMessages = channel.state.threads[parentID] || [];
5586
- // 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
5587
5751
  loadMoreThreadFinished(threadHasMoreMessages, newThreadMessages);
5588
5752
  return [3 /*break*/, 4];
5589
5753
  case 3:
@@ -5593,18 +5757,12 @@ var ChannelInner = function (props) {
5593
5757
  case 4: return [2 /*return*/];
5594
5758
  }
5595
5759
  });
5596
- }); }, [channel, loadMoreThreadFinished, state.thread, state.threadLoadingMore]);
5597
- var closeThread = React.useCallback(function (event) {
5598
- if (event && event.preventDefault) {
5599
- event.preventDefault();
5600
- }
5601
- dispatch({ type: 'closeThread' });
5602
- }, []);
5760
+ }); };
5603
5761
  var onMentionsHoverOrClick = useMentionsHandlers(onMentionsHover, onMentionsClick);
5604
5762
  var editMessage = useEditMessageHandler(doUpdateMessageRequest);
5605
5763
  var typing = state.typing, restState = __rest(state, ["typing"]);
5606
- 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 });
5607
- 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 ({
5608
5766
  addNotification: addNotification,
5609
5767
  closeThread: closeThread,
5610
5768
  dispatch: dispatch,
@@ -5618,8 +5776,9 @@ var ChannelInner = function (props) {
5618
5776
  retrySendMessage: retrySendMessage,
5619
5777
  sendMessage: sendMessage,
5620
5778
  setQuotedMessage: setQuotedMessage,
5779
+ skipMessageDataMemoization: skipMessageDataMemoization,
5621
5780
  updateMessage: updateMessage,
5622
- };
5781
+ }); }, [channel.cid, loadMore, quotedMessage]);
5623
5782
  var componentContextValue = React.useMemo(function () { return ({
5624
5783
  Attachment: props.Attachment || Attachment,
5625
5784
  AutocompleteSuggestionHeader: props.AutocompleteSuggestionHeader,
@@ -5663,9 +5822,9 @@ var ChannelInner = function (props) {
5663
5822
  EmojiIndex: props.EmojiIndex,
5664
5823
  EmojiPicker: props.EmojiPicker,
5665
5824
  }); }, []);
5666
- var typingContextValue = {
5825
+ var typingContextValue = useCreateTypingContext({
5667
5826
  typing: typing,
5668
- };
5827
+ });
5669
5828
  var chatClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.chat) || 'str-chat';
5670
5829
  var channelClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.channel) || 'str-chat-channel';
5671
5830
  var windowsEmojiClass = useImageFlagEmojisOnWindows && navigator.userAgent.match(/Win/)
@@ -5679,7 +5838,7 @@ var ChannelInner = function (props) {
5679
5838
  return (React__default['default'].createElement("div", { className: chatClass + " " + channelClass + " " + theme },
5680
5839
  React__default['default'].createElement(LoadingIndicator$1, { size: 25 })));
5681
5840
  }
5682
- if (!(channel === null || channel === void 0 ? void 0 : channel.watch)) {
5841
+ if (!channel.watch) {
5683
5842
  return (React__default['default'].createElement("div", { className: chatClass + " " + channelClass + " " + theme },
5684
5843
  React__default['default'].createElement("div", null, t('Channel Missing'))));
5685
5844
  }
@@ -6004,7 +6163,7 @@ var useNotificationAddedToChannelListener = function (setChannels, customHandler
6004
6163
  }, [customHandler]);
6005
6164
  };
6006
6165
 
6007
- var useNotificationMessageNewListener = function (setChannels, customHandler, setOffset, allowNewMessagesFromUnfilteredChannels) {
6166
+ var useNotificationMessageNewListener = function (setChannels, customHandler, allowNewMessagesFromUnfilteredChannels) {
6008
6167
  if (allowNewMessagesFromUnfilteredChannels === void 0) { allowNewMessagesFromUnfilteredChannels = true; }
6009
6168
  var client = useChatContext().client;
6010
6169
  React.useEffect(function () {
@@ -6024,9 +6183,7 @@ var useNotificationMessageNewListener = function (setChannels, customHandler, se
6024
6183
  channel_1 = _b.sent();
6025
6184
  setChannels(function (channels) { return uniqBy__default['default'](__spreadArray([channel_1], channels), 'cid'); });
6026
6185
  _b.label = 3;
6027
- case 3:
6028
- setOffset === null || setOffset === void 0 ? void 0 : setOffset(function (prevOffset) { return prevOffset + 1; });
6029
- return [2 /*return*/];
6186
+ case 3: return [2 /*return*/];
6030
6187
  }
6031
6188
  });
6032
6189
  }); };
@@ -6060,12 +6217,11 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
6060
6217
  var _b = React.useState(false), error = _b[0], setError = _b[1];
6061
6218
  var _c = React.useState(true), hasNextPage = _c[0], setHasNextPage = _c[1];
6062
6219
  var _d = React.useState(true), loadingChannels = _d[0], setLoadingChannels = _d[1];
6063
- var _e = React.useState(0), offset = _e[0], setOffset = _e[1];
6064
- var _f = React.useState(true), refreshing = _f[0], setRefreshing = _f[1];
6220
+ var _e = React.useState(true), refreshing = _e[0], setRefreshing = _e[1];
6065
6221
  var filterString = React.useMemo(function () { return JSON.stringify(filters); }, [filters]);
6066
6222
  var sortString = React.useMemo(function () { return JSON.stringify(sort); }, [sort]);
6067
6223
  var queryChannels = function (queryType) { return __awaiter(void 0, void 0, void 0, function () {
6068
- var newOptions, channelQueryResponse, newChannels, err_1;
6224
+ var offset, newOptions, channelQueryResponse, newChannels, err_1;
6069
6225
  var _a;
6070
6226
  return __generator(this, function (_b) {
6071
6227
  switch (_b.label) {
@@ -6075,27 +6231,21 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
6075
6231
  setLoadingChannels(true);
6076
6232
  }
6077
6233
  setRefreshing(true);
6078
- 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);
6079
6236
  _b.label = 1;
6080
6237
  case 1:
6081
6238
  _b.trys.push([1, 3, , 4]);
6082
6239
  return [4 /*yield*/, client.queryChannels(filters, sort || {}, newOptions)];
6083
6240
  case 2:
6084
6241
  channelQueryResponse = _b.sent();
6085
- newChannels = void 0;
6086
- if (queryType === 'reload') {
6087
- newChannels = channelQueryResponse;
6088
- }
6089
- else {
6090
- newChannels = __spreadArray(__spreadArray([], channels), channelQueryResponse);
6091
- }
6242
+ newChannels = queryType === 'reload' ? channelQueryResponse : __spreadArray(__spreadArray([], channels), channelQueryResponse);
6092
6243
  setChannels(newChannels);
6093
6244
  setHasNextPage(channelQueryResponse.length >= newOptions.limit);
6094
- // Set active channel only after first page.
6095
- if (offset === 0 && activeChannelHandler) {
6245
+ // Set active channel only on load of first page
6246
+ if (!offset && activeChannelHandler) {
6096
6247
  activeChannelHandler(newChannels, setChannels);
6097
6248
  }
6098
- setOffset(newChannels.length);
6099
6249
  return [3 /*break*/, 4];
6100
6250
  case 3:
6101
6251
  err_1 = _b.sent();
@@ -6120,7 +6270,6 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
6120
6270
  hasNextPage: hasNextPage,
6121
6271
  loadNextPage: loadNextPage,
6122
6272
  setChannels: setChannels,
6123
- setOffset: setOffset,
6124
6273
  status: {
6125
6274
  error: error,
6126
6275
  loadingChannels: loadingChannels,
@@ -6570,11 +6719,11 @@ var UnMemoizedChannelList = function (props) {
6570
6719
  * force a re-render. Incrementing this dummy variable ensures the channel previews update.
6571
6720
  */
6572
6721
  var forceUpdate = function () { return setChannelUpdateCount(function (count) { return count + 1; }); };
6573
- 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;
6574
6723
  var loadedChannels = channelRenderFilterFn ? channelRenderFilterFn(channels) : channels;
6575
6724
  useMobileNavigation(channelListRef, navOpen, closeMobileNav);
6576
6725
  useMessageNewListener(setChannels, lockChannelOrder, allowNewMessagesFromUnfilteredChannels);
6577
- useNotificationMessageNewListener(setChannels, onMessageNew, setOffset, allowNewMessagesFromUnfilteredChannels);
6726
+ useNotificationMessageNewListener(setChannels, onMessageNew, allowNewMessagesFromUnfilteredChannels);
6578
6727
  useNotificationAddedToChannelListener(setChannels, onAddedToChannel, allowNewMessagesFromUnfilteredChannels);
6579
6728
  useNotificationRemovedFromChannelListener(setChannels, onRemovedFromChannel);
6580
6729
  useChannelDeletedListener(setChannels, onChannelDeleted);
@@ -7252,7 +7401,7 @@ var Streami18n = /** @class */ (function () {
7252
7401
  return Streami18n;
7253
7402
  }());
7254
7403
 
7255
- var version = '6.8.0';
7404
+ var version = '6.9.0';
7256
7405
 
7257
7406
  var useChat = function (_a) {
7258
7407
  var _b;
@@ -7265,7 +7414,7 @@ var useChat = function (_a) {
7265
7414
  var _e = React.useState(), channel = _e[0], setChannel = _e[1];
7266
7415
  var _f = React.useState([]), mutes = _f[0], setMutes = _f[1];
7267
7416
  var _g = React.useState(initialNavOpen), navOpen = _g[0], setNavOpen = _g[1];
7268
- 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;
7269
7418
  var closeMobileNav = function () { return setNavOpen(false); };
7270
7419
  var openMobileNav = function () { return setTimeout(function () { return setNavOpen(true); }, 100); };
7271
7420
  React.useEffect(function () {
@@ -7335,6 +7484,27 @@ var useChat = function (_a) {
7335
7484
  };
7336
7485
  };
7337
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
+
7338
7508
  var darkModeTheme = {
7339
7509
  '--bg-gradient-end': '#101214',
7340
7510
  '--bg-gradient-start': '#070a0d',
@@ -7373,20 +7543,21 @@ var Chat = function (props) {
7373
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;
7374
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;
7375
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
+ });
7376
7558
  if (!translators.t)
7377
7559
  return null;
7378
- return (React__default['default'].createElement(ChatProvider, { value: {
7379
- channel: channel,
7380
- client: client,
7381
- closeMobileNav: closeMobileNav,
7382
- customClasses: customClasses,
7383
- mutes: mutes,
7384
- navOpen: navOpen,
7385
- openMobileNav: openMobileNav,
7386
- setActiveChannel: setActiveChannel,
7387
- theme: theme,
7388
- useImageFlagEmojisOnWindows: useImageFlagEmojisOnWindows,
7389
- } },
7560
+ return (React__default['default'].createElement(ChatProvider, { value: chatContextValue },
7390
7561
  React__default['default'].createElement(TranslationProvider, { value: translators }, children)));
7391
7562
  };
7392
7563
 
@@ -8654,7 +8825,7 @@ function useShouldForceScrollToBottom(messages, currentUserId) {
8654
8825
 
8655
8826
  var PREPEND_OFFSET = Math.pow(10, 7);
8656
8827
  var VirtualizedMessageListWithContext = function (props) {
8657
- 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,
8658
8829
  // TODO: refactor to scrollSeekPlaceHolderConfiguration and components.ScrollSeekPlaceholder, like the Virtuoso Component
8659
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;
8660
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;
@@ -8782,7 +8953,7 @@ var VirtualizedMessageListWithContext = function (props) {
8782
8953
  var virtualizedMessageListClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.virtualizedMessageList) || 'str-chat__virtual-list';
8783
8954
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
8784
8955
  React__default['default'].createElement("div", { className: virtualizedMessageListClass },
8785
- 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 } : {}))),
8786
8957
  React__default['default'].createElement("div", { className: 'str-chat__list-notifications' },
8787
8958
  React__default['default'].createElement(MessageNotification$1, { onClick: scrollToBottom, showNotification: newMessagesNotification }, t('New Messages!')))),
8788
8959
  giphyPreviewMessage && React__default['default'].createElement(GiphyPreviewMessage$1, { message: giphyPreviewMessage })));
@@ -9019,6 +9190,7 @@ exports.getLatestMessagePreview = getLatestMessagePreview;
9019
9190
  exports.getMessageActions = getMessageActions;
9020
9191
  exports.getNonImageAttachments = getNonImageAttachments;
9021
9192
  exports.getReadByTooltipText = getReadByTooltipText;
9193
+ exports.getWholeChar = getWholeChar;
9022
9194
  exports.handleActionWarning = handleActionWarning;
9023
9195
  exports.hiTranslations = hiTranslations;
9024
9196
  exports.isAudioAttachment = isAudioAttachment;
@@ -9059,7 +9231,6 @@ exports.renderPreviewText = renderPreviewText;
9059
9231
  exports.renderText = renderText;
9060
9232
  exports.ruTranslations = ruTranslations;
9061
9233
  exports.showMessageActionsBox = showMessageActionsBox;
9062
- exports.smartRender = smartRender;
9063
9234
  exports.trTranslations = trTranslations;
9064
9235
  exports.useActionHandler = useActionHandler;
9065
9236
  exports.useBreakpoint = useBreakpoint;