stream-chat-react 11.3.0 → 11.4.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 (140) hide show
  1. package/dist/browser.full-bundle.js +423 -283
  2. package/dist/browser.full-bundle.js.map +1 -1
  3. package/dist/browser.full-bundle.min.js +3 -3
  4. package/dist/browser.full-bundle.min.js.map +1 -1
  5. package/dist/components/Attachment/Attachment.d.ts.map +1 -1
  6. package/dist/components/Attachment/Attachment.js +1 -0
  7. package/dist/components/Attachment/AttachmentContainer.d.ts.map +1 -1
  8. package/dist/components/Attachment/AttachmentContainer.js +1 -0
  9. package/dist/components/Attachment/hooks/useAudioController.d.ts.map +1 -1
  10. package/dist/components/Attachment/hooks/useAudioController.js +1 -0
  11. package/dist/components/Channel/Channel.d.ts.map +1 -1
  12. package/dist/components/Channel/Channel.js +34 -24
  13. package/dist/components/Channel/hooks/useCreateChannelStateContext.d.ts.map +1 -1
  14. package/dist/components/Channel/hooks/useCreateChannelStateContext.js +3 -1
  15. package/dist/components/Channel/hooks/useCreateTypingContext.d.ts.map +1 -1
  16. package/dist/components/Channel/hooks/useCreateTypingContext.js +3 -1
  17. package/dist/components/ChannelList/ChannelList.d.ts.map +1 -1
  18. package/dist/components/ChannelList/ChannelList.js +3 -0
  19. package/dist/components/ChannelList/hooks/useChannelDeletedListener.d.ts.map +1 -1
  20. package/dist/components/ChannelList/hooks/useChannelDeletedListener.js +1 -0
  21. package/dist/components/ChannelList/hooks/useChannelHiddenListener.d.ts.map +1 -1
  22. package/dist/components/ChannelList/hooks/useChannelHiddenListener.js +1 -0
  23. package/dist/components/ChannelList/hooks/useChannelTruncatedListener.d.ts.map +1 -1
  24. package/dist/components/ChannelList/hooks/useChannelTruncatedListener.js +1 -0
  25. package/dist/components/ChannelList/hooks/useChannelUpdatedListener.d.ts.map +1 -1
  26. package/dist/components/ChannelList/hooks/useChannelUpdatedListener.js +1 -0
  27. package/dist/components/ChannelList/hooks/useChannelVisibleListener.d.ts.map +1 -1
  28. package/dist/components/ChannelList/hooks/useChannelVisibleListener.js +1 -0
  29. package/dist/components/ChannelList/hooks/useConnectionRecoveredListener.d.ts.map +1 -1
  30. package/dist/components/ChannelList/hooks/useConnectionRecoveredListener.js +1 -0
  31. package/dist/components/ChannelList/hooks/useMessageNewListener.d.ts.map +1 -1
  32. package/dist/components/ChannelList/hooks/useMessageNewListener.js +1 -0
  33. package/dist/components/ChannelList/hooks/useNotificationAddedToChannelListener.d.ts.map +1 -1
  34. package/dist/components/ChannelList/hooks/useNotificationAddedToChannelListener.js +1 -0
  35. package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.d.ts.map +1 -1
  36. package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.js +1 -0
  37. package/dist/components/ChannelList/hooks/useNotificationRemovedFromChannelListener.d.ts.map +1 -1
  38. package/dist/components/ChannelList/hooks/useNotificationRemovedFromChannelListener.js +1 -0
  39. package/dist/components/ChannelList/hooks/usePaginatedChannels.d.ts.map +1 -1
  40. package/dist/components/ChannelList/hooks/usePaginatedChannels.js +2 -0
  41. package/dist/components/ChannelList/hooks/useUserPresenceChangedListener.d.ts.map +1 -1
  42. package/dist/components/ChannelList/hooks/useUserPresenceChangedListener.js +1 -0
  43. package/dist/components/ChannelPreview/ChannelPreview.d.ts.map +1 -1
  44. package/dist/components/ChannelPreview/ChannelPreview.js +2 -0
  45. package/dist/components/ChannelPreview/hooks/useChannelPreviewInfo.d.ts.map +1 -1
  46. package/dist/components/ChannelPreview/hooks/useChannelPreviewInfo.js +1 -0
  47. package/dist/components/ChannelPreview/hooks/useIsChannelMuted.d.ts.map +1 -1
  48. package/dist/components/ChannelPreview/hooks/useIsChannelMuted.js +1 -0
  49. package/dist/components/ChannelSearch/SearchBar.d.ts.map +1 -1
  50. package/dist/components/ChannelSearch/SearchBar.js +2 -0
  51. package/dist/components/ChannelSearch/SearchResults.d.ts.map +1 -1
  52. package/dist/components/ChannelSearch/SearchResults.js +3 -1
  53. package/dist/components/ChannelSearch/hooks/useChannelSearch.d.ts.map +1 -1
  54. package/dist/components/ChannelSearch/hooks/useChannelSearch.js +7 -1
  55. package/dist/components/Chat/hooks/useChat.d.ts.map +1 -1
  56. package/dist/components/Chat/hooks/useChat.js +2 -0
  57. package/dist/components/Chat/hooks/useCreateChatContext.d.ts.map +1 -1
  58. package/dist/components/Chat/hooks/useCreateChatContext.js +3 -1
  59. package/dist/components/Gallery/ModalGallery.d.ts.map +1 -1
  60. package/dist/components/Gallery/ModalGallery.js +3 -1
  61. package/dist/components/InfiniteScrollPaginator/InfiniteScroll.d.ts.map +1 -1
  62. package/dist/components/InfiniteScrollPaginator/InfiniteScroll.js +1 -0
  63. package/dist/components/LoadMore/LoadMoreButton.d.ts.map +1 -1
  64. package/dist/components/LoadMore/LoadMoreButton.js +1 -0
  65. package/dist/components/LoadMore/LoadMorePaginator.d.ts.map +1 -1
  66. package/dist/components/LoadMore/LoadMorePaginator.js +1 -0
  67. package/dist/components/Message/MessageText.d.ts.map +1 -1
  68. package/dist/components/Message/MessageText.js +1 -0
  69. package/dist/components/Message/hooks/useReactionHandler.d.ts.map +1 -1
  70. package/dist/components/Message/hooks/useReactionHandler.js +6 -2
  71. package/dist/components/MessageActions/MessageActions.d.ts.map +1 -1
  72. package/dist/components/MessageActions/MessageActions.js +11 -3
  73. package/dist/components/MessageActions/MessageActionsBox.d.ts +3 -2
  74. package/dist/components/MessageActions/MessageActionsBox.d.ts.map +1 -1
  75. package/dist/components/MessageActions/MessageActionsBox.js +9 -24
  76. package/dist/components/MessageActions/hooks/index.d.ts +2 -0
  77. package/dist/components/MessageActions/hooks/index.d.ts.map +1 -0
  78. package/dist/components/MessageActions/hooks/index.js +1 -0
  79. package/dist/components/MessageActions/hooks/useMessageActionsBoxPopper.d.ts +18 -0
  80. package/dist/components/MessageActions/hooks/useMessageActionsBoxPopper.d.ts.map +1 -0
  81. package/dist/components/MessageActions/hooks/useMessageActionsBoxPopper.js +32 -0
  82. package/dist/components/MessageInput/MessageInputFlat.d.ts.map +1 -1
  83. package/dist/components/MessageInput/MessageInputFlat.js +1 -0
  84. package/dist/components/MessageInput/MessageInputSmall.d.ts.map +1 -1
  85. package/dist/components/MessageInput/MessageInputSmall.js +1 -0
  86. package/dist/components/MessageInput/hooks/useAttachments.d.ts.map +1 -1
  87. package/dist/components/MessageInput/hooks/useAttachments.js +3 -1
  88. package/dist/components/MessageInput/hooks/useCreateMessageInputContext.d.ts.map +1 -1
  89. package/dist/components/MessageInput/hooks/useCreateMessageInputContext.js +3 -1
  90. package/dist/components/MessageInput/hooks/useFileUploads.d.ts.map +1 -1
  91. package/dist/components/MessageInput/hooks/useFileUploads.js +3 -0
  92. package/dist/components/MessageInput/hooks/useImageUploads.d.ts.map +1 -1
  93. package/dist/components/MessageInput/hooks/useImageUploads.js +4 -1
  94. package/dist/components/MessageInput/hooks/useLinkPreviews.d.ts.map +1 -1
  95. package/dist/components/MessageInput/hooks/useLinkPreviews.js +5 -1
  96. package/dist/components/MessageInput/hooks/useMessageInputText.d.ts.map +1 -1
  97. package/dist/components/MessageInput/hooks/useMessageInputText.js +6 -2
  98. package/dist/components/MessageInput/hooks/usePasteHandler.d.ts.map +1 -1
  99. package/dist/components/MessageInput/hooks/usePasteHandler.js +3 -1
  100. package/dist/components/MessageInput/hooks/useUserTrigger.d.ts.map +1 -1
  101. package/dist/components/MessageInput/hooks/useUserTrigger.js +1 -0
  102. package/dist/components/MessageList/MessageList.d.ts +3 -0
  103. package/dist/components/MessageList/MessageList.d.ts.map +1 -1
  104. package/dist/components/MessageList/MessageList.js +11 -8
  105. package/dist/components/MessageList/ScrollToBottomButton.d.ts.map +1 -1
  106. package/dist/components/MessageList/ScrollToBottomButton.js +1 -0
  107. package/dist/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
  108. package/dist/components/MessageList/VirtualizedMessageList.js +12 -14
  109. package/dist/components/MessageList/hooks/MessageList/useEnrichedMessages.d.ts.map +1 -1
  110. package/dist/components/MessageList/hooks/MessageList/useEnrichedMessages.js +3 -1
  111. package/dist/components/MessageList/hooks/MessageList/useMessageListElements.d.ts +3 -3
  112. package/dist/components/MessageList/hooks/MessageList/useMessageListElements.d.ts.map +1 -1
  113. package/dist/components/MessageList/hooks/MessageList/useMessageListElements.js +19 -30
  114. package/dist/components/MessageList/hooks/MessageList/useMessageListScrollManager.d.ts.map +1 -1
  115. package/dist/components/MessageList/hooks/MessageList/useMessageListScrollManager.js +1 -0
  116. package/dist/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts.map +1 -1
  117. package/dist/components/MessageList/hooks/MessageList/useScrollLocationLogic.js +1 -0
  118. package/dist/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.d.ts.map +1 -1
  119. package/dist/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.js +1 -0
  120. package/dist/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.d.ts.map +1 -1
  121. package/dist/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.js +1 -0
  122. package/dist/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.d.ts.map +1 -1
  123. package/dist/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.js +1 -0
  124. package/dist/components/MessageList/hooks/VirtualizedMessageList/useShouldForceScrollToBottom.d.ts.map +1 -1
  125. package/dist/components/MessageList/hooks/VirtualizedMessageList/useShouldForceScrollToBottom.js +1 -0
  126. package/dist/components/MessageList/index.d.ts +1 -0
  127. package/dist/components/MessageList/index.d.ts.map +1 -1
  128. package/dist/components/MessageList/index.js +1 -0
  129. package/dist/components/MessageList/renderMessages.d.ts +22 -0
  130. package/dist/components/MessageList/renderMessages.d.ts.map +1 -0
  131. package/dist/components/MessageList/renderMessages.js +30 -0
  132. package/dist/components/MessageList/utils.d.ts.map +1 -1
  133. package/dist/components/MessageList/utils.js +1 -1
  134. package/dist/components/Reactions/hooks/useProcessReactions.d.ts.map +1 -1
  135. package/dist/components/Reactions/hooks/useProcessReactions.js +3 -0
  136. package/dist/components/Thread/Thread.js +1 -0
  137. package/dist/index.cjs.js +304 -166
  138. package/dist/version.d.ts +1 -1
  139. package/dist/version.js +1 -1
  140. package/package.json +2 -1
package/dist/index.cjs.js CHANGED
@@ -163,6 +163,7 @@ var useAudioController = function () {
163
163
  audioRef.current.play();
164
164
  return function () {
165
165
  var _a;
166
+ // eslint-disable-next-line react-hooks/exhaustive-deps
166
167
  (_a = audioRef.current) === null || _a === void 0 ? void 0 : _a.pause();
167
168
  window.clearInterval(interval);
168
169
  };
@@ -317,7 +318,9 @@ var ModalGallery = function (props) {
317
318
  source: imageSrc,
318
319
  };
319
320
  });
320
- }, [images]);
321
+ },
322
+ // eslint-disable-next-line react-hooks/exhaustive-deps
323
+ [images]);
321
324
  return (React__default["default"].createElement(ImageGallery__default["default"], { items: formattedArray, renderItem: renderItem, showIndex: true, showPlayButton: false, showThumbnails: false, startIndex: index }));
