stream-chat-react 10.1.1 → 10.2.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 (104) hide show
  1. package/dist/browser.full-bundle.js +328 -202
  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/ChannelPreview/ChannelPreview.d.ts +0 -2
  16. package/dist/components/ChannelPreview/ChannelPreview.d.ts.map +1 -1
  17. package/dist/components/ChannelPreview/hooks/index.d.ts +2 -0
  18. package/dist/components/ChannelPreview/hooks/index.d.ts.map +1 -0
  19. package/dist/components/ChannelPreview/hooks/index.js +1 -0
  20. package/dist/components/ChannelPreview/index.d.ts +1 -0
  21. package/dist/components/ChannelPreview/index.d.ts.map +1 -1
  22. package/dist/components/ChannelPreview/index.js +1 -0
  23. package/dist/components/Gallery/Gallery.d.ts +7 -2
  24. package/dist/components/Gallery/Gallery.d.ts.map +1 -1
  25. package/dist/components/Gallery/Gallery.js +16 -5
  26. package/dist/components/Gallery/Image.d.ts +4 -0
  27. package/dist/components/Gallery/Image.d.ts.map +1 -1
  28. package/dist/components/Gallery/Image.js +3 -3
  29. package/dist/components/LoadMore/LoadMorePaginator.d.ts +4 -1
  30. package/dist/components/LoadMore/LoadMorePaginator.d.ts.map +1 -1
  31. package/dist/components/Message/hooks/usePinHandler.d.ts.map +1 -1
  32. package/dist/components/Message/hooks/usePinHandler.js +3 -5
  33. package/dist/components/MessageInput/hooks/useFileUploads.d.ts.map +1 -1
  34. package/dist/components/MessageInput/hooks/useFileUploads.js +1 -0
  35. package/dist/components/MessageInput/hooks/useMessageInputState.d.ts +2 -0
  36. package/dist/components/MessageInput/hooks/useMessageInputState.d.ts.map +1 -1
  37. package/dist/components/MessageInput/hooks/useMessageInputState.js +2 -1
  38. package/dist/components/MessageInput/hooks/useSubmitHandler.d.ts.map +1 -1
  39. package/dist/components/MessageInput/hooks/useSubmitHandler.js +1 -0
  40. package/dist/components/MessageInput/index.d.ts +2 -1
  41. package/dist/components/MessageInput/index.d.ts.map +1 -1
  42. package/dist/components/MessageInput/index.js +2 -1
  43. package/dist/components/MessageList/MessageList.d.ts.map +1 -1
  44. package/dist/components/MessageList/MessageList.js +1 -2
  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/Thread/Thread.d.ts.map +1 -1
  54. package/dist/components/Thread/Thread.js +7 -2
  55. package/dist/components/Tooltip/Tooltip.d.ts +1 -1
  56. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  57. package/dist/components/TypingIndicator/TypingIndicator.d.ts +1 -1
  58. package/dist/components/TypingIndicator/TypingIndicator.d.ts.map +1 -1
  59. package/dist/components/index.d.ts +2 -2
  60. package/dist/components/index.d.ts.map +1 -1
  61. package/dist/components/index.js +2 -2
  62. package/dist/context/ChannelStateContext.d.ts +5 -2
  63. package/dist/context/ChannelStateContext.d.ts.map +1 -1
  64. package/dist/css/index.css +1 -1
  65. package/dist/css/index.css.map +1 -1
  66. package/dist/css/v2/index.css +1 -1
  67. package/dist/css/v2/index.css.map +1 -1
  68. package/dist/css/v2/index.layout.css +1 -1
  69. package/dist/css/v2/index.layout.css.map +1 -1
  70. package/dist/index.cjs.js +324 -202
  71. package/dist/index.cjs.js.map +1 -1
  72. package/dist/scss/Attachment.scss +49 -20
  73. package/dist/scss/Audio.scss +1 -0
  74. package/dist/scss/Message.scss +44 -41
  75. package/dist/scss/MessageCommerce.scss +1 -1
  76. package/dist/scss/Thread.scss +39 -2
  77. package/dist/scss/VirtualMessage.scss +2 -6
  78. package/dist/scss/v2/AttachmentList/AttachmentList-layout.scss +33 -19
  79. package/dist/scss/v2/Message/Message-layout.scss +12 -0
  80. package/dist/scss/v2/Message/Message-theme.scss +20 -0
  81. package/dist/scss/v2/MessageList/MessageList-layout.scss +1 -4
  82. package/dist/scss/v2/MessageList/VirtualizedMessageList-layout.scss +21 -0
  83. package/dist/scss/v2/MessageList/VirtualizedMessageList-theme.scss +9 -0
  84. package/dist/scss/v2/Notification/NotificationList-theme.scss +2 -2
  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/stories/edit-message.stories.d.ts.map +1 -1
  90. package/dist/stories/edit-message.stories.js +0 -4
  91. package/dist/stories/pin-message.stories.d.ts +2 -0
  92. package/dist/stories/pin-message.stories.d.ts.map +1 -0
  93. package/dist/stories/pin-message.stories.js +98 -0
  94. package/dist/stories/utils.d.ts +1 -1
  95. package/dist/stories/utils.d.ts.map +1 -1
  96. package/dist/stories/utils.js +30 -19
  97. package/dist/types/types.d.ts +9 -1
  98. package/dist/types/types.d.ts.map +1 -1
  99. package/dist/version.d.ts +1 -1
  100. package/dist/version.js +1 -1
  101. package/package.json +3 -3
  102. package/dist/components/MessageList/Center.d.ts +0 -3
  103. package/dist/components/MessageList/Center.d.ts.map +0 -1
  104. package/dist/components/MessageList/Center.js +0 -6
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,
@@ -6832,6 +6887,159 @@ var CUSTOM_MESSAGE_TYPE = {
6832
6887
  intro: 'channel.intro',
6833
6888
  };
6834
6889
 
