stream-chat-react 10.1.2 → 10.3.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 (96) hide show
  1. package/dist/browser.full-bundle.js +253 -72
  2. package/dist/browser.full-bundle.js.map +1 -1
  3. package/dist/browser.full-bundle.min.js +5 -5
  4. package/dist/browser.full-bundle.min.js.map +1 -1
  5. package/dist/components/Attachment/AttachmentContainer.d.ts.map +1 -1
  6. package/dist/components/Attachment/AttachmentContainer.js +67 -15
  7. package/dist/components/Attachment/attachment-sizing.d.ts +9 -0
  8. package/dist/components/Attachment/attachment-sizing.d.ts.map +1 -0
  9. package/dist/components/Attachment/attachment-sizing.js +72 -0
  10. package/dist/components/Channel/Channel.d.ts +7 -1
  11. package/dist/components/Channel/Channel.d.ts.map +1 -1
  12. package/dist/components/Channel/Channel.js +2 -1
  13. package/dist/components/Channel/hooks/useCreateChannelStateContext.d.ts.map +1 -1
  14. package/dist/components/Channel/hooks/useCreateChannelStateContext.js +5 -1
  15. package/dist/components/ChannelList/ChannelList.d.ts.map +1 -1
  16. package/dist/components/ChannelList/ChannelList.js +2 -2
  17. package/dist/components/ChannelList/ChannelListMessenger.js +2 -2
  18. package/dist/components/Gallery/Gallery.d.ts +7 -2
  19. package/dist/components/Gallery/Gallery.d.ts.map +1 -1
  20. package/dist/components/Gallery/Gallery.js +16 -5
  21. package/dist/components/Gallery/Image.d.ts +4 -0
  22. package/dist/components/Gallery/Image.d.ts.map +1 -1
  23. package/dist/components/Gallery/Image.js +3 -3
  24. package/dist/components/InfiniteScrollPaginator/InfiniteScroll.d.ts +19 -4
  25. package/dist/components/InfiniteScrollPaginator/InfiniteScroll.d.ts.map +1 -1
  26. package/dist/components/InfiniteScrollPaginator/InfiniteScroll.js +28 -6
  27. package/dist/components/LoadMore/LoadMoreButton.d.ts +7 -2
  28. package/dist/components/LoadMore/LoadMoreButton.d.ts.map +1 -1
  29. package/dist/components/LoadMore/LoadMoreButton.js +9 -4
  30. package/dist/components/LoadMore/LoadMorePaginator.d.ts +2 -7
  31. package/dist/components/LoadMore/LoadMorePaginator.d.ts.map +1 -1
  32. package/dist/components/LoadMore/LoadMorePaginator.js +8 -3
  33. package/dist/components/Message/hooks/useUserRole.d.ts +1 -1
  34. package/dist/components/Message/hooks/useUserRole.d.ts.map +1 -1
  35. package/dist/components/Message/hooks/useUserRole.js +5 -5
  36. package/dist/components/MessageInput/hooks/useFileUploads.d.ts.map +1 -1
  37. package/dist/components/MessageInput/hooks/useFileUploads.js +1 -0
  38. package/dist/components/MessageInput/hooks/useMessageInputState.d.ts +2 -0
  39. package/dist/components/MessageInput/hooks/useMessageInputState.d.ts.map +1 -1
  40. package/dist/components/MessageInput/hooks/useMessageInputState.js +2 -1
  41. package/dist/components/MessageInput/hooks/useSubmitHandler.d.ts.map +1 -1
  42. package/dist/components/MessageInput/hooks/useSubmitHandler.js +1 -0
  43. package/dist/components/MessageList/MessageList.d.ts.map +1 -1
  44. package/dist/components/MessageList/MessageList.js +2 -3
  45. package/dist/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
  46. package/dist/components/MessageList/VirtualizedMessageList.js +0 -1
  47. package/dist/components/MessageList/hooks/useMessageListElements.d.ts +0 -1
  48. package/dist/components/MessageList/hooks/useMessageListElements.d.ts.map +1 -1
  49. package/dist/components/MessageList/hooks/useMessageListElements.js +2 -3
  50. package/dist/components/MessageList/hooks/useScrollLocationLogic.d.ts +0 -1
  51. package/dist/components/MessageList/hooks/useScrollLocationLogic.d.ts.map +1 -1
  52. package/dist/components/MessageList/hooks/useScrollLocationLogic.js +0 -10
  53. package/dist/components/Reactions/SimpleReactionsList.d.ts.map +1 -1
  54. package/dist/components/Reactions/SimpleReactionsList.js +26 -6
  55. package/dist/components/Thread/Thread.d.ts.map +1 -1
  56. package/dist/components/Thread/Thread.js +7 -2
  57. package/dist/context/ChannelStateContext.d.ts +5 -2
  58. package/dist/context/ChannelStateContext.d.ts.map +1 -1
  59. package/dist/css/index.css +1 -1
  60. package/dist/css/index.css.map +1 -1
  61. package/dist/css/v2/index.css +1 -1
  62. package/dist/css/v2/index.css.map +1 -1
  63. package/dist/css/v2/index.layout.css +1 -1
  64. package/dist/css/v2/index.layout.css.map +1 -1
  65. package/dist/index.cjs.js +252 -71
  66. package/dist/index.cjs.js.map +1 -1
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +1 -0
  69. package/dist/scss/Attachment.scss +44 -17
  70. package/dist/scss/Audio.scss +1 -0
  71. package/dist/scss/ChannelList.scss +14 -0
  72. package/dist/scss/ChannelSearch.scss +8 -8
  73. package/dist/scss/Message.scss +28 -11
  74. package/dist/scss/v2/AttachmentList/AttachmentList-layout.scss +33 -19
  75. package/dist/scss/v2/ChannelList/ChannelList-layout.scss +14 -0
  76. package/dist/scss/v2/ChannelSearch/ChannelSearch-layout.scss +68 -51
  77. package/dist/scss/v2/ChannelSearch/ChannelSearch-theme.scss +48 -0
  78. package/dist/scss/v2/Message/Message-layout.scss +12 -0
  79. package/dist/scss/v2/Message/Message-theme.scss +20 -0
  80. package/dist/scss/v2/MessageList/MessageList-layout.scss +1 -4
  81. package/dist/scss/v2/MessageList/VirtualizedMessageList-layout.scss +21 -0
  82. package/dist/scss/v2/MessageList/VirtualizedMessageList-theme.scss +9 -0
  83. package/dist/scss/v2/Notification/NotificationList-theme.scss +2 -2
  84. package/dist/scss/v2/Tooltip/Tooltip-layout.scss +1 -1
  85. package/dist/scss/v2/_utils.scss +8 -0
  86. package/dist/stories/attachment-sizing.stories.d.ts +2 -0
  87. package/dist/stories/attachment-sizing.stories.d.ts.map +1 -0
  88. package/dist/stories/attachment-sizing.stories.js +179 -0
  89. package/dist/types/types.d.ts +19 -2
  90. package/dist/types/types.d.ts.map +1 -1
  91. package/dist/utils/deprecationWarning.d.ts +2 -0
  92. package/dist/utils/deprecationWarning.d.ts.map +1 -0
  93. package/dist/utils/deprecationWarning.js +12 -0
  94. package/dist/version.d.ts +1 -1
  95. package/dist/version.js +1 -1
  96. package/package.json +3 -3
package/dist/index.cjs.js CHANGED
@@ -1345,7 +1345,7 @@ var ModalGallery = function (props) {
1345
1345
  };
1346
1346
 
1347
1347
  var UnMemoizedGallery = function (props) {
1348
- var images = props.images;
1348
+ var images = props.images, innerRefs = props.innerRefs;
1349
1349
  var _a = React.useState(0), index = _a[0], setIndex = _a[1];
1350
1350
  var _b = React.useState(false), modalOpen = _b[0], setModalOpen = _b[1];
1351
1351
  var _c = useComponentContext('Gallery').ModalGallery, ModalGallery$1 = _c === void 0 ? ModalGallery : _c;
@@ -1362,13 +1362,13 @@ var UnMemoizedGallery = function (props) {
1362
1362
  }
1363
1363
  };