322
325
  };
323
326
 
@@ -3226,6 +3229,7 @@ var MediaContainer = function (props) {
3226
3229
  var config = videoAttachmentSizeHandler(attachment, videoElement.current, shouldGenerateVideoThumbnail);
3227
3230
  setAttachmentConfiguration(config);
3228
3231
  }
3232
+ // eslint-disable-next-line react-hooks/exhaustive-deps
3229
3233
  }, [videoElement, videoAttachmentSizeHandler, attachment]);
3230
3234
  var content = (React__default["default"].createElement("div", { className: 'str-chat__player-wrapper', "data-testid": 'video-wrapper', ref: videoElement, style: getCssDimensionsVariables(attachment.thumb_url || '') },
3231
3235
  React__default["default"].createElement(Media, { className: 'react-player', config: { file: { attributes: { poster: attachmentConfiguration === null || attachmentConfiguration === void 0 ? void 0 : attachmentConfiguration.thumbUrl } } }, controls: true, height: '100%', url: attachmentConfiguration === null || attachmentConfiguration === void 0 ? void 0 : attachmentConfiguration.url, width: '100%' })));
@@ -3261,6 +3265,7 @@ var ATTACHMENT_GROUPS_ORDER = [
3261
3265
  */
3262
3266
  var Attachment = function (props) {
3263
3267
  var attachments = props.attachments;
3268
+ // eslint-disable-next-line react-hooks/exhaustive-deps
3264
3269
  var groupedAttachments = React.useMemo(function () { return renderGroupedAttachments(props); }, [attachments]);
3265
3270
  return (React__default["default"].createElement("div", { className: 'str-chat__attachment-list' }, ATTACHMENT_GROUPS_ORDER.reduce(function (acc, groupName) { return icons.__spreadArray(icons.__spreadArray([], acc, true), groupedAttachments[groupName], true); }, [])));
3266
3271
  };
@@ -31622,7 +31627,9 @@ var useCreateChannelStateContext = function (value) {
31622
31627
  watcher_count: watcher_count,
31623
31628
  watcherCount: watcherCount,
31624
31629
  watchers: watchers,
31625
- }); }, [
31630
+ }); },
31631
+ // eslint-disable-next-line react-hooks/exhaustive-deps
31632
+ [
31626
31633
  channelId,
31627
31634
  debounceURLEnrichmentMs,
31628
31635
  enrichURLForPreview,
@@ -31659,7 +31666,9 @@ var useCreateTypingContext = function (value) {
31659
31666
  var typingValue = Object.keys(typing || {}).join();
31660
31667
  var typingContext = React.useMemo(function () { return ({
31661
31668
  typing: typing,
31662
- }); }, [typingValue]);
31669
+ }); },
31670
+ // eslint-disable-next-line react-hooks/exhaustive-deps
31671
+ [typingValue]);
31663
31672
  return typingContext;
31664
31673
  };
31665
31674
 
@@ -32175,29 +32184,15 @@ var CustomMessageActionsList = function (props) {
32175
32184
  })));
32176
32185
  };
32177
32186
 
32178
- var UnMemoizedMessageActionsBox = function (props) {
32179
- var getMessageActions = props.getMessageActions, handleDelete = props.handleDelete, handleEdit = props.handleEdit, handleFlag = props.handleFlag, handleMute = props.handleMute, handlePin = props.handlePin, isUserMuted = props.isUserMuted, mine = props.mine, _a = props.open, open = _a === void 0 ? false : _a;
32187
+ var UnMemoizedMessageActionsBox = React__default["default"].forwardRef(function (props, ref) {
32188
+ var getMessageActions = props.getMessageActions, handleDelete = props.handleDelete, handleEdit = props.handleEdit, handleFlag = props.handleFlag, handleMute = props.handleMute, handlePin = props.handlePin, isUserMuted = props.isUserMuted;
32189
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
32190
+ props.mine; var _a = props.open, open = _a === void 0 ? false : _a, restDivProps = icons.__rest(props, ["getMessageActions", "handleDelete", "handleEdit", "handleFlag", "handleMute", "handlePin", "isUserMuted", "mine", "open"]);
32180
32191
  var _b = icons.useComponentContext('MessageActionsBox').CustomMessageActionsList, CustomMessageActionsList$1 = _b === void 0 ? CustomMessageActionsList : _b;
32181
32192
  var setQuotedMessage = icons.useChannelActionContext('MessageActionsBox').setQuotedMessage;
32182
- var _c = icons.useMessageContext('MessageActionsBox'), customMessageActions = _c.customMessageActions, message = _c.message, messageListRect = _c.messageListRect;
32193
+ var _c = icons.useMessageContext('MessageActionsBox'), customMessageActions = _c.customMessageActions, message = _c.message;
32183
32194
  var t = icons.useTranslationContext('MessageActionsBox').t;
32184
- var _d = React.useState(false), reverse = _d[0], setReverse = _d[1];
32185
32195
  var messageActions = getMessageActions();
32186
- var checkIfReverse = React.useCallback(function (containerElement) {
32187
- if (!containerElement) {
32188
- setReverse(false);
32189
- return;
32190
- }
32191
- if (open) {
32192
- var containerRect = containerElement.getBoundingClientRect();
32193
- if (mine) {
32194
- setReverse(!!messageListRect && containerRect.left < messageListRect.left);
32195
- }
32196
- else {
32197
- setReverse(!!messageListRect && containerRect.right + 5 > messageListRect.right);
32198
- }
32199
- }
32200
- }, [messageListRect, mine, open]);
32201
32196
  var handleQuote = function () {
32202
32197
  setQuotedMessage(message);
32203
32198
  var elements = message.parent_id
@@ -32209,12 +32204,10 @@ var UnMemoizedMessageActionsBox = function (props) {
32209
32204
  }
32210
32205
  };
32211
32206
  var rootClassName = clsx('str-chat__message-actions-box', {
32212
- 'str-chat__message-actions-box--mine': mine,
32213
32207
  'str-chat__message-actions-box--open': open,
32214
- 'str-chat__message-actions-box--reverse': reverse,
32215
32208
  });
32216
32209
  var buttonClassName = 'str-chat__message-actions-list-item str-chat__message-actions-list-item-button';
32217
- return (React__default["default"].createElement("div", { className: rootClassName, "data-testid": 'message-actions-box', ref: checkIfReverse },
32210
+ return (React__default["default"].createElement("div", icons.__assign({}, restDivProps, { className: rootClassName, "data-testid": 'message-actions-box', ref: ref }),
32218
32211
  React__default["default"].createElement("div", { "aria-label": 'Message Options', className: 'str-chat__message-actions-list', role: 'listbox' },
32219
32212
  React__default["default"].createElement(CustomMessageActionsList$1, { customMessageActions: customMessageActions, message: message }),
32220
32213
  messageActions.indexOf(MESSAGE_ACTIONS.quote) > -1 && (React__default["default"].createElement("button", { "aria-selected": 'false', className: buttonClassName, onClick: handleQuote, role: 'option' }, t('Reply'))),
@@ -32223,12 +32216,43 @@ var UnMemoizedMessageActionsBox = function (props) {
32223
32216
  messageActions.indexOf(MESSAGE_ACTIONS.mute) > -1 && (React__default["default"].createElement("button", { "aria-selected": 'false', className: buttonClassName, onClick: handleMute, role: 'option' }, isUserMuted() ? t('Unmute') : t('Mute'))),
32224
32217
  messageActions.indexOf(MESSAGE_ACTIONS.edit) > -1 && (React__default["default"].createElement("button", { "aria-selected": 'false', className: buttonClassName, onClick: handleEdit, role: 'option' }, t('Edit Message'))),
32225
32218
  messageActions.indexOf(MESSAGE_ACTIONS.delete) > -1 && (React__default["default"].createElement("button", { "aria-selected": 'false', className: buttonClassName, onClick: handleDelete, role: 'option' }, t('Delete'))))));
32226
- };
32219
+ });
32227
32220
  /**
32228
32221
  * A popup box that displays the available actions on a message, such as edit, delete, pin, etc.
32229
32222
  */
32230
32223
  var MessageActionsBox = React__default["default"].memo(UnMemoizedMessageActionsBox);
32231
32224
 
32225
+ function useMessageActionsBoxPopper(_a) {
32226
+ var open = _a.open, placement = _a.placement, referenceElement = _a.referenceElement;
32227
+ var popperElementRef = React.useRef(null);
32228
+ var _b = icons.usePopper(referenceElement, popperElementRef.current, {
32229
+ modifiers: [
32230
+ {
32231
+ name: 'eventListeners',
32232
+ options: {
32233
+ // It's not safe to update popper position on resize and scroll, since popper's
32234
+ // reference element might not be visible at the time.
32235
+ resize: false,
32236
+ scroll: false,
32237
+ },
32238
+ },
32239
+ ],
32240
+ placement: placement,
32241
+ }), attributes = _b.attributes, styles = _b.styles, update = _b.update;
32242
+ React.useEffect(function () {
32243
+ if (open) {
32244
+ // Since the popper's reference element might not be (and usually is not) visible
32245
+ // all the time, it's safer to force popper update before showing it.
32246
+ update === null || update === void 0 ? void 0 : update();
32247
+ }
32248
+ }, [open, update]);
32249
+ return {
32250
+ attributes: attributes,
32251
+ popperElementRef: popperElementRef,
32252
+ styles: styles,
32253
+ };
32254
+ }
32255
+
32232
32256
  var MessageActions = function (props) {
32233
32257
  var _a = props.ActionsIcon, ActionsIcon$1 = _a === void 0 ? ActionsIcon : _a, _b = props.customWrapperClass, customWrapperClass = _b === void 0 ? '' : _b, propGetMessageActions = props.getMessageActions, propHandleDelete = props.handleDelete, propHandleFlag = props.handleFlag, propHandleMute = props.handleMute, propHandlePin = props.handlePin, inline = props.inline, propMessage = props.message, messageWrapperRef = props.messageWrapperRef, mine = props.mine;
32234
32258
  var mutes = icons.useChatContext('MessageActions').mutes;
@@ -32239,6 +32263,7 @@ var MessageActions = function (props) {
32239
32263
  var handleMute = propHandleMute || contextHandleMute;
32240
32264
  var handlePin = propHandlePin || contextHandlePin;
32241
32265
  var message = propMessage || contextMessage;
32266
+ var isMine = mine ? mine() : isMyMessage();
32242
32267
  var _d = React.useState(false), actionsBoxOpen = _d[0], setActionsBoxOpen = _d[1];
32243
32268
  var isMuted = React.useCallback(function () { return isUserMuted(message, mutes); }, [message, mutes]);
32244
32269
  var hideOptions = React.useCallback(function (event) {
@@ -32269,11 +32294,17 @@ var MessageActions = function (props) {
32269
32294
  document.removeEventListener('keyup', hideOptions);
32270
32295
  };
32271
32296
  }, [actionsBoxOpen, hideOptions]);
32297
+ var actionsBoxButtonRef = React.useRef(null);
32298
+ var _e = useMessageActionsBoxPopper({
32299
+ open: actionsBoxOpen,
32300
+ placement: isMine ? 'top-end' : 'top-start',
32301
+ referenceElement: actionsBoxButtonRef.current,
32302
+ }), attributes = _e.attributes, popperElementRef = _e.popperElementRef, styles = _e.styles;
32272
32303
  if (!messageActions.length && !customMessageActions)
32273
32304
  return null;
32274
32305
  return (React__default["default"].createElement(MessageActionsWrapper, { customWrapperClass: customWrapperClass, inline: inline, setActionsBoxOpen: setActionsBoxOpen },
32275
- React__default["default"].createElement(MessageActionsBox, { getMessageActions: getMessageActions, handleDelete: handleDelete, handleEdit: setEditingState, handleFlag: handleFlag, handleMute: handleMute, handlePin: handlePin, isUserMuted: isMuted, mine: mine ? mine() : isMyMessage(), open: actionsBoxOpen }),
32276
- React__default["default"].createElement("button", { "aria-expanded": actionsBoxOpen, "aria-haspopup": 'true', "aria-label": 'Open Message Actions Menu', className: 'str-chat__message-actions-box-button' },
32306
+ React__default["default"].createElement(MessageActionsBox, icons.__assign({}, attributes.popper, { getMessageActions: getMessageActions, handleDelete: handleDelete, handleEdit: setEditingState, handleFlag: handleFlag, handleMute: handleMute, handlePin: handlePin, isUserMuted: isMuted, mine: isMine, open: actionsBoxOpen, ref: popperElementRef, style: styles.popper })),
32307
+ React__default["default"].createElement("button", { "aria-expanded": actionsBoxOpen, "aria-haspopup": 'true', "aria-label": 'Open Message Actions Menu', className: 'str-chat__message-actions-box-button', ref: actionsBoxButtonRef },
32277
32308
  React__default["default"].createElement(ActionsIcon$1, { className: 'str-chat__message-action-icon' }))));
32278
32309
  };
32279
32310
  var MessageActionsWrapper = function (props) {
@@ -32440,6 +32471,7 @@ var UnMemoizedMessageTextComponent = function (props) {
32440
32471
  var message = propMessage || contextMessage;
32441
32472
  var hasAttachment = messageHasAttachments(message);
32442
32473
  var messageTextToRender = ((_b = message.i18n) === null || _b === void 0 ? void 0 : _b["".concat(userLanguage, "_text")]) || message.text;
32474
+ // eslint-disable-next-line react-hooks/exhaustive-deps
32443
32475
  var messageText = React.useMemo(function () { return renderText$1(messageTextToRender, message.mentioned_users); }, [
32444
32476
  message.mentioned_users,
32445
32477
  messageTextToRender,
@@ -32885,6 +32917,7 @@ var useUserTrigger = function (params) {
32885
32917
  });
32886
32918
  return Object.values(uniqueUsers);
32887
32919
  }, [members, watchers]);
32920
+ // eslint-disable-next-line react-hooks/exhaustive-deps
32888
32921
  var queryMembersThrottled = React.useCallback(throttle__default["default"](function (query, onReady) { return icons.__awaiter(void 0, void 0, void 0, function () {
32889
32922
  var response, users, error_1;
32890
32923
  return icons.__generator(this, function (_a) {
@@ -33194,6 +33227,7 @@ var MessageInputFlat = function () {
33194
33227
  channel === null || channel === void 0 ? void 0 : channel.off('message.deleted', handleQuotedMessageUpdate);
33195
33228
  channel === null || channel === void 0 ? void 0 : channel.off('message.updated', handleQuotedMessageUpdate);
33196
33229
  };
33230
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33197
33231
  }, [channel, quotedMessage]);
33198
33232
  return themeVersion === '2' ? (React__default["default"].createElement(MessageInputV2, null)) : (React__default["default"].createElement(MessageInputV1, null));
33199
33233
  };
@@ -33361,6 +33395,7 @@ var useImageUploads = function (props, state, dispatch) {
33361
33395
  var removeImage = React.useCallback(function (id) {
33362
33396
  dispatch({ id: id, type: 'removeImageUpload' });
33363
33397
  // TODO: cancel upload if still uploading
33398
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33364
33399
  }, []);
33365
33400
  var uploadImage = React.useCallback(function (id) { return icons.__awaiter(void 0, void 0, void 0, function () {
33366
33401
  var img, file, canUpload, response, error_1, errorMessage, alreadyRemoved;
@@ -33436,7 +33471,9 @@ var useImageUploads = function (props, state, dispatch) {
33436
33471
  return [2 /*return*/];
33437
33472
  }
33438
33473
  });
33439
- }); }, [imageUploads, channel, doImageUploadRequest, errorHandler, removeImage]);
33474
+ }); },
33475
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33476
+ [imageUploads, channel, doImageUploadRequest, errorHandler, removeImage]);
33440
33477
  React.useEffect(function () {
33441
33478
  var upload = Object.values(imageUploads).find(function (imageUpload) { return imageUpload.state === 'uploading' && imageUpload.file; });
33442
33479
  if (!upload)
@@ -33458,10 +33495,12 @@ var useFileUploads = function (props, state, dispatch) {
33458
33495
  var t = icons.useTranslationContext('useFileUploads').t;
33459
33496
  var uploadFile = React.useCallback(function (id) {
33460
33497
  dispatch({ id: id, state: 'uploading', type: 'setFileUpload' });
33498
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33461
33499
  }, []);
33462
33500
  var removeFile = React.useCallback(function (id) {
33463
33501
  // TODO: cancel upload if still uploading
33464
33502
  dispatch({ id: id, type: 'removeFileUpload' });
33503
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33465
33504
  }, []);
33466
33505
  React.useEffect(function () {
33467
33506
  (function () { return icons.__awaiter(void 0, void 0, void 0, function () {
@@ -33533,6 +33572,7 @@ var useFileUploads = function (props, state, dispatch) {
33533
33572
  }
33534
33573
  });
33535
33574
  }); })();
33575
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33536
33576
  }, [fileUploads, channel, doFileUploadRequest, errorHandler, removeFile]);
33537
33577
  return {
33538
33578
  removeFile: removeFile,
@@ -33584,7 +33624,9 @@ var useAttachments = function (props, state, dispatch, textareaRef) {
33584
33624
  }
33585
33625
  });
33586
33626
  (_a = textareaRef === null || textareaRef === void 0 ? void 0 : textareaRef.current) === null || _a === void 0 ? void 0 : _a.focus();
33587
- }, [maxFilesLeft, noFiles]);
33627
+ },
33628
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33629
+ [maxFilesLeft, noFiles]);
33588
33630
  return {
33589
33631
  maxFilesLeft: maxFilesLeft,
33590
33632
  numberOfUploads: numberOfUploads,
@@ -33635,7 +33677,9 @@ var useMessageInputText = function (props, state, dispatch, findAndEnqueueURLsTo
33635
33677
  },
33636
33678
  type: 'setText',
33637
33679
  });
