stream-chat-react 8.2.0 → 9.1.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 (60) hide show
  1. package/dist/browser.full-bundle.js +700 -147
  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/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 +0 -3
  28. package/dist/components/MessageInput/EditMessageForm.js +2 -2
  29. package/dist/components/MessageInput/UploadsPreview.d.ts.map +1 -1
  30. package/dist/components/MessageInput/UploadsPreview.js +3 -1
  31. package/dist/components/MessageInput/hooks/useAttachments.d.ts.map +1 -1
  32. package/dist/components/MessageInput/hooks/useAttachments.js +4 -4
  33. package/dist/components/MessageInput/hooks/useMessageInputState.d.ts +2 -2
  34. package/dist/components/MessageInput/hooks/useMessageInputState.d.ts.map +1 -1
  35. package/dist/components/MessageInput/hooks/useMessageInputState.js +24 -19
  36. package/dist/components/MessageInput/hooks/useSubmitHandler.d.ts.map +1 -1
  37. package/dist/components/MessageInput/hooks/useSubmitHandler.js +47 -19
  38. package/dist/components/MessageList/MessageList.d.ts.map +1 -1
  39. package/dist/components/MessageList/MessageList.js +13 -11
  40. package/dist/components/MessageList/hooks/useMessageListScrollManager.d.ts.map +1 -1
  41. package/dist/components/MessageList/hooks/useMessageListScrollManager.js +0 -3
  42. package/dist/components/MessageList/hooks/useScrollLocationLogic.d.ts +3 -1
  43. package/dist/components/MessageList/hooks/useScrollLocationLogic.d.ts.map +1 -1
  44. package/dist/components/MessageList/hooks/useScrollLocationLogic.js +42 -28
  45. package/dist/components/Modal/Modal.d.ts.map +1 -1
  46. package/dist/components/Modal/Modal.js +10 -15
  47. package/dist/context/ChannelActionContext.d.ts +2 -1
  48. package/dist/context/ChannelActionContext.d.ts.map +1 -1
  49. package/dist/context/ChatContext.d.ts +2 -0
  50. package/dist/context/ChatContext.d.ts.map +1 -1
  51. package/dist/index.cjs.js +186 -133
  52. package/dist/index.cjs.js.map +1 -1
  53. package/dist/stories/edit-message.stories.d.ts +3 -0
  54. package/dist/stories/edit-message.stories.d.ts.map +1 -0
  55. package/dist/stories/edit-message.stories.js +54 -0
  56. package/dist/types/types.d.ts +2 -1
  57. package/dist/types/types.d.ts.map +1 -1
  58. package/dist/version.d.ts +1 -1
  59. package/dist/version.js +1 -1
  60. package/package.json +4 -3
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,26 +1029,21 @@ 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';
1053
1049
  return (React__default['default'].createElement("div", { className: "str-chat__modal " + openClasses, onClick: handleClick },
@@ -2569,7 +2565,7 @@ var channelReducer = function (state, action) {
2569
2565
  }
2570
2566
  case 'setLoadingMore': {
2571
2567
  var loadingMore = action.loadingMore;
2572
- // supporess the autoscroll behavior
2568
+ // suppress the autoscroll behavior
2573
2569
  return __assign(__assign({}, state), { loadingMore: loadingMore, suppressAutoscroll: true });
2574
2570
  }
2575
2571
  case 'setLoadingMoreNewer': {
@@ -4702,7 +4698,9 @@ var UploadsPreview = function () {
4702
4698
  var _a = useChannelStateContext('UploadsPreview'), maxNumberOfFiles = _a.maxNumberOfFiles, multipleUploads = _a.multipleUploads;
4703
4699
  var messageInput = useMessageInputContext('UploadsPreview');
4704
4700
  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]; });
4701
+ var imagesToPreview = imageOrder
4702
+ .map(function (id) { return imageUploads[id]; })
4703
+ .filter(function (image) { return !image.og_scrape_url; });
4706
4704
  var filesToPreview = fileOrder.map(function (id) { return fileUploads[id]; });
4707
4705
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
4708
4706
  imageOrder.length > 0 && (React__default['default'].createElement(reactFileUtils.ImagePreviewer, { disabled: !multipleUploads ||
@@ -4747,8 +4745,8 @@ var EditMessageForm = function () {
4747
4745
  var _c = useComponentContext('EditMessageForm'), _d = _c.EmojiIcon, EmojiIcon = _d === void 0 ? EmojiIconSmall : _d, _e = _c.FileUploadIcon, FileUploadIcon$1 = _e === void 0 ? FileUploadIcon : _e;
4748
4746
  React.useEffect(function () {
4749
4747
  var onKeyDown = function (event) {
4750
- if (event.key === 'Escape' && clearEditingState)
4751
- clearEditingState();
4748
+ if (event.key === 'Escape')
4749
+ clearEditingState === null || clearEditingState === void 0 ? void 0 : clearEditingState();
4752
4750
  };
4753
4751
  document.addEventListener('keydown', onKeyDown);
4754
4752
  return function () { return document.removeEventListener('keydown', onKeyDown); };
@@ -5048,11 +5046,11 @@ var useAttachments = function (props, state, dispatch, textareaRef) {
5048
5046
  // Number of files that the user can still add. Should never be more than the amount allowed by the API.
5049
5047
  // If multipleUploads is false, we only want to allow a single upload.
5050
5048
  var maxFilesAllowed = !multipleUploads ? 1 : maxNumberOfFiles || apiMaxNumberOfFiles;
5049
+ // OG attachments should not be counted towards "numberOfImages"
5051
5050
  var numberOfImages = Object.values(imageUploads).filter(function (_a) {
5052
- var state = _a.state;
5053
- return state !== 'failed';
5054
- })
5055
- .length;
5051
+ var og_scrape_url = _a.og_scrape_url, state = _a.state;
5052
+ return state !== 'failed' && !og_scrape_url;
5053
+ }).length;
5056
5054
  var numberOfFiles = Object.values(fileUploads).filter(function (_a) {
5057
5055
  var state = _a.state;
5058
5056
  return state !== 'failed';
@@ -5238,6 +5236,14 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
5238
5236
  var channel = useChannelStateContext('useSubmitHandler').channel;
5239
5237
  var _a = useChannelActionContext('useSubmitHandler'), addNotification = _a.addNotification, editMessage = _a.editMessage, sendMessage = _a.sendMessage;
5240
5238
  var t = useTranslationContext('useSubmitHandler').t;
5239
+ var textReference = React.useRef({ hasChanged: false, initialText: text });
5240
+ React.useEffect(function () {
5241
+ if (!textReference.current.initialText.length) {
5242
+ textReference.current.initialText = text;
5243
+ return;
5244
+ }
5245
+ textReference.current.hasChanged = text !== textReference.current.initialText;
5246
+ }, [text]);
5241
5247
  var getAttachmentsFromUploads = function () {
5242
5248
  var imageAttachments = imageOrder
5243
5249
  .map(function (id) { return imageUploads[id]; })
@@ -5246,25 +5252,36 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
5246
5252
  var id = _a.id, url = _a.url;
5247
5253
  return self.every(function (upload) { return upload.id === id || upload.url !== url; });
5248
5254
  })
5249
- .map(function (upload) {
5255
+ .filter(function (upload) {
5256
+ // keep the OG attachments in case the text has not changed as the BE
5257
+ // won't re-enrich the message when only attachments have changed
5258
+ if (!textReference.current.hasChanged)
5259
+ return true;
5260
+ return !upload.og_scrape_url;
5261
+ })
5262
+ .map(function (_a) {
5263
+ var name = _a.file.name, url = _a.url, rest = __rest(_a, ["file", "url"]);
5250
5264
  return ({
5251
- fallback: upload.file.name,
5252
- image_url: upload.url,
5265
+ author_name: rest.author_name,
5266
+ fallback: name,
5267
+ image_url: url,
5268
+ og_scrape_url: rest.og_scrape_url,
5269
+ text: rest.text,
5270
+ title: rest.title,
5271
+ title_link: rest.title_link,
5253
5272
  type: 'image',
5254
5273
  });
5255
5274
  });
5256
5275
  var fileAttachments = fileOrder
5257
5276
  .map(function (id) { return fileUploads[id]; })
5258
5277
  .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
- });
5278
+ .map(function (upload) { return ({
5279
+ asset_url: upload.url,
5280
+ file_size: upload.file.size,
5281
+ mime_type: upload.file.type,
5282
+ title: upload.file.name,
5283
+ type: getAttachmentTypeFromMime(upload.file.type || ''),
5284
+ }); });
5268
5285
  return __spreadArray(__spreadArray(__spreadArray([], attachments), imageAttachments), fileAttachments);
5269
5286
  };
5270
5287
  var handleSubmit = function (event, customMessageData) { return __awaiter(void 0, void 0, void 0, function () {
@@ -5307,8 +5324,7 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
5307
5324
  return [4 /*yield*/, editMessage(__assign(__assign({}, message), updatedMessage))];
5308
5325
  case 2:
5309
5326
  _a.sent();
5310
- if (clearEditingState)
5311
- clearEditingState();
5327
+ clearEditingState === null || clearEditingState === void 0 ? void 0 : clearEditingState();
5312
5328
  dispatch({ type: 'clear' });
5313
5329
  return [3 /*break*/, 4];
5314
5330
  case 3:
@@ -5341,11 +5357,9 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
5341
5357
  getNewText: function () { return text; },
5342
5358
  type: 'setText',
5343
5359
  });
5344
- if (actualMentionedUsers.length) {
5345
- actualMentionedUsers.forEach(function (user) {
5346
- dispatch({ type: 'addMentionedUser', user: user });
5347
- });
5348
- }
5360
+ actualMentionedUsers === null || actualMentionedUsers === void 0 ? void 0 : actualMentionedUsers.forEach(function (user) {
5361
+ dispatch({ type: 'addMentionedUser', user: user });
5362
+ });
5349
5363
  addNotification(t('Send message request failed'), 'error');
5350
5364
  return [3 /*break*/, 13];
5351
5365
  case 13: return [2 /*return*/];
@@ -5406,15 +5420,13 @@ var usePasteHandler = function (uploadNewFiles, insertText, isUploadEnabled) {
5406
5420
  return { onPaste: onPaste };
5407
5421
  };
5408
5422
 
5409
- var emptyFileUploads = {};
5410
- var emptyImageUploads = {};
5411
5423
  var makeEmptyMessageInputState = function () { return ({
5412
5424
  attachments: [],
5413
5425
  emojiPickerIsOpen: false,
5414
5426
  fileOrder: [],
5415
- fileUploads: __assign({}, emptyFileUploads),
5427
+ fileUploads: {},
5416
5428
  imageOrder: [],
5417
- imageUploads: __assign({}, emptyImageUploads),
5429
+ imageUploads: {},
5418
5430
  mentioned_users: [],
5419
5431
  setText: function () { return null; },
5420
5432
  text: '',
@@ -5423,46 +5435,53 @@ var makeEmptyMessageInputState = function () { return ({
5423
5435
  * Initializes the state. Empty if the message prop is falsy.
5424
5436
  */
5425
5437
  var initState = function (message) {
5426
- var _a, _b, _c;
5438
+ var _a, _b, _c, _d, _e;
5427
5439
  if (!message) {
5428
5440
  return makeEmptyMessageInputState();
5429
5441
  }
5430
5442
  // 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) {
5443
+ var imageUploads = (_b = (_a = message.attachments) === null || _a === void 0 ? void 0 : _a.filter(function (_a) {
5432
5444
  var type = _a.type;
5433
5445
  return type === 'image';
5434
- }).reduce(function (acc, attachment) {
5446
+ }).reduce(function (acc, _a) {
5447
+ 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
5448
  var id = nanoid.nanoid();
5436
5449
  acc[id] = {
5450
+ author_name: author_name,
5437
5451
  file: {
5438
- name: attachment.fallback || '',
5452
+ name: fallback,
5439
5453
  },
5440
5454
  id: id,
5455
+ og_scrape_url: og_scrape_url,
5441
5456
  state: 'finished',
5442
- url: attachment.image_url,
5457
+ text: text,
5458
+ title: title,
5459
+ title_link: title_link,
5460
+ url: image_url,
5443
5461
  };
5444
5462
  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) {
5463
+ }, {})) !== null && _b !== void 0 ? _b : {};
5464
+ var fileUploads = (_d = (_c = message.attachments) === null || _c === void 0 ? void 0 : _c.filter(function (_a) {
5448
5465
  var type = _a.type;
5449
5466
  return type === 'file';
5450
- }).reduce(function (acc, attachment) {
5467
+ }).reduce(function (acc, _a) {
5468
+ 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
5469
  var id = nanoid.nanoid();
5452
5470
  acc[id] = {
5453
5471
  file: {
5454
- name: attachment.title || '',
5455
- size: attachment.file_size,
5456
- type: attachment.mime_type,
5472
+ name: title,
5473
+ size: file_size,
5474
+ type: mime_type,
5457
5475
  },
5458
5476
  id: id,
5459
5477
  state: 'finished',
5460
- url: attachment.asset_url,
5478
+ url: asset_url,
5461
5479
  };
5462
5480
  return acc;
5463
- }, {})) || {};
5481
+ }, {})) !== null && _d !== void 0 ? _d : {};
5482
+ var imageOrder = Object.keys(imageUploads);
5464
5483
  var fileOrder = Object.keys(fileUploads);
5465
- var attachments = ((_c = message.attachments) === null || _c === void 0 ? void 0 : _c.filter(function (_a) {
5484
+ var attachments = ((_e = message.attachments) === null || _e === void 0 ? void 0 : _e.filter(function (_a) {
5466
5485
  var type = _a.type;
5467
5486
  return type !== 'file' && type !== 'image';
5468
5487
  })) || [];
@@ -6151,9 +6170,15 @@ var makeAddNotifications = function (setNotifications, notificationTimeouts) { r
6151
6170
 
6152
6171
  var JUMP_MESSAGE_PAGE_SIZE = 25;
6153
6172
  var UnMemoizedChannel = function (props) {
6154
- var propsChannel = props.channel, _a = props.EmptyPlaceholder, EmptyPlaceholder = _a === void 0 ? null : _a;
6155
- var contextChannel = useChatContext('Channel').channel;
6173
+ var propsChannel = props.channel, _a = props.EmptyPlaceholder, EmptyPlaceholder = _a === void 0 ? null : _a, LoadingErrorIndicator = props.LoadingErrorIndicator, LoadingIndicator = props.LoadingIndicator;
6174
+ var _b = useChatContext('Channel'), contextChannel = _b.channel, channelsQueryState = _b.channelsQueryState;
6156
6175
  var channel = propsChannel || contextChannel;
6176
+ if (channelsQueryState.queryInProgress === 'reload' && LoadingIndicator) {
6177
+ return React__default['default'].createElement(LoadingIndicator, { size: 25 });
6178
+ }
6179
+ if (channelsQueryState.error && LoadingErrorIndicator) {
6180
+ return React__default['default'].createElement(LoadingErrorIndicator, { error: channelsQueryState.error });
6181
+ }
6157
6182
  if (!(channel === null || channel === void 0 ? void 0 : channel.cid))
6158
6183
  return EmptyPlaceholder;
6159
6184
  return React__default['default'].createElement(ChannelInner, __assign({}, props, { channel: channel, key: channel.cid }));
@@ -6167,7 +6192,7 @@ var ChannelInner = function (props) {
6167
6192
  var _k = React.useState([]), notifications = _k[0], setNotifications = _k[1];
6168
6193
  var _l = React.useState(), quotedMessage = _l[0], setQuotedMessage = _l[1];
6169
6194
  var notificationTimeouts = [];
6170
- var _m = React.useReducer(channelReducer, initialState), state = _m[0], dispatch = _m[1];
6195
+ var _m = React.useReducer(channelReducer, __assign(__assign({}, initialState), { loading: !channel.initialized })), state = _m[0], dispatch = _m[1];
6171
6196
  var isMounted = useIsMounted();
6172
6197
  var originalTitle = React.useRef('');
6173
6198
  var lastRead = React.useRef(new Date());
@@ -6501,7 +6526,7 @@ var ChannelInner = function (props) {
6501
6526
  error_1 = _b.sent();
6502
6527
  stringError = JSON.stringify(error_1);
6503
6528
  parsedError = stringError ? JSON.parse(stringError) : {};
6504
- updateMessage(__assign(__assign({}, message), { errorStatusCode: parsedError.status || undefined, status: 'failed' }));
6529
+ updateMessage(__assign(__assign({}, message), { error: parsedError, errorStatusCode: parsedError.status || undefined, status: 'failed' }));
6505
6530
  return [3 /*break*/, 7];
6506
6531
  case 7: return [2 /*return*/];
6507
6532
  }
@@ -6770,7 +6795,6 @@ var UnMemoizedChatDown = function (_a) {
6770
6795
  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
6796
  var t = useTranslationContext('ChatDown').t;
6772
6797
  return (React__default['default'].createElement("div", { className: 'str-chat__down' },
6773
- React__default['default'].createElement(LoadingChannels, null),
6774
6798
  React__default['default'].createElement("div", { className: 'str-chat__down-main' },
6775
6799
  typeof image === 'string' ? (React__default['default'].createElement("img", { alt: 'Connection error', "data-testid": 'chatdown-img', src: image })) : (image),
6776
6800
  React__default['default'].createElement("h1", null, type),
@@ -6785,7 +6809,7 @@ var ChatDown = React__default['default'].memo(UnMemoizedChatDown);
6785
6809
  * A preview list of channels, allowing you to select the channel you want to open
6786
6810
  */
6787
6811
  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;
6812
+ 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
6813
  if (error) {
6790
6814
  return React__default['default'].createElement(LoadingErrorIndicator, { type: 'Connection Error' });
6791
6815
  }
@@ -7084,11 +7108,9 @@ var useNotificationRemovedFromChannelListener = function (setChannels, customHan
7084
7108
  };
7085
7109
 
7086
7110
  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];
7111
+ var _a = useChatContext('usePaginatedChannels').channelsQueryState, setError = _a.setError, setQueryInProgress = _a.setQueryInProgress;
7112
+ var _b = React.useState([]), channels = _b[0], setChannels = _b[1];
7089
7113
  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
7114
  var filterString = React.useMemo(function () { return JSON.stringify(filters); }, [filters]);
7093
7115
  var sortString = React.useMemo(function () { return JSON.stringify(sort); }, [sort]);
7094
7116
  var queryChannels = function (queryType) { return __awaiter(void 0, void 0, void 0, function () {
@@ -7097,12 +7119,14 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
7097
7119
  return __generator(this, function (_b) {
7098
7120
  switch (_b.label) {
7099
7121
  case 0:
7100
- setError(false);
7122
+ setError(null);
7101
7123
  if (queryType === 'reload') {
7102
7124
  setChannels([]);
7103
- setLoadingChannels(true);
7125
+ setQueryInProgress('reload');
7126
+ }
7127
+ else {
7128
+ setQueryInProgress('load-more');
7104
7129
  }
7105
- setRefreshing(true);
7106
7130
  offset = queryType === 'reload' ? 0 : channels.length;
7107
7131
  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
7132
  _b.label = 1;
@@ -7122,11 +7146,10 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
7122
7146
  case 3:
7123
7147
  err_1 = _b.sent();
7124
7148
  console.warn(err_1);
7125
- setError(true);
7149
+ setError(err_1);
7126
7150
  return [3 /*break*/, 4];
7127
7151
  case 4:
7128
- setLoadingChannels(false);
7129
- setRefreshing(false);
7152
+ setQueryInProgress(null);
7130
7153
  return [2 /*return*/];
7131
7154
  }
7132
7155
  });
@@ -7142,11 +7165,6 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
7142
7165
  hasNextPage: hasNextPage,
7143
7166
  loadNextPage: loadNextPage,
7144
7167
  setChannels: setChannels,
7145
- status: {
7146
- error: error,
7147
- loadingChannels: loadingChannels,
7148
- refreshing: refreshing,
7149
- },
7150
7168
  };
7151
7169
  };
7152
7170
 
@@ -7553,8 +7571,8 @@ var DEFAULT_FILTERS = {};
7553
7571
  var DEFAULT_OPTIONS = {};
7554
7572
  var DEFAULT_SORT = {};
7555
7573
  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;
7574
+ 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;
7575
+ 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
7576
  var channelListRef = React.useRef(null);
7559
7577
  var _q = React.useState(0), channelUpdateCount = _q[0], setChannelUpdateCount = _q[1];
7560
7578
  /**
@@ -7601,7 +7619,7 @@ var UnMemoizedChannelList = function (props) {
7601
7619
  * force a re-render. Incrementing this dummy variable ensures the channel previews update.
7602
7620
  */
7603
7621
  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;
7622
+ 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
7623
  var loadedChannels = channelRenderFilterFn ? channelRenderFilterFn(channels) : channels;
7606
7624
  useMobileNavigation(channelListRef, navOpen, closeMobileNav);
7607
7625
  useMessageNewListener(setChannels, lockChannelOrder, allowNewMessagesFromUnfilteredChannels);
@@ -7651,14 +7669,16 @@ var UnMemoizedChannelList = function (props) {
7651
7669
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
7652
7670
  React__default['default'].createElement("div", { className: chatClass + " " + channelListClass + " " + theme + " " + navigationClass + " " + windowsEmojiClass, ref: channelListRef },
7653
7671
  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)))))));
7672
+ 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
7673
+ ? renderChannels(loadedChannels, renderChannel)
7674
+ : loadedChannels.map(renderChannel)))))));
7655
7675
  };
7656
7676
  /**
7657
7677
  * Renders a preview list of Channels, allowing you to select the Channel you want to open
7658
7678
  */
7659
7679
  var ChannelList = React__default['default'].memo(UnMemoizedChannelList);
7660
7680
 
7661
- var version = '8.2.0';
7681
+ var version = '9.1.0';
7662
7682
 
7663
7683
  var useChat = function (_a) {
7664
7684
  var _b, _c;
@@ -7755,12 +7775,15 @@ var useChat = function (_a) {
7755
7775
 
7756
7776
  var useCreateChatContext = function (value) {
7757
7777
  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;
7778
+ 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
7779
  var channelCid = channel === null || channel === void 0 ? void 0 : channel.cid;
7780
+ var channelsQueryError = channelsQueryState.error;
7781
+ var channelsQueryInProgress = channelsQueryState.queryInProgress;
7760
7782
  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
7783
  var mutedUsersLength = mutes.length;
7762
7784
  var chatContext = React.useMemo(function () { return ({
7763
7785
  channel: channel,
7786
+ channelsQueryState: channelsQueryState,
7764
7787
  client: client,
7765
7788
  closeMobileNav: closeMobileNav,
7766
7789
  customClasses: customClasses,
@@ -7772,10 +7795,29 @@ var useCreateChatContext = function (value) {
7772
7795
  setActiveChannel: setActiveChannel,
7773
7796
  theme: theme,
7774
7797
  useImageFlagEmojisOnWindows: useImageFlagEmojisOnWindows,
7775
- }); }, [channelCid, clientValues, getAppSettings, mutedUsersLength, navOpen]);
7798
+ }); }, [
7799
+ channelCid,
7800
+ channelsQueryError,
7801
+ channelsQueryInProgress,
7802
+ clientValues,
7803
+ getAppSettings,
7804
+ mutedUsersLength,
7805
+ navOpen,
7806
+ ]);
7776
7807
  return chatContext;
7777
7808
  };
7778
7809
 
7810
+ var useChannelsQueryState = function () {
7811
+ var _a = React.useState(null), error = _a[0], setError = _a[1];
7812
+ var _b = React.useState(null), queryInProgress = _b[0], setQueryInProgress = _b[1];
7813
+ return {
7814
+ error: error,
7815
+ queryInProgress: queryInProgress,
7816
+ setError: setError,
7817
+ setQueryInProgress: setQueryInProgress,
7818
+ };
7819
+ };
7820
+
7779
7821
  var darkModeTheme = {
7780
7822
  '--bg-gradient-end': '#101214',
7781
7823
  '--bg-gradient-start': '#070a0d',
@@ -7813,9 +7855,11 @@ var useCustomStyles = function (customStyles) {
7813
7855
  var Chat = function (props) {
7814
7856
  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
7857
  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;
7858
+ var channelsQueryState = useChannelsQueryState();
7816
7859
  useCustomStyles(darkMode ? darkModeTheme : customStyles);
7817
7860
  var chatContextValue = useCreateChatContext({
7818
7861
  channel: channel,
7862
+ channelsQueryState: channelsQueryState,
7819
7863
  client: client,
7820
7864
  closeMobileNav: closeMobileNav,
7821
7865
  customClasses: customClasses,
@@ -7926,9 +7970,6 @@ var InfiniteScroll = function (props) {
7926
7970
  }
7927
7971
  scrollElement.addEventListener('scroll', scrollListener, useCapture);
7928
7972
  scrollElement.addEventListener('resize', scrollListener, useCapture);
7929
- if (initialLoad) {
7930
- scrollListener();
7931
- }
7932
7973
  return function () {
7933
7974
  scrollElement.removeEventListener('scroll', scrollListener, useCapture);
7934
7975
  scrollElement.removeEventListener('resize', scrollListener, useCapture);
@@ -8692,9 +8733,6 @@ function useMessageListScrollManager(params) {
8692
8733
  });
8693
8734
  var messages = React.useRef();
8694
8735
  var scrollTop = React.useRef(0);
8695
- React.useEffect(function () {
8696
- scrollToBottom();
8697
- }, []);
8698
8736
  React.useEffect(function () {
8699
8737
  var _a, _b, _c;
8700
8738
  var prevMeasures = measures.current;
@@ -8740,49 +8778,62 @@ function useMessageListScrollManager(params) {
8740
8778
  };
8741
8779
  }
8742
8780
 
8781
+ var ResizeObserver = window.ResizeObserver || resizeObserver.ResizeObserver;
8743
8782
  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;
8783
+ 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
8784
  var _c = React.useState(false), hasNewMessages = _c[0], setHasNewMessages = _c[1];
8746
8785
  var _d = React.useState(), wrapperRect = _d[0], setWrapperRect = _d[1];
8747
8786
  var closeToBottom = React.useRef(false);
8748
8787
  var closeToTop = React.useRef(false);
8749
- var listRef = React.useRef(null);
8788
+ var scrollCounter = React.useRef({ autoScroll: 0, scroll: 0 });
8750
8789
  var scrollToBottom = React.useCallback(function () {
8751
- var _a, _b;
8752
- if (!((_a = listRef.current) === null || _a === void 0 ? void 0 : _a.scrollTo) || hasMoreNewer || suppressAutoscroll) {
8790
+ if (!(listElement === null || listElement === void 0 ? void 0 : listElement.scrollTo) || hasMoreNewer || suppressAutoscroll) {
8753
8791
  return;
8754
8792
  }
8755
- (_b = listRef.current) === null || _b === void 0 ? void 0 : _b.scrollTo({
8756
- top: listRef.current.scrollHeight,
8793
+ scrollCounter.current.autoScroll += 1;
8794
+ listElement.scrollTo({
8795
+ top: listElement.scrollHeight,
8757
8796
  });
8758
8797
  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]);
8798
+ }, [listElement, hasMoreNewer, suppressAutoscroll]);
8799
+ React.useEffect(function () {
8800
+ if (!listElement)
8801
+ return;
8802
+ var observer = new ResizeObserver(scrollToBottom);
8803
+ var cancelObserverOnUserScroll = function () {
8804
+ scrollCounter.current.scroll += 1;
8805
+ var userScrolled = scrollCounter.current.autoScroll < scrollCounter.current.scroll;
8806
+ if (ulElement && userScrolled) {
8807
+ observer.unobserve(ulElement);
8808
+ listElement === null || listElement === void 0 ? void 0 : listElement.removeEventListener('scroll', cancelObserverOnUserScroll);
8809
+ }
8810
+ };
8811
+ if (ulElement) {
8812
+ observer.observe(ulElement);
8813
+ }
8814
+ listElement.addEventListener('scroll', cancelObserverOnUserScroll);
8815
+ return function () {
8816
+ observer.disconnect();
8817
+ if (listElement) {
8818
+ listElement.removeEventListener('scroll', cancelObserverOnUserScroll);
8819
+ }
8820
+ };
8821
+ }, [ulElement, scrollToBottom]);
8767
8822
  React.useLayoutEffect(function () {
8768
- if (listRef === null || listRef === void 0 ? void 0 : listRef.current) {
8769
- setWrapperRect(listRef.current.getBoundingClientRect());
8823
+ if (listElement) {
8824
+ setWrapperRect(listElement.getBoundingClientRect());
8770
8825
  scrollToBottom();
8771
8826
  }
8772
- }, [listRef, hasMoreNewer]);
8827
+ }, [listElement, hasMoreNewer]);
8773
8828
  var updateScrollTop = useMessageListScrollManager({
8774
8829
  messages: messages,
8775
8830
  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
- });
8831
+ listElement === null || listElement === void 0 ? void 0 : listElement.scrollBy({ top: scrollBy });
8785
8832
  },
8833
+ scrollContainerMeasures: function () { return ({
8834
+ offsetHeight: (listElement === null || listElement === void 0 ? void 0 : listElement.offsetHeight) || 0,
8835
+ scrollHeight: (listElement === null || listElement === void 0 ? void 0 : listElement.scrollHeight) || 0,
8836
+ }); },
8786
8837
  scrolledUpThreshold: scrolledUpThreshold,
8787
8838
  scrollToBottom: scrollToBottom,
8788
8839
  showNewMessages: function () { return setHasNewMessages(true); },
@@ -8810,7 +8861,7 @@ var useScrollLocationLogic = function (params) {
8810
8861
  }, [closeToTop, closeToBottom, scrollToBottom]);
8811
8862
  return {
8812
8863
  hasNewMessages: hasNewMessages,
8813
- listRef: listRef,
8864
+ listElement: listElement,
8814
8865
  onMessageLoadCaptured: onMessageLoadCaptured,
8815
8866
  onScroll: onScroll,
8816
8867
  scrollToBottom: scrollToBottom,
@@ -8886,15 +8937,19 @@ var MessageListWithContext = function (props) {
8886
8937
  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
8938
  _h = props.returnAllReadData, // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release
8888
8939
  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;
8940
+ var _p = React__default['default'].useState(null), listElement = _p[0], setListElement = _p[1];
8941
+ var _q = React__default['default'].useState(null), ulElement = _q[0], setUlElement = _q[1];
8889
8942
  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({
8943
+ 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;
8944
+ var _w = useScrollLocationLogic({
8892
8945
  hasMoreNewer: hasMoreNewer,
8946
+ listElement: listElement,
8893
8947
  messages: messages,
8894
8948
  scrolledUpThreshold: props.scrolledUpThreshold,
8895
8949
  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({
8950
+ ulElement: ulElement,
8951
+ }), hasNewMessages = _w.hasNewMessages, onMessageLoadCaptured = _w.onMessageLoadCaptured, onScroll = _w.onScroll, scrollToBottom = _w.scrollToBottom, wrapperRect = _w.wrapperRect;
8952
+ var _x = useEnrichedMessages({
8898
8953
  channel: channel,
8899
8954
  disableDateSeparator: disableDateSeparator,
8900
8955
  groupStyles: groupStyles,
@@ -8903,7 +8958,7 @@ var MessageListWithContext = function (props) {
8903
8958
  hideNewMessageSeparator: hideNewMessageSeparator,
8904
8959
  messages: messages,
8905
8960
  noGroupByUser: noGroupByUser,
8906
- }), messageGroupStyles = _v.messageGroupStyles, enrichedMessages = _v.messages;
8961
+ }), messageGroupStyles = _x.messageGroupStyles, enrichedMessages = _x.messages;
8907
8962
  var elements = useMessageListElements({
8908
8963
  enrichedMessages: enrichedMessages,
8909
8964
  internalMessageProps: {
@@ -8938,7 +8993,7 @@ var MessageListWithContext = function (props) {
8938
8993
  returnAllReadData: returnAllReadData,
8939
8994
  threadList: threadList,
8940
8995
  });
8941
- var _w = useComponentContext('useInternalInfiniteScrollProps').LoadingIndicator, LoadingIndicator$1 = _w === void 0 ? LoadingIndicator : _w;
8996
+ var _y = useComponentContext('useInternalInfiniteScrollProps').LoadingIndicator, LoadingIndicator$1 = _y === void 0 ? LoadingIndicator : _y;
8942
8997
  var messageListClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.messageList) || 'str-chat__list';
8943
8998
  var threadListClass = threadList ? (customClasses === null || customClasses === void 0 ? void 0 : customClasses.threadList) || 'str-chat__list--thread' : '';
8944
8999
  var loadMore = React__default['default'].useCallback(function () {
@@ -8967,18 +9022,16 @@ var MessageListWithContext = function (props) {
8967
9022
  }
8968
9023
  });
8969
9024
  }); }, [scrollToBottom, hasMoreNewer]);
8970
- var ulRef = React__default['default'].useRef(null);
8971
9025
  React__default['default'].useLayoutEffect(function () {
8972
- var _a;
8973
9026
  if (highlightedMessageId) {
8974
- var element = (_a = ulRef.current) === null || _a === void 0 ? void 0 : _a.querySelector("[data-message-id='" + highlightedMessageId + "']");
9027
+ var element = ulElement === null || ulElement === void 0 ? void 0 : ulElement.querySelector("[data-message-id='" + highlightedMessageId + "']");
8975
9028
  element === null || element === void 0 ? void 0 : element.scrollIntoView({ block: 'center' });
8976
9029
  }
8977
9030
  }, [highlightedMessageId]);
8978
9031
  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' },
9032
+ 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(Center, { key: 'loadingindicator' },
8980
9033
  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),
9034
+ React__default['default'].createElement("ul", { className: 'str-chat__ul', ref: setUlElement }, elements),
8982
9035
  React__default['default'].createElement(TypingIndicator$1, { threadList: threadList }),
8983
9036
  React__default['default'].createElement("div", { key: 'bottom' })))),
8984
9037
  React__default['default'].createElement(MessageListNotifications$1, { hasNewMessages: hasNewMessages, isNotAtLatestMessageSet: hasMoreNewer, MessageNotification: MessageNotification$1, notifications: notifications, scrollToBottom: scrollToBottomFromNotification })));