stream-chat-react 9.0.0 → 9.1.1

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 (71) hide show
  1. package/dist/browser.full-bundle.js +744 -198
  2. package/dist/browser.full-bundle.js.map +1 -1
  3. package/dist/browser.full-bundle.min.js +4 -4
  4. package/dist/browser.full-bundle.min.js.map +1 -1
  5. package/dist/components/Channel/Channel.d.ts.map +1 -1
  6. package/dist/components/Channel/Channel.js +10 -4
  7. package/dist/components/Channel/channelState.js +1 -1
  8. package/dist/components/ChannelList/ChannelList.d.ts +2 -0
  9. package/dist/components/ChannelList/ChannelList.d.ts.map +1 -1
  10. package/dist/components/ChannelList/ChannelList.js +6 -4
  11. package/dist/components/ChannelList/ChannelListMessenger.d.ts +2 -2
  12. package/dist/components/ChannelList/ChannelListMessenger.d.ts.map +1 -1
  13. package/dist/components/ChannelList/ChannelListMessenger.js +1 -1
  14. package/dist/components/ChannelList/hooks/usePaginatedChannels.d.ts +0 -5
  15. package/dist/components/ChannelList/hooks/usePaginatedChannels.d.ts.map +1 -1
  16. package/dist/components/ChannelList/hooks/usePaginatedChannels.js +10 -15
  17. package/dist/components/Chat/Chat.d.ts.map +1 -1
  18. package/dist/components/Chat/Chat.js +3 -0
  19. package/dist/components/Chat/hooks/useChannelsQueryState.d.ts +12 -0
  20. package/dist/components/Chat/hooks/useChannelsQueryState.d.ts.map +1 -0
  21. package/dist/components/Chat/hooks/useChannelsQueryState.js +11 -0
  22. package/dist/components/Chat/hooks/useCreateChatContext.d.ts.map +1 -1
  23. package/dist/components/Chat/hooks/useCreateChatContext.js +13 -2
  24. package/dist/components/ChatDown/ChatDown.d.ts.map +1 -1
  25. package/dist/components/ChatDown/ChatDown.js +0 -2
  26. package/dist/components/InfiniteScrollPaginator/InfiniteScroll.d.ts.map +1 -1
  27. package/dist/components/InfiniteScrollPaginator/InfiniteScroll.js +1 -7
  28. package/dist/components/MessageInput/EditMessageForm.d.ts.map +1 -1
  29. package/dist/components/MessageInput/EditMessageForm.js +3 -7
  30. package/dist/components/MessageInput/UploadsPreview.d.ts.map +1 -1
  31. package/dist/components/MessageInput/UploadsPreview.js +3 -1
  32. package/dist/components/MessageInput/hooks/useAttachments.d.ts.map +1 -1
  33. package/dist/components/MessageInput/hooks/useAttachments.js +4 -4
  34. package/dist/components/MessageInput/hooks/useMessageInputState.d.ts +2 -2
  35. package/dist/components/MessageInput/hooks/useMessageInputState.d.ts.map +1 -1
  36. package/dist/components/MessageInput/hooks/useMessageInputState.js +24 -19
  37. package/dist/components/MessageInput/hooks/useSubmitHandler.d.ts.map +1 -1
  38. package/dist/components/MessageInput/hooks/useSubmitHandler.js +47 -19
  39. package/dist/components/MessageList/MessageList.d.ts.map +1 -1
  40. package/dist/components/MessageList/MessageList.js +13 -13
  41. package/dist/components/MessageList/hooks/useMessageListScrollManager.d.ts.map +1 -1
  42. package/dist/components/MessageList/hooks/useMessageListScrollManager.js +0 -3
  43. package/dist/components/MessageList/hooks/useScrollLocationLogic.d.ts +3 -1
  44. package/dist/components/MessageList/hooks/useScrollLocationLogic.d.ts.map +1 -1
  45. package/dist/components/MessageList/hooks/useScrollLocationLogic.js +42 -28
  46. package/dist/components/Modal/Modal.d.ts +1 -1
  47. package/dist/components/Modal/Modal.d.ts.map +1 -1
  48. package/dist/components/Modal/Modal.js +12 -15
  49. package/dist/context/ChannelActionContext.d.ts +2 -1
  50. package/dist/context/ChannelActionContext.d.ts.map +1 -1
  51. package/dist/context/ChatContext.d.ts +2 -0
  52. package/dist/context/ChatContext.d.ts.map +1 -1
  53. package/dist/css/index.css +1 -1
  54. package/dist/index.cjs.js +190 -149
  55. package/dist/index.cjs.js.map +1 -1
  56. package/dist/scss/Message.scss +1 -1
  57. package/dist/scss/MessageActions.scss +19 -0
  58. package/dist/scss/MessageList.scss +16 -7
  59. package/dist/scss/Modal.scss +1 -2
  60. package/dist/scss/Thread.scss +0 -1
  61. package/dist/scss/_variables.scss +2 -0
  62. package/dist/stories/edit-message.stories.d.ts +3 -0
  63. package/dist/stories/edit-message.stories.d.ts.map +1 -0
  64. package/dist/stories/edit-message.stories.js +54 -0
  65. package/dist/stories/navigate-long-message-lists.stories.d.ts.map +1 -1
  66. package/dist/stories/navigate-long-message-lists.stories.js +5 -3
  67. package/dist/types/types.d.ts +2 -1
  68. package/dist/types/types.d.ts.map +1 -1
  69. package/dist/version.d.ts +1 -1
  70. package/dist/version.js +1 -1
  71. package/package.json +7 -6
package/dist/index.cjs.js CHANGED
@@ -53,6 +53,7 @@ var throttle = require('lodash.throttle');
53
53
  var streamChat = require('stream-chat');
54
54
  var deepequal = require('react-fast-compare');
55
55
  var DefaultEmojiIndex = require('emoji-mart/dist/utils/emoji-index/nimble-emoji-index.js');
56
+ var resizeObserver = require('@juggle/resize-observer');
56
57
  var reactVirtuoso = require('react-virtuoso');
57
58
 