33638
- }, [additionalTextareaProps, newCursorPosition, textareaRef]);
33680
+ },
33681
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33682
+ [additionalTextareaProps, newCursorPosition, textareaRef]);
33639
33683
  React.useEffect(function () {
33640
33684
  var textareaElement = textareaRef.current;
33641
33685
  if (textareaElement && newCursorPosition.current !== undefined) {
@@ -33658,7 +33702,9 @@ var useMessageInputText = function (props, state, dispatch, findAndEnqueueURLsTo
33658
33702
  if (publishTypingEvent && newText && channel) {
33659
33703
  streamChat.logChatPromiseExecution(channel.keystroke(parent === null || parent === void 0 ? void 0 : parent.id), 'start typing event');
33660
33704
  }
33661
- }, [channel, findAndEnqueueURLsToEnrich, parent, publishTypingEvent]);
33705
+ },
33706
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33707
+ [channel, findAndEnqueueURLsToEnrich, parent, publishTypingEvent]);
33662
33708
  return {
33663
33709
  handleChange: handleChange,
33664
33710
  insertText: insertText,
@@ -33892,7 +33938,9 @@ var usePasteHandler = function (uploadNewFiles, insertText, isUploadEnabled, fin
33892
33938
  }
33893
33939
  });
33894
33940
  }); })(clipboardEvent);
33895
- }, [insertText, uploadNewFiles]);
33941
+ },
33942
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33943
+ [insertText, uploadNewFiles]);
33896
33944
  return { onPaste: onPaste };
33897
33945
  };
33898
33946
 
@@ -33916,7 +33964,10 @@ var useLinkPreviews = function (_a) {
33916
33964
  mode: exports.SetLinkPreviewMode.UPSERT,
33917
33965
  type: 'setLinkPreviews',
33918
33966
  });
33919
- }, [onLinkPreviewDismissed]);
33967
+ },
33968
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33969
+ [onLinkPreviewDismissed]);
33970
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33920
33971
  var findAndEnqueueURLsToEnrich = React.useCallback(debounce__default["default"](function (text, mode) {
33921
33972
  if (mode === void 0) { mode = exports.SetLinkPreviewMode.SET; }
33922
33973
  var urls = findURLFn
@@ -33982,6 +34033,7 @@ var useLinkPreviews = function (_a) {
33982
34033
  });
33983
34034
  });
33984
34035
  });
34036
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33985
34037
  }, [shouldDiscardEnrichQueries, linkPreviews]);
33986
34038
  return {
33987
34039
  cancelURLEnrichment: cancelURLEnrichment,
@@ -34273,7 +34325,9 @@ var useCreateMessageInputContext = function (value) {
34273
34325
  uploadImage: uploadImage,
34274
34326
  uploadNewFiles: uploadNewFiles,
34275
34327
  useMentionsTransliteration: useMentionsTransliteration,
34276
- }); }, [
34328
+ }); },
34329
+ // eslint-disable-next-line react-hooks/exhaustive-deps
34330
+ [
34277
34331
  cancelURLEnrichment,
34278
34332
  cooldownInterval,
34279
34333
  cooldownRemaining,
@@ -34356,6 +34410,7 @@ var MessageInputSmall = function () {
34356
34410
  channel === null || channel === void 0 ? void 0 : channel.off('message.deleted', handleQuotedMessageUpdate);
34357
34411
  channel === null || channel === void 0 ? void 0 : channel.off('message.updated', handleQuotedMessageUpdate);
34358
34412
  };
34413
+ // eslint-disable-next-line react-hooks/exhaustive-deps
34359
34414
  }, [channel, quotedMessage]);