6890
+ var useFileState = function (file) {
6891
+ return React.useMemo(function () { return ({
6892
+ failed: file.state === 'failed',
6893
+ finished: file.state === 'finished',
6894
+ uploading: file.state === 'uploading',
6895
+ }); }, [file.state]);
6896
+ };
6897
+
6898
+ var EmojiIconLarge = function () {
6899
+ var t = useTranslationContext('EmojiIconLarge').t;
6900
+ return (React__default["default"].createElement("svg", { height: '28', width: '28', xmlns: 'http://www.w3.org/2000/svg' },
6901
+ React__default["default"].createElement("title", null, t('Open emoji picker')),
6902
+ React__default["default"].createElement("g", { clipRule: 'evenodd', fillRule: 'evenodd' },
6903
+ React__default["default"].createElement("path", { d: 'M14 4.4C8.6 4.4 4.4 8.6 4.4 14c0 5.4 4.2 9.6 9.6 9.6c5.4 0 9.6-4.2 9.6-9.6c0-5.4-4.2-9.6-9.6-9.6zM2 14c0-6.6 5.4-12 12-12s12 5.4 12 12s-5.4 12-12 12s-12-5.4-12-12zM12.8 11c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8s.8-1.8 1.8-1.8s1.8.8 1.8 1.8zM18.8 11c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8s.8-1.8 1.8-1.8s1.8.8 1.8 1.8zM8.6 15.4c.6-.4 1.2-.2 1.6.2c.6.8 1.6 1.8 3 2c1.2.4 2.8.2 4.8-2c.4-.4 1.2-.6 1.6 0c.4.4.6 1.2 0 1.6c-2.2 2.6-4.8 3.4-7 3c-2-.4-3.6-1.8-4.4-3c-.4-.6-.2-1.2.4-1.8z' }))));
6904
+ };
6905
+ var EmojiIconSmall = function () {
6906
+ var t = useTranslationContext('EmojiIconSmall').t;
6907
+ return (React__default["default"].createElement("svg", { height: '14', width: '14', xmlns: 'http://www.w3.org/2000/svg' },
6908
+ React__default["default"].createElement("title", null, t('Open emoji picker')),
6909
+ React__default["default"].createElement("g", { clipRule: 'evenodd', fillRule: 'evenodd' },
6910
+ React__default["default"].createElement("path", { d: 'M6.7 1.42C3.73 1.42 1.42 3.73 1.42 6.7c0 2.97 2.31 5.28 5.28 5.28c2.97 0 5.28-2.31 5.28-5.28c0-2.97-2.31-5.28-5.28-5.28zM.1 6.7c0-3.63 2.97-6.6 6.6-6.6s6.6 2.97 6.6 6.6s-2.97 6.6-6.6 6.6s-6.6-2.97-6.6-6.6zM6.04 5.05c0 .55-.44.99-.99.99s-.99-.44-.99-.99s.44-.99.99-.99s.99.44.99.99zM9.34 5.05c0 .55-.44.99-.99.99s-.99-.44-.99-.99s.44-.99.99-.99s.99.44.99.99zM3.73 7.47c.33-.22.66-.11.88.11c.33.44.88.99 1.65 1.1c.66.22 1.54.11 2.64-1.1c.22-.22.66-.33.88 0c.22.22.33.66 0 .88c-1.21 1.43-2.64 1.87-3.85 1.65c-1.1-.22-1.98-.99-2.42-1.65c-.22-.33-.11-.66.22-.99z' }))));
6911
+ };
6912
+ // ThemingV2 icon
6913
+ var EmojiPickerIcon = function () { return (React__default["default"].createElement("svg", { preserveAspectRatio: 'xMinYMin', viewBox: '0 0 28 28', width: '100%', xmlns: 'http://www.w3.org/2000/svg' },
6914
+ React__default["default"].createElement("g", { clipRule: 'evenodd', fillRule: 'evenodd' },
6915
+ React__default["default"].createElement("path", { d: 'M14 4.4C8.6 4.4 4.4 8.6 4.4 14c0 5.4 4.2 9.6 9.6 9.6c5.4 0 9.6-4.2 9.6-9.6c0-5.4-4.2-9.6-9.6-9.6zM2 14c0-6.6 5.4-12 12-12s12 5.4 12 12s-5.4 12-12 12s-12-5.4-12-12zM12.8 11c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8s.8-1.8 1.8-1.8s1.8.8 1.8 1.8zM18.8 11c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8s.8-1.8 1.8-1.8s1.8.8 1.8 1.8zM8.6 15.4c.6-.4 1.2-.2 1.6.2c.6.8 1.6 1.8 3 2c1.2.4 2.8.2 4.8-2c.4-.4 1.2-.6 1.6 0c.4.4.6 1.2 0 1.6c-2.2 2.6-4.8 3.4-7 3c-2-.4-3.6-1.8-4.4-3c-.4-.6-.2-1.2.4-1.8z' })))); };
6916
+ var FileUploadIcon = function () {
6917
+ var t = useTranslationContext('FileUploadIcon').t;
6918
+ return (React__default["default"].createElement("svg", { height: '14', width: '14', xmlns: 'http://www.w3.org/2000/svg' },
6919
+ React__default["default"].createElement("title", null, t('Attach files')),
6920
+ React__default["default"].createElement("path", { d: 'M7 .5c3.59 0 6.5 2.91 6.5 6.5s-2.91 6.5-6.5 6.5S.5 10.59.5 7 3.41.5 7 .5zm0 12c3.031 0 5.5-2.469 5.5-5.5S10.031 1.5 7 1.5A5.506 5.506 0 0 0 1.5 7c0 3.034 2.469 5.5 5.5 5.5zM7.506 3v3.494H11v1.05H7.506V11h-1.05V7.544H3v-1.05h3.456V3h1.05z', fillRule: 'nonzero' })));
6921
+ };
6922
+ var FileUploadIconFlat = function () {
6923
+ var t = useTranslationContext('FileUploadIconFlat').t;
6924
+ return (React__default["default"].createElement("svg", { height: '14', width: '14', xmlns: 'http://www.w3.org/2000/svg' },
6925
+ React__default["default"].createElement("title", null, t('Attach files')),
6926
+ React__default["default"].createElement("path", { d: 'M1.667.333h10.666c.737 0 1.334.597 1.334 1.334v10.666c0 .737-.597 1.334-1.334 1.334H1.667a1.333 1.333 0 0 1-1.334-1.334V1.667C.333.93.93.333 1.667.333zm2 1.334a1.667 1.667 0 1 0 0 3.333 1.667 1.667 0 0 0 0-3.333zm-2 9.333v1.333h10.666v-4l-2-2-4 4-2-2L1.667 11z', fillRule: 'nonzero' })));
6927
+ };
6928
+ var LoadingIndicatorIcon = function (_a) {
6929
+ var _b = _a.size, size = _b === void 0 ? 20 : _b;
6930
+ var id = React.useMemo(function () { return nanoid.nanoid(); }, []);
6931
+ return (React__default["default"].createElement("div", { className: 'str-chat__loading-indicator' },
6932
+ React__default["default"].createElement("svg", { "data-testid": 'loading-indicator', height: size, viewBox: '0 0 30 30', width: size, xmlns: 'http://www.w3.org/2000/svg' },
6933
+ React__default["default"].createElement("defs", null,
6934
+ React__default["default"].createElement("linearGradient", { id: "".concat(id, "-linear-gradient"), x1: '50%', x2: '50%', y1: '0%', y2: '100%' },
6935
+ React__default["default"].createElement("stop", { offset: '0%', stopColor: '#FFF', stopOpacity: '0' }),
6936
+ React__default["default"].createElement("stop", { "data-testid": 'stop-color', offset: '100%', stopOpacity: '1' }))),
6937
+ React__default["default"].createElement("path", { d: 'M2.518 23.321l1.664-1.11A12.988 12.988 0 0 0 15 28c7.18 0 13-5.82 13-13S22.18 2 15 2V0c8.284 0 15 6.716 15 15 0 8.284-6.716 15-15 15-5.206 0-9.792-2.652-12.482-6.679z', fill: "url(#".concat(id, "-linear-gradient)"), fillRule: 'evenodd' }))));
6938
+ };
6939
+ // ThemingV2 icon
6940
+ var UploadIcon = function () { return (React__default["default"].createElement("svg", { "data-testid": 'attach', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
6941
+ React__default["default"].createElement("g", { clipPath: 'url(#clip0_10878_5)' },
6942
+ React__default["default"].createElement("path", { d: 'M12.9997 6.99993L10.9997 6.99993L10.9997 10.9999L6.99972 10.9999L6.99972 12.9999L10.9997 12.9999L10.9997 16.9999L12.9997 16.9999L12.9997 12.9999L16.9997 12.9999L16.9997 10.9999L12.9997 10.9999L12.9997 6.99993ZM11.9997 1.99992C6.47972 1.99992 1.99972 6.47993 1.99972 11.9999C1.99972 17.5199 6.47972 21.9999 11.9997 21.9999C17.5197 21.9999 21.9997 17.5199 21.9997 11.9999C21.9997 6.47993 17.5197 1.99992 11.9997 1.99992ZM11.9997 19.9999C7.58972 19.9999 3.99972 16.4099 3.99972 11.9999C3.99972 7.58993 7.58972 3.99993 11.9997 3.99993C16.4097 3.99993 19.9997 7.58993 19.9997 11.9999C19.9997 16.4099 16.4097 19.9999 11.9997 19.9999Z', fill: 'black' })),
6943
+ React__default["default"].createElement("defs", null,
6944
+ React__default["default"].createElement("clipPath", { id: 'clip0_10878_5' },
6945
+ React__default["default"].createElement("rect", { fill: 'white', height: '24', width: '24' }))))); };
6946
+ var CloseIcon$1 = function () { return (React__default["default"].createElement("svg", { "data-testid": 'close-no-outline', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
6947
+ React__default["default"].createElement("path", { d: 'M19 6.41L17.59 5L12 10.59L6.41 5L5 6.41L10.59 12L5 17.59L6.41 19L12 13.41L17.59 19L19 17.59L13.41 12L19 6.41Z', fill: 'black' }))); };
6948
+ var RetryIcon = function () { return (React__default["default"].createElement("svg", { "data-testid": 'retry', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
6949
+ React__default["default"].createElement("path", { d: 'M17.6449 6.35C16.1949 4.9 14.2049 4 11.9949 4C7.57488 4 4.00488 7.58 4.00488 12C4.00488 16.42 7.57488 20 11.9949 20C15.7249 20 18.8349 17.45 19.7249 14H17.6449C16.8249 16.33 14.6049 18 11.9949 18C8.68488 18 5.99488 15.31 5.99488 12C5.99488 8.69 8.68488 6 11.9949 6C13.6549 6 15.1349 6.69 16.2149 7.78L12.9949 11H19.9949V4L17.6449 6.35Z', fill: 'black' }))); };
6950
+ var DownloadIcon = function () { return (React__default["default"].createElement("svg", { "data-testid": 'download', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
6951
+ React__default["default"].createElement("path", { d: 'M19.35 10.04C18.67 6.59 15.64 4 12 4C9.11 4 6.6 5.64 5.35 8.04C2.34 8.36 0 10.91 0 14C0 17.31 2.69 20 6 20H19C21.76 20 24 17.76 24 15C24 12.36 21.95 10.22 19.35 10.04ZM19 18H6C3.79 18 2 16.21 2 14C2 11.95 3.53 10.24 5.56 10.03L6.63 9.92L7.13 8.97C8.08 7.14 9.94 6 12 6C14.62 6 16.88 7.86 17.39 10.43L17.69 11.93L19.22 12.04C20.78 12.14 22 13.45 22 15C22 16.65 20.65 18 19 18ZM13.45 10H10.55V13H8L12 17L16 13H13.45V10Z', fill: 'black' }))); };
6952
+ var SendIconV1 = function () {
6953
+ var t = useTranslationContext('SendButton').t;
6954
+ return (React__default["default"].createElement("svg", { height: '17', viewBox: '0 0 18 17', width: '18', xmlns: 'http://www.w3.org/2000/svg' },
6955
+ React__default["default"].createElement("title", null, t('Send')),
6956
+ React__default["default"].createElement("path", { d: 'M0 17.015l17.333-8.508L0 0v6.617l12.417 1.89L0 10.397z', fill: '#006cff', fillRule: 'evenodd' })));
6957
+ };
6958
+ var SendIconV2 = function () {
6959
+ var t = useTranslationContext('SendButton').t;
6960
+ return (React__default["default"].createElement("svg", { "data-testid": 'send', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
6961
+ React__default["default"].createElement("title", null, t('Send')),
6962
+ React__default["default"].createElement("path", { d: 'M4.00952 22L24 12L4.00952 2L4 9.77778L18.2857 12L4 14.2222L4.00952 22Z', fill: 'black' })));
6963
+ };
6964
+ var SendButton = function (_a) {
6965
+ var sendMessage = _a.sendMessage, rest = __rest(_a, ["sendMessage"]);
6966
+ var themeVersion = useChatContext('SendButton').themeVersion;
6967
+ return (React__default["default"].createElement("button", __assign({ "aria-label": 'Send', className: 'str-chat__send-button', "data-testid": 'send-button', onClick: sendMessage, type: 'button' }, rest), themeVersion === '2' ? React__default["default"].createElement(SendIconV2, null) : React__default["default"].createElement(SendIconV1, null)));
6968
+ };
6969
+
6970
+ var AttachmentPreviewList = function () {
6971
+ var _a = useMessageInputContext('AttachmentPreviewList'), fileOrder = _a.fileOrder, imageOrder = _a.imageOrder;
6972
+ return (React__default["default"].createElement("div", { className: 'str-chat__attachment-preview-list' },
6973
+ React__default["default"].createElement("div", { className: 'str-chat__attachment-list-scroll-container', "data-testid": 'attachment-list-scroll-container' },
6974
+ imageOrder.map(function (id) { return (React__default["default"].createElement(ImagePreviewItem, { id: id, key: id })); }),
6975
+ fileOrder.map(function (id) { return (React__default["default"].createElement(FilePreviewItem, { id: id, key: id })); }))));
6976
+ };
6977
+ var ImagePreviewItem = function (_a) {
6978
+ var _b;
6979
+ var id = _a.id;
6980
+ var _c = useMessageInputContext('ImagePreviewItem'), imageUploads = _c.imageUploads, removeImage = _c.removeImage, uploadImage = _c.uploadImage;
6981
+ var handleRemove = React.useCallback(function (e) {
6982
+ e.stopPropagation();
6983
+ removeImage(id);
6984
+ }, [removeImage, id]);
6985
+ var handleRetry = React.useCallback(function () { return uploadImage(id); }, [uploadImage, id]);
6986
+ var image = imageUploads[id];
6987
+ var state = useFileState(image);
6988
+ // do not display scraped attachments
6989
+ if (!image || image.og_scrape_url)
6990
+ return null;
6991
+ return (React__default["default"].createElement("div", { className: 'str-chat__attachment-preview-image', "data-testid": 'attachment-preview-image' },
6992
+ React__default["default"].createElement("button", { className: 'str-chat__attachment-preview-delete', "data-testid": 'image-preview-item-delete-button', disabled: state.uploading, onClick: handleRemove },
6993
+ React__default["default"].createElement(CloseIcon$1, null)),
6994
+ state.failed && (React__default["default"].createElement("button", { className: 'str-chat__attachment-preview-error str-chat__attachment-preview-error-image', "data-testid": 'image-preview-item-retry-button', onClick: handleRetry },
6995
+ React__default["default"].createElement(RetryIcon, null))),
6996
+ state.uploading && (React__default["default"].createElement("div", { className: 'str-chat__attachment-preview-image-loading' },
6997
+ React__default["default"].createElement(LoadingIndicatorIcon, { size: 17 }))),
6998
+ (image.previewUri || image.url) && (React__default["default"].createElement("img", { alt: image.file.name, className: 'str-chat__attachment-preview-thumbnail', src: (_b = image.previewUri) !== null && _b !== void 0 ? _b : image.url }))));
6999
+ };
7000
+ var FilePreviewItem = function (_a) {
7001
+ var id = _a.id;
7002
+ var _b = useMessageInputContext('FilePreviewItem'), fileUploads = _b.fileUploads, removeFile = _b.removeFile, uploadFile = _b.uploadFile;
7003
+ var handleRemove = React.useCallback(function (e) {
7004
+ e.stopPropagation();
7005
+ removeFile(id);
7006
+ }, [removeFile, id]);
7007
+ var handleRetry = React.useCallback(function () { return uploadFile(id); }, [uploadFile, id]);
7008
+ var file = fileUploads[id];
7009
+ var state = useFileState(file);
7010
+ if (!file)
7011
+ return null;
7012
+ return (React__default["default"].createElement("div", { className: 'str-chat__attachment-preview-file', "data-testid": 'attachment-preview-file' },
7013
+ React__default["default"].createElement("div", { className: 'str-chat__attachment-preview-file-icon' },
7014
+ React__default["default"].createElement(reactFileUtils.FileIcon, { filename: file.file.name, mimeType: file.file.type, version: '2' })),
7015
+ React__default["default"].createElement("button", { className: 'str-chat__attachment-preview-delete', "data-testid": 'file-preview-item-delete-button', disabled: state.uploading, onClick: handleRemove },
7016
+ React__default["default"].createElement(CloseIcon$1, null)),
7017
+ state.failed && (React__default["default"].createElement("button", { className: 'str-chat__attachment-preview-error str-chat__attachment-preview-error-file', "data-testid": 'file-preview-item-retry-button', onClick: handleRetry },
7018
+ React__default["default"].createElement(RetryIcon, null))),
7019
+ React__default["default"].createElement("div", { className: 'str-chat__attachment-preview-file-end' },
7020
+ React__default["default"].createElement("div", { className: 'str-chat__attachment-preview-file-name' }, file.file.name),
7021
+ state.finished && (React__default["default"].createElement("a", { className: 'str-chat__attachment-preview-file-download', download: true, href: file.url, rel: 'noreferrer', target: '_blank' },
7022
+ React__default["default"].createElement(DownloadIcon, null))),
7023
+ state.uploading && React__default["default"].createElement(LoadingIndicatorIcon, { size: 17 }))));
7024
+ };
7025
+
7026
+ var CooldownTimer = function (_a) {
7027
+ var cooldownInterval = _a.cooldownInterval, setCooldownRemaining = _a.setCooldownRemaining;
7028
+ var _b = React.useState(cooldownInterval), seconds = _b[0], setSeconds = _b[1];
7029
+ React.useEffect(function () {
7030
+ var countdownInterval = setInterval(function () {
7031
+ if (seconds > 0) {
7032
+ setSeconds(seconds - 1);
7033
+ }
7034
+ else {
7035
+ setCooldownRemaining(0);
7036
+ }
7037
+ }, 1000);
7038
+ return function () { return clearInterval(countdownInterval); };
7039
+ });
7040
+ return (React__default["default"].createElement("div", { className: 'str-chat__message-input-cooldown', "data-testid": 'cooldown-timer' }, seconds === 0 ? null : seconds));
7041
+ };
7042
+
6835
7043
  var useCommandTrigger = function () {
6836
7044
  var themeVersion = useChatContext('useCommandTrigger').themeVersion;
6837
7045
  var channelConfig = useChannelStateContext('useCommandTrigger').channelConfig;
@@ -7236,78 +7444,6 @@ var EmojiPicker = function (_a) {
7236
7444
  React__default["default"].createElement(EmojiPickerComponent, { color: '#006CFF', data: emojiData, emoji: 'point_up', emojisToShowFilter: filterEmoji, native: true, onSelect: onSelectEmoji, set: 'facebook', showPreview: false, showSkinTones: false, title: t('Pick your emoji'), useButton: true }))));
7237
7445
  };
7238
7446
 
7239
- var EmojiIconLarge = function () {
7240
- var t = useTranslationContext('EmojiIconLarge').t;
7241
- return (React__default["default"].createElement("svg", { height: '28', width: '28', xmlns: 'http://www.w3.org/2000/svg' },
7242
- React__default["default"].createElement("title", null, t('Open emoji picker')),
7243
- React__default["default"].createElement("g", { clipRule: 'evenodd', fillRule: 'evenodd' },
7244
- React__default["default"].createElement("path", { d: 'M14 4.4C8.6 4.4 4.4 8.6 4.4 14c0 5.4 4.2 9.6 9.6 9.6c5.4 0 9.6-4.2 9.6-9.6c0-5.4-4.2-9.6-9.6-9.6zM2 14c0-6.6 5.4-12 12-12s12 5.4 12 12s-5.4 12-12 12s-12-5.4-12-12zM12.8 11c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8s.8-1.8 1.8-1.8s1.8.8 1.8 1.8zM18.8 11c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8s.8-1.8 1.8-1.8s1.8.8 1.8 1.8zM8.6 15.4c.6-.4 1.2-.2 1.6.2c.6.8 1.6 1.8 3 2c1.2.4 2.8.2 4.8-2c.4-.4 1.2-.6 1.6 0c.4.4.6 1.2 0 1.6c-2.2 2.6-4.8 3.4-7 3c-2-.4-3.6-1.8-4.4-3c-.4-.6-.2-1.2.4-1.8z' }))));
7245
- };
7246
- var EmojiIconSmall = function () {
7247
- var t = useTranslationContext('EmojiIconSmall').t;
7248
- return (React__default["default"].createElement("svg", { height: '14', width: '14', xmlns: 'http://www.w3.org/2000/svg' },
7249
- React__default["default"].createElement("title", null, t('Open emoji picker')),
7250
- React__default["default"].createElement("g", { clipRule: 'evenodd', fillRule: 'evenodd' },
7251
- React__default["default"].createElement("path", { d: 'M6.7 1.42C3.73 1.42 1.42 3.73 1.42 6.7c0 2.97 2.31 5.28 5.28 5.28c2.97 0 5.28-2.31 5.28-5.28c0-2.97-2.31-5.28-5.28-5.28zM.1 6.7c0-3.63 2.97-6.6 6.6-6.6s6.6 2.97 6.6 6.6s-2.97 6.6-6.6 6.6s-6.6-2.97-6.6-6.6zM6.04 5.05c0 .55-.44.99-.99.99s-.99-.44-.99-.99s.44-.99.99-.99s.99.44.99.99zM9.34 5.05c0 .55-.44.99-.99.99s-.99-.44-.99-.99s.44-.99.99-.99s.99.44.99.99zM3.73 7.47c.33-.22.66-.11.88.11c.33.44.88.99 1.65 1.1c.66.22 1.54.11 2.64-1.1c.22-.22.66-.33.88 0c.22.22.33.66 0 .88c-1.21 1.43-2.64 1.87-3.85 1.65c-1.1-.22-1.98-.99-2.42-1.65c-.22-.33-.11-.66.22-.99z' }))));
7252
- };
7253
- // ThemingV2 icon
7254
- var EmojiPickerIcon = function () { return (React__default["default"].createElement("svg", { preserveAspectRatio: 'xMinYMin', viewBox: '0 0 28 28', width: '100%', xmlns: 'http://www.w3.org/2000/svg' },
7255
- React__default["default"].createElement("g", { clipRule: 'evenodd', fillRule: 'evenodd' },
7256
- React__default["default"].createElement("path", { d: 'M14 4.4C8.6 4.4 4.4 8.6 4.4 14c0 5.4 4.2 9.6 9.6 9.6c5.4 0 9.6-4.2 9.6-9.6c0-5.4-4.2-9.6-9.6-9.6zM2 14c0-6.6 5.4-12 12-12s12 5.4 12 12s-5.4 12-12 12s-12-5.4-12-12zM12.8 11c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8s.8-1.8 1.8-1.8s1.8.8 1.8 1.8zM18.8 11c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8s.8-1.8 1.8-1.8s1.8.8 1.8 1.8zM8.6 15.4c.6-.4 1.2-.2 1.6.2c.6.8 1.6 1.8 3 2c1.2.4 2.8.2 4.8-2c.4-.4 1.2-.6 1.6 0c.4.4.6 1.2 0 1.6c-2.2 2.6-4.8 3.4-7 3c-2-.4-3.6-1.8-4.4-3c-.4-.6-.2-1.2.4-1.8z' })))); };
7257
- var FileUploadIcon = function () {
7258
- var t = useTranslationContext('FileUploadIcon').t;
7259
- return (React__default["default"].createElement("svg", { height: '14', width: '14', xmlns: 'http://www.w3.org/2000/svg' },
7260
- React__default["default"].createElement("title", null, t('Attach files')),
7261
- React__default["default"].createElement("path", { d: 'M7 .5c3.59 0 6.5 2.91 6.5 6.5s-2.91 6.5-6.5 6.5S.5 10.59.5 7 3.41.5 7 .5zm0 12c3.031 0 5.5-2.469 5.5-5.5S10.031 1.5 7 1.5A5.506 5.506 0 0 0 1.5 7c0 3.034 2.469 5.5 5.5 5.5zM7.506 3v3.494H11v1.05H7.506V11h-1.05V7.544H3v-1.05h3.456V3h1.05z', fillRule: 'nonzero' })));
7262
- };
7263
- var FileUploadIconFlat = function () {
7264
- var t = useTranslationContext('FileUploadIconFlat').t;
7265
- return (React__default["default"].createElement("svg", { height: '14', width: '14', xmlns: 'http://www.w3.org/2000/svg' },
7266
- React__default["default"].createElement("title", null, t('Attach files')),
7267
- React__default["default"].createElement("path", { d: 'M1.667.333h10.666c.737 0 1.334.597 1.334 1.334v10.666c0 .737-.597 1.334-1.334 1.334H1.667a1.333 1.333 0 0 1-1.334-1.334V1.667C.333.93.93.333 1.667.333zm2 1.334a1.667 1.667 0 1 0 0 3.333 1.667 1.667 0 0 0 0-3.333zm-2 9.333v1.333h10.666v-4l-2-2-4 4-2-2L1.667 11z', fillRule: 'nonzero' })));
7268
- };
7269
- var LoadingIndicatorIcon = function (_a) {
7270
- var _b = _a.size, size = _b === void 0 ? 20 : _b;
7271
- var id = React.useMemo(function () { return nanoid.nanoid(); }, []);
7272
- return (React__default["default"].createElement("div", { className: 'str-chat__loading-indicator' },
7273
- React__default["default"].createElement("svg", { "data-testid": 'loading-indicator', height: size, viewBox: '0 0 30 30', width: size, xmlns: 'http://www.w3.org/2000/svg' },
7274
- React__default["default"].createElement("defs", null,
7275
- React__default["default"].createElement("linearGradient", { id: "".concat(id, "-linear-gradient"), x1: '50%', x2: '50%', y1: '0%', y2: '100%' },
7276
- React__default["default"].createElement("stop", { offset: '0%', stopColor: '#FFF', stopOpacity: '0' }),
7277
- React__default["default"].createElement("stop", { "data-testid": 'stop-color', offset: '100%', stopOpacity: '1' }))),
7278
- React__default["default"].createElement("path", { d: 'M2.518 23.321l1.664-1.11A12.988 12.988 0 0 0 15 28c7.18 0 13-5.82 13-13S22.18 2 15 2V0c8.284 0 15 6.716 15 15 0 8.284-6.716 15-15 15-5.206 0-9.792-2.652-12.482-6.679z', fill: "url(#".concat(id, "-linear-gradient)"), fillRule: 'evenodd' }))));
7279
- };
7280
- // ThemingV2 icon
7281
- var UploadIcon = function () { return (React__default["default"].createElement("svg", { "data-testid": 'attach', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
7282
- React__default["default"].createElement("g", { clipPath: 'url(#clip0_10878_5)' },
7283
- React__default["default"].createElement("path", { d: 'M12.9997 6.99993L10.9997 6.99993L10.9997 10.9999L6.99972 10.9999L6.99972 12.9999L10.9997 12.9999L10.9997 16.9999L12.9997 16.9999L12.9997 12.9999L16.9997 12.9999L16.9997 10.9999L12.9997 10.9999L12.9997 6.99993ZM11.9997 1.99992C6.47972 1.99992 1.99972 6.47993 1.99972 11.9999C1.99972 17.5199 6.47972 21.9999 11.9997 21.9999C17.5197 21.9999 21.9997 17.5199 21.9997 11.9999C21.9997 6.47993 17.5197 1.99992 11.9997 1.99992ZM11.9997 19.9999C7.58972 19.9999 3.99972 16.4099 3.99972 11.9999C3.99972 7.58993 7.58972 3.99993 11.9997 3.99993C16.4097 3.99993 19.9997 7.58993 19.9997 11.9999C19.9997 16.4099 16.4097 19.9999 11.9997 19.9999Z', fill: 'black' })),
7284
- React__default["default"].createElement("defs", null,
7285
- React__default["default"].createElement("clipPath", { id: 'clip0_10878_5' },
7286
- React__default["default"].createElement("rect", { fill: 'white', height: '24', width: '24' }))))); };
7287
- var CloseIcon$1 = function () { return (React__default["default"].createElement("svg", { "data-testid": 'close-no-outline', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
7288
- React__default["default"].createElement("path", { d: 'M19 6.41L17.59 5L12 10.59L6.41 5L5 6.41L10.59 12L5 17.59L6.41 19L12 13.41L17.59 19L19 17.59L13.41 12L19 6.41Z', fill: 'black' }))); };
7289
- var RetryIcon = function () { return (React__default["default"].createElement("svg", { "data-testid": 'retry', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
7290
- React__default["default"].createElement("path", { d: 'M17.6449 6.35C16.1949 4.9 14.2049 4 11.9949 4C7.57488 4 4.00488 7.58 4.00488 12C4.00488 16.42 7.57488 20 11.9949 20C15.7249 20 18.8349 17.45 19.7249 14H17.6449C16.8249 16.33 14.6049 18 11.9949 18C8.68488 18 5.99488 15.31 5.99488 12C5.99488 8.69 8.68488 6 11.9949 6C13.6549 6 15.1349 6.69 16.2149 7.78L12.9949 11H19.9949V4L17.6449 6.35Z', fill: 'black' }))); };
7291
- var DownloadIcon = function () { return (React__default["default"].createElement("svg", { "data-testid": 'download', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
7292
- React__default["default"].createElement("path", { d: 'M19.35 10.04C18.67 6.59 15.64 4 12 4C9.11 4 6.6 5.64 5.35 8.04C2.34 8.36 0 10.91 0 14C0 17.31 2.69 20 6 20H19C21.76 20 24 17.76 24 15C24 12.36 21.95 10.22 19.35 10.04ZM19 18H6C3.79 18 2 16.21 2 14C2 11.95 3.53 10.24 5.56 10.03L6.63 9.92L7.13 8.97C8.08 7.14 9.94 6 12 6C14.62 6 16.88 7.86 17.39 10.43L17.69 11.93L19.22 12.04C20.78 12.14 22 13.45 22 15C22 16.65 20.65 18 19 18ZM13.45 10H10.55V13H8L12 17L16 13H13.45V10Z', fill: 'black' }))); };
7293
- var SendIconV1 = function () {
7294
- var t = useTranslationContext('SendButton').t;
7295
- return (React__default["default"].createElement("svg", { height: '17', viewBox: '0 0 18 17', width: '18', xmlns: 'http://www.w3.org/2000/svg' },
7296
- React__default["default"].createElement("title", null, t('Send')),
7297
- React__default["default"].createElement("path", { d: 'M0 17.015l17.333-8.508L0 0v6.617l12.417 1.89L0 10.397z', fill: '#006cff', fillRule: 'evenodd' })));
7298
- };
7299
- var SendIconV2 = function () {
7300
- var t = useTranslationContext('SendButton').t;
7301
- return (React__default["default"].createElement("svg", { "data-testid": 'send', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
7302
- React__default["default"].createElement("title", null, t('Send')),
7303
- React__default["default"].createElement("path", { d: 'M4.00952 22L24 12L4.00952 2L4 9.77778L18.2857 12L4 14.2222L4.00952 22Z', fill: 'black' })));
7304
- };
7305
- var SendButton = function (_a) {
7306
- var sendMessage = _a.sendMessage, rest = __rest(_a, ["sendMessage"]);
7307
- var themeVersion = useChatContext('SendButton').themeVersion;
7308
- return (React__default["default"].createElement("button", __assign({ "aria-label": 'Send', className: 'str-chat__send-button', "data-testid": 'send-button', onClick: sendMessage, type: 'button' }, rest), themeVersion === '2' ? React__default["default"].createElement(SendIconV2, null) : React__default["default"].createElement(SendIconV1, null)));
7309
- };
7310
-
7311
7447
  /**
7312
7448
  * @deprecated This component has been deprecated in favor of `AttachmentPreviewList` as this component
7313
7449
  * utilises outdated components from the package [`react-file-utils`](https://github.com/GetStream/react-file-utils)
@@ -9109,87 +9245,6 @@ var QuotedMessagePreview = function (_a) {
9109
9245
  themeVersion === '1' && React__default["default"].createElement(React__default["default"].Fragment, null, quotedMessageText))))));
9110
9246
  };
9111
9247
 
9112
- var useFileState = function (file) {
9113
- return React.useMemo(function () { return ({
9114
- failed: file.state === 'failed',
9115
- finished: file.state === 'finished',
9116
- uploading: file.state === 'uploading',
9117
- }); }, [file.state]);
9118
- };
9119
-
9120
- var AttachmentPreviewList = function () {
9121
- var _a = useMessageInputContext('AttachmentPreviewList'), fileOrder = _a.fileOrder, imageOrder = _a.imageOrder;
9122
- return (React__default["default"].createElement("div", { className: 'str-chat__attachment-preview-list' },
9123
- React__default["default"].createElement("div", { className: 'str-chat__attachment-list-scroll-container', "data-testid": 'attachment-list-scroll-container' },
9124
- imageOrder.map(function (id) { return (React__default["default"].createElement(ImagePreviewItem, { id: id, key: id })); }),
9125
- fileOrder.map(function (id) { return (React__default["default"].createElement(FilePreviewItem, { id: id, key: id })); }))));
9126
- };
9127
- var ImagePreviewItem = function (_a) {
9128
- var _b;
9129
- var id = _a.id;
9130
- var _c = useMessageInputContext('ImagePreviewItem'), imageUploads = _c.imageUploads, removeImage = _c.removeImage, uploadImage = _c.uploadImage;
9131
- var handleRemove = React.useCallback(function (e) {
9132
- e.stopPropagation();
9133
- removeImage(id);
9134
- }, [removeImage, id]);
9135
- var handleRetry = React.useCallback(function () { return uploadImage(id); }, [uploadImage, id]);
9136
- var image = imageUploads[id];
9137
- var state = useFileState(image);
9138
- // do not display scraped attachments
9139
- if (!image || image.og_scrape_url)
9140
- return null;
9141
- return (React__default["default"].createElement("div", { className: 'str-chat__attachment-preview-image', "data-testid": 'attachment-preview-image' },
9142
- React__default["default"].createElement("button", { className: 'str-chat__attachment-preview-delete', "data-testid": 'image-preview-item-delete-button', disabled: state.uploading, onClick: handleRemove },
9143
- React__default["default"].createElement(CloseIcon$1, null)),
9144
- state.failed && (React__default["default"].createElement("button", { className: 'str-chat__attachment-preview-error str-chat__attachment-preview-error-image', "data-testid": 'image-preview-item-retry-button', onClick: handleRetry },
9145
- React__default["default"].createElement(RetryIcon, null))),
9146
- state.uploading && (React__default["default"].createElement("div", { className: 'str-chat__attachment-preview-image-loading' },
9147
- React__default["default"].createElement(LoadingIndicatorIcon, { size: 17 }))),
9148
- (image.previewUri || image.url) && (React__default["default"].createElement("img", { alt: image.file.name, className: 'str-chat__attachment-preview-thumbnail', src: (_b = image.previewUri) !== null && _b !== void 0 ? _b : image.url }))));
9149
- };
9150
- var FilePreviewItem = function (_a) {
9151
- var id = _a.id;
9152
- var _b = useMessageInputContext('FilePreviewItem'), fileUploads = _b.fileUploads, removeFile = _b.removeFile, uploadFile = _b.uploadFile;
9153
- var handleRemove = React.useCallback(function (e) {
9154
- e.stopPropagation();
9155
- removeFile(id);
9156
- }, [removeFile, id]);
9157
- var handleRetry = React.useCallback(function () { return uploadFile(id); }, [uploadFile, id]);
9158
- var file = fileUploads[id];
9159
- var state = useFileState(file);
9160
- if (!file)
9161
- return null;
9162
- return (React__default["default"].createElement("div", { className: 'str-chat__attachment-preview-file', "data-testid": 'attachment-preview-file' },
9163
- React__default["default"].createElement("div", { className: 'str-chat__attachment-preview-file-icon' },
9164
- React__default["default"].createElement(reactFileUtils.FileIcon, { filename: file.file.name, mimeType: file.file.type, version: '2' })),
9165
- React__default["default"].createElement("button", { className: 'str-chat__attachment-preview-delete', "data-testid": 'file-preview-item-delete-button', disabled: state.uploading, onClick: handleRemove },
9166
- React__default["default"].createElement(CloseIcon$1, null)),
9167
- state.failed && (React__default["default"].createElement("button", { className: 'str-chat__attachment-preview-error str-chat__attachment-preview-error-file', "data-testid": 'file-preview-item-retry-button', onClick: handleRetry },
9168
- React__default["default"].createElement(RetryIcon, null))),
9169
- React__default["default"].createElement("div", { className: 'str-chat__attachment-preview-file-end' },
9170
- React__default["default"].createElement("div", { className: 'str-chat__attachment-preview-file-name' }, file.file.name),
9171
- state.finished && (React__default["default"].createElement("a", { className: 'str-chat__attachment-preview-file-download', download: true, href: file.url, rel: 'noreferrer', target: '_blank' },
9172
- React__default["default"].createElement(DownloadIcon, null))),
9173
- state.uploading && React__default["default"].createElement(LoadingIndicatorIcon, { size: 17 }))));
9174
- };
9175
-
9176
- var CooldownTimer = function (_a) {
9177
- var cooldownInterval = _a.cooldownInterval, setCooldownRemaining = _a.setCooldownRemaining;
9178
- var _b = React.useState(cooldownInterval), seconds = _b[0], setSeconds = _b[1];
9179
- React.useEffect(function () {
9180
- var countdownInterval = setInterval(function () {
9181
- if (seconds > 0) {
9182
- setSeconds(seconds - 1);
9183
- }
9184
- else {
9185
- setCooldownRemaining(0);
9186
- }
9187
- }, 1000);
9188
- return function () { return clearInterval(countdownInterval); };
9189
- });
9190
- return (React__default["default"].createElement("div", { className: 'str-chat__message-input-cooldown', "data-testid": 'cooldown-timer' }, seconds === 0 ? null : seconds));
9191
- };
9192
-
9193
9248
  var MessageInputFlat = function () {
9194
9249
  var quotedMessage = useChannelStateContext('MessageInputFlat').quotedMessage;
9195
9250
  var setQuotedMessage = useChannelActionContext('MessageInputFlat').setQuotedMessage;
@@ -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;
@@ -10916,6 +10974,79 @@ var useChannelContainerClasses = function (_a) {
10916
10974
  };
10917
10975
  };
10918
10976
 
10977
+ var getImageAttachmentConfiguration = function (attachment, element) {
10978
+ var url = new URL((attachment.image_url || attachment.thumb_url || ''));
10979
+ var resizeDimensions = getSizingRestrictions(url, element);
10980
+ if (resizeDimensions) {
10981
+ // Apply 2x for retina displays
10982
+ resizeDimensions.height *= 2;
10983
+ resizeDimensions.width *= 2;
10984
+ addResizingParamsToUrl(resizeDimensions, url);
10985
+ }
10986
+ return {
10987
+ url: url.href,
10988
+ };
10989
+ };
10990
+ var getVideoAttachmentConfiguration = function (attachment, element, shouldGenerateVideoThumbnail) {
10991
+ var thumbUrl = undefined;
10992
+ if (attachment.thumb_url && shouldGenerateVideoThumbnail) {
10993
+ var url = new URL(attachment.thumb_url);
10994
+ var resizeDimensions = getSizingRestrictions(url, element);
10995
+ if (resizeDimensions) {
10996
+ // Apply 2x for retina displays
10997
+ resizeDimensions.height *= 2;
10998
+ resizeDimensions.width *= 2;
10999
+ addResizingParamsToUrl(resizeDimensions, url);
11000
+ }
11001
+ thumbUrl = url.href;
11002
+ }
11003
+ return {
11004
+ thumbUrl: thumbUrl,
11005
+ url: attachment.asset_url || '',
11006
+ };
11007
+ };
11008
+ var getSizingRestrictions = function (url, htmlElement) {
11009
+ var urlParams = url.searchParams;
11010
+ var originalHeight = Number(urlParams.get('oh')) || 1;
11011
+ var originalWidth = Number(urlParams.get('ow')) || 1;
11012
+ var cssSizeRestriction = getCSSSizeRestrictions(htmlElement);
11013
+ var resizeDimensions;
11014
+ if ((cssSizeRestriction.maxHeight || cssSizeRestriction.height) && cssSizeRestriction.maxWidth) {
11015
+ resizeDimensions = getResizeDimensions(originalHeight, originalWidth,
11016
+ /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */
11017
+ cssSizeRestriction.maxHeight || cssSizeRestriction.height, cssSizeRestriction.maxWidth);
11018
+ }
11019
+ else {
11020
+ resizeDimensions = undefined;
11021
+ }
11022
+ return resizeDimensions;
11023
+ };
11024
+ var getResizeDimensions = function (originalHeight, originalWidth, maxHeight, maxWidth) { return ({
11025
+ height: Math.round(Math.max(maxHeight, (maxWidth / originalWidth) * originalHeight)),
11026
+ width: Math.round(Math.max(maxHeight, (maxWidth / originalHeight) * originalWidth)),
11027
+ }); };
11028
+ var getCSSSizeRestrictions = function (htmlElement) {
11029
+ var computedStylesheet = getComputedStyle(htmlElement);
11030
+ var height = getValueRepresentationOfCSSProperty(computedStylesheet.getPropertyValue('height'));
11031
+ var maxHeight = getValueRepresentationOfCSSProperty(computedStylesheet.getPropertyValue('max-height'));
11032
+ var maxWidth = getValueRepresentationOfCSSProperty(computedStylesheet.getPropertyValue('max-width'));
11033
+ if (!((height || maxHeight) && maxWidth)) {
11034
+ 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");
11035
+ }
11036
+ return { height: height, maxHeight: maxHeight, maxWidth: maxWidth };
11037
+ };
11038
+ var getValueRepresentationOfCSSProperty = function (property) {
11039
+ if (!property.endsWith('px')) {
11040
+ return undefined;
11041
+ }
11042
+ var number = parseFloat(property);
11043
+ return isNaN(number) ? undefined : number;
11044
+ };
11045
+ var addResizingParamsToUrl = function (resizeDimensions, url) {
11046
+ url.searchParams.set('h', resizeDimensions.height.toString());
11047
+ url.searchParams.set('w', resizeDimensions.width.toString());
11048
+ };
11049
+
10919
11050
  var UnMemoizedChannel = function (props) {
10920
11051
  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
11052
  var _c = useChatContext('Channel'), contextChannel = _c.channel, channelsQueryState = _c.channelsQueryState, customClasses = _c.customClasses, theme = _c.theme;
@@ -11402,7 +11533,7 @@ var ChannelInner = function (props) {
11402
11533
  var onMentionsHoverOrClick = useMentionsHandlers(onMentionsHover, onMentionsClick);
11403
11534
  var editMessage = useEditMessageHandler(doUpdateMessageRequest);
11404
11535
  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 }));
11536
+ 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
11537
  var channelActionContextValue = React.useMemo(function () { return ({
11407
11538
  addNotification: addNotification,
11408
11539
  closeThread: closeThread,
@@ -12648,7 +12779,7 @@ var UnMemoizedChannelList = function (props) {
12648
12779
  */
12649
12780
  var ChannelList = React__default["default"].memo(UnMemoizedChannelList);
12650
12781
 
12651
- var version = '10.1.1';
12782
+ var version = '10.2.0';
12652
12783
 
12653
12784
  var useChat = function (_a) {
12654
12785
  var _b, _c;
@@ -13224,7 +13355,7 @@ notifications) {
13224
13355
  var t = useTranslationContext('usePinHandler').t;
13225
13356
  var canPin = !!channelCapabilities['pin-message'];
13226
13357
  var handlePin = function (event) { return __awaiter$1(void 0, void 0, void 0, function () {
13227
- var optimisticMessage, messageResponse, errorMessage, optimisticMessage, messageResponse, errorMessage;
13358
+ var optimisticMessage, errorMessage, optimisticMessage, errorMessage;
13228
13359
  return __generator$1(this, function (_a) {
13229
13360
  switch (_a.label) {
13230
13361
  case 0:
@@ -13239,8 +13370,7 @@ notifications) {
13239
13370
  updateMessage(optimisticMessage);
13240
13371
  return [4 /*yield*/, client.pinMessage(message)];
13241
13372
  case 2:
13242
- messageResponse = _a.sent();
13243
- updateMessage(messageResponse.message);
13373
+ _a.sent();
13244
13374
  return [3 /*break*/, 4];
13245
13375
  case 3:
13246
13376
  _a.sent();
@@ -13256,8 +13386,7 @@ notifications) {
13256
13386
  updateMessage(optimisticMessage);
13257
13387
  return [4 /*yield*/, client.unpinMessage(message)];
13258
13388
  case 6:
13259
- messageResponse = _a.sent();
13260
- updateMessage(messageResponse.message);
13389
+ _a.sent();
13261
13390
  return [3 /*break*/, 8];
13262
13391
  case 7:
13263
13392
  _a.sent();
@@ -13703,7 +13832,7 @@ var useLastReadData = function (props) {
13703
13832
  };
13704
13833
 
13705
13834
  var useMessageListElements = function (props) {
13706
- var enrichedMessages = props.enrichedMessages, internalMessageProps = props.internalMessageProps, messageGroupStyles = props.messageGroupStyles, onMessageLoadCaptured = props.onMessageLoadCaptured, read = props.read, returnAllReadData = props.returnAllReadData, threadList = props.threadList;
13835
+ var enrichedMessages = props.enrichedMessages, internalMessageProps = props.internalMessageProps, messageGroupStyles = props.messageGroupStyles, read = props.read, returnAllReadData = props.returnAllReadData, threadList = props.threadList;
13707
13836
  var _a = useChatContext('useMessageListElements'), client = _a.client, customClasses = _a.customClasses;
13708
13837
  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;
13709
13838
  // get the readData, but only for messages submitted by the user themselves
@@ -13735,7 +13864,7 @@ var useMessageListElements = function (props) {
13735
13864
  }
13736
13865
  var groupStyles = messageGroupStyles[message.id] || '';
13737
13866
  var messageClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.message) || "str-chat__li str-chat__li--".concat(groupStyles);
13738
- return (React__default["default"].createElement("li", { className: messageClass, "data-message-id": message.id, "data-testid": messageClass, key: message.id || message.created_at, onLoadCapture: onMessageLoadCaptured },
13867
+ return (React__default["default"].createElement("li", { className: messageClass, "data-message-id": message.id, "data-testid": messageClass, key: message.id || message.created_at },
13739
13868
  React__default["default"].createElement(Message, __assign({ groupStyles: [groupStyles], lastReceivedId: lastReceivedId, message: message, readBy: readData[message.id] || [], threadList: threadList }, internalMessageProps))));
13740
13869
  });
13741
13870
  }, [
@@ -13743,7 +13872,6 @@ var useMessageListElements = function (props) {
13743
13872
  internalMessageProps,
13744
13873
  lastReceivedId,
13745
13874
  messageGroupStyles,
13746
- onMessageLoadCaptured,
13747
13875
  readData,
13748
13876
  threadList,
13749
13877
  ]);
@@ -13862,19 +13990,9 @@ var useScrollLocationLogic = function (params) {
13862
13990
  setIsMessageListScrolledToBottom(true);
13863
13991
  }
13864
13992
  }, [updateScrollTop, closeToTop, closeToBottom, scrolledUpThreshold]);
13865
- var onMessageLoadCaptured = React.useCallback(function () {
13866
- /**
13867
- * A load event (emitted by e.g. an <img>) was captured on a message.
13868
- * In some cases, the loaded asset is larger than the placeholder, which means we have to scroll down.
13869
- */
13870
- if (closeToBottom.current) {
13871
- scrollToBottom();
13872
- }
13873
- }, [closeToTop, closeToBottom, scrollToBottom]);
13874
13993
  return {
13875
13994
  hasNewMessages: hasNewMessages,
13876
13995
  isMessageListScrolledToBottom: isMessageListScrolledToBottom,
13877
- onMessageLoadCaptured: onMessageLoadCaptured,
13878
13996
  onScroll: onScroll,
13879
13997
  scrollToBottom: scrollToBottom,
13880
13998
  wrapperRect: wrapperRect,
@@ -14002,7 +14120,7 @@ var MessageListWithContext = function (props) {
14002
14120
  messages: messages,
14003
14121
  scrolledUpThreshold: props.scrolledUpThreshold,
14004
14122
  suppressAutoscroll: suppressAutoscroll,
14005
- }), hasNewMessages = _x.hasNewMessages, isMessageListScrolledToBottom = _x.isMessageListScrolledToBottom, onMessageLoadCaptured = _x.onMessageLoadCaptured, onScroll = _x.onScroll, scrollToBottom = _x.scrollToBottom, wrapperRect = _x.wrapperRect;
14123
+ }), hasNewMessages = _x.hasNewMessages, isMessageListScrolledToBottom = _x.isMessageListScrolledToBottom, onScroll = _x.onScroll, scrollToBottom = _x.scrollToBottom, wrapperRect = _x.wrapperRect;
14006
14124
  var _y = useEnrichedMessages({
14007
14125
  channel: channel,
14008
14126
  disableDateSeparator: disableDateSeparator,
@@ -14042,7 +14160,6 @@ var MessageListWithContext = function (props) {
14042
14160
  unsafeHTML: unsafeHTML,
14043
14161
  },
14044
14162
  messageGroupStyles: messageGroupStyles,
14045
- onMessageLoadCaptured: onMessageLoadCaptured,
14046
14163
  read: read,
14047
14164
  returnAllReadData: returnAllReadData,
14048
14165
  threadList: threadList,
@@ -14486,7 +14603,6 @@ var VirtualizedMessageListWithContext = function (props) {
14486
14603
  return Item;
14487
14604
  }, [
14488
14605
  customClasses === null || customClasses === void 0 ? void 0 : customClasses.virtualMessage,
14489
- messageGroupStyles,
14490
14606
  numItemsPrepended,
14491
14607
  // processedMessages were incorrectly rebuilt with a new object identity at some point, hence the .length usage
14492
14608
  processedMessages.length,
@@ -14624,9 +14740,13 @@ var ThreadInner = function (props) {
14624
14740
  }, []);
14625
14741
  if (!thread)
14626
14742
  return null;
14627
- var threadClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.thread) || 'str-chat__thread-container str-chat__thread';
14743
+ var threadClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.thread) ||
14744
+ clsx('str-chat__thread-container str-chat__thread', {
14745
+ 'str-chat__thread--full': fullWidth,
14746
+ 'str-chat__thread--virtualized': virtualized,
14747
+ });
14628
14748
  var head = (React__default["default"].createElement(ThreadHead$1, __assign({ key: thread.id, message: thread, Message: MessageUIComponent }, additionalParentMessageProps)));
14629
- return (React__default["default"].createElement("div", { className: "".concat(threadClass, " ").concat(fullWidth ? 'str-chat__thread--full' : '') },
14749
+ return (React__default["default"].createElement("div", { className: threadClass },
14630
14750
  React__default["default"].createElement(ThreadHeader$1, { closeThread: closeThread, thread: thread }),
14631
14751
  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))),
14632
14752
  React__default["default"].createElement(MessageInput, __assign({ focus: autoFocus, Input: ThreadInput, parent: thread, publishTypingEvent: false }, additionalMessageInputProps))));
@@ -14661,6 +14781,7 @@ exports.ActionsIcon = ActionsIcon;
14661
14781
  exports.Attachment = Attachment;
14662
14782
  exports.AttachmentActions = AttachmentActions;
14663
14783
  exports.AttachmentActionsContainer = AttachmentActionsContainer;
14784
+ exports.AttachmentPreviewList = AttachmentPreviewList;
14664
14785
  exports.AttachmentWithinContainer = AttachmentWithinContainer;
14665
14786
  exports.Audio = Audio;
14666
14787
  exports.AudioContainer = AudioContainer;
@@ -14875,6 +14996,7 @@ exports.useChannelDeletedListener = useChannelDeletedListener;
14875
14996
  exports.useChannelEditMessageHandler = useEditMessageHandler;
14876
14997
  exports.useChannelHiddenListener = useChannelHiddenListener;
14877
14998
  exports.useChannelMentionsHandler = useMentionsHandlers;
14999
+ exports.useChannelPreviewInfo = useChannelPreviewInfo;
14878
15000
  exports.useChannelStateContext = useChannelStateContext;
14879
15001
  exports.useChannelTruncatedListener = useChannelTruncatedListener;
14880
15002
  exports.useChannelUpdatedListener = useChannelUpdatedListener;