58
59
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -1028,28 +1029,25 @@ var Modal = function (props) {
1028
1029
  var innerRef = React.useRef(null);
1029
1030
  var closeRef = React.useRef(null);
1030
1031
  var handleClick = function (event) {
1031
- var _a, _b;
1032
- if ((event.target instanceof HTMLDivElement &&
1033
- !((_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target)) &&
1034
- onClose) ||
1035
- (event.target instanceof HTMLButtonElement &&
1036
- ((_b = closeRef.current) === null || _b === void 0 ? void 0 : _b.contains(event.target)) &&
1037
- onClose)) {
1038
- onClose();
1039
- }
1032
+ var target = event.target;
1033
+ if (!innerRef.current || !closeRef.current)
1034
+ return;
1035
+ if (!innerRef.current.contains(target) || closeRef.current.contains(target))
1036
+ onClose === null || onClose === void 0 ? void 0 : onClose();
1040
1037
  };
1041
1038
  React.useEffect(function () {
1042
1039
  if (!open)
1043
- return function () { return null; };
1040
+ return;
1044
1041
  var handleEscKey = function (event) {
1045
- if (event instanceof KeyboardEvent && event.key === 'Escape' && onClose) {
1046
- onClose();
1047
- }
1042
+ if (event.key === 'Escape')
1043
+ onClose === null || onClose === void 0 ? void 0 : onClose();
1048
1044
  };
1049
- document.addEventListener('keypress', handleEscKey);
1050
- return function () { return document.removeEventListener('keypress', handleEscKey); };
1045
+ document.addEventListener('keydown', handleEscKey);
1046
+ return function () { return document.removeEventListener('keydown', handleEscKey); };
1051
1047
  }, [onClose, open]);
1052
1048
  var openClasses = open ? 'str-chat__modal--open' : 'str-chat__modal--closed';
1049
+ if (!open)
1050
+ return null;
1053
1051
  return (React__default['default'].createElement("div", { className: "str-chat__modal " + openClasses, onClick: handleClick },
1054
1052
  React__default['default'].createElement("button", { className: 'str-chat__modal__close-button', ref: closeRef, title: 'Close' },
1055
1053
  t('Close'),
@@ -2569,7 +2567,7 @@ var channelReducer = function (state, action) {
2569
2567
  }
2570
2568
  case 'setLoadingMore': {
2571
2569
  var loadingMore = action.loadingMore;
2572
- // supporess the autoscroll behavior
2570
+ // suppress the autoscroll behavior
2573
2571
  return __assign(__assign({}, state), { loadingMore: loadingMore, suppressAutoscroll: true });
2574
2572
  }
2575
2573
  case 'setLoadingMoreNewer': {
@@ -4702,7 +4700,9 @@ var UploadsPreview = function () {
4702
4700
  var _a = useChannelStateContext('UploadsPreview'), maxNumberOfFiles = _a.maxNumberOfFiles, multipleUploads = _a.multipleUploads;
4703
4701
  var messageInput = useMessageInputContext('UploadsPreview');
4704
4702
  var fileOrder = messageInput.fileOrder, fileUploads = messageInput.fileUploads, imageOrder = messageInput.imageOrder, imageUploads = messageInput.imageUploads, numberOfUploads = messageInput.numberOfUploads, removeFile = messageInput.removeFile, removeImage = messageInput.removeImage, uploadFile = messageInput.uploadFile, uploadImage = messageInput.uploadImage, uploadNewFiles = messageInput.uploadNewFiles;
4705
- var imagesToPreview = imageOrder.map(function (id) { return imageUploads[id]; });
4703
+ var imagesToPreview = imageOrder
4704
+ .map(function (id) { return imageUploads[id]; })
4705
+ .filter(function (image) { return !image.og_scrape_url; });
4706
4706
  var filesToPreview = fileOrder.map(function (id) { return fileUploads[id]; });
4707
4707
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
4708
4708
  imageOrder.length > 0 && (React__default['default'].createElement(reactFileUtils.ImagePreviewer, { disabled: !multipleUploads ||
@@ -4747,8 +4747,8 @@ var EditMessageForm = function () {
4747
4747
  var _c = useComponentContext('EditMessageForm'), _d = _c.EmojiIcon, EmojiIcon = _d === void 0 ? EmojiIconSmall : _d, _e = _c.FileUploadIcon, FileUploadIcon$1 = _e === void 0 ? FileUploadIcon : _e;
4748
4748
  React.useEffect(function () {
4749
4749
  var onKeyDown = function (event) {
4750
- if (event.key === 'Escape' && clearEditingState)
4751
- clearEditingState();
4750
+ if (event.key === 'Escape')
4751
+ clearEditingState === null || clearEditingState === void 0 ? void 0 : clearEditingState();
4752
4752
  };
4753
4753
  document.addEventListener('keydown', onKeyDown);
4754
4754
  return function () { return document.removeEventListener('keydown', onKeyDown); };
@@ -4771,11 +4771,7 @@ var EditMessageForm = function () {
4771
4771
  React__default['default'].createElement("span", { className: 'str-chat__input-fileupload' },
4772
4772
  React__default['default'].createElement(FileUploadIcon$1, null)))))),
4773
4773
  React__default['default'].createElement("div", null,
4774
- React__default['default'].createElement("button", { onClick: function () {
4775
- if (clearEditingState) {
4776
- clearEditingState();
4777
- }
4778
- } }, t('Cancel')),
4774
+ React__default['default'].createElement("button", { onClick: clearEditingState }, t('Cancel')),
4779
4775
  React__default['default'].createElement("button", { type: 'submit' }, t('Send'))))))));
4780
4776
  };
4781
4777
 
@@ -5048,11 +5044,11 @@ var useAttachments = function (props, state, dispatch, textareaRef) {
5048
5044
  // Number of files that the user can still add. Should never be more than the amount allowed by the API.
5049
5045
  // If multipleUploads is false, we only want to allow a single upload.
5050
5046
  var maxFilesAllowed = !multipleUploads ? 1 : maxNumberOfFiles || apiMaxNumberOfFiles;
5047
+ // OG attachments should not be counted towards "numberOfImages"
5051
5048
  var numberOfImages = Object.values(imageUploads).filter(function (_a) {
5052
- var state = _a.state;
5053
- return state !== 'failed';
5054
- })
5055
- .length;
5049
+ var og_scrape_url = _a.og_scrape_url, state = _a.state;
5050
+ return state !== 'failed' && !og_scrape_url;
5051
+ }).length;
5056
5052
  var numberOfFiles = Object.values(fileUploads).filter(function (_a) {
5057
5053
  var state = _a.state;
5058
5054
  return state !== 'failed';
@@ -5238,6 +5234,14 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
5238
5234
  var channel = useChannelStateContext('useSubmitHandler').channel;
5239
5235
  var _a = useChannelActionContext('useSubmitHandler'), addNotification = _a.addNotification, editMessage = _a.editMessage, sendMessage = _a.sendMessage;
5240
5236
  var t = useTranslationContext('useSubmitHandler').t;
5237
+ var textReference = React.useRef({ hasChanged: false, initialText: text });
5238
+ React.useEffect(function () {
5239
+ if (!textReference.current.initialText.length) {
5240
+ textReference.current.initialText = text;
5241
+ return;
5242
+ }
5243
+ textReference.current.hasChanged = text !== textReference.current.initialText;
5244
+ }, [text]);
5241
5245
  var getAttachmentsFromUploads = function () {
5242
5246
  var imageAttachments = imageOrder
5243
5247
  .map(function (id) { return imageUploads[id]; })
@@ -5246,25 +5250,36 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
5246
5250
  var id = _a.id, url = _a.url;
5247
5251
  return self.every(function (upload) { return upload.id === id || upload.url !== url; });
5248
5252
  })
5249
- .map(function (upload) {
5253
+ .filter(function (upload) {
5254
+ // keep the OG attachments in case the text has not changed as the BE
5255
+ // won't re-enrich the message when only attachments have changed
5256
+ if (!textReference.current.hasChanged)
5257
+ return true;
5258
+ return !upload.og_scrape_url;
5259
+ })
5260
+ .map(function (_a) {
5261
+ var name = _a.file.name, url = _a.url, rest = __rest(_a, ["file", "url"]);
5250
5262
  return ({
5251
- fallback: upload.file.name,
5252
- image_url: upload.url,
5263
+ author_name: rest.author_name,
5264
+ fallback: name,
5265
+ image_url: url,
5266
+ og_scrape_url: rest.og_scrape_url,
5267
+ text: rest.text,
5268
+ title: rest.title,
5269
+ title_link: rest.title_link,
5253
5270
  type: 'image',
5254
5271
  });
5255
5272
  });
5256
5273
  var fileAttachments = fileOrder
5257
5274
  .map(function (id) { return fileUploads[id]; })
5258
5275
  .filter(function (upload) { return upload.state !== 'failed'; })
5259
- .map(function (upload) {
5260
- return ({
5261
- asset_url: upload.url,
5262
- file_size: upload.file.size,
5263
- mime_type: upload.file.type,
5264
- title: upload.file.name,
5265
- type: getAttachmentTypeFromMime(upload.file.type || ''),
5266
- });
5267
- });
5276
+ .map(function (upload) { return ({
5277
+ asset_url: upload.url,
5278
+ file_size: upload.file.size,
5279
+ mime_type: upload.file.type,
5280
+ title: upload.file.name,
5281
+ type: getAttachmentTypeFromMime(upload.file.type || ''),
5282
+ }); });
5268
5283
  return __spreadArray(__spreadArray(__spreadArray([], attachments), imageAttachments), fileAttachments);
5269
5284
  };
5270
5285
  var handleSubmit = function (event, customMessageData) { return __awaiter(void 0, void 0, void 0, function () {
@@ -5307,8 +5322,7 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
5307
5322
  return [4 /*yield*/, editMessage(__assign(__assign({}, message), updatedMessage))];
5308
5323
  case 2:
5309
5324
  _a.sent();
5310
- if (clearEditingState)
5311
- clearEditingState();
5325
+ clearEditingState === null || clearEditingState === void 0 ? void 0 : clearEditingState();
5312
5326
  dispatch({ type: 'clear' });
5313
5327
  return [3 /*break*/, 4];
5314
5328
  case 3:
@@ -5341,11 +5355,9 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
5341
5355
  getNewText: function () { return text; },
5342
5356
  type: 'setText',
5343
5357
  });
5344
- if (actualMentionedUsers.length) {
5345
- actualMentionedUsers.forEach(function (user) {
5346
- dispatch({ type: 'addMentionedUser', user: user });
5347
- });
5348
- }
5358
+ actualMentionedUsers === null || actualMentionedUsers === void 0 ? void 0 : actualMentionedUsers.forEach(function (user) {
5359
+ dispatch({ type: 'addMentionedUser', user: user });
5360
+ });
5349
5361
  addNotification(t('Send message request failed'), 'error');
5350
5362
  return [3 /*break*/, 13];
5351
5363
  case 13: return [2 /*return*/];
@@ -5406,15 +5418,13 @@ var usePasteHandler = function (uploadNewFiles, insertText, isUploadEnabled) {
5406
5418
  return { onPaste: onPaste };
5407
5419
  };
5408
5420
 
5409
- var emptyFileUploads = {};
5410
- var emptyImageUploads = {};
5411
5421
  var makeEmptyMessageInputState = function () { return ({
5412
5422
  attachments: [],
5413
5423
  emojiPickerIsOpen: false,
5414
5424
  fileOrder: [],
5415
- fileUploads: __assign({}, emptyFileUploads),
5425
+ fileUploads: {},
5416
5426
  imageOrder: [],
5417
- imageUploads: __assign({}, emptyImageUploads),
5427
+ imageUploads: {},
5418
5428
  mentioned_users: [],
5419
5429
  setText: function () { return null; },
5420
5430
  text: '',
@@ -5423,46 +5433,53 @@ var makeEmptyMessageInputState = function () { return ({
5423
5433
  * Initializes the state. Empty if the message prop is falsy.
5424
5434
  */
5425
5435
  var initState = function (message) {
5426
- var _a, _b, _c;
5436
+ var _a, _b, _c, _d, _e;
5427
5437
  if (!message) {
5428
5438
  return makeEmptyMessageInputState();
5429
5439
  }
5430
5440
  // if message prop is defined, get image uploads, file uploads, text, etc.
5431
- var imageUploads = ((_a = message.attachments) === null || _a === void 0 ? void 0 : _a.filter(function (_a) {
5441
+ var imageUploads = (_b = (_a = message.attachments) === null || _a === void 0 ? void 0 : _a.filter(function (_a) {
5432
5442
  var type = _a.type;
5433
5443
  return type === 'image';
5434
- }).reduce(function (acc, attachment) {
5444
+ }).reduce(function (acc, _a) {
5445
+ var author_name = _a.author_name, _b = _a.fallback, fallback = _b === void 0 ? '' : _b, image_url = _a.image_url, og_scrape_url = _a.og_scrape_url, text = _a.text, title = _a.title, title_link = _a.title_link;
5435
5446
  var id = nanoid.nanoid();
5436
5447
  acc[id] = {
5448
+ author_name: author_name,
5437
5449
  file: {
5438
- name: attachment.fallback || '',
5450
+ name: fallback,
5439
5451
  },
5440
5452
  id: id,
5453
+ og_scrape_url: og_scrape_url,
5441
5454
  state: 'finished',
5442
- url: attachment.image_url,
5455
+ text: text,
5456
+ title: title,
5457
+ title_link: title_link,
5458
+ url: image_url,
5443
5459
  };
5444
5460
  return acc;
5445
- }, {})) || {};
5446
- var imageOrder = Object.keys(imageUploads);
5447
- var fileUploads = ((_b = message.attachments) === null || _b === void 0 ? void 0 : _b.filter(function (_a) {
5461
+ }, {})) !== null && _b !== void 0 ? _b : {};
5462
+ var fileUploads = (_d = (_c = message.attachments) === null || _c === void 0 ? void 0 : _c.filter(function (_a) {
5448
5463
  var type = _a.type;
5449
5464
  return type === 'file';
5450
- }).reduce(function (acc, attachment) {
5465
+ }).reduce(function (acc, _a) {
5466
+ var asset_url = _a.asset_url, file_size = _a.file_size, mime_type = _a.mime_type, _b = _a.title, title = _b === void 0 ? '' : _b;
5451
5467
  var id = nanoid.nanoid();
5452
5468
  acc[id] = {
5453
5469
  file: {
5454
- name: attachment.title || '',
5455
- size: attachment.file_size,
5456
- type: attachment.mime_type,
5470
+ name: title,
5471
+ size: file_size,
5472
+ type: mime_type,
5457
5473
  },
5458
5474
  id: id,
5459
5475
  state: 'finished',
5460
- url: attachment.asset_url,
5476
+ url: asset_url,
5461
5477
  };
5462
5478
  return acc;
5463
- }, {})) || {};
5479
+ }, {})) !== null && _d !== void 0 ? _d : {};
5480
+ var imageOrder = Object.keys(imageUploads);
5464
5481
  var fileOrder = Object.keys(fileUploads);
5465
- var attachments = ((_c = message.attachments) === null || _c === void 0 ? void 0 : _c.filter(function (_a) {
5482
+ var attachments = ((_e = message.attachments) === null || _e === void 0 ? void 0 : _e.filter(function (_a) {
5466
5483
  var type = _a.type;
5467
5484
  return type !== 'file' && type !== 'image';
5468
5485
  })) || [];
@@ -6151,9 +6168,15 @@ var makeAddNotifications = function (setNotifications, notificationTimeouts) { r
6151
6168
 
6152
6169
  var JUMP_MESSAGE_PAGE_SIZE = 25;
6153
6170
  var UnMemoizedChannel = function (props) {
6154
- var propsChannel = props.channel, _a = props.EmptyPlaceholder, EmptyPlaceholder = _a === void 0 ? null : _a;
6155
- var contextChannel = useChatContext('Channel').channel;
6171
+ var propsChannel = props.channel, _a = props.EmptyPlaceholder, EmptyPlaceholder = _a === void 0 ? null : _a, LoadingErrorIndicator = props.LoadingErrorIndicator, LoadingIndicator = props.LoadingIndicator;
6172
+ var _b = useChatContext('Channel'), contextChannel = _b.channel, channelsQueryState = _b.channelsQueryState;
6156
6173
  var channel = propsChannel || contextChannel;
6174
+ if (channelsQueryState.queryInProgress === 'reload' && LoadingIndicator) {
6175
+ return React__default['default'].createElement(LoadingIndicator, { size: 25 });
6176
+ }
6177
+ if (channelsQueryState.error && LoadingErrorIndicator) {
6178
+ return React__default['default'].createElement(LoadingErrorIndicator, { error: channelsQueryState.error });
6179
+ }
6157
6180
  if (!(channel === null || channel === void 0 ? void 0 : channel.cid))
6158
6181
  return EmptyPlaceholder;
6159
6182
  return React__default['default'].createElement(ChannelInner, __assign({}, props, { channel: channel, key: channel.cid }));
@@ -6167,7 +6190,7 @@ var ChannelInner = function (props) {
6167
6190
  var _k = React.useState([]), notifications = _k[0], setNotifications = _k[1];
6168
6191
  var _l = React.useState(), quotedMessage = _l[0], setQuotedMessage = _l[1];
6169
6192
  var notificationTimeouts = [];
6170
- var _m = React.useReducer(channelReducer, initialState), state = _m[0], dispatch = _m[1];
6193
+ var _m = React.useReducer(channelReducer, __assign(__assign({}, initialState), { loading: !channel.initialized })), state = _m[0], dispatch = _m[1];
6171
6194
  var isMounted = useIsMounted();
6172
6195
  var originalTitle = React.useRef('');
6173
6196
  var lastRead = React.useRef(new Date());
@@ -6501,7 +6524,7 @@ var ChannelInner = function (props) {
6501
6524
  error_1 = _b.sent();
6502
6525
  stringError = JSON.stringify(error_1);
6503
6526
  parsedError = stringError ? JSON.parse(stringError) : {};
6504
- updateMessage(__assign(__assign({}, message), { errorStatusCode: parsedError.status || undefined, status: 'failed' }));
6527
+ updateMessage(__assign(__assign({}, message), { error: parsedError, errorStatusCode: parsedError.status || undefined, status: 'failed' }));
6505
6528
  return [3 /*break*/, 7];
6506
6529
  case 7: return [2 /*return*/];
6507
6530
  }
@@ -6770,7 +6793,6 @@ var UnMemoizedChatDown = function (_a) {
6770
6793
  var _b = _a.image, image = _b === void 0 ? React__default['default'].createElement(ConnectionErrorIcon, null) : _b, text = _a.text, _c = _a.type, type = _c === void 0 ? 'Error' : _c;
6771
6794
  var t = useTranslationContext('ChatDown').t;
6772
6795
  return (React__default['default'].createElement("div", { className: 'str-chat__down' },
6773
- React__default['default'].createElement(LoadingChannels, null),
6774
6796
  React__default['default'].createElement("div", { className: 'str-chat__down-main' },
6775
6797
  typeof image === 'string' ? (React__default['default'].createElement("img", { alt: 'Connection error', "data-testid": 'chatdown-img', src: image })) : (image),
6776
6798
  React__default['default'].createElement("h1", null, type),
@@ -6785,7 +6807,7 @@ var ChatDown = React__default['default'].memo(UnMemoizedChatDown);
6785
6807
  * A preview list of channels, allowing you to select the channel you want to open
6786
6808
  */
6787
6809
  var ChannelListMessenger = function (props) {
6788
- var children = props.children, _a = props.error, error = _a === void 0 ? false : _a, loading = props.loading, _b = props.LoadingErrorIndicator, LoadingErrorIndicator = _b === void 0 ? ChatDown : _b, _c = props.LoadingIndicator, LoadingIndicator = _c === void 0 ? LoadingChannels : _c;
6810
+ var children = props.children, _a = props.error, error = _a === void 0 ? null : _a, loading = props.loading, _b = props.LoadingErrorIndicator, LoadingErrorIndicator = _b === void 0 ? ChatDown : _b, _c = props.LoadingIndicator, LoadingIndicator = _c === void 0 ? LoadingChannels : _c;
6789
6811
  if (error) {
6790
6812
  return React__default['default'].createElement(LoadingErrorIndicator, { type: 'Connection Error' });
6791
6813
  }
@@ -7084,11 +7106,9 @@ var useNotificationRemovedFromChannelListener = function (setChannels, customHan
7084
7106
  };
7085
7107
 
7086
7108
  var usePaginatedChannels = function (client, filters, sort, options, activeChannelHandler) {
7087
- var _a = React.useState([]), channels = _a[0], setChannels = _a[1];
7088
- var _b = React.useState(false), error = _b[0], setError = _b[1];
7109
+ var _a = useChatContext('usePaginatedChannels').channelsQueryState, setError = _a.setError, setQueryInProgress = _a.setQueryInProgress;
7110
+ var _b = React.useState([]), channels = _b[0], setChannels = _b[1];
7089
7111
  var _c = React.useState(true), hasNextPage = _c[0], setHasNextPage = _c[1];
7090
- var _d = React.useState(true), loadingChannels = _d[0], setLoadingChannels = _d[1];
7091
- var _e = React.useState(true), refreshing = _e[0], setRefreshing = _e[1];
7092
7112
  var filterString = React.useMemo(function () { return JSON.stringify(filters); }, [filters]);
7093
7113
  var sortString = React.useMemo(function () { return JSON.stringify(sort); }, [sort]);
7094
7114
  var queryChannels = function (queryType) { return __awaiter(void 0, void 0, void 0, function () {
@@ -7097,12 +7117,14 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
7097
7117
  return __generator(this, function (_b) {
7098
7118
  switch (_b.label) {
7099
7119
  case 0:
7100
- setError(false);
7120
+ setError(null);
7101
7121
  if (queryType === 'reload') {
7102
7122
  setChannels([]);
7103
- setLoadingChannels(true);
7123
+ setQueryInProgress('reload');
7124
+ }
7125
+ else {
7126
+ setQueryInProgress('load-more');
7104
7127
  }
7105
- setRefreshing(true);
7106
7128
  offset = queryType === 'reload' ? 0 : channels.length;
7107
7129
  newOptions = __assign({ limit: (_a = options === null || options === void 0 ? void 0 : options.limit) !== null && _a !== void 0 ? _a : MAX_QUERY_CHANNELS_LIMIT, offset: offset }, options);
7108
7130
  _b.label = 1;
@@ -7122,11 +7144,10 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
7122
7144
  case 3:
7123
7145
  err_1 = _b.sent();
7124
7146
  console.warn(err_1);
7125
- setError(true);
7147
+ setError(err_1);
7126
7148
  return [3 /*break*/, 4];
7127
7149
  case 4:
7128
- setLoadingChannels(false);
7129
- setRefreshing(false);
7150
+ setQueryInProgress(null);
7130
7151
  return [2 /*return*/];
7131
7152
  }
7132
7153
  });
@@ -7142,11 +7163,6 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
7142
7163
  hasNextPage: hasNextPage,
7143
7164
  loadNextPage: loadNextPage,
7144
7165
  setChannels: setChannels,
7145
- status: {
7146
- error: error,
7147
- loadingChannels: loadingChannels,
7148
- refreshing: refreshing,
7149
- },
7150
7166
  };
7151
7167
  };
7152
7168
 
@@ -7553,8 +7569,8 @@ var DEFAULT_FILTERS = {};
7553
7569
  var DEFAULT_OPTIONS = {};
7554
7570
  var DEFAULT_SORT = {};
7555
7571
  var UnMemoizedChannelList = function (props) {
7556
- var additionalChannelSearchProps = props.additionalChannelSearchProps, _a = props.Avatar, Avatar$1 = _a === void 0 ? Avatar : _a, allowNewMessagesFromUnfilteredChannels = props.allowNewMessagesFromUnfilteredChannels, channelRenderFilterFn = props.channelRenderFilterFn, _b = props.ChannelSearch, ChannelSearch$1 = _b === void 0 ? ChannelSearch : _b, customActiveChannel = props.customActiveChannel, _c = props.EmptyStateIndicator, EmptyStateIndicator$1 = _c === void 0 ? EmptyStateIndicator : _c, filters = props.filters, _d = props.LoadingErrorIndicator, LoadingErrorIndicator = _d === void 0 ? ChatDown : _d, _e = props.LoadingIndicator, LoadingIndicator = _e === void 0 ? LoadingChannels : _e, _f = props.List, List = _f === void 0 ? ChannelListMessenger : _f, lockChannelOrder = props.lockChannelOrder, onAddedToChannel = props.onAddedToChannel, onChannelDeleted = props.onChannelDeleted, onChannelHidden = props.onChannelHidden, onChannelTruncated = props.onChannelTruncated, onChannelUpdated = props.onChannelUpdated, onChannelVisible = props.onChannelVisible, onMessageNew = props.onMessageNew, onRemovedFromChannel = props.onRemovedFromChannel, options = props.options, _g = props.Paginator, Paginator = _g === void 0 ? LoadMorePaginator : _g, Preview = props.Preview, _h = props.sendChannelsToList, sendChannelsToList = _h === void 0 ? false : _h, _j = props.setActiveChannelOnMount, setActiveChannelOnMount = _j === void 0 ? true : _j, _k = props.showChannelSearch, showChannelSearch = _k === void 0 ? false : _k, _l = props.sort, sort = _l === void 0 ? DEFAULT_SORT : _l, _m = props.watchers, watchers = _m === void 0 ? {} : _m;
7557
- var _o = useChatContext('ChannelList'), channel = _o.channel, client = _o.client, closeMobileNav = _o.closeMobileNav, customClasses = _o.customClasses, _p = _o.navOpen, navOpen = _p === void 0 ? false : _p, setActiveChannel = _o.setActiveChannel, theme = _o.theme, useImageFlagEmojisOnWindows = _o.useImageFlagEmojisOnWindows;
7572
+ var additionalChannelSearchProps = props.additionalChannelSearchProps, _a = props.Avatar, Avatar$1 = _a === void 0 ? Avatar : _a, allowNewMessagesFromUnfilteredChannels = props.allowNewMessagesFromUnfilteredChannels, channelRenderFilterFn = props.channelRenderFilterFn, _b = props.ChannelSearch, ChannelSearch$1 = _b === void 0 ? ChannelSearch : _b, customActiveChannel = props.customActiveChannel, _c = props.EmptyStateIndicator, EmptyStateIndicator$1 = _c === void 0 ? EmptyStateIndicator : _c, filters = props.filters, _d = props.LoadingErrorIndicator, LoadingErrorIndicator = _d === void 0 ? ChatDown : _d, _e = props.LoadingIndicator, LoadingIndicator = _e === void 0 ? LoadingChannels : _e, _f = props.List, List = _f === void 0 ? ChannelListMessenger : _f, lockChannelOrder = props.lockChannelOrder, onAddedToChannel = props.onAddedToChannel, onChannelDeleted = props.onChannelDeleted, onChannelHidden = props.onChannelHidden, onChannelTruncated = props.onChannelTruncated, onChannelUpdated = props.onChannelUpdated, onChannelVisible = props.onChannelVisible, onMessageNew = props.onMessageNew, onRemovedFromChannel = props.onRemovedFromChannel, options = props.options, _g = props.Paginator, Paginator = _g === void 0 ? LoadMorePaginator : _g, Preview = props.Preview, renderChannels = props.renderChannels, _h = props.sendChannelsToList, sendChannelsToList = _h === void 0 ? false : _h, _j = props.setActiveChannelOnMount, setActiveChannelOnMount = _j === void 0 ? true : _j, _k = props.showChannelSearch, showChannelSearch = _k === void 0 ? false : _k, _l = props.sort, sort = _l === void 0 ? DEFAULT_SORT : _l, _m = props.watchers, watchers = _m === void 0 ? {} : _m;
7573
+ var _o = useChatContext('ChannelList'), channel = _o.channel, channelsQueryState = _o.channelsQueryState, client = _o.client, closeMobileNav = _o.closeMobileNav, customClasses = _o.customClasses, _p = _o.navOpen, navOpen = _p === void 0 ? false : _p, setActiveChannel = _o.setActiveChannel, theme = _o.theme, useImageFlagEmojisOnWindows = _o.useImageFlagEmojisOnWindows;
7558
7574
  var channelListRef = React.useRef(null);
7559
7575
  var _q = React.useState(0), channelUpdateCount = _q[0], setChannelUpdateCount = _q[1];
7560
7576
  /**
@@ -7601,7 +7617,7 @@ var UnMemoizedChannelList = function (props) {
7601
7617
  * force a re-render. Incrementing this dummy variable ensures the channel previews update.
7602
7618
  */
7603
7619
  var forceUpdate = function () { return setChannelUpdateCount(function (count) { return count + 1; }); };
7604
- var _r = usePaginatedChannels(client, filters || DEFAULT_FILTERS, sort || DEFAULT_SORT, options || DEFAULT_OPTIONS, activeChannelHandler), channels = _r.channels, hasNextPage = _r.hasNextPage, loadNextPage = _r.loadNextPage, setChannels = _r.setChannels, status = _r.status;
7620
+ var _r = usePaginatedChannels(client, filters || DEFAULT_FILTERS, sort || DEFAULT_SORT, options || DEFAULT_OPTIONS, activeChannelHandler), channels = _r.channels, hasNextPage = _r.hasNextPage, loadNextPage = _r.loadNextPage, setChannels = _r.setChannels;
7605
7621
  var loadedChannels = channelRenderFilterFn ? channelRenderFilterFn(channels) : channels;
7606
7622
  useMobileNavigation(channelListRef, navOpen, closeMobileNav);
7607
7623
  useMessageNewListener(setChannels, lockChannelOrder, allowNewMessagesFromUnfilteredChannels);
@@ -7651,14 +7667,16 @@ var UnMemoizedChannelList = function (props) {
7651
7667
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
7652
7668
  React__default['default'].createElement("div", { className: chatClass + " " + channelListClass + " " + theme + " " + navigationClass + " " + windowsEmojiClass, ref: channelListRef },
7653
7669
  showChannelSearch && React__default['default'].createElement(ChannelSearch$1, __assign({}, additionalChannelSearchProps)),
7654
- React__default['default'].createElement(List, { error: status.error, loadedChannels: sendChannelsToList ? loadedChannels : undefined, loading: status.loadingChannels, LoadingErrorIndicator: LoadingErrorIndicator, LoadingIndicator: LoadingIndicator, setChannels: setChannels }, !(loadedChannels === null || loadedChannels === void 0 ? void 0 : loadedChannels.length) ? (React__default['default'].createElement(EmptyStateIndicator$1, { listType: 'channel' })) : (React__default['default'].createElement(Paginator, { hasNextPage: hasNextPage, loadNextPage: loadNextPage, refreshing: status.refreshing }, loadedChannels.map(renderChannel)))))));
7670
+ React__default['default'].createElement(List, { error: channelsQueryState.error, loadedChannels: sendChannelsToList ? loadedChannels : undefined, loading: channelsQueryState.queryInProgress === 'reload', LoadingErrorIndicator: LoadingErrorIndicator, LoadingIndicator: LoadingIndicator, setChannels: setChannels }, !(loadedChannels === null || loadedChannels === void 0 ? void 0 : loadedChannels.length) ? (React__default['default'].createElement(EmptyStateIndicator$1, { listType: 'channel' })) : (React__default['default'].createElement(Paginator, { hasNextPage: hasNextPage, loadNextPage: loadNextPage, refreshing: channelsQueryState.queryInProgress === 'load-more' }, renderChannels
7671
+ ? renderChannels(loadedChannels, renderChannel)
7672
+ : loadedChannels.map(renderChannel)))))));
7655
7673
  };
7656
7674
  /**
7657
7675
  * Renders a preview list of Channels, allowing you to select the Channel you want to open
7658
7676
  */
7659
7677
  var ChannelList = React__default['default'].memo(UnMemoizedChannelList);
7660
7678
 
7661
- var version = '9.0.0';
7679
+ var version = '9.1.1';
7662
7680
 
7663
7681
  var useChat = function (_a) {
7664
7682
  var _b, _c;
@@ -7755,12 +7773,15 @@ var useChat = function (_a) {
7755
7773
 
7756
7774
  var useCreateChatContext = function (value) {
7757
7775
  var _a;
7758
- var channel = value.channel, client = value.client, closeMobileNav = value.closeMobileNav, customClasses = value.customClasses, getAppSettings = value.getAppSettings, latestMessageDatesByChannels = value.latestMessageDatesByChannels, mutes = value.mutes, navOpen = value.navOpen, openMobileNav = value.openMobileNav, setActiveChannel = value.setActiveChannel, theme = value.theme, useImageFlagEmojisOnWindows = value.useImageFlagEmojisOnWindows;
7776
+ var channel = value.channel, channelsQueryState = value.channelsQueryState, client = value.client, closeMobileNav = value.closeMobileNav, customClasses = value.customClasses, getAppSettings = value.getAppSettings, latestMessageDatesByChannels = value.latestMessageDatesByChannels, mutes = value.mutes, navOpen = value.navOpen, openMobileNav = value.openMobileNav, setActiveChannel = value.setActiveChannel, theme = value.theme, useImageFlagEmojisOnWindows = value.useImageFlagEmojisOnWindows;
7759
7777
  var channelCid = channel === null || channel === void 0 ? void 0 : channel.cid;
7778
+ var channelsQueryError = channelsQueryState.error;
7779
+ var channelsQueryInProgress = channelsQueryState.queryInProgress;
7760
7780
  var clientValues = "" + client.clientID + Object.keys(client.activeChannels).length + Object.keys(client.listeners).length + client.mutedChannels.length + "\n " + ((_a = client.user) === null || _a === void 0 ? void 0 : _a.id);
7761
7781
  var mutedUsersLength = mutes.length;
7762
7782
  var chatContext = React.useMemo(function () { return ({
7763
7783
  channel: channel,
7784
+ channelsQueryState: channelsQueryState,
7764
7785
  client: client,
7765
7786
  closeMobileNav: closeMobileNav,
7766
7787
  customClasses: customClasses,
@@ -7772,10 +7793,29 @@ var useCreateChatContext = function (value) {
7772
7793
  setActiveChannel: setActiveChannel,
7773
7794
  theme: theme,
7774
7795
  useImageFlagEmojisOnWindows: useImageFlagEmojisOnWindows,
7775
- }); }, [channelCid, clientValues, getAppSettings, mutedUsersLength, navOpen]);
7796
+ }); }, [
7797
+ channelCid,
7798
+ channelsQueryError,
7799
+ channelsQueryInProgress,
7800
+ clientValues,
7801
+ getAppSettings,
7802
+ mutedUsersLength,
7803
+ navOpen,
7804
+ ]);
7776
7805
  return chatContext;
7777
7806
  };
7778
7807
 
7808
+ var useChannelsQueryState = function () {
7809
+ var _a = React.useState(null), error = _a[0], setError = _a[1];
7810
+ var _b = React.useState(null), queryInProgress = _b[0], setQueryInProgress = _b[1];
7811
+ return {
7812
+ error: error,
7813
+ queryInProgress: queryInProgress,
7814
+ setError: setError,
7815
+ setQueryInProgress: setQueryInProgress,
7816
+ };
7817
+ };
7818
+
7779
7819
  var darkModeTheme = {
7780
7820
  '--bg-gradient-end': '#101214',
7781
7821
  '--bg-gradient-start': '#070a0d',
@@ -7813,9 +7853,11 @@ var useCustomStyles = function (customStyles) {
7813
7853
  var Chat = function (props) {
7814
7854
  var children = props.children, client = props.client, customClasses = props.customClasses, customStyles = props.customStyles, _a = props.darkMode, darkMode = _a === void 0 ? false : _a, defaultLanguage = props.defaultLanguage, i18nInstance = props.i18nInstance, _b = props.initialNavOpen, initialNavOpen = _b === void 0 ? true : _b, _c = props.theme, theme = _c === void 0 ? 'messaging light' : _c, _d = props.useImageFlagEmojisOnWindows, useImageFlagEmojisOnWindows = _d === void 0 ? false : _d;
7815
7855
  var _e = useChat({ client: client, defaultLanguage: defaultLanguage, i18nInstance: i18nInstance, initialNavOpen: initialNavOpen }), channel = _e.channel, closeMobileNav = _e.closeMobileNav, getAppSettings = _e.getAppSettings, latestMessageDatesByChannels = _e.latestMessageDatesByChannels, mutes = _e.mutes, navOpen = _e.navOpen, openMobileNav = _e.openMobileNav, setActiveChannel = _e.setActiveChannel, translators = _e.translators;
7856
+ var channelsQueryState = useChannelsQueryState();
7816
7857
  useCustomStyles(darkMode ? darkModeTheme : customStyles);
7817
7858
  var chatContextValue = useCreateChatContext({
7818
7859
  channel: channel,
7860
+ channelsQueryState: channelsQueryState,
7819
7861
  client: client,
7820
7862
  closeMobileNav: closeMobileNav,
7821
7863
  customClasses: customClasses,
@@ -7926,9 +7968,6 @@ var InfiniteScroll = function (props) {
7926
7968
  }
7927
7969
  scrollElement.addEventListener('scroll', scrollListener, useCapture);
7928
7970
  scrollElement.addEventListener('resize', scrollListener, useCapture);
7929
- if (initialLoad) {
7930
- scrollListener();
7931
- }
7932
7971
  return function () {
7933
7972
  scrollElement.removeEventListener('scroll', scrollListener, useCapture);
7934
7973
  scrollElement.removeEventListener('resize', scrollListener, useCapture);
@@ -7949,10 +7988,7 @@ var InfiniteScroll = function (props) {
7949
7988
  var attributes = __assign(__assign({}, elementProps), { ref: function (element) {
7950
7989
  scrollComponent.current = element;
7951
7990
  } });
7952
- var childrenArray = [children];
7953
- if (isLoading && loader) {
7954
- childrenArray.unshift(loader);
7955
- }
7991
+ var childrenArray = [loader, children];
7956
7992
  return React__default['default'].createElement(element, attributes, childrenArray);
7957
7993
  };
7958
7994
 
@@ -8692,9 +8728,6 @@ function useMessageListScrollManager(params) {
8692
8728
  });
8693
8729
  var messages = React.useRef();
8694
8730
  var scrollTop = React.useRef(0);
8695
- React.useEffect(function () {
8696
- scrollToBottom();
8697
- }, []);
8698
8731
  React.useEffect(function () {
8699
8732
  var _a, _b, _c;
8700
8733
  var prevMeasures = measures.current;
@@ -8740,49 +8773,62 @@ function useMessageListScrollManager(params) {
8740
8773
  };
8741
8774
  }
8742
8775
 
8776
+ var ResizeObserver = window.ResizeObserver || resizeObserver.ResizeObserver;
8743
8777
  var useScrollLocationLogic = function (params) {
8744
- var _a = params.messages, messages = _a === void 0 ? [] : _a, _b = params.scrolledUpThreshold, scrolledUpThreshold = _b === void 0 ? 200 : _b, hasMoreNewer = params.hasMoreNewer, suppressAutoscroll = params.suppressAutoscroll;
8778
+ var _a = params.messages, messages = _a === void 0 ? [] : _a, _b = params.scrolledUpThreshold, scrolledUpThreshold = _b === void 0 ? 200 : _b, hasMoreNewer = params.hasMoreNewer, suppressAutoscroll = params.suppressAutoscroll, listElement = params.listElement, ulElement = params.ulElement;
8745
8779
  var _c = React.useState(false), hasNewMessages = _c[0], setHasNewMessages = _c[1];
8746
8780
  var _d = React.useState(), wrapperRect = _d[0], setWrapperRect = _d[1];
8747
8781
  var closeToBottom = React.useRef(false);
8748
8782
  var closeToTop = React.useRef(false);
8749
- var listRef = React.useRef(null);
8783
+ var scrollCounter = React.useRef({ autoScroll: 0, scroll: 0 });
8750
8784
  var scrollToBottom = React.useCallback(function () {
8751
- var _a, _b;
8752
- if (!((_a = listRef.current) === null || _a === void 0 ? void 0 : _a.scrollTo) || hasMoreNewer || suppressAutoscroll) {
8785
+ if (!(listElement === null || listElement === void 0 ? void 0 : listElement.scrollTo) || hasMoreNewer || suppressAutoscroll) {
8753
8786
  return;
8754
8787
  }
8755
- (_b = listRef.current) === null || _b === void 0 ? void 0 : _b.scrollTo({
8756
- top: listRef.current.scrollHeight,
8788
+ scrollCounter.current.autoScroll += 1;
8789
+ listElement.scrollTo({
8790
+ top: listElement.scrollHeight,
8757
8791
  });
8758
8792
  setHasNewMessages(false);
8759
- // this is hacky and unreliable, but that was the current implementation so not breaking it
8760
- setTimeout(function () {
8761
- var _a;
8762
- (_a = listRef.current) === null || _a === void 0 ? void 0 : _a.scrollTo({
8763
- top: listRef.current.scrollHeight,
8764
- });
8765
- }, 200);
8766
- }, [listRef, hasMoreNewer, suppressAutoscroll]);
8793
+ }, [listElement, hasMoreNewer, suppressAutoscroll]);
8794
+ React.useEffect(function () {
8795
+ if (!listElement)
8796
+ return;
8797
+ var observer = new ResizeObserver(scrollToBottom);
8798
+ var cancelObserverOnUserScroll = function () {
8799
+ scrollCounter.current.scroll += 1;
8800
+ var userScrolled = scrollCounter.current.autoScroll < scrollCounter.current.scroll;
8801
+ if (ulElement && userScrolled) {
8802
+ observer.unobserve(ulElement);
8803
+ listElement === null || listElement === void 0 ? void 0 : listElement.removeEventListener('scroll', cancelObserverOnUserScroll);
8804
+ }
8805
+ };
8806
+ if (ulElement) {
8807
+ observer.observe(ulElement);
8808
+ }
8809
+ listElement.addEventListener('scroll', cancelObserverOnUserScroll);
8810
+ return function () {
8811
+ observer.disconnect();
8812
+ if (listElement) {
8813
+ listElement.removeEventListener('scroll', cancelObserverOnUserScroll);
8814
+ }
8815
+ };
8816
+ }, [ulElement, scrollToBottom]);
8767
8817
  React.useLayoutEffect(function () {
8768
- if (listRef === null || listRef === void 0 ? void 0 : listRef.current) {
8769
- setWrapperRect(listRef.current.getBoundingClientRect());
8818
+ if (listElement) {
8819
+ setWrapperRect(listElement.getBoundingClientRect());
8770
8820
  scrollToBottom();
8771
8821
  }
8772
- }, [listRef, hasMoreNewer]);
8822
+ }, [listElement, hasMoreNewer]);
8773
8823
  var updateScrollTop = useMessageListScrollManager({
8774
8824
  messages: messages,
8775
8825
  onScrollBy: function (scrollBy) {
8776
- var _a;
8777
- (_a = listRef.current) === null || _a === void 0 ? void 0 : _a.scrollBy({ top: scrollBy });
8778
- },
8779
- scrollContainerMeasures: function () {
8780
- var _a, _b;
8781
- return ({
8782
- offsetHeight: ((_a = listRef.current) === null || _a === void 0 ? void 0 : _a.offsetHeight) || 0,
8783
- scrollHeight: ((_b = listRef.current) === null || _b === void 0 ? void 0 : _b.scrollHeight) || 0,
8784
- });
8826
+ listElement === null || listElement === void 0 ? void 0 : listElement.scrollBy({ top: scrollBy });
8785
8827
  },
8828
+ scrollContainerMeasures: function () { return ({
8829
+ offsetHeight: (listElement === null || listElement === void 0 ? void 0 : listElement.offsetHeight) || 0,
8830
+ scrollHeight: (listElement === null || listElement === void 0 ? void 0 : listElement.scrollHeight) || 0,
8831
+ }); },
8786
8832
  scrolledUpThreshold: scrolledUpThreshold,
8787
8833
  scrollToBottom: scrollToBottom,
8788
8834
  showNewMessages: function () { return setHasNewMessages(true); },
@@ -8810,7 +8856,7 @@ var useScrollLocationLogic = function (params) {
8810
8856
  }, [closeToTop, closeToBottom, scrollToBottom]);
8811
8857
  return {
8812
8858
  hasNewMessages: hasNewMessages,
8813
- listRef: listRef,
8859
+ listElement: listElement,
8814
8860
  onMessageLoadCaptured: onMessageLoadCaptured,
8815
8861
  onScroll: onScroll,
8816
8862
  scrollToBottom: scrollToBottom,
@@ -8818,12 +8864,6 @@ var useScrollLocationLogic = function (params) {
8818
8864
  };
8819
8865
  };
8820
8866
 
8821
- var UnMemoizedCenter = function (_a) {
8822
- var children = _a.children;
8823
- return (React__default['default'].createElement("div", { className: 'str-chat__list__center' }, children));
8824
- };
8825
- var Center = React__default['default'].memo(UnMemoizedCenter);
8826
-
8827
8867
  var UnMemoizedMessageNotification = function (props) {
8828
8868
  var children = props.children, onClick = props.onClick, _a = props.showNotification, showNotification = _a === void 0 ? true : _a;
8829
8869
  if (!showNotification)
@@ -8886,15 +8926,19 @@ var MessageListWithContext = function (props) {
8886
8926
  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, _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
8887
8927
  _h = props.returnAllReadData, // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release
8888
8928
  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;
8929
+ var _p = React__default['default'].useState(null), listElement = _p[0], setListElement = _p[1];
8930
+ var _q = React__default['default'].useState(null), ulElement = _q[0], setUlElement = _q[1];
8889
8931
  var customClasses = useChatContext('MessageList').customClasses;
8890
- var _p = useComponentContext('MessageList'), _q = _p.EmptyStateIndicator, EmptyStateIndicator$1 = _q === void 0 ? EmptyStateIndicator : _q, _r = _p.MessageListNotifications, MessageListNotifications$1 = _r === void 0 ? MessageListNotifications : _r, _s = _p.MessageNotification, MessageNotification$1 = _s === void 0 ? MessageNotification : _s, _t = _p.TypingIndicator, TypingIndicator$1 = _t === void 0 ? TypingIndicator : _t;
8891
- var _u = useScrollLocationLogic({
8932
+ var _r = useComponentContext('MessageList'), _s = _r.EmptyStateIndicator, EmptyStateIndicator$1 = _s === void 0 ? EmptyStateIndicator : _s, _t = _r.MessageListNotifications, MessageListNotifications$1 = _t === void 0 ? MessageListNotifications : _t, _u = _r.MessageNotification, MessageNotification$1 = _u === void 0 ? MessageNotification : _u, _v = _r.TypingIndicator, TypingIndicator$1 = _v === void 0 ? TypingIndicator : _v;
8933
+ var _w = useScrollLocationLogic({
8892
8934
  hasMoreNewer: hasMoreNewer,
8935
+ listElement: listElement,
8893
8936
  messages: messages,
8894
8937
  scrolledUpThreshold: props.scrolledUpThreshold,
8895
8938
  suppressAutoscroll: suppressAutoscroll,
8896
- }), hasNewMessages = _u.hasNewMessages, listRef = _u.listRef, onMessageLoadCaptured = _u.onMessageLoadCaptured, onScroll = _u.onScroll, scrollToBottom = _u.scrollToBottom, wrapperRect = _u.wrapperRect;
8897
- var _v = useEnrichedMessages({
8939
+ ulElement: ulElement,
8940
+ }), hasNewMessages = _w.hasNewMessages, onMessageLoadCaptured = _w.onMessageLoadCaptured, onScroll = _w.onScroll, scrollToBottom = _w.scrollToBottom, wrapperRect = _w.wrapperRect;
8941
+ var _x = useEnrichedMessages({
8898
8942
  channel: channel,
8899
8943
  disableDateSeparator: disableDateSeparator,
8900
8944
  groupStyles: groupStyles,
@@ -8903,7 +8947,7 @@ var MessageListWithContext = function (props) {
8903
8947
  hideNewMessageSeparator: hideNewMessageSeparator,
8904
8948
  messages: messages,
8905
8949
  noGroupByUser: noGroupByUser,
8906
- }), messageGroupStyles = _v.messageGroupStyles, enrichedMessages = _v.messages;
8950
+ }), messageGroupStyles = _x.messageGroupStyles, enrichedMessages = _x.messages;
8907
8951
  var elements = useMessageListElements({
8908
8952
  enrichedMessages: enrichedMessages,
8909
8953
  internalMessageProps: {
@@ -8938,7 +8982,7 @@ var MessageListWithContext = function (props) {
8938
8982
  returnAllReadData: returnAllReadData,
8939
8983
  threadList: threadList,
8940
8984
  });
8941
- var _w = useComponentContext('useInternalInfiniteScrollProps').LoadingIndicator, LoadingIndicator$1 = _w === void 0 ? LoadingIndicator : _w;
8985
+ var _y = useComponentContext('useInternalInfiniteScrollProps').LoadingIndicator, LoadingIndicator$1 = _y === void 0 ? LoadingIndicator : _y;
8942
8986
  var messageListClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.messageList) || 'str-chat__list';
8943
8987
  var threadListClass = threadList ? (customClasses === null || customClasses === void 0 ? void 0 : customClasses.threadList) || 'str-chat__list--thread' : '';
8944
8988
  var loadMore = React__default['default'].useCallback(function () {
@@ -8967,18 +9011,15 @@ var MessageListWithContext = function (props) {
8967
9011
  }
8968
9012
  });
8969
9013
  }); }, [scrollToBottom, hasMoreNewer]);
8970
- var ulRef = React__default['default'].useRef(null);
8971
9014
  React__default['default'].useLayoutEffect(function () {
8972
- var _a;
8973
9015
  if (highlightedMessageId) {
8974
- var element = (_a = ulRef.current) === null || _a === void 0 ? void 0 : _a.querySelector("[data-message-id='" + highlightedMessageId + "']");
9016
+ var element = ulElement === null || ulElement === void 0 ? void 0 : ulElement.querySelector("[data-message-id='" + highlightedMessageId + "']");
8975
9017
  element === null || element === void 0 ? void 0 : element.scrollIntoView({ block: 'center' });
8976
9018
  }
8977
9019
  }, [highlightedMessageId]);
8978
9020
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
8979
- React__default['default'].createElement("div", { className: messageListClass + " " + threadListClass, onScroll: onScroll, ref: listRef }, !elements.length ? (React__default['default'].createElement(EmptyStateIndicator$1, { listType: 'message' })) : (React__default['default'].createElement(InfiniteScroll, __assign({ className: 'str-chat__reverse-infinite-scroll', "data-testid": 'reverse-infinite-scroll', hasMore: props.hasMore, hasMoreNewer: props.hasMoreNewer, isLoading: props.loadingMore, loader: React__default['default'].createElement(Center, { key: 'loadingindicator' },
8980
- React__default['default'].createElement(LoadingIndicator$1, { size: 20 })), loadMore: loadMore, loadMoreNewer: loadMoreNewer }, props.internalInfiniteScrollProps),
8981
- React__default['default'].createElement("ul", { className: 'str-chat__ul', ref: ulRef }, elements),
9021
+ React__default['default'].createElement("div", { className: messageListClass + " " + threadListClass, onScroll: onScroll, ref: setListElement, tabIndex: 0 }, !elements.length ? (React__default['default'].createElement(EmptyStateIndicator$1, { listType: 'message' })) : (React__default['default'].createElement(InfiniteScroll, __assign({ className: 'str-chat__reverse-infinite-scroll', "data-testid": 'reverse-infinite-scroll', hasMore: props.hasMore, hasMoreNewer: props.hasMoreNewer, isLoading: props.loadingMore, loader: React__default['default'].createElement("div", { className: 'str-chat__list__loading', key: 'loadingindicator' }, props.loadingMore && React__default['default'].createElement(LoadingIndicator$1, { size: 20 })), loadMore: loadMore, loadMoreNewer: loadMoreNewer }, props.internalInfiniteScrollProps),
9022
+ React__default['default'].createElement("ul", { className: 'str-chat__ul', ref: setUlElement }, elements),
8982
9023
  React__default['default'].createElement(TypingIndicator$1, { threadList: threadList }),
8983
9024
  React__default['default'].createElement("div", { key: 'bottom' })))),
8984
9025
  React__default['default'].createElement(MessageListNotifications$1, { hasNewMessages: hasNewMessages, isNotAtLatestMessageSet: hasMoreNewer, MessageNotification: MessageNotification$1, notifications: notifications, scrollToBottom: scrollToBottomFromNotification })));