34360
34415
  return (React__default["default"].createElement("div", { className: 'str-chat__small-message-input__wrapper' },
34361
34416
  React__default["default"].createElement(ImageDropzone, { accept: acceptedFiles, disabled: !isUploadEnabled || maxFilesLeft === 0 || !!cooldownRemaining, handleFiles: uploadNewFiles, maxNumberOfFiles: maxFilesLeft, multiple: multipleUploads },
@@ -34514,8 +34569,11 @@ var useProcessReactions = function (params) {
34514
34569
  var message = icons.useMessageContext('useProcessReactions').message;
34515
34570
  var contextReactionOptions = icons.useComponentContext('useProcessReactions').reactionOptions;
34516
34571
  var reactionOptions = propReactionOptions !== null && propReactionOptions !== void 0 ? propReactionOptions : contextReactionOptions;
34572
+ // eslint-disable-next-line react-hooks/exhaustive-deps
34517
34573
  var latestReactions = propReactions || message.latest_reactions || [];
34574
+ // eslint-disable-next-line react-hooks/exhaustive-deps
34518
34575
  var ownReactions = propOwnReactions || (message === null || message === void 0 ? void 0 : message.own_reactions) || [];
34576
+ // eslint-disable-next-line react-hooks/exhaustive-deps
34519
34577
  var reactionCounts = propReactionCounts || message.reaction_counts || {};
34520
34578
  var iHaveReactedWithReaction = React.useCallback(function (reactionType) { return ownReactions.find(function (reaction) { return reaction.type === reactionType; }); }, [ownReactions]);
34521
34579
  var getEmojiByReactionType = React.useCallback(function (reactionType) { return reactionOptions.find(function (_a) {
@@ -35025,7 +35083,7 @@ var getGroupStyles = function (message, previousMessage, nextMessage, noGroupByU
35025
35083
  // The MessageList should have configurable the limit for performing the requests.
35026
35084
  // This parameter would then be used within these functions
35027
35085
  var hasMoreMessagesProbably = function (returnedCountMessages, limit) {
35028
- return returnedCountMessages === limit;
35086
+ return returnedCountMessages >= limit;
35029
35087
  };
35030
35088
  // @deprecated
35031
35089
  var hasNotMoreMessages = function (returnedCountMessages, limit) {
@@ -35199,6 +35257,60 @@ var addResizingParamsToUrl = function (resizeDimensions, url) {
35199
35257
  url.searchParams.set('w', resizeDimensions.width.toString());
35200
35258
  };
35201
35259
 
35260
+ /**
35261
+ * Component to display system and channel event messages
35262
+ */
35263
+ var UnMemoizedEventComponent = function (props) {
35264
+ var _a, _b, _c;
35265
+ var _d = props.Avatar, Avatar$1 = _d === void 0 ? Avatar : _d, message = props.message;
35266
+ var tDateTimeParser = icons.useTranslationContext('EventComponent').tDateTimeParser;
35267
+ var _e = message.created_at, created_at = _e === void 0 ? '' : _e, event = message.event, text = message.text, type = message.type;
35268
+ var getDateOptions = { messageCreatedAt: created_at.toString(), tDateTimeParser: tDateTimeParser };
35269
+ if (type === 'system')
35270
+ return (React__default["default"].createElement("div", { className: 'str-chat__message--system', "data-testid": 'message-system' },
35271
+ React__default["default"].createElement("div", { className: 'str-chat__message--system__text' },
35272
+ React__default["default"].createElement("div", { className: 'str-chat__message--system__line' }),
35273
+ React__default["default"].createElement("p", null, text),
35274
+ React__default["default"].createElement("div", { className: 'str-chat__message--system__line' })),
35275
+ React__default["default"].createElement("div", { className: 'str-chat__message--system__date' },
35276
+ React__default["default"].createElement("strong", null,
35277
+ getDateString(icons.__assign(icons.__assign({}, getDateOptions), { format: 'dddd' })),
35278
+ " "),
35279
+ "at ",
35280
+ getDateString(icons.__assign(icons.__assign({}, getDateOptions), { format: 'hh:mm A' })))));
35281
+ if ((event === null || event === void 0 ? void 0 : event.type) === 'member.removed' || (event === null || event === void 0 ? void 0 : event.type) === 'member.added') {
35282
+ var name_1 = ((_a = event.user) === null || _a === void 0 ? void 0 : _a.name) || ((_b = event.user) === null || _b === void 0 ? void 0 : _b.id);
35283
+ var sentence = "".concat(name_1, " ").concat(event.type === 'member.added' ? 'has joined the chat' : 'was removed from the chat');
35284
+ return (React__default["default"].createElement("div", { className: 'str-chat__event-component__channel-event' },
35285
+ React__default["default"].createElement(Avatar$1, { image: (_c = event.user) === null || _c === void 0 ? void 0 : _c.image, name: name_1, user: event.user }),
35286
+ React__default["default"].createElement("div", { className: 'str-chat__event-component__channel-event__content' },
35287
+ React__default["default"].createElement("em", { className: 'str-chat__event-component__channel-event__sentence' }, sentence),
35288
+ React__default["default"].createElement("div", { className: 'str-chat__event-component__channel-event__date' }, getDateString(icons.__assign(icons.__assign({}, getDateOptions), { format: 'LT' }))))));
35289
+ }
35290
+ return null;
35291
+ };
35292
+ var EventComponent = React__default["default"].memo(UnMemoizedEventComponent);
35293
+
35294
+ var UnMemoizedDateSeparator = function (props) {
35295
+ var messageCreatedAt = props.date, formatDate = props.formatDate, _a = props.position, position = _a === void 0 ? 'right' : _a, unread = props.unread;
35296
+ var _b = icons.useTranslationContext('DateSeparator'), t = _b.t, tDateTimeParser = _b.tDateTimeParser;
35297
+ var formattedDate = getDateString({
35298
+ calendar: true,
35299
+ formatDate: formatDate,
35300
+ messageCreatedAt: messageCreatedAt,
35301
+ tDateTimeParser: tDateTimeParser,
35302
+ });
35303
+ return (React__default["default"].createElement("div", { className: 'str-chat__date-separator', "data-testid": 'date-separator' },
35304
+ (position === 'right' || position === 'center') && (React__default["default"].createElement("hr", { className: 'str-chat__date-separator-line' })),
35305
+ React__default["default"].createElement("div", { className: 'str-chat__date-separator-date' }, unread ? "".concat(t('New'), " - ").concat(formattedDate) : formattedDate),
35306
+ (position === 'left' || position === 'center') && (React__default["default"].createElement("hr", { className: 'str-chat__date-separator-line' }))));
35307
+ };
35308
+ /**
35309
+ * A simple date separator between messages.
35310
+ */
35311
+ var DateSeparator = React__default["default"].memo(UnMemoizedDateSeparator);
35312
+
35313
+ var isUserResponseArray = function (output) { var _a; return ((_a = output[0]) === null || _a === void 0 ? void 0 : _a.id) != null; };
35202
35314
  var UnMemoizedChannel = function (props) {
35203
35315
  var propsChannel = props.channel, _a = props.EmptyPlaceholder, EmptyPlaceholder = _a === void 0 ? null : _a, LoadingErrorIndicator = props.LoadingErrorIndicator, _b = props.LoadingIndicator, LoadingIndicator = _b === void 0 ? LoadingChannel : _b;
35204
35316
  var _c = icons.useChatContext('Channel'), contextChannel = _c.channel, channelsQueryState = _c.channelsQueryState, customClasses = _c.customClasses, theme = _c.theme;
@@ -35420,6 +35532,7 @@ var ChannelInner = function (props) {
35420
35532
  client.off('user.deleted', handleEvent);
35421
35533
  notificationTimeouts.forEach(clearTimeout);
35422
35534
  };
35535
+ // eslint-disable-next-line react-hooks/exhaustive-deps
35423
35536
  }, [
35424
35537
  channel.cid,
35425
35538
  channelQueryOptions,
@@ -35438,14 +35551,12 @@ var ChannelInner = function (props) {
35438
35551
  /** MESSAGE */
35439
35552
  // Adds a temporary notification to message list, will be removed after 5 seconds
35440
35553
  var addNotification = makeAddNotifications(setNotifications, notificationTimeouts);
35441
- var loadMoreFinished = debounce__default["default"](function (hasMore, messages) {
35554
+ // eslint-disable-next-line react-hooks/exhaustive-deps
35555
+ var loadMoreFinished = React.useCallback(debounce__default["default"](function (hasMore, messages) {
35442
35556
  if (!isMounted.current)
35443
35557
  return;
35444
35558
  dispatch({ hasMore: hasMore, messages: messages, type: 'loadMoreFinished' });
35445
- }, 2000, {
35446
- leading: true,
35447
- trailing: true,
35448
- });
35559
+ }, 2000, { leading: true, trailing: true }), []);
35449
35560
  var loadMore = function (limit) {
35450
35561
  if (limit === void 0) { limit = DEFAULT_NEXT_CHANNEL_PAGE_SIZE; }
35451
35562
  return icons.__awaiter(void 0, void 0, void 0, function () {
@@ -35489,12 +35600,12 @@ var ChannelInner = function (props) {
35489
35600
  var loadMoreNewer = function (limit) {
35490
35601
  if (limit === void 0) { limit = 100; }
35491
35602
  return icons.__awaiter(void 0, void 0, void 0, function () {
35492
- var newestMessage, newestId, perPage, queryResponse, e_3, hasMoreNewer;
35603
+ var newestMessage, newestId, perPage, queryResponse, e_3, hasMoreNewerMessages;
35493
35604
  var _a, _b;
35494
35605
  return icons.__generator(this, function (_c) {
35495
35606
  switch (_c.label) {
35496
35607
  case 0:
35497
- if (!online.current || !window.navigator.onLine)
35608
+ if (!online.current || !window.navigator.onLine || !state.hasMoreNewer)
35498
35609
  return [2 /*return*/, 0];
35499
35610
  newestMessage = (_a = state === null || state === void 0 ? void 0 : state.messages) === null || _a === void 0 ? void 0 : _a[((_b = state === null || state === void 0 ? void 0 : state.messages) === null || _b === void 0 ? void 0 : _b.length) - 1];
35500
35611
  if (state.loadingMore || state.loadingMoreNewer)
@@ -35518,8 +35629,12 @@ var ChannelInner = function (props) {
35518
35629
  dispatch({ loadingMoreNewer: false, type: 'setLoadingMoreNewer' });
35519
35630
  return [2 /*return*/, 0];
35520
35631
  case 4:
35521
- hasMoreNewer = channel.state.messages !== channel.state.latestMessages;
35522
- dispatch({ hasMoreNewer: hasMoreNewer, messages: channel.state.messages, type: 'loadMoreNewerFinished' });
35632
+ hasMoreNewerMessages = channel.state.messages !== channel.state.latestMessages;
35633
+ dispatch({
35634
+ hasMoreNewer: hasMoreNewerMessages,
35635
+ messages: channel.state.messages,
35636
+ type: 'loadMoreNewerFinished',
35637
+ });
35523
35638
  return [2 /*return*/, queryResponse.messages.length];
35524
35639
  }
35525
35640
  });
@@ -35604,7 +35719,6 @@ var ChannelInner = function (props) {
35604
35719
  type: 'copyMessagesFromChannel',
35605
35720
  });
35606
35721
  };
35607
- var isUserResponseArray = function (output) { var _a; return ((_a = output[0]) === null || _a === void 0 ? void 0 : _a.id) != null; };
35608
35722
  var doSendMessage = function (message, customMessageData, options) { return icons.__awaiter(void 0, void 0, void 0, function () {
35609
35723
  var attachments, id, _a, mentioned_users, parent_id, text, mentions, messageData, messageResponse, existingMessage, i, msg, responseTimestamp, existingMessageTimestamp, responseIsTheNewest, error_1, stringError, parsedError;
35610
35724
  var _b, _c;
@@ -35724,17 +35838,18 @@ var ChannelInner = function (props) {
35724
35838
  event === null || event === void 0 ? void 0 : event.preventDefault();
35725
35839
  dispatch({ type: 'closeThread' });
35726
35840
  };
35727
- var loadMoreThreadFinished = debounce__default["default"](function (threadHasMore, threadMessages) {
35841
+ // eslint-disable-next-line react-hooks/exhaustive-deps
35842
+ var loadMoreThreadFinished = React.useCallback(debounce__default["default"](function (threadHasMore, threadMessages) {
35728
35843
  dispatch({
35729
35844
  threadHasMore: threadHasMore,
35730
35845
  threadMessages: threadMessages,
35731
35846
  type: 'loadMoreThreadFinished',
35732
35847
  });
35733
- }, 2000, { leading: true, trailing: true });
35848
+ }, 2000, { leading: true, trailing: true }), []);
35734
35849
  var loadMoreThread = function (limit) {
35735
35850
  if (limit === void 0) { limit = DEFAULT_THREAD_PAGE_SIZE; }
35736
35851
  return icons.__awaiter(void 0, void 0, void 0, function () {
35737
- var parentID, oldMessages, oldestMessageID, queryResponse, threadHasMoreMessages, newThreadMessages;
35852
+ var parentId, oldMessages, oldestMessageId, queryResponse, threadHasMoreMessages, newThreadMessages;
35738
35853
  var _a;
35739
35854
  return icons.__generator(this, function (_b) {
35740
35855
  switch (_b.label) {
@@ -35743,23 +35858,23 @@ var ChannelInner = function (props) {
35743
35858
  if (state.threadLoadingMore || !state.thread)
35744
35859
  return [2 /*return*/];
35745
35860
  dispatch({ type: 'startLoadingThread' });
35746
- parentID = state.thread.id;
35747
- if (!parentID) {
35861
+ parentId = state.thread.id;
35862
+ if (!parentId) {
35748
35863
  return [2 /*return*/, dispatch({ type: 'closeThread' })];
35749
35864
  }
35750
- oldMessages = channel.state.threads[parentID] || [];
35751
- oldestMessageID = (_a = oldMessages[0]) === null || _a === void 0 ? void 0 : _a.id;
35865
+ oldMessages = channel.state.threads[parentId] || [];
35866
+ oldestMessageId = (_a = oldMessages[0]) === null || _a === void 0 ? void 0 : _a.id;
35752
35867
  _b.label = 1;
35753
35868
  case 1:
35754
35869
  _b.trys.push([1, 3, , 4]);
35755
- return [4 /*yield*/, channel.getReplies(parentID, {
35756
- id_lt: oldestMessageID,
35870
+ return [4 /*yield*/, channel.getReplies(parentId, {
35871
+ id_lt: oldestMessageId,
35757
35872
  limit: limit,
35758
35873
  })];
35759
35874
  case 2:
35760
35875
  queryResponse = _b.sent();
35761
35876
  threadHasMoreMessages = hasMoreMessagesProbably(queryResponse.messages.length, limit);
35762
- newThreadMessages = channel.state.threads[parentID] || [];
35877
+ newThreadMessages = channel.state.threads[parentId] || [];
35763
35878
  // next set loadingMore to false so we can start asking for more data
35764
35879
  loadMoreThreadFinished(threadHasMoreMessages, newThreadMessages);
35765
35880
  return [3 /*break*/, 4];
@@ -35796,7 +35911,9 @@ var ChannelInner = function (props) {
35796
35911
  setQuotedMessage: setQuotedMessage,
35797
35912
  skipMessageDataMemoization: skipMessageDataMemoization,
35798
35913
  updateMessage: updateMessage,
35799
- }); }, [
35914
+ }); },
35915
+ // eslint-disable-next-line react-hooks/exhaustive-deps
35916
+ [
35800
35917
  channel.cid,
35801
35918
  deleteMessage,
35802
35919
  enrichURLForPreviewConfig === null || enrichURLForPreviewConfig === void 0 ? void 0 : enrichURLForPreviewConfig.findURLFn,
@@ -35819,7 +35936,7 @@ var ChannelInner = function (props) {
35819
35936
  BaseImage: props.BaseImage,
35820
35937
  CooldownTimer: props.CooldownTimer,
35821
35938
  CustomMessageActionsList: props.CustomMessageActionsList,
35822
- DateSeparator: props.DateSeparator,
35939
+ DateSeparator: props.DateSeparator || DateSeparator,
35823
35940
  EditMessageInput: props.EditMessageInput,
35824
35941
  EmojiPicker: props.EmojiPicker,
35825
35942
  emojiSearchIndex: props.emojiSearchIndex,
@@ -35837,7 +35954,7 @@ var ChannelInner = function (props) {
35837
35954
  MessageOptions: props.MessageOptions,
35838
35955
  MessageRepliesCountButton: props.MessageRepliesCountButton,
35839
35956
  MessageStatus: props.MessageStatus,
35840
- MessageSystem: props.MessageSystem,
35957
+ MessageSystem: props.MessageSystem || EventComponent,
35841
35958
  MessageTimestamp: props.MessageTimestamp,
35842
35959
  ModalGallery: props.ModalGallery,
35843
35960
  PinIndicator: props.PinIndicator,
@@ -35854,7 +35971,9 @@ var ChannelInner = function (props) {
35854
35971
  TypingIndicator: props.TypingIndicator,
35855
35972
  VirtualMessage: props.VirtualMessage,
35856
35973
  });
35857
- }, [props.reactionOptions]);
35974
+ },
35975
+ // eslint-disable-next-line react-hooks/exhaustive-deps
35976
+ [props.reactionOptions]);
35858
35977
  var typingContextValue = useCreateTypingContext({
35859
35978
  typing: typing,
35860
35979
  });
@@ -35968,6 +36087,7 @@ var useChannelPreviewInfo = function (props) {
35968
36087
  return function () {
35969
36088
  client.off('user.updated', handleEvent);
35970
36089
  };
36090
+ // eslint-disable-next-line react-hooks/exhaustive-deps
35971
36091
  }, []);
35972
36092
  return {
35973
36093
  displayImage: overrideImage || displayImage,
@@ -36068,6 +36188,7 @@ var useChannelDeletedListener = function (setChannels, customHandler) {
36068
36188
  return function () {
36069
36189
  client.off('channel.deleted', handleEvent);
36070
36190
  };
36191
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36071
36192
  }, [customHandler]);
36072
36193
  };
36073
36194
 
@@ -36093,6 +36214,7 @@ var useChannelHiddenListener = function (setChannels, customHandler) {
36093
36214
  return function () {
36094
36215
  client.off('channel.hidden', handleEvent);
36095
36216
  };
36217
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36096
36218
  }, [customHandler]);
36097
36219
  };
36098
36220
 
@@ -36112,6 +36234,7 @@ var useChannelTruncatedListener = function (setChannels, customHandler, forceUpd
36112
36234
  return function () {
36113
36235
  client.off('channel.truncated', handleEvent);
36114
36236
  };
36237
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36115
36238
  }, [customHandler]);
36116
36239
  };
36117
36240
 
@@ -36140,6 +36263,7 @@ var useChannelUpdatedListener = function (setChannels, customHandler, forceUpdat
36140
36263
  return function () {
36141
36264
  client.off('channel.updated', handleEvent);
36142
36265
  };
36266
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36143
36267
  }, [customHandler]);
36144
36268
  };
36145
36269
 
@@ -36173,6 +36297,7 @@ var useChannelVisibleListener = function (setChannels, customHandler) {
36173
36297
  return function () {
36174
36298
  client.off('channel.visible', handleEvent);
36175
36299
  };
36300
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36176
36301
  }, [customHandler]);
36177
36302
  };
36178
36303
 
@@ -36188,6 +36313,7 @@ var useConnectionRecoveredListener = function (forceUpdate) {
36188
36313
  return function () {
36189
36314
  client.off('connection.recovered', handleEvent);
36190
36315
  };
36316
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36191
36317
  }, []);
36192
36318
  };
36193
36319
 
@@ -36229,6 +36355,7 @@ var useMessageNewListener = function (setChannels, customHandler, lockChannelOrd
36229
36355
  return function () {
36230
36356
  client.off('message.new', handleEvent);
36231
36357
  };
36358
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36232
36359
  }, [lockChannelOrder]);
36233
36360
  };
36234
36361
 
@@ -36289,6 +36416,7 @@ var useNotificationAddedToChannelListener = function (setChannels, customHandler
36289
36416
  return function () {
36290
36417
  client.off('notification.added_to_channel', handleEvent);
36291
36418
  };
36419
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36292
36420
  }, [customHandler]);
36293
36421
  };
36294
36422
 
@@ -36324,6 +36452,7 @@ var useNotificationMessageNewListener = function (setChannels, customHandler, al
36324
36452
  return function () {
36325
36453
  client.off('notification.message_new', handleEvent);
36326
36454
  };
36455
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36327
36456
  }, [customHandler]);
36328
36457
  };
36329
36458
 
@@ -36342,6 +36471,7 @@ var useNotificationRemovedFromChannelListener = function (setChannels, customHan
36342
36471
  return function () {
36343
36472
  client.off('notification.removed_from_channel', handleEvent);
36344
36473
  };
36474
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36345
36475
  }, [customHandler]);
36346
36476
  };
36347
36477
 
@@ -36361,6 +36491,7 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
36361
36491
  // memoize props
36362
36492
  var filterString = React.useMemo(function () { return JSON.stringify(filters); }, [filters]);
36363
36493
  var sortString = React.useMemo(function () { return JSON.stringify(sort); }, [sort]);
36494
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36364
36495
  var queryChannels = function (queryType) { return icons.__awaiter(void 0, void 0, void 0, function () {
36365
36496
  var offset, newOptions, channelQueryResponse, newChannels, err_1;
36366
36497
  var _a;
@@ -36429,6 +36560,7 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
36429
36560
  }, [client, throttleRecover]);
36430
36561
  React.useEffect(function () {
36431
36562
  queryChannels('reload');
36563
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36432
36564
  }, [filterString, sortString]);
36433
36565
  return {
36434
36566
  channels: channels,
@@ -36459,6 +36591,7 @@ var useUserPresenceChangedListener = function (setChannels) {
36459
36591
  return function () {
36460
36592
  client.off('user.presence.changed', handleEvent);
36461
36593
  };
36594
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36462
36595
  }, []);
36463
36596
  };
36464
36597
 
@@ -36501,6 +36634,7 @@ var useIsChannelMuted = function (channel) {
36501
36634
  var handleEvent = function () { return setMuted(channel.muteStatus()); };
36502
36635
  client.on('notification.channel_mutes_updated', handleEvent);
36503
36636
  return function () { return client.off('notification.channel_mutes_updated', handleEvent); };
36637
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36504
36638
  }, [muted]);
36505
36639
  return muted;
36506
36640
  };
@@ -36584,6 +36718,7 @@ var ChannelPreview = function (props) {
36584
36718
  };
36585
36719
  client.on('notification.mark_read', handleEvent);
36586
36720
  return function () { return client.off('notification.mark_read', handleEvent); };
36721
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36587
36722
  }, []);
36588
36723
  var refreshUnreadCount = React.useCallback(function () {
36589
36724
  if (isActive || muted) {
@@ -36608,6 +36743,7 @@ var ChannelPreview = function (props) {
36608
36743
  channel.off('message.updated', handleEvent);
36609
36744
  channel.off('message.deleted', handleEvent);
36610
36745
  };
36746
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36611
36747
  }, [refreshUnreadCount, channelUpdateCount]);
36612
36748
  if (!Preview)
36613
36749
  return null;
@@ -36664,6 +36800,7 @@ var useChannelSearch = function (_a) {
36664
36800
  };
36665
36801
  document.addEventListener('click', clickListener);
36666
36802
  return function () { return document.removeEventListener('click', clickListener); };
36803
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36667
36804
  }, [disabled, inputIsFocused, query, exitSearch, clearSearchOnClickOutside]);
36668
36805
  React.useEffect(function () {
36669
36806
  if (!inputRef.current || disabled)
@@ -36675,8 +36812,10 @@ var useChannelSearch = function (_a) {
36675
36812
  inputRef.current.addEventListener('keydown', handleKeyDown);
36676
36813
  return function () {
36677
36814
  var _a;
36815
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36678
36816
  (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener('keydown', handleKeyDown);
36679
36817
  };
36818
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36680
36819
  }, [disabled]);
36681
36820
  var selectResult = React.useCallback(function (result) { return icons.__awaiter(void 0, void 0, void 0, function () {
36682
36821
  var selectedChannel, newChannel;
@@ -36715,7 +36854,9 @@ var useChannelSearch = function (_a) {
36715
36854
  return [2 /*return*/];
36716
36855
  }
36717
36856
  });
36718
- }); }, [clearSearchOnClickOutside, client, exitSearch, onSelectResult, setActiveChannel, setChannels]);
36857
+ }); },
36858
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36859
+ [clearSearchOnClickOutside, client, exitSearch, onSelectResult, setActiveChannel, setChannels]);
36719
36860
  var getChannels = React.useCallback(function (text) { return icons.__awaiter(void 0, void 0, void 0, function () {
36720
36861
  var results, userQueryPromise, users, channelQueryPromise, _a, channels, users, error_1;
36721
36862
  var _b, _c, _d, _e, _f, _g;
@@ -36763,6 +36904,7 @@ var useChannelSearch = function (_a) {
36763
36904
  }
36764
36905
  });
36765
36906
  }); }, [client, searchForChannels, searchQueryParams]);