1364
1364
  var renderImages = images.slice(0, countImagesDisplayedInPreview).map(function (image, i) {
1365
- return i === lastImageIndexInPreview && images.length > countImagesDisplayedInPreview ? (React__default["default"].createElement("button", { className: 'str-chat__gallery-placeholder', key: "gallery-image-".concat(i), onClick: function () { return toggleModal(i); }, style: {
1366
- backgroundImage: "url(".concat(images[lastImageIndexInPreview].image_url, ")"),
1367
- } },
1365
+ return i === lastImageIndexInPreview && images.length > countImagesDisplayedInPreview ? (React__default["default"].createElement("button", __assign({ className: 'str-chat__gallery-placeholder', "data-testid": 'gallery-image-last', key: "gallery-image-".concat(i), onClick: function () { return toggleModal(i); }, style: __assign({ backgroundImage: "url(".concat(images[lastImageIndexInPreview].previewUrl ||
1366
+ images[lastImageIndexInPreview].image_url ||
1367
+ images[lastImageIndexInPreview].thumb_url, ")") }, image.style) }, ((innerRefs === null || innerRefs === void 0 ? void 0 : innerRefs.current) && { ref: function (r) { return (innerRefs.current[i] = r); } })),
1368
1368
  React__default["default"].createElement("p", null, t('{{ imageCount }} more', {
1369
1369
  imageCount: images.length - countImagesDisplayedInPreview,
1370
1370
  })))) : (React__default["default"].createElement("button", { className: 'str-chat__gallery-image', "data-testid": 'gallery-image', key: "gallery-image-".concat(i), onClick: function () { return toggleModal(i); } },
1371
- React__default["default"].createElement("img", { alt: 'User uploaded content', src: image.image_url || image.thumb_url })));
1371
+ React__default["default"].createElement("img", __assign({ alt: 'User uploaded content', src: image.previewUrl || image.image_url || image.thumb_url, style: image.style }, ((innerRefs === null || innerRefs === void 0 ? void 0 : innerRefs.current) && { ref: function (r) { return (innerRefs.current[i] = r); } })))));
1372
1372
  });
1373
1373
  var className = clsx('str-chat__gallery', {
1374
1374
  'str-chat__gallery--square': images.length > lastImageIndexInPreview,
@@ -1388,13 +1388,13 @@ var Gallery = React__default["default"].memo(UnMemoizedGallery);
1388
1388
  * A simple component that displays an image.
1389
1389
  */
1390
1390
  var ImageComponent = function (props) {
1391
- var _a = props.dimensions, dimensions = _a === void 0 ? {} : _a, fallback = props.fallback, image_url = props.image_url, thumb_url = props.thumb_url;
1391
+ var _a = props.dimensions, dimensions = _a === void 0 ? {} : _a, fallback = props.fallback, image_url = props.image_url, thumb_url = props.thumb_url, innerRef = props.innerRef, previewUrl = props.previewUrl, style = props.style;
1392
1392
  var _b = React.useState(false), modalIsOpen = _b[0], setModalIsOpen = _b[1];
1393
1393
  var _c = useComponentContext('ImageComponent').ModalGallery, ModalGallery$1 = _c === void 0 ? ModalGallery : _c;
1394
- var imageSrc = sanitizeUrl.sanitizeUrl(image_url || thumb_url);
1394
+ var imageSrc = sanitizeUrl.sanitizeUrl(previewUrl || image_url || thumb_url);
1395
1395
  var toggleModal = function () { return setModalIsOpen(function (modalIsOpen) { return !modalIsOpen; }); };
1396
1396
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
1397
- React__default["default"].createElement("img", __assign({ alt: fallback, className: 'str-chat__message-attachment--img', "data-testid": 'image-test', onClick: toggleModal, src: imageSrc, tabIndex: 0 }, dimensions)),
1397
+ React__default["default"].createElement("img", __assign({ alt: fallback, className: 'str-chat__message-attachment--img', "data-testid": 'image-test', onClick: toggleModal, src: imageSrc, style: style, tabIndex: 0 }, dimensions, (innerRef && { ref: innerRef }))),
1398
1398
  React__default["default"].createElement(Modal, { onClose: toggleModal, open: modalIsOpen },
1399
1399
  React__default["default"].createElement(ModalGallery$1, { images: [props], index: 0 }))));
1400
1400
  };
@@ -1713,7 +1713,7 @@ var AttachmentWithinContainer = function (_a) {
1713
1713
  ? 'actions'
1714
1714
  : '';
1715
1715
  }
1716
- var classNames = clsx('str-chat__message-attachment', (_b = {},
1716
+ var classNames = clsx('str-chat__message-attachment str-chat__message-attachment-dynamic-size', (_b = {},
1717
1717
  _b["str-chat__message-attachment--".concat(componentType)] = componentType,
1718
1718
  _b["str-chat__message-attachment--".concat(attachment === null || attachment === void 0 ? void 0 : attachment.type)] = attachment === null || attachment === void 0 ? void 0 : attachment.type,
1719
1719
  _b["str-chat__message-attachment--".concat(componentType, "--").concat(extra)] = componentType && extra,
@@ -1729,22 +1729,68 @@ var AttachmentActionsContainer = function (_a) {
1729
1729
  return null;
1730
1730
  return (React__default["default"].createElement(AttachmentActions$1, __assign({}, attachment, { actionHandler: actionHandler, actions: attachment.actions, id: attachment.id || '', text: attachment.text || '' })));
1731
1731
  };
1732
+ function getCssDimensionsVariables(url) {
1733
+ var _a;
1734
+ var cssVars = (_a = {},
1735
+ _a['--original-height'] = 1000000,
1736
+ _a['--original-width'] = 1000000,
1737
+ _a);
1738
+ if (url) {
1739
+ var urlParams = new URL(url).searchParams;
1740
+ var oh = Number(urlParams.get('oh'));
1741
+ var ow = Number(urlParams.get('ow'));
1742
+ var originalHeight = oh > 1 ? oh : 1000000;
1743
+ var originalWidth = ow > 1 ? ow : 1000000;
1744
+ cssVars['--original-width'] = originalWidth;
1745
+ cssVars['--original-height'] = originalHeight;
1746
+ }
1747
+ return cssVars;
1748
+ }
1732
1749
  var GalleryContainer = function (_a) {
1733
1750
  var attachment = _a.attachment, _b = _a.Gallery, Gallery$1 = _b === void 0 ? Gallery : _b;
1751
+ var imageElements = React.useRef([]);
1752
+ var imageAttachmentSizeHandler = useChannelStateContext().imageAttachmentSizeHandler;
1753
+ var _c = React.useState([]), attachmentConfigurations = _c[0], setAttachmentConfigurations = _c[1];
1754
+ React.useLayoutEffect(function () {
1755
+ if (imageElements.current &&
1756
+ imageElements.current.every(function (element) { return !!element; }) &&
1757
+ imageAttachmentSizeHandler) {
1758
+ var newConfigurations_1 = [];
1759
+ imageElements.current.forEach(function (element, i) {
1760
+ var config = imageAttachmentSizeHandler(attachment.images[i], element);
1761
+ newConfigurations_1.push(config);
1762
+ });
1763
+ setAttachmentConfigurations(newConfigurations_1);
1764
+ }
1765
+ }, [imageElements, imageAttachmentSizeHandler, attachment]);
1766
+ var images = attachment.images.map(function (image, i) {
1767
+ var _a, _b, _c;
1768
+ return (__assign(__assign({}, image), { previewUrl: ((_a = attachmentConfigurations[i]) === null || _a === void 0 ? void 0 : _a.url) || 'about:blank', style: getCssDimensionsVariables(((_b = attachment.images[i]) === null || _b === void 0 ? void 0 : _b.image_url) || ((_c = attachment.images[i]) === null || _c === void 0 ? void 0 : _c.thumb_url) || '') }));
1769
+ });
1734
1770
  return (React__default["default"].createElement(AttachmentWithinContainer, { attachment: attachment, componentType: 'gallery' },
1735
- React__default["default"].createElement(Gallery$1, { images: attachment.images || [], key: 'gallery' })));
1771
+ React__default["default"].createElement(Gallery$1, { images: images || [], innerRefs: imageElements, key: 'gallery' })));
1736
1772
  };
1737
1773
  var ImageContainer = function (props) {
1738
1774
  var attachment = props.attachment, _a = props.Image, Image = _a === void 0 ? ImageComponent : _a;
1739
1775
  var componentType = 'image';
1776
+ var imageElement = React.useRef(null);
1777
+ var imageAttachmentSizeHandler = useChannelStateContext().imageAttachmentSizeHandler;
1778
+ var _b = React.useState(undefined), attachmentConfiguration = _b[0], setAttachmentConfiguration = _b[1];
1779
+ React.useLayoutEffect(function () {
1780
+ if (imageElement.current && imageAttachmentSizeHandler) {
1781
+ var config = imageAttachmentSizeHandler(attachment, imageElement.current);
1782
+ setAttachmentConfiguration(config);
1783
+ }
1784
+ }, [imageElement, imageAttachmentSizeHandler, attachment]);
1785
+ var imageConfig = __assign(__assign({}, attachment), { previewUrl: (attachmentConfiguration === null || attachmentConfiguration === void 0 ? void 0 : attachmentConfiguration.url) || 'about:blank', style: getCssDimensionsVariables(attachment.image_url || attachment.thumb_url || '') });
1740
1786
  if (attachment.actions && attachment.actions.length) {
1741
1787
  return (React__default["default"].createElement(AttachmentWithinContainer, { attachment: attachment, componentType: componentType },
1742
1788
  React__default["default"].createElement("div", { className: 'str-chat__attachment' },
1743
- React__default["default"].createElement(Image, __assign({}, attachment)),
1789
+ React__default["default"].createElement(Image, __assign({}, imageConfig, { innerRef: imageElement })),
1744
1790
  React__default["default"].createElement(AttachmentActionsContainer, __assign({}, props)))));
1745
1791
  }
1746
1792
  return (React__default["default"].createElement(AttachmentWithinContainer, { attachment: attachment, componentType: componentType },
1747
- React__default["default"].createElement(Image, __assign({}, attachment))));
1793
+ React__default["default"].createElement(Image, __assign({}, imageConfig, { innerRef: imageElement }))));
1748
1794
  };