36907
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36766
36908
  var scheduleGetChannels = React.useCallback(debounce__default["default"](getChannels, searchDebounceIntervalMs), [
36767
36909
  getChannels,
36768
36910
  searchDebounceIntervalMs,
@@ -36870,11 +37012,13 @@ var SearchBar = function (props) {
36870
37012
  (_a = props.inputRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener('focus', handleFocus);
36871
37013
  (_b = props.inputRef.current) === null || _b === void 0 ? void 0 : _b.addEventListener('blur', handleBlur);
36872
37014
  };
37015
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36873
37016
  }, []);
36874
37017
  var handleClearClick = React.useCallback(function () {
36875
37018
  var _a;
36876
37019
  exitSearch();
36877
37020
  (_a = inputProps.inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
37021
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36878
37022
  }, []);
36879
37023
  var closeAppMenu = React.useCallback(function () { return setMenuIsOpen(false); }, []);
36880
37024
  return (React__default["default"].createElement("div", { className: 'str-chat__channel-search-bar', "data-testid": 'search-bar', ref: searchBarRef },
@@ -36956,7 +37100,9 @@ var SearchResults = function (props) {
36956
37100
  return setFocusedResult(undefined);
36957
37101
  }
36958
37102
  }
36959
- }, [focusedResult]);
37103
+ },
37104
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37105
+ [focusedResult]);
36960
37106
  React.useEffect(function () {
36961
37107
  document.addEventListener('keydown', handleKeyDown, false);
36962
37108
  return function () { return document.removeEventListener('keydown', handleKeyDown); };
@@ -37037,6 +37183,7 @@ var UnMemoizedLoadMoreButton = function (_a) {
37037
37183
  var loading = typeof isLoading !== 'undefined' ? isLoading : refreshing;
37038
37184
  React.useEffect(function () {
37039
37185
  deprecationAndReplacementWarning([[{ refreshing: refreshing }, { isLoading: isLoading }]], 'LoadMoreButton');
37186
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37040
37187
  }, []);
37041
37188
  return (React__default["default"].createElement("div", { className: 'str-chat__load-more-button' },
37042
37189
  React__default["default"].createElement("button", { "aria-label": 'Load More Channels', className: 'str-chat__load-more-button__button str-chat__cta-button', "data-testid": 'load-more-button', disabled: loading, onClick: onClick }, loading ? React__default["default"].createElement(LoadingIndicator, null) : childrenOrDefaultString)));
@@ -37048,6 +37195,7 @@ var UnMemoizedLoadMorePaginator = function (props) {
37048
37195
  var loadingState = typeof isLoading !== 'undefined' ? isLoading : refreshing;
37049
37196
  React.useEffect(function () {
37050
37197
  deprecationAndReplacementWarning([[{ refreshing: refreshing }, { isLoading: isLoading }]], 'LoadMorePaginator');
37198
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37051
37199
  }, []);
37052
37200
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
37053
37201
  !reverse && children,
@@ -37119,11 +37267,13 @@ var UnMemoizedChannelList = function (props) {
37119
37267
  setSearchActive(true);
37120
37268
  }
37121
37269
  (_a = additionalChannelSearchProps === null || additionalChannelSearchProps === void 0 ? void 0 : additionalChannelSearchProps.onSearch) === null || _a === void 0 ? void 0 : _a.call(additionalChannelSearchProps, event);
37270
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37122
37271
  }, []);
37123
37272
  var onSearchExit = React.useCallback(function () {
37124
37273
  var _a;
37125
37274
  setSearchActive(false);
37126
37275
  (_a = additionalChannelSearchProps === null || additionalChannelSearchProps === void 0 ? void 0 : additionalChannelSearchProps.onSearchExit) === null || _a === void 0 ? void 0 : _a.call(additionalChannelSearchProps);
37276
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37127
37277
  }, []);
37128
37278
  var _u = usePaginatedChannels(client, filters || DEFAULT_FILTERS, sort || DEFAULT_SORT, options || DEFAULT_OPTIONS, activeChannelHandler, recoveryThrottleIntervalMs), channels = _u.channels, hasNextPage = _u.hasNextPage, loadNextPage = _u.loadNextPage, setChannels = _u.setChannels;
37129
37279
  var loadedChannels = channelRenderFilterFn ? channelRenderFilterFn(channels) : channels;
@@ -37151,6 +37301,7 @@ var UnMemoizedChannelList = function (props) {
37151
37301
  client.off('channel.deleted', handleEvent);
37152
37302
  client.off('channel.hidden', handleEvent);
37153
37303
  };
37304
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37154
37305
  }, [channel === null || channel === void 0 ? void 0 : channel.cid]);
37155
37306
  var renderChannel = function (item) {
37156
37307
  var previewProps = {
@@ -37184,7 +37335,7 @@ var UnMemoizedChannelList = function (props) {
37184
37335
  */
37185
37336
  var ChannelList = React__default["default"].memo(UnMemoizedChannelList);
37186
37337
 
37187
- var version = '11.3.0';
37338
+ var version = '11.4.0';
37188
37339
 
37189
37340
  var useChat = function (_a) {
37190
37341
  var _b, _c;
@@ -37226,6 +37377,7 @@ var useChat = function (_a) {
37226
37377
  };
37227
37378
  client.on('notification.mutes_updated', handleEvent);
37228
37379
  return function () { return client.off('notification.mutes_updated', handleEvent); };
37380
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37229
37381
  }, [clientMutes === null || clientMutes === void 0 ? void 0 : clientMutes.length]);
37230
37382
  React.useEffect(function () {
37231
37383
  var _a;
@@ -37241,6 +37393,7 @@ var useChat = function (_a) {
37241
37393
  streami18n.getTranslators().then(function (translator) {
37242
37394
  setTranslators(icons.__assign(icons.__assign({}, translator), { userLanguage: userLanguage || defaultLanguage }));
37243
37395
  });
37396
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37244
37397
  }, [i18nInstance]);
37245
37398
  var setActiveChannel = React.useCallback(function (activeChannel, watchers, event) {
37246
37399
  if (watchers === void 0) { watchers = {}; }
@@ -37302,7 +37455,9 @@ var useCreateChatContext = function (value) {
37302
37455
  theme: theme,
37303
37456
  themeVersion: themeVersion,
37304
37457
  useImageFlagEmojisOnWindows: useImageFlagEmojisOnWindows,
37305
- }); }, [
37458
+ }); },
37459
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37460
+ [
37306
37461
  channelCid,
37307
37462
  channelsQueryError,
37308
37463
  channelsQueryInProgress,
@@ -37399,59 +37554,6 @@ var Chat = function (props) {
37399
37554
  React__default["default"].createElement(icons.TranslationProvider, { value: translators }, children)));
37400
37555
  };
37401
37556
 