1749
1795
  var CardContainer = function (props) {
1750
1796
  var attachment = props.attachment, _a = props.Card, Card$1 = _a === void 0 ? Card : _a;
@@ -1775,16 +1821,21 @@ var MediaContainer = function (props) {
1775
1821
  var _a;
1776
1822
  var attachment = props.attachment, _b = props.Media, Media = _b === void 0 ? ReactPlayer__default["default"] : _b;
1777
1823
  var componentType = 'media';
1778
- if ((_a = attachment.actions) === null || _a === void 0 ? void 0 : _a.length) {
1779
- return (React__default["default"].createElement(AttachmentWithinContainer, { attachment: attachment, componentType: componentType },
1780
- React__default["default"].createElement("div", { className: 'str-chat__attachment str-chat__attachment-media' },
1781
- React__default["default"].createElement("div", { className: 'str-chat__player-wrapper' },
1782
- React__default["default"].createElement(Media, { className: 'react-player', controls: true, height: '100%', url: attachment.asset_url, width: '100%' })),
1783
- React__default["default"].createElement(AttachmentActionsContainer, __assign({}, props)))));
1784
- }
1785
- return (React__default["default"].createElement(AttachmentWithinContainer, { attachment: attachment, componentType: componentType },
1786
- React__default["default"].createElement("div", { className: 'str-chat__player-wrapper' },
1787
- React__default["default"].createElement(Media, { className: 'react-player', controls: true, height: '100%', url: attachment.asset_url, width: '100%' }))));
1824
+ var _c = useChannelStateContext(), shouldGenerateVideoThumbnail = _c.shouldGenerateVideoThumbnail, videoAttachmentSizeHandler = _c.videoAttachmentSizeHandler;
1825
+ var videoElement = React.useRef(null);
1826
+ var _d = React.useState(), attachmentConfiguration = _d[0], setAttachmentConfiguration = _d[1];
1827
+ React.useLayoutEffect(function () {
1828
+ if (videoElement.current && videoAttachmentSizeHandler) {
1829
+ var config = videoAttachmentSizeHandler(attachment, videoElement.current, shouldGenerateVideoThumbnail);
1830
+ setAttachmentConfiguration(config);
1831
+ }
1832
+ }, [videoElement, videoAttachmentSizeHandler, attachment]);
1833
+ var content = (React__default["default"].createElement("div", { className: 'str-chat__player-wrapper', "data-testid": 'video-wrapper', ref: videoElement, style: getCssDimensionsVariables(attachment.thumb_url || '') },
1834
+ React__default["default"].createElement(Media, { className: 'react-player', config: { file: { attributes: { poster: attachmentConfiguration === null || attachmentConfiguration === void 0 ? void 0 : attachmentConfiguration.thumbUrl } } }, controls: true, height: '100%', url: attachmentConfiguration === null || attachmentConfiguration === void 0 ? void 0 : attachmentConfiguration.url, width: '100%' })));
1835
+ return ((_a = attachment.actions) === null || _a === void 0 ? void 0 : _a.length) ? (React__default["default"].createElement(AttachmentWithinContainer, { attachment: attachment, componentType: componentType },
1836
+ React__default["default"].createElement("div", { className: 'str-chat__attachment str-chat__attachment-media' },
1837
+ content,
1838
+ React__default["default"].createElement(AttachmentActionsContainer, __assign({}, props))))) : (React__default["default"].createElement(AttachmentWithinContainer, { attachment: attachment, componentType: componentType }, content));
1788
1839
  };
1789
1840
 
1790
1841
  var CONTAINER_MAP = {
@@ -3961,7 +4012,7 @@ var getStrippedEmojiData = function (data) { return (__assign(__assign({}, data)
3961
4012
 
3962
4013
  var useCreateChannelStateContext = function (value) {
3963
4014
  var _a;
3964
- var acceptedFiles = value.acceptedFiles, channel = value.channel, _b = value.channelCapabilitiesArray, channelCapabilitiesArray = _b === void 0 ? [] : _b, channelConfig = value.channelConfig, dragAndDropWindow = value.dragAndDropWindow, giphyVersion = value.giphyVersion, error = value.error, hasMore = value.hasMore, hasMoreNewer = value.hasMoreNewer, suppressAutoscroll = value.suppressAutoscroll, highlightedMessageId = value.highlightedMessageId, loading = value.loading, loadingMore = value.loadingMore, maxNumberOfFiles = value.maxNumberOfFiles, members = value.members, _c = value.messages, messages = _c === void 0 ? [] : _c, multipleUploads = value.multipleUploads, mutes = value.mutes, notifications = value.notifications, pinnedMessages = value.pinnedMessages, quotedMessage = value.quotedMessage, _d = value.read, read = _d === void 0 ? {} : _d, skipMessageDataMemoization = value.skipMessageDataMemoization, thread = value.thread, threadHasMore = value.threadHasMore, threadLoadingMore = value.threadLoadingMore, _e = value.threadMessages, threadMessages = _e === void 0 ? [] : _e, watcherCount = value.watcherCount, watcher_count = value.watcher_count, watchers = value.watchers;
4015
+ var acceptedFiles = value.acceptedFiles, channel = value.channel, _b = value.channelCapabilitiesArray, channelCapabilitiesArray = _b === void 0 ? [] : _b, channelConfig = value.channelConfig, dragAndDropWindow = value.dragAndDropWindow, giphyVersion = value.giphyVersion, error = value.error, hasMore = value.hasMore, hasMoreNewer = value.hasMoreNewer, imageAttachmentSizeHandler = value.imageAttachmentSizeHandler, suppressAutoscroll = value.suppressAutoscroll, highlightedMessageId = value.highlightedMessageId, loading = value.loading, loadingMore = value.loadingMore, maxNumberOfFiles = value.maxNumberOfFiles, members = value.members, _c = value.messages, messages = _c === void 0 ? [] : _c, multipleUploads = value.multipleUploads, mutes = value.mutes, notifications = value.notifications, pinnedMessages = value.pinnedMessages, quotedMessage = value.quotedMessage, _d = value.read, read = _d === void 0 ? {} : _d, shouldGenerateVideoThumbnail = value.shouldGenerateVideoThumbnail, skipMessageDataMemoization = value.skipMessageDataMemoization, thread = value.thread, threadHasMore = value.threadHasMore, threadLoadingMore = value.threadLoadingMore, _e = value.threadMessages, threadMessages = _e === void 0 ? [] : _e, videoAttachmentSizeHandler = value.videoAttachmentSizeHandler, watcherCount = value.watcherCount, watcher_count = value.watcher_count, watchers = value.watchers;
3965
4016
  var channelId = channel.cid;
3966
4017
  var lastRead = channel.initialized && ((_a = channel.lastRead()) === null || _a === void 0 ? void 0 : _a.getTime());
3967
4018
  var membersLength = Object.keys(members || []).length;
@@ -4012,6 +4063,7 @@ var useCreateChannelStateContext = function (value) {
4012
4063
  hasMore: hasMore,
4013
4064
  hasMoreNewer: hasMoreNewer,
4014
4065
  highlightedMessageId: highlightedMessageId,
4066
+ imageAttachmentSizeHandler: imageAttachmentSizeHandler,
4015
4067
  loading: loading,
4016
4068
  loadingMore: loadingMore,
4017
4069
  maxNumberOfFiles: maxNumberOfFiles,
@@ -4023,11 +4075,13 @@ var useCreateChannelStateContext = function (value) {
4023
4075
  pinnedMessages: pinnedMessages,
4024
4076
  quotedMessage: quotedMessage,
4025
4077
  read: read,
4078
+ shouldGenerateVideoThumbnail: shouldGenerateVideoThumbnail,
4026
4079
  suppressAutoscroll: suppressAutoscroll,
4027
4080
  thread: thread,
4028
4081
  threadHasMore: threadHasMore,
4029
4082
  threadLoadingMore: threadLoadingMore,
4030
4083
  threadMessages: threadMessages,
4084
+ videoAttachmentSizeHandler: videoAttachmentSizeHandler,
4031
4085
  watcher_count: watcher_count,
4032
4086
  watcherCount: watcherCount,
4033
4087
  watchers: watchers,
@@ -4047,6 +4101,7 @@ var useCreateChannelStateContext = function (value) {
4047
4101
  quotedMessage,
4048
4102
  readUsersLength,
4049
4103
  readUsersLastReads,
4104
+ shouldGenerateVideoThumbnail,
4050
4105
  skipMessageDataMemoization,
4051
4106
  suppressAutoscroll,
4052
4107
  thread,
@@ -4226,7 +4281,7 @@ var MessageErrorIcon = function () { return (React__default["default"].createEle
4226
4281
 
4227
4282
  var useUserRole = function (message, onlySenderCanEdit, disableQuotedMessages) {
4228
4283
  var _a, _b, _c;
4229
- var _d = useChannelStateContext('useUserRole'), channel = _d.channel, _e = _d.channelCapabilities, channelCapabilities = _e === void 0 ? {} : _e, channelConfig = _d.channelConfig;
4284
+ var _d = useChannelStateContext('useUserRole'), channel = _d.channel, _e = _d.channelCapabilities, channelCapabilities = _e === void 0 ? {} : _e;
4230
4285
  var client = useChatContext('useUserRole').client;
4231
4286
  /**
4232
4287
  * @deprecated as it relies on `membership.role` check which is already deprecated and shouldn't be used anymore.
@@ -4252,11 +4307,11 @@ var useUserRole = function (message, onlySenderCanEdit, disableQuotedMessages) {
4252
4307
  (isMyMessage && channelCapabilities['update-own-message']);
4253
4308
  var canDelete = channelCapabilities['delete-any-message'] ||
4254
4309
  (isMyMessage && channelCapabilities['delete-own-message']);
4255
- var canFlag = !isMyMessage;
4256
- var canMute = !isMyMessage && (channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.mutes);
4310
+ var canFlag = !isMyMessage && channelCapabilities['flag-message'];
4311
+ var canMute = !isMyMessage && channelCapabilities['mute-channel'];
4257
4312
  var canQuote = !disableQuotedMessages && channelCapabilities['quote-message'];
4258
- var canReact = (channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.reactions) !== false && channelCapabilities['send-reaction'];
4259
- var canReply = (channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.replies) !== false && channelCapabilities['send-reply'];
4313
+ var canReact = channelCapabilities['send-reaction'];
4314
+ var canReply = channelCapabilities['send-reply'];
4260
4315
  return {
4261
4316
  canDelete: canDelete,
4262
4317
  canEdit: canEdit,
@@ -9552,6 +9607,7 @@ var useFileUploads = function (props, state, dispatch) {
9552
9607
  dispatch({
9553
9608
  id: id,
9554
9609
  state: 'finished',
9610
+ thumb_url: response.thumb_url,
9555
9611
  type: 'setFileUpload',
9556
9612
  url: response.file,
9557
9613
  });
@@ -9816,6 +9872,7 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
9816
9872
  asset_url: upload.url,
9817
9873
  file_size: upload.file.size,
9818
9874
  mime_type: upload.file.type,
9875
+ thumb_url: upload.thumb_url,
9819
9876
  title: upload.file.name,
9820
9877
  type: getAttachmentTypeFromMime(upload.file.type || ''),
9821
9878
  }); });
@@ -10002,7 +10059,7 @@ var initState = function (message) {
10002
10059
  var type = _a.type;
10003
10060
  return type === 'file';
10004
10061
  }).reduce(function (acc, _a) {
10005
- var asset_url = _a.asset_url, file_size = _a.file_size, mime_type = _a.mime_type, _b = _a.title, title = _b === void 0 ? '' : _b;
10062
+ var asset_url = _a.asset_url, file_size = _a.file_size, mime_type = _a.mime_type, thumb_url = _a.thumb_url, _b = _a.title, title = _b === void 0 ? '' : _b;
10006
10063
  var id = nanoid.nanoid();
10007
10064
  acc[id] = {
10008
10065
  file: {
@@ -10012,6 +10069,7 @@ var initState = function (message) {
10012
10069
  },
10013
10070
  id: id,
10014
10071
  state: 'finished',
10072
+ thumb_url: thumb_url,
10015
10073
  url: asset_url,
10016
10074
  };
10017
10075
  return acc;
@@ -10538,12 +10596,27 @@ var UnMemoizedReactionsList = function (props) {
10538
10596
  */
10539
10597
  var ReactionsList = React__default["default"].memo(UnMemoizedReactionsList);
10540
10598
 
10599
+ // todo: merge with ReactionsList/ButtonWithTooltip
10600
+ // avoiding breaking change of replacing <span> with <button>
10601
+ var WithTooltip = function (_a) {
10602
+ var children = _a.children, onMouseEnter = _a.onMouseEnter, onMouseLeave = _a.onMouseLeave, title = _a.title;
10603
+ var _b = React.useState(null), referenceElement = _b[0], setReferenceElement = _b[1];
10604
+ var _c = useEnterLeaveHandlers({
10605
+ onMouseEnter: onMouseEnter,
10606
+ onMouseLeave: onMouseLeave,
10607
+ }), handleEnter = _c.handleEnter, handleLeave = _c.handleLeave, tooltipVisible = _c.tooltipVisible;
10608
+ var themeVersion = useChatContext('WithTooltip').themeVersion;
10609
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
10610
+ themeVersion === '2' && (React__default["default"].createElement(PopperTooltip, { referenceElement: referenceElement, visible: tooltipVisible }, title)),
10611
+ React__default["default"].createElement("span", { onMouseEnter: handleEnter, onMouseLeave: handleLeave, ref: setReferenceElement }, children)));
10612
+ };
10541
10613
  var UnMemoizedSimpleReactionsList = function (props) {
10542
10614
  var propHandleReaction = props.handleReaction, rest = __rest(props, ["handleReaction"]);
10543
10615
  var _a = useEmojiContext('SimpleReactionsList'), Emoji = _a.Emoji, emojiConfig = _a.emojiConfig;
10544
10616
  var contextHandleReaction = useMessageContext('SimpleReactionsList').handleReaction;
10545
10617
  var _b = useProcessReactions(__assign({ emojiConfig: emojiConfig }, rest)), additionalEmojiProps = _b.additionalEmojiProps, emojiData = _b.emojiData, getEmojiByReactionType = _b.getEmojiByReactionType, iHaveReactedWithReaction = _b.iHaveReactedWithReaction, latestReactions = _b.latestReactions, latestReactionTypes = _b.latestReactionTypes, supportedReactionsArePresent = _b.supportedReactionsArePresent, totalReactionCount = _b.totalReactionCount;
10546
10618
  var _c = React.useState(undefined), tooltipReactionType = _c[0], setTooltipReactionType = _c[1];
10619
+ var themeVersion = useChatContext('SimpleReactionsList').themeVersion;
10547
10620
  var handleReaction = propHandleReaction || contextHandleReaction;
10548
10621
  if (!latestReactions.length)
10549
10622
  return null;
@@ -10553,7 +10626,7 @@ var UnMemoizedSimpleReactionsList = function (props) {
10553
10626
  return latestReactions
10554
10627
  .map(function (reaction) {
10555
10628
  var _a, _b;
10556
- if (reaction.type === type) {
10629
+ if (type && reaction.type === type) {
10557
10630
  return ((_a = reaction.user) === null || _a === void 0 ? void 0 : _a.name) || ((_b = reaction.user) === null || _b === void 0 ? void 0 : _b.id);
10558
10631
  }
10559
10632
  return null;
@@ -10566,16 +10639,18 @@ var UnMemoizedSimpleReactionsList = function (props) {
10566
10639
  var _a;
10567
10640
  var emojiObject = getEmojiByReactionType(reactionType);
10568
10641
  var isOwnReaction = iHaveReactedWithReaction(reactionType);
10642
+ var tooltipVisible = emojiObject && tooltipReactionType === (emojiObject === null || emojiObject === void 0 ? void 0 : emojiObject.id);
10643
+ var tooltipContent = (_a = getUsersPerReactionType(tooltipReactionType)) === null || _a === void 0 ? void 0 : _a.join(', ');
10569
10644
  return emojiObject ? (React__default["default"].createElement("li", { className: clsx('str-chat__simple-reactions-list-item', {
10570
10645
  'str-chat__message-reaction-own': isOwnReaction,
10571
10646
  }), key: "".concat(emojiObject.id, "-").concat(i), onClick: function (event) { return handleReaction(reactionType, event); }, onKeyUp: function (event) { return handleReaction(reactionType, event); } },
10572
- React__default["default"].createElement("span", { onMouseEnter: function () { return setTooltipReactionType(reactionType); } },
10647
+ React__default["default"].createElement(WithTooltip, { onMouseEnter: function () { return setTooltipReactionType(reactionType); }, onMouseLeave: function () { return setTooltipReactionType(undefined); }, title: tooltipContent },
10573
10648
  React__default["default"].createElement(React.Suspense, { fallback: null },
10574
10649
  React__default["default"].createElement(Emoji, __assign({ data: emojiData, emoji: emojiObject, size: 13 }, additionalEmojiProps))),
10575
- "\u00A0"),
10576
- tooltipReactionType === emojiObject.id && (React__default["default"].createElement("div", { className: 'str-chat__simple-reactions-list-tooltip str-chat__tooltip' },
10577
- React__default["default"].createElement("div", { className: 'arrow' }), (_a = getUsersPerReactionType(tooltipReactionType)) === null || _a === void 0 ? void 0 :
10578
- _a.join(', '))))) : null;
10650
+ "\u00A0",
10651
+ tooltipVisible && themeVersion === '1' && (React__default["default"].createElement("div", { className: 'str-chat__simple-reactions-list-tooltip' },
10652
+ React__default["default"].createElement("div", { className: 'arrow' }),
10653
+ tooltipContent))))) : null;
10579
10654
  }),
10580
10655
  React__default["default"].createElement("li", { className: 'str-chat__simple-reactions-list-item--last-number' }, totalReactionCount))));
10581
10656
  };
@@ -10916,6 +10991,79 @@ var useChannelContainerClasses = function (_a) {
10916
10991
  };
10917
10992
  };
10918
10993
 
10994
+ var getImageAttachmentConfiguration = function (attachment, element) {
10995
+ var url = new URL((attachment.image_url || attachment.thumb_url || ''));
10996
+ var resizeDimensions = getSizingRestrictions(url, element);
10997
+ if (resizeDimensions) {
10998
+ // Apply 2x for retina displays
10999
+ resizeDimensions.height *= 2;
11000
+ resizeDimensions.width *= 2;
11001
+ addResizingParamsToUrl(resizeDimensions, url);
11002
+ }
11003
+ return {
11004
+ url: url.href,
11005
+ };
11006
+ };
11007
+ var getVideoAttachmentConfiguration = function (attachment, element, shouldGenerateVideoThumbnail) {
11008
+ var thumbUrl = undefined;
11009
+ if (attachment.thumb_url && shouldGenerateVideoThumbnail) {
11010
+ var url = new URL(attachment.thumb_url);
11011
+ var resizeDimensions = getSizingRestrictions(url, element);
11012
+ if (resizeDimensions) {
11013
+ // Apply 2x for retina displays
11014
+ resizeDimensions.height *= 2;
11015
+ resizeDimensions.width *= 2;
11016
+ addResizingParamsToUrl(resizeDimensions, url);
11017
+ }
11018
+ thumbUrl = url.href;
11019
+ }
11020
+ return {
11021
+ thumbUrl: thumbUrl,
11022
+ url: attachment.asset_url || '',
11023
+ };
11024
+ };
11025
+ var getSizingRestrictions = function (url, htmlElement) {
11026
+ var urlParams = url.searchParams;
11027
+ var originalHeight = Number(urlParams.get('oh')) || 1;
11028
+ var originalWidth = Number(urlParams.get('ow')) || 1;
11029
+ var cssSizeRestriction = getCSSSizeRestrictions(htmlElement);
11030
+ var resizeDimensions;
11031
+ if ((cssSizeRestriction.maxHeight || cssSizeRestriction.height) && cssSizeRestriction.maxWidth) {
11032
+ resizeDimensions = getResizeDimensions(originalHeight, originalWidth,
11033
+ /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */
11034
+ cssSizeRestriction.maxHeight || cssSizeRestriction.height, cssSizeRestriction.maxWidth);
11035
+ }
11036
+ else {
11037
+ resizeDimensions = undefined;
11038
+ }
11039
+ return resizeDimensions;
11040
+ };
11041
+ var getResizeDimensions = function (originalHeight, originalWidth, maxHeight, maxWidth) { return ({
11042
+ height: Math.round(Math.max(maxHeight, (maxWidth / originalWidth) * originalHeight)),
11043
+ width: Math.round(Math.max(maxHeight, (maxWidth / originalHeight) * originalWidth)),
11044
+ }); };
11045
+ var getCSSSizeRestrictions = function (htmlElement) {
11046
+ var computedStylesheet = getComputedStyle(htmlElement);
11047
+ var height = getValueRepresentationOfCSSProperty(computedStylesheet.getPropertyValue('height'));
11048
+ var maxHeight = getValueRepresentationOfCSSProperty(computedStylesheet.getPropertyValue('max-height'));
11049
+ var maxWidth = getValueRepresentationOfCSSProperty(computedStylesheet.getPropertyValue('max-width'));
11050
+ if (!((height || maxHeight) && maxWidth)) {
11051
+ console.warn("Invalid value set for height/max-height and/or max-width for HTML element, this can cause scrolling issues inside the message list, more info https://getstream.io/chat/docs/sdk/react/message-components/attachment/#image-and-video-sizing");
11052
+ }
11053
+ return { height: height, maxHeight: maxHeight, maxWidth: maxWidth };
11054
+ };
11055
+ var getValueRepresentationOfCSSProperty = function (property) {
11056
+ if (!property.endsWith('px')) {
11057
+ return undefined;
11058
+ }
11059
+ var number = parseFloat(property);
11060
+ return isNaN(number) ? undefined : number;
11061
+ };
11062
+ var addResizingParamsToUrl = function (resizeDimensions, url) {
11063
+ url.searchParams.set('h', resizeDimensions.height.toString());
11064
+ url.searchParams.set('w', resizeDimensions.width.toString());
11065
+ };
11066
+
10919
11067
  var UnMemoizedChannel = function (props) {
10920
11068
  var propsChannel = props.channel, _a = props.EmptyPlaceholder, EmptyPlaceholder = _a === void 0 ? null : _a, LoadingErrorIndicator = props.LoadingErrorIndicator, _b = props.LoadingIndicator, LoadingIndicator = _b === void 0 ? LoadingChannel : _b;
10921
11069
  var _c = useChatContext('Channel'), contextChannel = _c.channel, channelsQueryState = _c.channelsQueryState, customClasses = _c.customClasses, theme = _c.theme;
@@ -11402,7 +11550,7 @@ var ChannelInner = function (props) {
11402
11550
  var onMentionsHoverOrClick = useMentionsHandlers(onMentionsHover, onMentionsClick);
11403
11551
  var editMessage = useEditMessageHandler(doUpdateMessageRequest);
11404
11552
  var typing = state.typing, restState = __rest(state, ["typing"]);
11405
- var channelStateContextValue = useCreateChannelStateContext(__assign(__assign({}, restState), { acceptedFiles: acceptedFiles, channel: channel, channelCapabilitiesArray: channelCapabilitiesArray, channelConfig: channelConfig, dragAndDropWindow: dragAndDropWindow, giphyVersion: props.giphyVersion || 'fixed_height', maxNumberOfFiles: maxNumberOfFiles, multipleUploads: multipleUploads, mutes: mutes, notifications: notifications, quotedMessage: quotedMessage, watcher_count: state.watcherCount }));
11553
+ var channelStateContextValue = useCreateChannelStateContext(__assign(__assign({}, restState), { acceptedFiles: acceptedFiles, channel: channel, channelCapabilitiesArray: channelCapabilitiesArray, channelConfig: channelConfig, dragAndDropWindow: dragAndDropWindow, giphyVersion: props.giphyVersion || 'fixed_height', imageAttachmentSizeHandler: props.imageAttachmentSizeHandler || getImageAttachmentConfiguration, maxNumberOfFiles: maxNumberOfFiles, multipleUploads: multipleUploads, mutes: mutes, notifications: notifications, quotedMessage: quotedMessage, shouldGenerateVideoThumbnail: props.shouldGenerateVideoThumbnail || true, videoAttachmentSizeHandler: props.videoAttachmentSizeHandler || getVideoAttachmentConfiguration, watcher_count: state.watcherCount }));
11406
11554
  var channelActionContextValue = React.useMemo(function () { return ({
11407
11555
  addNotification: addNotification,
11408
11556
  closeThread: closeThread,
@@ -11657,8 +11805,8 @@ var ChannelListMessenger = function (props) {
11657
11805
  if (loading) {
11658
11806
  return React__default["default"].createElement(LoadingIndicator, null);
11659
11807
  }
11660
- return (React__default["default"].createElement("div", { className: 'str-chat__channel-list-messenger' },
11661
- React__default["default"].createElement("div", { "aria-label": 'Channel list', className: 'str-chat__channel-list-messenger__main', role: 'listbox' }, children)));
11808
+ return (React__default["default"].createElement("div", { className: 'str-chat__channel-list-messenger str-chat__channel-list-messenger-react' },
11809
+ React__default["default"].createElement("div", { "aria-label": 'Channel list', className: 'str-chat__channel-list-messenger__main str-chat__channel-list-messenger-react__main', role: 'listbox' }, children)));
11662
11810
  };
11663
11811
 
11664
11812
  var useChannelDeletedListener = function (setChannels, customHandler) {
@@ -12505,18 +12653,39 @@ var UnMemoizedEmptyStateIndicator = function (props) {
12505
12653
  };
12506
12654
  var EmptyStateIndicator = React__default["default"].memo(UnMemoizedEmptyStateIndicator);
12507
12655
 
12508
- var UnMemoizedLoadMoreButton = function (props) {
12509
- var _a = props.children, children = _a === void 0 ? 'Load more' : _a, onClick = props.onClick, refreshing = props.refreshing;
12656
+ var deprecationAndReplacementWarning = function (pairs, component) {
12657
+ pairs.forEach(function (data) {
12658
+ var _a = [
12659
+ Object.entries(data[0])[0],
12660
+ Object.entries(data[1])[0],
12661
+ ], _b = _a[0], oldName = _b[0], oldValue = _b[1], _c = _a[1], newName = _c[0], newValue = _c[1];
12662
+ if ((typeof oldValue !== 'undefined' && typeof newValue === 'undefined') ||
12663
+ (typeof oldValue !== 'undefined' && typeof newValue !== 'undefined')) {
12664
+ console.warn("[Deprecation notice (".concat(component, ")]: prefer using prop ").concat(newName, " instead of ").concat(oldName));
12665
+ }
12666
+ });
12667
+ };
12668
+
12669
+ var UnMemoizedLoadMoreButton = function (_a) {
12670
+ var _b = _a.children, children = _b === void 0 ? 'Load more' : _b, isLoading = _a.isLoading, onClick = _a.onClick, refreshing = _a.refreshing;
12671
+ var loading = typeof isLoading !== 'undefined' ? isLoading : refreshing;
12672
+ React.useEffect(function () {
12673
+ deprecationAndReplacementWarning([[{ refreshing: refreshing }, { isLoading: isLoading }]], 'LoadMoreButton');
12674
+ }, []);
12510
12675
  return (React__default["default"].createElement("div", { className: 'str-chat__load-more-button' },
12511
- React__default["default"].createElement("button", { "aria-label": 'Load More Channels', className: 'str-chat__load-more-button__button str-chat__cta-button', "data-testid": 'load-more-button', disabled: refreshing, onClick: onClick }, refreshing ? React__default["default"].createElement(LoadingIndicator, null) : children)));
12676
+ React__default["default"].createElement("button", { "aria-label": 'Load More Channels', className: 'str-chat__load-more-button__button str-chat__cta-button', "data-testid": 'load-more-button', disabled: loading, onClick: onClick }, loading ? React__default["default"].createElement(LoadingIndicator, null) : children)));
12512
12677
  };
12513
12678
  var LoadMoreButton = React__default["default"].memo(UnMemoizedLoadMoreButton);
12514
12679
 
12515
12680
  var UnMemoizedLoadMorePaginator = function (props) {
12516
- var children = props.children, hasNextPage = props.hasNextPage, _a = props.LoadMoreButton, LoadMoreButton$1 = _a === void 0 ? LoadMoreButton : _a, loadNextPage = props.loadNextPage, refreshing = props.refreshing, reverse = props.reverse;
12681
+ var children = props.children, hasNextPage = props.hasNextPage, isLoading = props.isLoading, _a = props.LoadMoreButton, LoadMoreButton$1 = _a === void 0 ? LoadMoreButton : _a, loadNextPage = props.loadNextPage, refreshing = props.refreshing, reverse = props.reverse;
12682
+ var loadingState = typeof isLoading !== 'undefined' ? isLoading : refreshing;
12683
+ React.useEffect(function () {
12684
+ deprecationAndReplacementWarning([[{ refreshing: refreshing }, { isLoading: isLoading }]], 'LoadMorePaginator');
12685
+ }, []);
12517
12686
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
12518
12687
  !reverse && children,
12519
- hasNextPage && React__default["default"].createElement(LoadMoreButton$1, { onClick: loadNextPage, refreshing: refreshing }),
12688
+ hasNextPage && React__default["default"].createElement(LoadMoreButton$1, { isLoading: loadingState, onClick: loadNextPage }),
12520
12689
  reverse && children));
12521
12690
  };
12522
12691
  var LoadMorePaginator = React__default["default"].memo(UnMemoizedLoadMorePaginator);
@@ -12631,7 +12800,7 @@ var UnMemoizedChannelList = function (props) {
12631
12800
  };
12632
12801
  return React__default["default"].createElement(ChannelPreview, __assign({}, previewProps));
12633
12802
  };
12634
- var className = clsx((_a = customClasses === null || customClasses === void 0 ? void 0 : customClasses.chat) !== null && _a !== void 0 ? _a : 'str-chat', theme, (_b = customClasses === null || customClasses === void 0 ? void 0 : customClasses.channelList) !== null && _b !== void 0 ? _b : 'str-chat-channel-list str-chat__channel-list', {
12803
+ var className = clsx((_a = customClasses === null || customClasses === void 0 ? void 0 : customClasses.chat) !== null && _a !== void 0 ? _a : 'str-chat', theme, (_b = customClasses === null || customClasses === void 0 ? void 0 : customClasses.channelList) !== null && _b !== void 0 ? _b : 'str-chat-channel-list str-chat__channel-list str-chat__channel-list-react', {
12635
12804
  'str-chat--windows-flags': useImageFlagEmojisOnWindows && navigator.userAgent.match(/Win/),
12636
12805
  'str-chat-channel-list--open': navOpen,
12637
12806
  });
@@ -12639,7 +12808,7 @@ var UnMemoizedChannelList = function (props) {
12639
12808
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
12640
12809
  React__default["default"].createElement("div", { className: className, ref: channelListRef },
12641
12810
  showChannelSearch && (React__default["default"].createElement(ChannelSearch$1, __assign({ onSearch: onSearch, onSearchExit: onSearchExit, setChannels: setChannels }, additionalChannelSearchProps))),
12642
- showChannelList && (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
12811
+ showChannelList && (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, isLoading: channelsQueryState.queryInProgress === 'load-more', loadNextPage: loadNextPage }, renderChannels
12643
12812
  ? renderChannels(loadedChannels, renderChannel)
12644
12813
  : loadedChannels.map(function (channel) { return renderChannel(channel); }))))))));
12645
12814
  };
@@ -12648,7 +12817,7 @@ var UnMemoizedChannelList = function (props) {
12648
12817
  */
12649
12818
  var ChannelList = React__default["default"].memo(UnMemoizedChannelList);
12650
12819
 
12651
- var version = '10.1.2';
12820
+ var version = '10.3.0';
12652
12821
 
12653
12822
  var useChat = function (_a) {
12654
12823
  var _b, _c;
@@ -12923,7 +13092,11 @@ var mousewheelListener = function (event) {
12923
13092
  }
12924
13093
  };
12925
13094
  var InfiniteScroll = function (props) {
12926
- var children = props.children, _a = props.element, element = _a === void 0 ? 'div' : _a, _b = props.hasMore, hasMore = _b === void 0 ? false : _b, _c = props.hasMoreNewer, hasMoreNewer = _c === void 0 ? false : _c, head = props.head, _d = props.initialLoad, initialLoad = _d === void 0 ? true : _d, _e = props.isLoading, isLoading = _e === void 0 ? false : _e, listenToScroll = props.listenToScroll, loader = props.loader, loadMore = props.loadMore, loadMoreNewer = props.loadMoreNewer, _f = props.threshold, threshold = _f === void 0 ? 250 : _f, _g = props.useCapture, useCapture = _g === void 0 ? false : _g, elementProps = __rest(props, ["children", "element", "hasMore", "hasMoreNewer", "head", "initialLoad", "isLoading", "listenToScroll", "loader", "loadMore", "loadMoreNewer", "threshold", "useCapture"]);
13095
+ var children = props.children, _a = props.element, element = _a === void 0 ? 'div' : _a, hasMore = props.hasMore, hasMoreNewer = props.hasMoreNewer, hasNextPage = props.hasNextPage, hasPreviousPage = props.hasPreviousPage, head = props.head, _b = props.initialLoad, initialLoad = _b === void 0 ? true : _b, isLoading = props.isLoading, listenToScroll = props.listenToScroll, loader = props.loader, loadMore = props.loadMore, loadMoreNewer = props.loadMoreNewer, loadNextPage = props.loadNextPage, loadPreviousPage = props.loadPreviousPage, _c = props.threshold, threshold = _c === void 0 ? 250 : _c, _d = props.useCapture, useCapture = _d === void 0 ? false : _d, elementProps = __rest(props, ["children", "element", "hasMore", "hasMoreNewer", "hasNextPage", "hasPreviousPage", "head", "initialLoad", "isLoading", "listenToScroll", "loader", "loadMore", "loadMoreNewer", "loadNextPage", "loadPreviousPage", "threshold", "useCapture"]);
13096
+ var loadNextPageFn = loadNextPage || loadMoreNewer;
13097
+ var loadPreviousPageFn = loadPreviousPage || loadMore;
13098
+ var hasNextPageFlag = hasNextPage || hasMoreNewer;
13099
+ var hasPreviousPageFlag = hasPreviousPage || hasMore;
12927
13100
  var scrollComponent = React.useRef();
12928
13101
  var scrollListener = React.useCallback(function () {
12929
13102
  var element = scrollComponent.current;
@@ -12937,13 +13110,30 @@ var InfiniteScroll = function (props) {
12937
13110
  if (listenToScroll) {
12938
13111
  listenToScroll(offset, reverseOffset, threshold);
12939
13112
  }
12940
- if (reverseOffset < Number(threshold) && typeof loadMore === 'function' && hasMore) {
12941
- loadMore();
13113
+ if (reverseOffset < Number(threshold) &&
13114
+ typeof loadPreviousPageFn === 'function' &&
13115
+ hasPreviousPageFlag) {
13116
+ loadPreviousPageFn();
12942
13117
  }
12943
- if (offset < Number(threshold) && typeof loadMoreNewer === 'function' && hasMoreNewer) {
12944
- loadMoreNewer();
13118
+ if (offset < Number(threshold) && typeof loadNextPageFn === 'function' && hasNextPageFlag) {
13119
+ loadNextPageFn();
12945
13120
  }
12946
- }, [hasMore, hasMoreNewer, threshold, listenToScroll, loadMore, loadMoreNewer]);
13121
+ }, [
13122
+ hasPreviousPageFlag,
13123
+ hasNextPageFlag,
13124
+ threshold,
13125
+ listenToScroll,
13126
+ loadPreviousPageFn,
13127
+ loadNextPageFn,
13128
+ ]);
13129
+ React.useEffect(function () {
13130
+ deprecationAndReplacementWarning([
13131
+ [{ hasMoreNewer: hasMoreNewer }, { hasNextPage: hasNextPage }],
13132
+ [{ loadMoreNewer: loadMoreNewer }, { loadNextPage: loadNextPage }],
13133
+ [{ hasMore: hasMore }, { hasPreviousPage: hasPreviousPage }],
13134
+ [{ loadMore: loadMore }, { loadPreviousPage: loadPreviousPage }],
13135
+ ], 'InfiniteScroll');
13136
+ }, []);
12947
13137
  React.useEffect(function () {
12948
13138
  var _a;
12949
13139
  var scrollElement = (_a = scrollComponent.current) === null || _a === void 0 ? void 0 : _a.parentNode;
@@ -13701,7 +13891,7 @@ var useLastReadData = function (props) {
13701
13891
  };
13702
13892
 
13703
13893
  var useMessageListElements = function (props) {
13704
- var enrichedMessages = props.enrichedMessages, internalMessageProps = props.internalMessageProps, messageGroupStyles = props.messageGroupStyles, onMessageLoadCaptured = props.onMessageLoadCaptured, read = props.read, returnAllReadData = props.returnAllReadData, threadList = props.threadList;
13894
+ var enrichedMessages = props.enrichedMessages, internalMessageProps = props.internalMessageProps, messageGroupStyles = props.messageGroupStyles, read = props.read, returnAllReadData = props.returnAllReadData, threadList = props.threadList;
13705
13895
  var _a = useChatContext('useMessageListElements'), client = _a.client, customClasses = _a.customClasses;
13706
13896
  var _b = useComponentContext('useMessageListElements'), _c = _b.DateSeparator, DateSeparator$1 = _c === void 0 ? DateSeparator : _c, HeaderComponent = _b.HeaderComponent, _d = _b.MessageSystem, MessageSystem = _d === void 0 ? EventComponent : _d;
13707
13897
  // get the readData, but only for messages submitted by the user themselves
@@ -13733,7 +13923,7 @@ var useMessageListElements = function (props) {
13733
13923
  }
13734
13924
  var groupStyles = messageGroupStyles[message.id] || '';
13735
13925
  var messageClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.message) || "str-chat__li str-chat__li--".concat(groupStyles);
13736
- return (React__default["default"].createElement("li", { className: messageClass, "data-message-id": message.id, "data-testid": messageClass, key: message.id || message.created_at, onLoadCapture: onMessageLoadCaptured },
13926
+ return (React__default["default"].createElement("li", { className: messageClass, "data-message-id": message.id, "data-testid": messageClass, key: message.id || message.created_at },
13737
13927
  React__default["default"].createElement(Message, __assign({ groupStyles: [groupStyles], lastReceivedId: lastReceivedId, message: message, readBy: readData[message.id] || [], threadList: threadList }, internalMessageProps))));
13738
13928
  });
13739
13929
  }, [
@@ -13741,7 +13931,6 @@ var useMessageListElements = function (props) {
13741
13931
  internalMessageProps,
13742
13932
  lastReceivedId,
13743
13933
  messageGroupStyles,
13744
- onMessageLoadCaptured,
13745
13934
  readData,
13746
13935
  threadList,
13747
13936
  ]);
@@ -13860,19 +14049,9 @@ var useScrollLocationLogic = function (params) {
13860
14049
  setIsMessageListScrolledToBottom(true);
13861
14050
  }
13862
14051
  }, [updateScrollTop, closeToTop, closeToBottom, scrolledUpThreshold]);
13863
- var onMessageLoadCaptured = React.useCallback(function () {
13864
- /**
13865
- * A load event (emitted by e.g. an <img>) was captured on a message.
13866
- * In some cases, the loaded asset is larger than the placeholder, which means we have to scroll down.
13867
- */
13868
- if (closeToBottom.current) {
13869
- scrollToBottom();
13870
- }
13871
- }, [closeToTop, closeToBottom, scrollToBottom]);
13872
14052
  return {
13873
14053
  hasNewMessages: hasNewMessages,
13874
14054
  isMessageListScrolledToBottom: isMessageListScrolledToBottom,
13875
- onMessageLoadCaptured: onMessageLoadCaptured,
13876
14055
  onScroll: onScroll,
13877
14056
  scrollToBottom: scrollToBottom,
13878
14057
  wrapperRect: wrapperRect,
@@ -14000,7 +14179,7 @@ var MessageListWithContext = function (props) {
14000
14179
  messages: messages,
14001
14180
  scrolledUpThreshold: props.scrolledUpThreshold,
14002
14181
  suppressAutoscroll: suppressAutoscroll,
14003
- }), hasNewMessages = _x.hasNewMessages, isMessageListScrolledToBottom = _x.isMessageListScrolledToBottom, onMessageLoadCaptured = _x.onMessageLoadCaptured, onScroll = _x.onScroll, scrollToBottom = _x.scrollToBottom, wrapperRect = _x.wrapperRect;
14182
+ }), hasNewMessages = _x.hasNewMessages, isMessageListScrolledToBottom = _x.isMessageListScrolledToBottom, onScroll = _x.onScroll, scrollToBottom = _x.scrollToBottom, wrapperRect = _x.wrapperRect;
14004
14183
  var _y = useEnrichedMessages({
14005
14184
  channel: channel,
14006
14185
  disableDateSeparator: disableDateSeparator,
@@ -14040,7 +14219,6 @@ var MessageListWithContext = function (props) {
14040
14219
  unsafeHTML: unsafeHTML,
14041
14220
  },
14042
14221
  messageGroupStyles: messageGroupStyles,
14043
- onMessageLoadCaptured: onMessageLoadCaptured,
14044
14222
  read: read,
14045
14223
  returnAllReadData: returnAllReadData,
14046
14224
  threadList: threadList,
@@ -14084,7 +14262,7 @@ var MessageListWithContext = function (props) {
14084
14262
  var showEmptyStateIndicator = elements.length === 0 && !threadList;
14085
14263
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
14086
14264
  React__default["default"].createElement(MessageListMainPanel, null,
14087
- React__default["default"].createElement("div", { className: "".concat(messageListClass, " ").concat(threadListClass), onScroll: onScroll, ref: setListElement, tabIndex: 0 }, showEmptyStateIndicator ? (React__default["default"].createElement(EmptyStateIndicator$1, { key: 'empty-state-indicator', listType: threadList ? 'thread' : 'message' })) : (React__default["default"].createElement(InfiniteScroll, __assign({ className: 'str-chat__reverse-infinite-scroll str-chat__message-list-scroll', "data-testid": 'reverse-infinite-scroll', hasMore: props.hasMore, hasMoreNewer: props.hasMoreNewer, head: props.head, isLoading: props.loadingMore, loader: React__default["default"].createElement("div", { className: 'str-chat__list__loading', key: 'loading-indicator' }, props.loadingMore && React__default["default"].createElement(LoadingIndicator$1, { size: 20 })), loadMore: loadMore, loadMoreNewer: loadMoreNewer }, props.internalInfiniteScrollProps),
14265
+ React__default["default"].createElement("div", { className: "".concat(messageListClass, " ").concat(threadListClass), onScroll: onScroll, ref: setListElement, tabIndex: 0 }, showEmptyStateIndicator ? (React__default["default"].createElement(EmptyStateIndicator$1, { key: 'empty-state-indicator', listType: threadList ? 'thread' : 'message' })) : (React__default["default"].createElement(InfiniteScroll, __assign({ className: 'str-chat__reverse-infinite-scroll str-chat__message-list-scroll', "data-testid": 'reverse-infinite-scroll', hasNextPage: props.hasMoreNewer, hasPreviousPage: props.hasMore, head: props.head, isLoading: props.loadingMore, loader: React__default["default"].createElement("div", { className: 'str-chat__list__loading', key: 'loading-indicator' }, props.loadingMore && React__default["default"].createElement(LoadingIndicator$1, { size: 20 })), loadNextPage: loadMoreNewer, loadPreviousPage: loadMore }, props.internalInfiniteScrollProps),
14088
14266
  React__default["default"].createElement("ul", { className: 'str-chat__ul', ref: setUlElement }, elements),
14089
14267
  React__default["default"].createElement(TypingIndicator$1, { threadList: threadList }),
14090
14268
  React__default["default"].createElement("div", { key: 'bottom' }))))),
@@ -14484,7 +14662,6 @@ var VirtualizedMessageListWithContext = function (props) {
14484
14662
  return Item;
14485
14663
  }, [
14486
14664
  customClasses === null || customClasses === void 0 ? void 0 : customClasses.virtualMessage,
14487
- messageGroupStyles,
14488
14665
  numItemsPrepended,
14489
14666
  // processedMessages were incorrectly rebuilt with a new object identity at some point, hence the .length usage
14490
14667
  processedMessages.length,
@@ -14622,9 +14799,13 @@ var ThreadInner = function (props) {
14622
14799
  }, []);
14623
14800
  if (!thread)
14624
14801
  return null;
14625
- var threadClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.thread) || 'str-chat__thread-container str-chat__thread';
14802
+ var threadClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.thread) ||
14803
+ clsx('str-chat__thread-container str-chat__thread', {
14804
+ 'str-chat__thread--full': fullWidth,
14805
+ 'str-chat__thread--virtualized': virtualized,
14806
+ });
14626
14807
  var head = (React__default["default"].createElement(ThreadHead$1, __assign({ key: thread.id, message: thread, Message: MessageUIComponent }, additionalParentMessageProps)));
14627
- return (React__default["default"].createElement("div", { className: "".concat(threadClass, " ").concat(fullWidth ? 'str-chat__thread--full' : '') },
14808
+ return (React__default["default"].createElement("div", { className: threadClass },
14628
14809
  React__default["default"].createElement(ThreadHeader$1, { closeThread: closeThread, thread: thread }),
14629
14810
  React__default["default"].createElement(ThreadMessageList, __assign({ disableDateSeparator: !enableDateSeparator, hasMore: threadHasMore, head: head, loadingMore: threadLoadingMore, loadMore: loadMoreThread, Message: MessageUIComponent, messageActions: messageActions, messages: threadMessages || [], suppressAutoscroll: threadSuppressAutoscroll, threadList: true }, (virtualized ? additionalVirtualizedMessageListProps : additionalMessageListProps))),
14630
14811
  React__default["default"].createElement(MessageInput, __assign({ focus: autoFocus, Input: ThreadInput, parent: thread, publishTypingEvent: false }, additionalMessageInputProps))));