37402
- var UnMemoizedDateSeparator = function (props) {
37403
- var messageCreatedAt = props.date, formatDate = props.formatDate, _a = props.position, position = _a === void 0 ? 'right' : _a, unread = props.unread;
37404
- var _b = icons.useTranslationContext('DateSeparator'), t = _b.t, tDateTimeParser = _b.tDateTimeParser;
37405
- var formattedDate = getDateString({
37406
- calendar: true,
37407
- formatDate: formatDate,
37408
- messageCreatedAt: messageCreatedAt,
37409
- tDateTimeParser: tDateTimeParser,
37410
- });
37411
- return (React__default["default"].createElement("div", { className: 'str-chat__date-separator', "data-testid": 'date-separator' },
37412
- (position === 'right' || position === 'center') && (React__default["default"].createElement("hr", { className: 'str-chat__date-separator-line' })),
37413
- React__default["default"].createElement("div", { className: 'str-chat__date-separator-date' }, unread ? "".concat(t('New'), " - ").concat(formattedDate) : formattedDate),
37414
- (position === 'left' || position === 'center') && (React__default["default"].createElement("hr", { className: 'str-chat__date-separator-line' }))));
37415
- };
37416
- /**
37417
- * A simple date separator between messages.
37418
- */
37419
- var DateSeparator = React__default["default"].memo(UnMemoizedDateSeparator);
37420
-
37421
- /**
37422
- * Component to display system and channel event messages
37423
- */
37424
- var UnMemoizedEventComponent = function (props) {
37425
- var _a, _b, _c;
37426
- var _d = props.Avatar, Avatar$1 = _d === void 0 ? Avatar : _d, message = props.message;
37427
- var tDateTimeParser = icons.useTranslationContext('EventComponent').tDateTimeParser;
37428
- var _e = message.created_at, created_at = _e === void 0 ? '' : _e, event = message.event, text = message.text, type = message.type;
37429
- var getDateOptions = { messageCreatedAt: created_at.toString(), tDateTimeParser: tDateTimeParser };
37430
- if (type === 'system')
37431
- return (React__default["default"].createElement("div", { className: 'str-chat__message--system', "data-testid": 'message-system' },
37432
- React__default["default"].createElement("div", { className: 'str-chat__message--system__text' },
37433
- React__default["default"].createElement("div", { className: 'str-chat__message--system__line' }),
37434
- React__default["default"].createElement("p", null, text),
37435
- React__default["default"].createElement("div", { className: 'str-chat__message--system__line' })),
37436
- React__default["default"].createElement("div", { className: 'str-chat__message--system__date' },
37437
- React__default["default"].createElement("strong", null,
37438
- getDateString(icons.__assign(icons.__assign({}, getDateOptions), { format: 'dddd' })),
37439
- " "),
37440
- "at ",
37441
- getDateString(icons.__assign(icons.__assign({}, getDateOptions), { format: 'hh:mm A' })))));
37442
- if ((event === null || event === void 0 ? void 0 : event.type) === 'member.removed' || (event === null || event === void 0 ? void 0 : event.type) === 'member.added') {
37443
- var name_1 = ((_a = event.user) === null || _a === void 0 ? void 0 : _a.name) || ((_b = event.user) === null || _b === void 0 ? void 0 : _b.id);
37444
- var sentence = "".concat(name_1, " ").concat(event.type === 'member.added' ? 'has joined the chat' : 'was removed from the chat');
37445
- return (React__default["default"].createElement("div", { className: 'str-chat__event-component__channel-event' },
37446
- React__default["default"].createElement(Avatar$1, { image: (_c = event.user) === null || _c === void 0 ? void 0 : _c.image, name: name_1, user: event.user }),
37447
- React__default["default"].createElement("div", { className: 'str-chat__event-component__channel-event__content' },
37448
- React__default["default"].createElement("em", { className: 'str-chat__event-component__channel-event__sentence' }, sentence),
37449
- React__default["default"].createElement("div", { className: 'str-chat__event-component__channel-event__date' }, getDateString(icons.__assign(icons.__assign({}, getDateOptions), { format: 'LT' }))))));
37450
- }
37451
- return null;
37452
- };
37453
- var EventComponent = React__default["default"].memo(UnMemoizedEventComponent);
37454
-
37455
37557
  /**
37456
37558
  * Prevents Chrome hangups
37457
37559
  * See: https://stackoverflow.com/questions/47524205/random-high-content-download-time-in-chrome/47684257#47684257
@@ -37507,6 +37609,7 @@ var InfiniteScroll = function (props) {
37507
37609
  [{ hasMore: hasMore }, { hasPreviousPage: hasPreviousPage }],
37508
37610
  [{ loadMore: loadMore }, { loadPreviousPage: loadPreviousPage }],
37509
37611
  ], 'InfiniteScroll');
37612
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37510
37613
  }, []);
37511
37614
  React.useLayoutEffect(function () {
37512
37615
  var _a;
@@ -37860,7 +37963,9 @@ var useReactionHandler = function (message) {
37860
37963
  var newOwnReactions = add
37861
37964
  ? icons.__spreadArray([reaction], ((message === null || message === void 0 ? void 0 : message.own_reactions) || []), true) : (_b = message === null || message === void 0 ? void 0 : message.own_reactions) === null || _b === void 0 ? void 0 : _b.filter(function (item) { return item.type !== reaction.type; });
37862
37965
  return icons.__assign(icons.__assign({}, message), { latest_reactions: newReactions || message.latest_reactions, own_reactions: newOwnReactions, reaction_counts: newReactionCounts, reaction_scores: newReactionCounts });
37863
- }, [client.user, client.userID]);
37966
+ },
37967
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37968
+ [client.user, client.userID]);
37864
37969
  var createReactionPreview = function (type) {
37865
37970
  var _a;
37866
37971
  return ({
@@ -37966,7 +38071,9 @@ var useReactionClick = function (message, reactionSelectorRef, messageWrapperRef
37966
38071
  return;
37967
38072
  }
37968
38073
  setShowDetailedReactions(false);
37969
- }, [setShowDetailedReactions, reactionSelectorRef]);
38074
+ },
38075
+ // eslint-disable-next-line react-hooks/exhaustive-deps
38076
+ [setShowDetailedReactions, reactionSelectorRef]);
37970
38077
  React.useEffect(function () {
37971
38078
  var messageWrapper = messageWrapperRef === null || messageWrapperRef === void 0 ? void 0 : messageWrapperRef.current;
37972
38079
  if (showDetailedReactions && !hasListener.current) {
@@ -38245,7 +38352,9 @@ var useEnrichedMessages = function (args) {
38245
38352
  acc[message.id] = style;
38246
38353
  return acc;
38247
38354
  }, {});
38248
- }, [messagesWithDates, noGroupByUser]);
38355
+ },
38356
+ // eslint-disable-next-line react-hooks/exhaustive-deps
38357
+ [messagesWithDates, noGroupByUser]);
38249
38358
  return { messageGroupStyles: messageGroupStyles, messages: messagesWithDates };
38250
38359
  };
38251
38360
 
@@ -38260,9 +38369,9 @@ var useLastReadData = function (props) {
38260
38369
  };
38261
38370
 
38262
38371
  var useMessageListElements = function (props) {
38263
- var enrichedMessages = props.enrichedMessages, internalMessageProps = props.internalMessageProps, messageGroupStyles = props.messageGroupStyles, read = props.read, returnAllReadData = props.returnAllReadData, threadList = props.threadList;
38372
+ var enrichedMessages = props.enrichedMessages, internalMessageProps = props.internalMessageProps, messageGroupStyles = props.messageGroupStyles, read = props.read, renderMessages = props.renderMessages, returnAllReadData = props.returnAllReadData, threadList = props.threadList;
38264
38373
  var _a = icons.useChatContext('useMessageListElements'), client = _a.client, customClasses = _a.customClasses;
38265
- var _b = icons.useComponentContext('useMessageListElements'), _c = _b.DateSeparator, DateSeparator$1 = _c === void 0 ? DateSeparator : _c, HeaderComponent = _b.HeaderComponent, _d = _b.MessageSystem, MessageSystem = _d === void 0 ? EventComponent : _d;
38374
+ var components = icons.useComponentContext('useMessageListElements');
38266
38375
  // get the readData, but only for messages submitted by the user themselves
38267
38376
  var readData = useLastReadData({
38268
38377
  messages: enrichedMessages,
@@ -38270,34 +38379,28 @@ var useMessageListElements = function (props) {
38270
38379
  returnAllReadData: returnAllReadData,
38271
38380
  userID: client.userID,
38272
38381
  });
38273
- var lastReceivedId = React.useMemo(function () { return getLastReceived(enrichedMessages); }, [enrichedMessages]);
38382
+ var lastReceivedMessageId = React.useMemo(function () { return getLastReceived(enrichedMessages); }, [
38383
+ enrichedMessages,
38384
+ ]);
38274
38385
  var elements = React.useMemo(function () {
38275
- return enrichedMessages.map(function (message) {
38276
- if (message.customType === CUSTOM_MESSAGE_TYPE.date &&
38277
- message.date &&
38278
- icons.isDate(message.date)) {
38279
- return (React__default["default"].createElement("li", { key: "".concat(message.date.toISOString(), "-i") },
38280
- React__default["default"].createElement(DateSeparator$1, { date: message.date, formatDate: internalMessageProps.formatDate, unread: message.unread })));
38281
- }
38282
- if (message.customType === CUSTOM_MESSAGE_TYPE.intro && HeaderComponent) {
38283
- return (React__default["default"].createElement("li", { key: 'intro' },
38284
- React__default["default"].createElement(HeaderComponent, null)));
38285
- }
38286
- if (message.type === 'system') {
38287
- return (React__default["default"].createElement("li", { key: message.id || message.created_at },
38288
- React__default["default"].createElement(MessageSystem, { message: message })));
38289
- }
38290
- var groupStyles = messageGroupStyles[message.id] || '';
38291
- var messageClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.message) || "str-chat__li str-chat__li--".concat(groupStyles);
38292
- return (React__default["default"].createElement("li", { className: messageClass, "data-message-id": message.id, "data-testid": messageClass, key: message.id || message.created_at },
38293
- React__default["default"].createElement(Message, icons.__assign({ groupStyles: [groupStyles], lastReceivedId: lastReceivedId, message: message, readBy: readData[message.id] || [], threadList: threadList }, internalMessageProps))));
38386
+ return renderMessages({
38387
+ components: components,
38388
+ customClasses: customClasses,
38389
+ lastReceivedMessageId: lastReceivedMessageId,
38390
+ messageGroupStyles: messageGroupStyles,
38391
+ messages: enrichedMessages,
38392
+ readData: readData,
38393
+ sharedMessageProps: icons.__assign(icons.__assign({}, internalMessageProps), { threadList: threadList }),
38294
38394
  });
38295
- }, [
38395
+ },
38396
+ // eslint-disable-next-line react-hooks/exhaustive-deps
38397
+ [
38296
38398
  enrichedMessages,
38297
38399
  internalMessageProps,
38298
- lastReceivedId,
38400
+ lastReceivedMessageId,
38299
38401
  messageGroupStyles,
38300
38402
  readData,
38403
+ renderMessages,
38301
38404
  threadList,
38302
38405
  ]);
38303
38406
  return elements;
@@ -38354,6 +38457,7 @@ function useMessageListScrollManager(params) {
38354
38457
  }
38355
38458
  messages.current = newMessages;
38356
38459
  measures.current = newMeasures;
38460
+ // eslint-disable-next-line react-hooks/exhaustive-deps
38357
38461
  }, [measures, messages, params.messages]);
38358
38462
  return function (scrollTopValue) {
38359
38463
  scrollTop.current = scrollTopValue;
@@ -38383,6 +38487,7 @@ var useScrollLocationLogic = function (params) {
38383
38487
  setWrapperRect(listElement.getBoundingClientRect());
38384
38488
  scrollToBottom();
38385
38489
  }
38490
+ // eslint-disable-next-line react-hooks/exhaustive-deps
38386
38491
  }, [listElement, hasMoreNewer]);
38387
38492
  var updateScrollTop = useMessageListScrollManager({
38388
38493
  loadMoreScrollThreshold: loadMoreScrollThreshold,
@@ -38533,24 +38638,50 @@ var MessageListMainPanel = function (_a) {
38533
38638
  return React__default["default"].createElement(React__default["default"].Fragment, null, children);
38534
38639
  };
38535
38640
 
38641
+ function defaultRenderMessages(_a) {
38642
+ var components = _a.components, customClasses = _a.customClasses, lastReceivedId = _a.lastReceivedMessageId, messageGroupStyles = _a.messageGroupStyles, messages = _a.messages, readData = _a.readData, messageProps = _a.sharedMessageProps;
38643
+ var DateSeparator = components.DateSeparator, HeaderComponent = components.HeaderComponent, MessageSystem = components.MessageSystem;
38644
+ return messages.map(function (message) {
38645
+ if (message.customType === CUSTOM_MESSAGE_TYPE.date &&
38646
+ message.date &&
38647
+ icons.isDate(message.date) &&
38648
+ DateSeparator) {
38649
+ return (React__default["default"].createElement("li", { key: "".concat(message.date.toISOString(), "-i") },
38650
+ React__default["default"].createElement(DateSeparator, { date: message.date, formatDate: messageProps.formatDate, unread: message.unread })));
38651
+ }
38652
+ if (message.customType === CUSTOM_MESSAGE_TYPE.intro && HeaderComponent) {
38653
+ return (React__default["default"].createElement("li", { key: 'intro' },
38654
+ React__default["default"].createElement(HeaderComponent, null)));
38655
+ }
38656
+ if (message.type === 'system' && MessageSystem) {
38657
+ return (React__default["default"].createElement("li", { key: message.id || message.created_at },
38658
+ React__default["default"].createElement(MessageSystem, { message: message })));
38659
+ }
38660
+ var groupStyles = messageGroupStyles[message.id] || '';
38661
+ var messageClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.message) || "str-chat__li str-chat__li--".concat(groupStyles);
38662
+ return (React__default["default"].createElement("li", { className: messageClass, "data-message-id": message.id, "data-testid": messageClass, key: message.id || message.created_at },
38663
+ React__default["default"].createElement(Message, icons.__assign({ groupStyles: [groupStyles], lastReceivedId: lastReceivedId, message: message, readBy: readData[message.id] || [] }, messageProps))));
38664
+ });
38665
+ }
38666
+
38536
38667
  var MessageListWithContext = function (props) {
38537
38668
  var channel = props.channel, _a = props.disableDateSeparator, disableDateSeparator = _a === void 0 ? false : _a, groupStyles = props.groupStyles, _b = props.hideDeletedMessages, hideDeletedMessages = _b === void 0 ? false : _b, _c = props.hideNewMessageSeparator, hideNewMessageSeparator = _c === void 0 ? false : _c, internalInfiniteScrollProps = props.internalInfiniteScrollProps, _d = props.messageActions, messageActions = _d === void 0 ? Object.keys(MESSAGE_ACTIONS) : _d, _e = props.messages, messages = _e === void 0 ? [] : _e, notifications = props.notifications, _f = props.noGroupByUser, noGroupByUser = _f === void 0 ? false : _f, _g = props.pinPermissions, pinPermissions = _g === void 0 ? defaultPinPermissions : _g, // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release
38538
38669
  _h = props.returnAllReadData, // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release
38539
- returnAllReadData = _h === void 0 ? false : _h, _j = props.threadList, threadList = _j === void 0 ? false : _j, _k = props.unsafeHTML, unsafeHTML = _k === void 0 ? false : _k, headerPosition = props.headerPosition, read = props.read, _l = props.messageLimit, messageLimit = _l === void 0 ? 100 : _l, loadMoreCallback = props.loadMore, loadMoreNewerCallback = props.loadMoreNewer, _m = props.hasMoreNewer, hasMoreNewer = _m === void 0 ? false : _m, suppressAutoscroll = props.suppressAutoscroll, highlightedMessageId = props.highlightedMessageId, _o = props.jumpToLatestMessage, jumpToLatestMessage = _o === void 0 ? function () { return Promise.resolve(); } : _o;
38540
- var _p = React__default["default"].useState(null), listElement = _p[0], setListElement = _p[1];
38541
- var _q = React__default["default"].useState(null), ulElement = _q[0], setUlElement = _q[1];
38670
+ returnAllReadData = _h === void 0 ? false : _h, _j = props.threadList, threadList = _j === void 0 ? false : _j, _k = props.unsafeHTML, unsafeHTML = _k === void 0 ? false : _k, headerPosition = props.headerPosition, read = props.read, _l = props.renderMessages, renderMessages = _l === void 0 ? defaultRenderMessages : _l, _m = props.messageLimit, messageLimit = _m === void 0 ? 100 : _m, loadMoreCallback = props.loadMore, loadMoreNewerCallback = props.loadMoreNewer, _o = props.hasMoreNewer, hasMoreNewer = _o === void 0 ? false : _o, suppressAutoscroll = props.suppressAutoscroll, highlightedMessageId = props.highlightedMessageId, _p = props.jumpToLatestMessage, jumpToLatestMessage = _p === void 0 ? function () { return Promise.resolve(); } : _p;
38671
+ var _q = React__default["default"].useState(null), listElement = _q[0], setListElement = _q[1];
38672
+ var _r = React__default["default"].useState(null), ulElement = _r[0], setUlElement = _r[1];
38542
38673
  var customClasses = icons.useChatContext('MessageList').customClasses;
38543
- var _r = icons.useComponentContext('MessageList'), _s = _r.EmptyStateIndicator, EmptyStateIndicator$1 = _s === void 0 ? EmptyStateIndicator : _s, _t = _r.LoadingIndicator, LoadingIndicator$1 = _t === void 0 ? LoadingIndicator : _t, _u = _r.MessageListNotifications, MessageListNotifications$1 = _u === void 0 ? MessageListNotifications : _u, _v = _r.MessageNotification, MessageNotification$1 = _v === void 0 ? MessageNotification : _v, _w = _r.TypingIndicator, TypingIndicator$1 = _w === void 0 ? TypingIndicator : _w;
38674
+ var _s = icons.useComponentContext('MessageList'), _t = _s.EmptyStateIndicator, EmptyStateIndicator$1 = _t === void 0 ? EmptyStateIndicator : _t, _u = _s.LoadingIndicator, LoadingIndicator$1 = _u === void 0 ? LoadingIndicator : _u, _v = _s.MessageListNotifications, MessageListNotifications$1 = _v === void 0 ? MessageListNotifications : _v, _w = _s.MessageNotification, MessageNotification$1 = _w === void 0 ? MessageNotification : _w, _x = _s.TypingIndicator, TypingIndicator$1 = _x === void 0 ? TypingIndicator : _x;
38544
38675
  var loadMoreScrollThreshold = (internalInfiniteScrollProps === null || internalInfiniteScrollProps === void 0 ? void 0 : internalInfiniteScrollProps.threshold) || 250;
38545
- var _x = useScrollLocationLogic({
38676
+ var _y = useScrollLocationLogic({
38546
38677
  hasMoreNewer: hasMoreNewer,
38547
38678
  listElement: listElement,
38548
38679
  loadMoreScrollThreshold: loadMoreScrollThreshold,
38549
38680
  messages: messages,
38550
38681
  scrolledUpThreshold: props.scrolledUpThreshold,
38551
38682
  suppressAutoscroll: suppressAutoscroll,
38552
- }), hasNewMessages = _x.hasNewMessages, isMessageListScrolledToBottom = _x.isMessageListScrolledToBottom, onScroll = _x.onScroll, scrollToBottom = _x.scrollToBottom, wrapperRect = _x.wrapperRect;
38553
- var _y = useEnrichedMessages({
38683
+ }), hasNewMessages = _y.hasNewMessages, isMessageListScrolledToBottom = _y.isMessageListScrolledToBottom, onScroll = _y.onScroll, scrollToBottom = _y.scrollToBottom, wrapperRect = _y.wrapperRect;
38684
+ var _z = useEnrichedMessages({
38554
38685
  channel: channel,
38555
38686
  disableDateSeparator: disableDateSeparator,
38556
38687
  groupStyles: groupStyles,
@@ -38559,7 +38690,7 @@ var MessageListWithContext = function (props) {
38559
38690
  hideNewMessageSeparator: hideNewMessageSeparator,
38560
38691
  messages: messages,
38561
38692
  noGroupByUser: noGroupByUser,
38562
- }), messageGroupStyles = _y.messageGroupStyles, enrichedMessages = _y.messages;
38693
+ }), messageGroupStyles = _z.messageGroupStyles, enrichedMessages = _z.messages;
38563
38694
  var elements = useMessageListElements({
38564
38695
  enrichedMessages: enrichedMessages,
38565
38696
  internalMessageProps: {
@@ -38590,6 +38721,7 @@ var MessageListWithContext = function (props) {
38590
38721
  },
38591
38722
  messageGroupStyles: messageGroupStyles,
38592
38723
  read: read,
38724
+ renderMessages: renderMessages,
38593
38725
  returnAllReadData: returnAllReadData,
38594
38726
  threadList: threadList,
38595
38727
  });
@@ -38628,6 +38760,7 @@ var MessageListWithContext = function (props) {
38628
38760
  var element = ulElement === null || ulElement === void 0 ? void 0 : ulElement.querySelector("[data-message-id='".concat(highlightedMessageId, "']"));
38629
38761
  element === null || element === void 0 ? void 0 : element.scrollIntoView({ block: 'center' });
38630
38762
  }
38763
+ // eslint-disable-next-line react-hooks/exhaustive-deps
38631
38764
  }, [highlightedMessageId]);
38632
38765
  var showEmptyStateIndicator = elements.length === 0 && !threadList;
38633
38766
  return (React__default["default"].createElement(icons.MessageListContextProvider, { value: { listElement: listElement, scrollToBottom: scrollToBottom } },
@@ -38695,6 +38828,7 @@ var UnMemoizedScrollToBottomButton = function (props) {
38695
38828
  return function () {
38696
38829
  client.off(observedEvent, handleEvent);
38697
38830
  };
38831
+ // eslint-disable-next-line react-hooks/exhaustive-deps
38698
38832
  }, [activeChannel, isMessageListScrolledToBottom, observedEvent, replyCount, thread]);
38699
38833
  React.useEffect(function () {
38700
38834
  if (isMessageListScrolledToBottom) {
@@ -38805,6 +38939,7 @@ function usePrependedMessagesCount(messages, hasDateSeparator) {
38805
38939
  return 0;
38806
38940
  // TODO: there's a bug here, the messages prop is the same array instance (something mutates it)
38807
38941
  // that's why the second dependency is necessary
38942
+ // eslint-disable-next-line react-hooks/exhaustive-deps
38808
38943
  }, [firstRealMessageIndex, messages, messages === null || messages === void 0 ? void 0 : messages.length]);
38809
38944
  return numItemsPrepended;
38810
38945
  }
@@ -38829,6 +38964,7 @@ function useShouldForceScrollToBottom(messages, currentUserId) {
38829
38964
  initialFocusRegistered.current = true;
38830
38965
  recheckForNewOwnMessage();
38831
38966
  }
38967
+ // eslint-disable-next-line react-hooks/exhaustive-deps
38832
38968
  }, [messages, messages === null || messages === void 0 ? void 0 : messages.length]);
38833
38969
  return recheckForNewOwnMessage;
38834
38970
  }
@@ -38846,6 +38982,7 @@ var useGiphyPreview = function (separateGiphyPreview) {
38846
38982
  if (separateGiphyPreview)
38847
38983
  client.on('message.new', handleEvent);
38848
38984
  return function () { return client.off('message.new', handleEvent); };
38985
+ // eslint-disable-next-line react-hooks/exhaustive-deps
38849
38986
  }, [separateGiphyPreview]);
38850
38987
  return { giphyPreviewMessage: giphyPreviewMessage, setGiphyPreviewMessage: setGiphyPreviewMessage };
38851
38988
  };
@@ -38895,6 +39032,7 @@ var useScrollToBottomOnNewMessage = function (_a) {
38895
39032
  window.removeEventListener('focus', scrollToBottomIfConfigured);
38896
39033
  window.removeEventListener('blur', resetNewMessagesReceivedInBackground);
38897
39034
  };
39035
+ // eslint-disable-next-line react-hooks/exhaustive-deps
38898
39036
  }, [scrollToBottomIfConfigured]);
38899
39037
  };
38900
39038
 
@@ -38991,7 +39129,7 @@ function calculateInitialTopMostItemIndex(messages, highlightedMessageId) {
38991
39129
  return messages.length - 1;
38992
39130
  }
38993
39131
  var VirtualizedMessageListWithContext = function (props) {
38994
- var additionalMessageInputProps = props.additionalMessageInputProps, _a = props.additionalVirtuosoProps, additionalVirtuosoProps = _a === void 0 ? {} : _a, channel = props.channel, closeReactionSelectorOnClick = props.closeReactionSelectorOnClick, customMessageActions = props.customMessageActions, customMessageRenderer = props.customMessageRenderer, defaultItemHeight = props.defaultItemHeight, _b = props.disableDateSeparator, disableDateSeparator = _b === void 0 ? true : _b, groupStyles = props.groupStyles, hasMore = props.hasMore, hasMoreNewer = props.hasMoreNewer, head = props.head, _c = props.hideDeletedMessages, hideDeletedMessages = _c === void 0 ? false : _c, _d = props.hideNewMessageSeparator, hideNewMessageSeparator = _d === void 0 ? false : _d, highlightedMessageId = props.highlightedMessageId, jumpToLatestMessage = props.jumpToLatestMessage, loadingMore = props.loadingMore, loadMore = props.loadMore, loadMoreNewer = props.loadMoreNewer, MessageUIComponentFromProps = props.Message, messageActions = props.messageActions, _e = props.messageLimit, messageLimit = _e === void 0 ? 100 : _e, messages = props.messages, notifications = props.notifications,
39132
+ var additionalMessageInputProps = props.additionalMessageInputProps, _a = props.additionalVirtuosoProps, additionalVirtuosoProps = _a === void 0 ? {} : _a, channel = props.channel, closeReactionSelectorOnClick = props.closeReactionSelectorOnClick, customMessageActions = props.customMessageActions, customMessageRenderer = props.customMessageRenderer, defaultItemHeight = props.defaultItemHeight, _b = props.disableDateSeparator, disableDateSeparator = _b === void 0 ? true : _b, groupStyles = props.groupStyles, hasMoreNewer = props.hasMoreNewer, head = props.head, _c = props.hideDeletedMessages, hideDeletedMessages = _c === void 0 ? false : _c, _d = props.hideNewMessageSeparator, hideNewMessageSeparator = _d === void 0 ? false : _d, highlightedMessageId = props.highlightedMessageId, jumpToLatestMessage = props.jumpToLatestMessage, loadingMore = props.loadingMore, loadMore = props.loadMore, loadMoreNewer = props.loadMoreNewer, MessageUIComponentFromProps = props.Message, messageActions = props.messageActions, _e = props.messageLimit, messageLimit = _e === void 0 ? 100 : _e, messages = props.messages, notifications = props.notifications,
38995
39133
  // TODO: refactor to scrollSeekPlaceHolderConfiguration and components.ScrollSeekPlaceholder, like the Virtuoso Component
38996
39134
  _f = props.overscan,
38997
39135
  // TODO: refactor to scrollSeekPlaceHolderConfiguration and components.ScrollSeekPlaceholder, like the Virtuoso Component
@@ -39025,6 +39163,7 @@ var VirtualizedMessageListWithContext = function (props) {
39025
39163
  setGiphyPreviewMessage: setGiphyPreviewMessage,
39026
39164
  userId: client.userID || '',
39027
39165
  });
39166
+ // eslint-disable-next-line react-hooks/exhaustive-deps
39028
39167
  }, [
39029
39168
  disableDateSeparator,
39030
39169
  hideDeletedMessages,
@@ -39054,6 +39193,7 @@ var VirtualizedMessageListWithContext = function (props) {
39054
39193
  }, {});
39055
39194
  },
39056
39195
  // processedMessages were incorrectly rebuilt with a new object identity at some point, hence the .length usage
39196
+ // eslint-disable-next-line react-hooks/exhaustive-deps
39057
39197
  [processedMessages.length, shouldGroupByUser, groupStylesFn]);
39058
39198
  var _w = useNewMessageNotification(processedMessages, client.userID, hasMoreNewer), atBottom = _w.atBottom, isMessageListScrolledToBottom = _w.isMessageListScrolledToBottom, newMessagesNotification = _w.newMessagesNotification, setIsMessageListScrolledToBottom = _w.setIsMessageListScrolledToBottom, setNewMessagesNotification = _w.setNewMessagesNotification;
39059
39199
  var scrollToBottom = React.useCallback(function () { return icons.__awaiter(void 0, void 0, void 0, function () {
@@ -39103,19 +39243,14 @@ var VirtualizedMessageListWithContext = function (props) {
39103
39243
  var atBottomStateChange = function (isAtBottom) {
39104
39244
  atBottom.current = isAtBottom;
39105
39245
  setIsMessageListScrolledToBottom(isAtBottom);
39106
- if (isAtBottom && newMessagesNotification) {
39107
- setNewMessagesNotification(false);
39246
+ if (isAtBottom) {
39247
+ loadMoreNewer === null || loadMoreNewer === void 0 ? void 0 : loadMoreNewer(messageLimit);
39248
+ setNewMessagesNotification === null || setNewMessagesNotification === void 0 ? void 0 : setNewMessagesNotification(false);
39108
39249
  }
39109
39250
  };
39110
- var startReached = function () {
39111
- if (hasMore && loadMore) {
39112
- loadMore(messageLimit);
39113
- }
39114
- };
39115
- var endReached = function () {
39116
- if (hasMoreNewer && loadMoreNewer) {
39117
- loadMoreNewer(messageLimit);
39118
- }
39251
+ var atTopStateChange = function (isAtTop) {
39252
+ if (isAtTop)
39253
+ loadMore === null || loadMore === void 0 ? void 0 : loadMore(messageLimit);
39119
39254
  };
39120
39255
  React.useEffect(function () {
39121
39256
  var _a;
@@ -39125,13 +39260,14 @@ var VirtualizedMessageListWithContext = function (props) {
39125
39260
  (_a = virtuoso.current) === null || _a === void 0 ? void 0 : _a.scrollToIndex({ align: 'center', index: index });
39126
39261
  }
39127
39262
  }
39263
+ // eslint-disable-next-line react-hooks/exhaustive-deps
39128
39264
  }, [highlightedMessageId]);
39129
39265
  if (!processedMessages)
39130
39266
  return null;
39131
39267
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
39132
39268
  React__default["default"].createElement(MessageListMainPanel, null,
39133
39269
  React__default["default"].createElement("div", { className: (customClasses === null || customClasses === void 0 ? void 0 : customClasses.virtualizedMessageList) || 'str-chat__virtual-list' },
39134
- React__default["default"].createElement(reactVirtuoso.Virtuoso, icons.__assign({ atBottomStateChange: atBottomStateChange, atBottomThreshold: 200, className: 'str-chat__message-list-scroll', components: icons.__assign({ EmptyPlaceholder: EmptyPlaceholder, Footer: Footer, Header: Header, Item: Item }, virtuosoComponentsFromProps), computeItemKey: computeItemKey, context: {
39270
+ React__default["default"].createElement(reactVirtuoso.Virtuoso, icons.__assign({ atBottomStateChange: atBottomStateChange, atBottomThreshold: 100, atTopStateChange: atTopStateChange, atTopThreshold: 100, className: 'str-chat__message-list-scroll', components: icons.__assign({ EmptyPlaceholder: EmptyPlaceholder, Footer: Footer, Header: Header, Item: Item }, virtuosoComponentsFromProps), computeItemKey: computeItemKey, context: {
39135
39271
  additionalMessageInputProps: additionalMessageInputProps,
39136
39272
  closeReactionSelectorOnClick: closeReactionSelectorOnClick,
39137
39273
  customClasses: customClasses,
@@ -39151,7 +39287,7 @@ var VirtualizedMessageListWithContext = function (props) {
39151
39287
  shouldGroupByUser: shouldGroupByUser,
39152
39288
  threadList: threadList,
39153
39289
  virtuosoRef: virtuoso,
39154
- }, endReached: endReached, firstItemIndex: calculateFirstItemIndex(numItemsPrepended), followOutput: followOutput, increaseViewportBy: { bottom: 200, top: 0 }, initialTopMostItemIndex: calculateInitialTopMostItemIndex(processedMessages, highlightedMessageId), itemContent: messageRenderer, itemSize: fractionalItemSize, key: messageSetKey, overscan: overscan, ref: virtuoso, startReached: startReached, style: { overflowX: 'hidden' }, totalCount: processedMessages.length }, overridingVirtuosoProps, (scrollSeekPlaceHolder ? { scrollSeek: scrollSeekPlaceHolder } : {}), (defaultItemHeight ? { defaultItemHeight: defaultItemHeight } : {}))))),
39290
+ }, firstItemIndex: calculateFirstItemIndex(numItemsPrepended), followOutput: followOutput, increaseViewportBy: { bottom: 200, top: 0 }, initialTopMostItemIndex: calculateInitialTopMostItemIndex(processedMessages, highlightedMessageId), itemContent: messageRenderer, itemSize: fractionalItemSize, key: messageSetKey, overscan: overscan, ref: virtuoso, style: { overflowX: 'hidden' }, totalCount: processedMessages.length }, overridingVirtuosoProps, (scrollSeekPlaceHolder ? { scrollSeek: scrollSeekPlaceHolder } : {}), (defaultItemHeight ? { defaultItemHeight: defaultItemHeight } : {}))))),
39155
39291
  React__default["default"].createElement(MessageListNotifications$1, { hasNewMessages: newMessagesNotification, isMessageListScrolledToBottom: isMessageListScrolledToBottom, isNotAtLatestMessageSet: hasMoreNewer, MessageNotification: MessageNotification$1, notifications: notifications, scrollToBottom: scrollToBottom, threadList: threadList }),
39156
39292
  giphyPreviewMessage && React__default["default"].createElement(GiphyPreviewMessage$1, { message: giphyPreviewMessage })));
39157
39293
  };
@@ -39233,6 +39369,7 @@ var ThreadInner = function (props) {
39233
39369
  // FIXME: integrators can customize channel query options but cannot customize channel.getReplies() options
39234
39370
  loadMoreThread();
39235
39371
  }
39372
+ // eslint-disable-next-line react-hooks/exhaustive-deps
39236
39373
  }, []);
39237
39374
  if (!thread)
39238
39375
  return null;
@@ -39456,6 +39593,7 @@ exports.darkModeTheme = darkModeTheme;
39456
39593
  exports.defaultAllowedTagNames = defaultAllowedTagNames;
39457
39594
  exports.defaultPinPermissions = defaultPinPermissions;
39458
39595
  exports.defaultReactionOptions = defaultReactionOptions;
39596
+ exports.defaultRenderMessages = defaultRenderMessages;
39459
39597
  exports.defaultScrollToItem = defaultScrollToItem;
39460
39598
  exports.defaultTimestampFormat = defaultTimestampFormat;
39461
39599
  exports.emojiMarkdownPlugin = emojiMarkdownPlugin;