stream-chat-react 6.12.0 → 7.0.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 (134) hide show
  1. package/README.md +1 -1
  2. package/dist/browser.full-bundle.js +2147 -19244
  3. package/dist/browser.full-bundle.js.map +1 -1
  4. package/dist/browser.full-bundle.min.js +5 -5
  5. package/dist/browser.full-bundle.min.js.map +1 -1
  6. package/dist/components/Attachment/Audio.js +2 -2
  7. package/dist/components/Attachment/Card.d.ts.map +1 -1
  8. package/dist/components/Attachment/Card.js +1 -3
  9. package/dist/components/AutoCompleteTextarea/Item.d.ts.map +1 -1
  10. package/dist/components/AutoCompleteTextarea/Item.js +1 -1
  11. package/dist/components/AutoCompleteTextarea/List.d.ts.map +1 -1
  12. package/dist/components/AutoCompleteTextarea/List.js +0 -1
  13. package/dist/components/AutoCompleteTextarea/Textarea.d.ts +7 -6
  14. package/dist/components/AutoCompleteTextarea/Textarea.d.ts.map +1 -1
  15. package/dist/components/AutoCompleteTextarea/Textarea.js +9 -22
  16. package/dist/components/Channel/Channel.d.ts.map +1 -1
  17. package/dist/components/Channel/Channel.js +10 -2
  18. package/dist/components/ChannelHeader/ChannelHeader.js +1 -1
  19. package/dist/components/ChannelList/ChannelListMessenger.d.ts.map +1 -1
  20. package/dist/components/ChannelList/ChannelListMessenger.js +1 -1
  21. package/dist/components/ChannelList/hooks/useChannelUpdatedListener.d.ts.map +1 -1
  22. package/dist/components/ChannelList/hooks/useChannelUpdatedListener.js +13 -1
  23. package/dist/components/ChannelPreview/ChannelPreviewMessenger.d.ts.map +1 -1
  24. package/dist/components/ChannelPreview/ChannelPreviewMessenger.js +1 -1
  25. package/dist/components/ChannelSearch/SearchResults.d.ts.map +1 -1
  26. package/dist/components/ChannelSearch/SearchResults.js +6 -6
  27. package/dist/components/ChatAutoComplete/ChatAutoComplete.d.ts +3 -1
  28. package/dist/components/ChatAutoComplete/ChatAutoComplete.d.ts.map +1 -1
  29. package/dist/components/ChatAutoComplete/ChatAutoComplete.js +16 -14
  30. package/dist/components/ChatDown/ChatDown.d.ts.map +1 -1
  31. package/dist/components/ChatDown/ChatDown.js +2 -2
  32. package/dist/components/EmptyStateIndicator/EmptyStateIndicator.js +1 -1
  33. package/dist/components/Gallery/Gallery.d.ts.map +1 -1
  34. package/dist/components/Gallery/Gallery.js +5 -3
  35. package/dist/components/Gallery/Image.d.ts.map +1 -1
  36. package/dist/components/Gallery/Image.js +4 -2
  37. package/dist/components/Gallery/ModalWrapper.d.ts +3 -6
  38. package/dist/components/Gallery/ModalWrapper.d.ts.map +1 -1
  39. package/dist/components/Gallery/ModalWrapper.js +4 -7
  40. package/dist/components/Gallery/index.d.ts +0 -1
  41. package/dist/components/Gallery/index.d.ts.map +1 -1
  42. package/dist/components/Gallery/index.js +0 -1
  43. package/dist/components/LoadMore/LoadMoreButton.d.ts.map +1 -1
  44. package/dist/components/LoadMore/LoadMoreButton.js +1 -1
  45. package/dist/components/Message/MessageOptions.d.ts.map +1 -1
  46. package/dist/components/Message/MessageOptions.js +4 -4
  47. package/dist/components/Message/MessageSimple.d.ts.map +1 -1
  48. package/dist/components/Message/MessageSimple.js +2 -0
  49. package/dist/components/Message/hooks/useUserRole.js +1 -1
  50. package/dist/components/MessageActions/MessageActions.d.ts.map +1 -1
  51. package/dist/components/MessageActions/MessageActions.js +2 -1
  52. package/dist/components/MessageActions/MessageActionsBox.d.ts +1 -1
  53. package/dist/components/MessageActions/MessageActionsBox.d.ts.map +1 -1
  54. package/dist/components/MessageActions/MessageActionsBox.js +12 -19
  55. package/dist/components/MessageInput/EditMessageForm.d.ts.map +1 -1
  56. package/dist/components/MessageInput/EditMessageForm.js +2 -2
  57. package/dist/components/MessageInput/MessageInput.d.ts +3 -1
  58. package/dist/components/MessageInput/MessageInput.d.ts.map +1 -1
  59. package/dist/components/MessageInput/MessageInputFlat.d.ts.map +1 -1
  60. package/dist/components/MessageInput/MessageInputFlat.js +4 -4
  61. package/dist/components/MessageInput/MessageInputSmall.d.ts.map +1 -1
  62. package/dist/components/MessageInput/MessageInputSmall.js +7 -5
  63. package/dist/components/MessageInput/QuotedMessagePreview.d.ts.map +1 -1
  64. package/dist/components/MessageInput/QuotedMessagePreview.js +4 -3
  65. package/dist/components/MessageInput/UploadsPreview.d.ts.map +1 -1
  66. package/dist/components/MessageInput/UploadsPreview.js +2 -1
  67. package/dist/components/MessageInput/hooks/useAttachments.d.ts +1 -1
  68. package/dist/components/MessageInput/hooks/useAttachments.d.ts.map +1 -1
  69. package/dist/components/MessageInput/hooks/useAttachments.js +3 -1
  70. package/dist/components/MessageInput/hooks/useEmojiPicker.d.ts +3 -3
  71. package/dist/components/MessageInput/hooks/useEmojiPicker.d.ts.map +1 -1
  72. package/dist/components/MessageInput/hooks/useEmojiPicker.js +14 -4
  73. package/dist/components/MessageInput/hooks/useMessageInputState.js +4 -4
  74. package/dist/components/MessageInput/hooks/utils.js +1 -1
  75. package/dist/components/MessageInput/icons.js +1 -1
  76. package/dist/components/MessageInput/index.d.ts +1 -0
  77. package/dist/components/MessageInput/index.d.ts.map +1 -1
  78. package/dist/components/MessageInput/index.js +1 -0
  79. package/dist/components/MessageList/CustomNotification.d.ts.map +1 -1
  80. package/dist/components/MessageList/CustomNotification.js +1 -1
  81. package/dist/components/MessageList/MessageNotification.d.ts.map +1 -1
  82. package/dist/components/MessageList/MessageNotification.js +1 -1
  83. package/dist/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
  84. package/dist/components/MessageList/VirtualizedMessageList.js +2 -6
  85. package/dist/components/Modal/Modal.d.ts.map +1 -1
  86. package/dist/components/Modal/Modal.js +8 -4
  87. package/dist/components/Reactions/ReactionSelector.d.ts.map +1 -1
  88. package/dist/components/Reactions/ReactionSelector.js +7 -6
  89. package/dist/components/Reactions/ReactionsList.d.ts.map +1 -1
  90. package/dist/components/Reactions/ReactionsList.js +5 -4
  91. package/dist/components/Reactions/SimpleReactionsList.d.ts.map +1 -1
  92. package/dist/components/Reactions/SimpleReactionsList.js +1 -1
  93. package/dist/components/SafeAnchor/SafeAnchor.d.ts.map +1 -1
  94. package/dist/components/SafeAnchor/SafeAnchor.js +1 -1
  95. package/dist/components/Thread/Thread.js +1 -1
  96. package/dist/components/Window/Window.d.ts +1 -1
  97. package/dist/components/Window/Window.d.ts.map +1 -1
  98. package/dist/components/Window/Window.js +1 -4
  99. package/dist/css/index.css +1 -1
  100. package/dist/i18n/Streami18n.js +5 -5
  101. package/dist/index.cjs.js +230 -217
  102. package/dist/index.cjs.js.map +1 -1
  103. package/dist/scss/Card.scss +10 -0
  104. package/dist/scss/ChannelListMessenger.scss +4 -0
  105. package/dist/scss/ChannelSearch.scss +4 -1
  106. package/dist/scss/EditMessageForm.scss +4 -0
  107. package/dist/scss/Gallery.scss +6 -0
  108. package/dist/scss/LoadMoreButton.scss +6 -0
  109. package/dist/scss/Message.scss +24 -0
  110. package/dist/scss/MessageActions.scss +21 -0
  111. package/dist/scss/MessageInput.scss +26 -0
  112. package/dist/scss/MessageInputFlat.scss +23 -1
  113. package/dist/scss/MessageTeam.scss +8 -0
  114. package/dist/scss/Modal.scss +11 -2
  115. package/dist/scss/ReactionList.scss +7 -0
  116. package/dist/scss/ReactionSelector.scss +7 -0
  117. package/dist/scss/SendButton.scss +5 -0
  118. package/dist/scss/SmallMessageInput.scss +12 -0
  119. package/dist/scss/Thread.scss +24 -0
  120. package/dist/scss/_base.scss +4 -2
  121. package/dist/scss/_variables.scss +6 -1
  122. package/dist/scss/index.scss +1 -1
  123. package/dist/scss/vendor/react-file-utils.scss +2 -0
  124. package/dist/scss/vendor/react-image-gallery.scss +224 -0
  125. package/dist/utils.d.ts.map +1 -1
  126. package/dist/utils.js +24 -3
  127. package/dist/version.d.ts +1 -1
  128. package/dist/version.d.ts.map +1 -1
  129. package/dist/version.js +1 -1
  130. package/package.json +13 -11
  131. package/dist/components/Gallery/ModalImage.d.ts +0 -9
  132. package/dist/components/Gallery/ModalImage.d.ts.map +0 -1
  133. package/dist/components/Gallery/ModalImage.js +0 -6
  134. package/dist/scss/ModalImage.scss +0 -11
package/dist/index.cjs.js CHANGED
@@ -10,7 +10,7 @@ var calendar = require('dayjs/plugin/calendar');
10
10
  var localizedFormat = require('dayjs/plugin/localizedFormat');
11
11
  var prettybytes = require('pretty-bytes');
12
12
  var reactFileUtils = require('react-file-utils');
13
- var Carousel = require('react-images');
13
+ var ImageGallery = require('react-image-gallery');
14
14
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
15
15
  var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
16
16
  var emojiRegex = require('emoji-regex');
@@ -84,7 +84,7 @@ var Dayjs__default = /*#__PURE__*/_interopDefaultLegacy(Dayjs);
84
84
  var calendar__default = /*#__PURE__*/_interopDefaultLegacy(calendar);
85
85
  var localizedFormat__default = /*#__PURE__*/_interopDefaultLegacy(localizedFormat);
86
86
  var prettybytes__default = /*#__PURE__*/_interopDefaultLegacy(prettybytes);
87
- var Carousel__default = /*#__PURE__*/_interopDefaultLegacy(Carousel);
87
+ var ImageGallery__default = /*#__PURE__*/_interopDefaultLegacy(ImageGallery);
88
88
  var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
89
89
  var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray);
90
90
  var emojiRegex__default = /*#__PURE__*/_interopDefaultLegacy(emojiRegex);
@@ -251,9 +251,9 @@ var UnMemoizedAudio = function (props) {
251
251
  React__default['default'].createElement("audio", { ref: audioRef },
252
252
  React__default['default'].createElement("source", { "data-testid": 'audio-source', src: asset_url, type: 'audio/mp3' })),
253
253
  React__default['default'].createElement("div", { className: 'str-chat__audio__image' },
254
- React__default['default'].createElement("div", { className: 'str-chat__audio__image--overlay' }, !isPlaying ? (React__default['default'].createElement("div", { className: 'str-chat__audio__image--button', "data-testid": 'play-audio', onClick: function () { return setIsPlaying(true); } },
254
+ React__default['default'].createElement("div", { className: 'str-chat__audio__image--overlay' }, !isPlaying ? (React__default['default'].createElement("button", { className: 'str-chat__audio__image--button', "data-testid": 'play-audio', onClick: function () { return setIsPlaying(true); } },
255
255
  React__default['default'].createElement("svg", { height: '40', viewBox: '0 0 64 64', width: '40', xmlns: 'http://www.w3.org/2000/svg' },
256
- React__default['default'].createElement("path", { d: 'M32 58c14.36 0 26-11.64 26-26S46.36 6 32 6 6 17.64 6 32s11.64 26 26 26zm0 6C14.327 64 0 49.673 0 32 0 14.327 14.327 0 32 0c17.673 0 32 14.327 32 32 0 17.673-14.327 32-32 32zm13.237-28.412L26.135 45.625a3.27 3.27 0 0 1-4.426-1.4 3.319 3.319 0 0 1-.372-1.47L21 23.36c-.032-1.823 1.41-3.327 3.222-3.358a3.263 3.263 0 0 1 1.473.322l19.438 9.36a3.311 3.311 0 0 1 .103 5.905z', fillRule: 'nonzero' })))) : (React__default['default'].createElement("div", { className: 'str-chat__audio__image--button', "data-testid": 'pause-audio', onClick: function () { return setIsPlaying(false); } },
256
+ React__default['default'].createElement("path", { d: 'M32 58c14.36 0 26-11.64 26-26S46.36 6 32 6 6 17.64 6 32s11.64 26 26 26zm0 6C14.327 64 0 49.673 0 32 0 14.327 14.327 0 32 0c17.673 0 32 14.327 32 32 0 17.673-14.327 32-32 32zm13.237-28.412L26.135 45.625a3.27 3.27 0 0 1-4.426-1.4 3.319 3.319 0 0 1-.372-1.47L21 23.36c-.032-1.823 1.41-3.327 3.222-3.358a3.263 3.263 0 0 1 1.473.322l19.438 9.36a3.311 3.311 0 0 1 .103 5.905z', fillRule: 'nonzero' })))) : (React__default['default'].createElement("button", { className: 'str-chat__audio__image--button', "data-testid": 'pause-audio', onClick: function () { return setIsPlaying(false); } },
257
257
  React__default['default'].createElement("svg", { height: '40', viewBox: '0 0 64 64', width: '40', xmlns: 'http://www.w3.org/2000/svg' },
258
258
  React__default['default'].createElement("path", { d: 'M32 58.215c14.478 0 26.215-11.737 26.215-26.215S46.478 5.785 32 5.785 5.785 17.522 5.785 32 17.522 58.215 32 58.215zM32 64C14.327 64 0 49.673 0 32 0 14.327 14.327 0 32 0c17.673 0 32 14.327 32 32 0 17.673-14.327 32-32 32zm-7.412-45.56h2.892a2.17 2.17 0 0 1 2.17 2.17v23.865a2.17 2.17 0 0 1-2.17 2.17h-2.892a2.17 2.17 0 0 1-2.17-2.17V20.61a2.17 2.17 0 0 1 2.17-2.17zm12.293 0h2.893a2.17 2.17 0 0 1 2.17 2.17v23.865a2.17 2.17 0 0 1-2.17 2.17h-2.893a2.17 2.17 0 0 1-2.17-2.17V20.61a2.17 2.17 0 0 1 2.17-2.17z', fillRule: 'nonzero' }))))),
259
259
  image_url && React__default['default'].createElement("img", { alt: "" + description, src: image_url })),
@@ -274,12 +274,10 @@ var UnMemoizedSafeAnchor = function (props) {
274
274
  if (!href)
275
275
  return null;
276
276
  var sanitized = sanitizeUrl.sanitizeUrl(href);
277
- return (React__default['default'].createElement("a", { className: className, download: download, href: sanitized, rel: rel, target: target }, children));
277
+ return (React__default['default'].createElement("a", { "aria-label": 'Attachment', className: className, download: download, href: sanitized, rel: rel, target: target }, children));
278
278
  };
279
279
  var SafeAnchor = React__default['default'].memo(UnMemoizedSafeAnchor);
280
280
 
281
- var img$1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAkCAYAAAB/up84AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABVhJREFUeNrsW6GS20AMdToGBgEGAQYBBgEBBQYFgQcP5hMO9jP6CYWFBwsPBgYUGBQEFAQUGAQYBBgYGHjmutt5O6NupbXXcZJrx5rJXGyv11o96Ukr52avr6/BJG9HZmMBMpvNYnxt1JzNZNoRAYFxM2Z8rT6FuueMcaH6s1KfhBn3U42r1Jg1rrfq+Bt5xgf1Z64+uQFQndNzLc1Ydfwg6F2p6wd1PVXfU+b6Gc9vHGuh8+jrsXVN61Sq64XggNw95tlH9XmP6y3W2OI+qvN3db6mN7/zBFAb8L2aNMJxRsDQC6jIuEyN039LnAvV8QJKRRijZUHmT8iiLpEFDHKJaB1TGN732WuAokEIDQCwhwGjsMEIMNgp6qY9JlsTgyXquCFG1d54IsbOsKAVPLDBcQJjUxB0RJwAltGntNQ46GhzqPnb0y0954RG/1iLQ7SRCkR+guiPtW6GFRg5gAlCrFvbJEZ0ngDAUn0/Y77fDCJFXuiB/AmGDC3PLg0YWLRW5CcJWWPglNxDKS6C59AcZBs/sYxbOQBqHHkuZYCsGCds4SQJDDx3RK3RjUb9EfMUcLQ57BHS64MAIYtYkvEt+d4wCzqr++ipkoTtkihOI2chREfA5KiC0GOAaMig05zoWJPjgMk39jxcPphDR0mSDrtq438g51iq8omQlEnYJfHoiAFxYQGko6bCPSmZ5wS+TRx0Zc5R4CtmHbEVJT+0p1uOYdNE1SMfOKNO0zXWEmItptApsfYa1LV0UZUPIHSCmlRYJhfokNWhX5IcsmIWbEAMCQWerWirhZK57MghNQyzgke3QuQWPUv4EAac9wCuJjmkNmvUNEwiobX+DgdEWoQGgNDPGtTWWhRRWONX5JlnePCZhP1JUCOzPN1O0C2MohP7xuiko8Qy9INUDBg2YPJMlzP8pRv0qYeUdu+Cy+RAKIYmtVqojM5kkS0DwkXlLuY0ICzgAEOlAd8fPe+rYJdppz61TiZ5G4AgcScWz05RcUtAkOwyJMtI4FzNt3suCWKfwLUhdqRC0yA/enB1CZ4vBZ2fhIptJ4x/5PYVavyzQ39N0V8ddnsQ+m3sfX02hjo3bIVJ7d5PhqojZxYdC3NEdv9oQMQWFFjHHqpLEsc9BZyF23c9cG0ZOJjUIN15V1mY8OOAhW0E77yWaP2eoO9VBFG/d6yX6/xuHT2z3AsQ5ImnjrZBF6XcUiKAEl0RlJzZ7ZtnbxmqSgRqfxmyD9k6wNDGzuExecB3Z1/ukBOjQH73MZbspChFp9nQ/EYY9+LaaIYOqlo7JjwISX+LcBwbjAOz2ZKS7BpOcq0o0R2HvZAbHpHPJGc+dm00paQuedmOA4O0WD5fyQ4V08Ip4ATxhYl8CCh76/0QLVyehlBVFyCpYJTcKmPjHoY8XNE2VQ8dbIkdr4Z95npBwcNVahKzNEMBSYSyz46iLm8sLunreG5O+xYTsaMUHYu6bMn79sRCT2+8l6SMV2cCT5e3UspBXbbd9n3nDIN/Q1KP3JDfWLcd8kZwCVX12hjeOlmOIMe+L6FGjJLC4QS5rz6hg/tThjZiU0Pr/g7D65/uCUafKgaUJu0lHjvox/XsjXA+GAOQUogIXV8/v7GoKOGJfYuHxvHjt7t3rEMHD2+E5PoR+5GCLCS+8g6Z2xgGt6anuwGC99MSKAl6RrfUs/ofje+b1PcjlJBlMMk4gKBUe77AqKVP/T1Jj30IQPmCTdkm6NeKb5BkJzCGdCA8XuFGZIOWCBEh/mwGiZ/rFZXk3xHEdkjHb6MknVOhypJe+Sac03XlL4fe3r81mH518q9GyCS3kV8CDADlsrVaJhTLAgAAAABJRU5ErkJggg==";
282
-
283
281
  var getDisplayName = function (Component) {
284
282
  return Component.displayName || Component.name || 'Component';
285
283
  };
@@ -351,8 +349,7 @@ var UnMemoizedCard = function (props) {
351
349
  React__default['default'].createElement("div", { className: 'str-chat__message-attachment-card--flex' },
352
350
  title && React__default['default'].createElement("div", { className: 'str-chat__message-attachment-card--title' }, title),
353
351
  text && React__default['default'].createElement("div", { className: 'str-chat__message-attachment-card--text' }, text),
354
- (title_link || og_scrape_url) && (React__default['default'].createElement(SafeAnchor, { className: 'str-chat__message-attachment-card--url', href: title_link || og_scrape_url, rel: 'noopener noreferrer', target: '_blank' }, trimUrl(title_link || og_scrape_url)))),
355
- type === 'giphy' && (React__default['default'].createElement("img", { alt: 'giphy logo', className: 'str-chat__message-attachment-card__giphy-logo', "data-testid": 'card-giphy', src: img$1 })))));
352
+ (title_link || og_scrape_url) && (React__default['default'].createElement(SafeAnchor, { className: 'str-chat__message-attachment-card--url', href: title_link || og_scrape_url, rel: 'noopener noreferrer', target: '_blank' }, trimUrl(title_link || og_scrape_url)))))));
356
353
  };
357
354
  /**
358
355
  * Simple Card Layout for displaying links
@@ -369,19 +366,46 @@ var UnMemoizedFileAttachment = function (props) {
369
366
  };
370
367
  var FileAttachment = React__default['default'].memo(UnMemoizedFileAttachment);
371
368
 
372
- var ModalImage = function (props) {
373
- var data = props.data;
374
- return (React__default['default'].createElement("div", { className: 'str-chat__modal-image__wrapper', "data-testid": 'modal-image' },
375
- React__default['default'].createElement("img", { className: 'str-chat__modal-image__image', src: data.source })));
369
+ var Modal = function (props) {
370
+ var children = props.children, onClose = props.onClose, open = props.open;
371
+ var t = useTranslationContext('Modal').t;
372
+ var innerRef = React.useRef(null);
373
+ var closeRef = React.useRef(null);
374
+ var handleClick = function (event) {
375
+ var _a, _b;
376
+ if ((event.target instanceof HTMLDivElement &&
377
+ !((_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target)) &&
378
+ onClose) ||
379
+ (event.target instanceof HTMLButtonElement &&
380
+ ((_b = closeRef.current) === null || _b === void 0 ? void 0 : _b.contains(event.target)) &&
381
+ onClose)) {
382
+ onClose();
383
+ }
384
+ };
385
+ React.useEffect(function () {
386
+ if (!open)
387
+ return function () { return null; };
388
+ var handleEscKey = function (event) {
389
+ if (event instanceof KeyboardEvent && event.key === 'Escape' && onClose) {
390
+ onClose();
391
+ }
392
+ };
393
+ document.addEventListener('keypress', handleEscKey);
394
+ return function () { return document.removeEventListener('keypress', handleEscKey); };
395
+ }, [onClose, open]);
396
+ var openClasses = open ? 'str-chat__modal--open' : 'str-chat__modal--closed';
397
+ return (React__default['default'].createElement("div", { className: "str-chat__modal " + openClasses, onClick: handleClick },
398
+ React__default['default'].createElement("button", { className: 'str-chat__modal__close-button', ref: closeRef, title: 'Close' },
399
+ t('Close'),
400
+ React__default['default'].createElement("svg", { height: '10', width: '10', xmlns: 'http://www.w3.org/2000/svg' },
401
+ React__default['default'].createElement("path", { d: 'M9.916 1.027L8.973.084 5 4.058 1.027.084l-.943.943L4.058 5 .084 8.973l.943.943L5 5.942l3.973 3.974.943-.943L5.942 5z', fillRule: 'evenodd' }))),
402
+ React__default['default'].createElement("div", { className: 'str-chat__modal__inner', ref: innerRef }, children)));
376
403
  };
377
404
 
378
405
  var ModalComponent = function (props) {
379
406
  var images = props.images, index = props.index, modalIsOpen = props.modalIsOpen, toggleModal = props.toggleModal;
380
- return (React__default['default'].createElement(Carousel.ModalGateway, null, modalIsOpen ? (React__default['default'].createElement(Carousel.Modal, { onClose: toggleModal },
381
- React__default['default'].createElement(Carousel__default['default'], { components: {
382
- // @ts-expect-error
383
- View: ModalImage,
384
- }, currentIndex: index, views: images }))) : null));
407
+ return (React__default['default'].createElement(Modal, { onClose: toggleModal, open: modalIsOpen },
408
+ React__default['default'].createElement(ImageGallery__default['default'], { items: images, showIndex: true, showPlayButton: false, showThumbnails: false, startIndex: index })));
385
409
  };
386
410
 
387
411
  var UnMemoizedGallery = function (props) {
@@ -400,14 +424,16 @@ var UnMemoizedGallery = function (props) {
400
424
  };
401
425
  var formattedArray = React.useMemo(function () {
402
426
  return images.map(function (image) { return ({
427
+ original: image.image_url || image.thumb_url || '',
428
+ originalAlt: 'User uploaded content',
403
429
  source: image.image_url || image.thumb_url || '',
404
430
  }); });
405
431
  }, [images]);
406
- var renderImages = images.slice(0, 3).map(function (image, i) { return (React__default['default'].createElement("div", { className: 'str-chat__gallery-image', "data-testid": 'gallery-image', key: "gallery-image-" + i, onClick: function () { return toggleModal(i); } },
407
- React__default['default'].createElement("img", { src: image.image_url || image.thumb_url }))); });
432
+ var renderImages = images.slice(0, 3).map(function (image, i) { return (React__default['default'].createElement("button", { className: 'str-chat__gallery-image', "data-testid": 'gallery-image', key: "gallery-image-" + i, onClick: function () { return toggleModal(i); } },
433
+ React__default['default'].createElement("img", { alt: 'User uploaded content', src: image.image_url || image.thumb_url }))); });
408
434
  return (React__default['default'].createElement("div", { className: "str-chat__gallery " + (images.length > 3 ? 'str-chat__gallery--square' : '') },
409
435
  renderImages,
410
- images.length > 3 && (React__default['default'].createElement("div", { className: 'str-chat__gallery-placeholder', onClick: function () { return toggleModal(3); }, style: {
436
+ images.length > 3 && (React__default['default'].createElement("button", { className: 'str-chat__gallery-placeholder', onClick: function () { return toggleModal(3); }, style: {
411
437
  backgroundImage: "url(" + images[3].image_url + ")",
412
438
  } },
413
439
  React__default['default'].createElement("p", null, t('{{ imageCount }} more', {
@@ -427,10 +453,12 @@ var ImageComponent = function (props) {
427
453
  var _a = React.useState(false), modalIsOpen = _a[0], setModalIsOpen = _a[1];
428
454
  var fallback = props.fallback, image_url = props.image_url, thumb_url = props.thumb_url;
429
455
  var imageSrc = sanitizeUrl.sanitizeUrl(image_url || thumb_url);
430
- var formattedArray = [{ source: imageSrc }];
456
+ var formattedArray = [
457
+ { original: imageSrc, originalAlt: 'User uploaded content', source: imageSrc },
458
+ ];
431
459
  var toggleModal = function () { return setModalIsOpen(!modalIsOpen); };
432
460
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
433
- React__default['default'].createElement("img", { alt: fallback, className: 'str-chat__message-attachment--img', "data-testid": 'image-test', onClick: toggleModal, src: imageSrc }),
461
+ React__default['default'].createElement("img", { alt: fallback, className: 'str-chat__message-attachment--img', "data-testid": 'image-test', onClick: toggleModal, onKeyPress: toggleModal, src: imageSrc, tabIndex: 0 }),
434
462
  React__default['default'].createElement(ModalComponent, { images: formattedArray, index: 0, modalIsOpen: modalIsOpen, toggleModal: toggleModal })));
435
463
  };
436
464
 
@@ -603,14 +631,12 @@ var Item = /*#__PURE__*/React__default['default'].forwardRef(function Item(props
603
631
  return /*#__PURE__*/React__default['default'].createElement("li", {
604
632
  className: "rta__item ".concat(className || ''),
605
633
  style: style
606
- }, /*#__PURE__*/React__default['default'].createElement("div", {
634
+ }, /*#__PURE__*/React__default['default'].createElement("button", {
607
635
  className: "rta__entity ".concat(selected ? 'rta__entity--selected' : ''),
608
636
  onClick: onClickHandler,
609
637
  onFocus: selectItem,
610
638
  onMouseEnter: selectItem,
611
- ref: innerRef,
612
- role: "button",
613
- tabIndex: 0
639
+ ref: innerRef
614
640
  }, /*#__PURE__*/React__default['default'].createElement(Component, {
615
641
  entity: item,
616
642
  selected: selected
@@ -687,6 +713,23 @@ var messageCodeBlocks = function (message) {
687
713
  var matches = message.match(codeRegex);
688
714
  return matches || [];
689
715
  };
716
+ var detectHttp = /(http(s?):\/\/)?(www\.)?/;
717
+ function formatUrlForDisplay(url) {
718
+ try {
719
+ return decodeURIComponent(url).replace(detectHttp, '');
720
+ }
721
+ catch (e) {
722
+ return url;
723
+ }
724
+ }
725
+ function encodeDecode(url) {
726
+ try {
727
+ return encodeURI(decodeURIComponent(url));
728
+ }
729
+ catch (error) {
730
+ return url;
731
+ }
732
+ }
690
733
  var markDownRenderers = {
691
734
  // eslint-disable-next-line react/display-name
692
735
  link: function (props) {
@@ -751,7 +794,6 @@ var renderText = function (text, mentioned_users, options) {
751
794
  var newText = text;
752
795
  var markdownLinks = matchMarkdownLinks(newText);
753
796
  var codeBlocks = messageCodeBlocks(newText);
754
- var detectHttp = /(http(s?):\/\/)?(www\.)?/;
755
797
  // extract all valid links/emails within text and replace it with proper markup
756
798
  uniqBy__default['default'](linkify__namespace.find(newText), 'value').forEach(function (_a) {
757
799
  var href = _a.href, type = _a.type, value = _a.value;
@@ -767,8 +809,12 @@ var renderText = function (text, mentioned_users, options) {
767
809
  });
768
810
  if (noParsingNeeded.length > 0 || linkIsInBlock)
769
811
  return;
770
- var displayLink = type === 'email' ? value : value.replace(detectHttp, '');
771
- newText = newText.replace(new RegExp(escapeRegExp(value), 'g'), "[" + displayLink + "](" + encodeURI(decodeURI(href)) + ")");
812
+ try {
813
+ var displayLink = type === 'email' ? value : formatUrlForDisplay(href);
814
+ newText = newText.replace(new RegExp(escapeRegExp(value), 'g'), "[" + displayLink + "](" + encodeDecode(href) + ")");
815
+ }
816
+ catch (e) {
817
+ }
772
818
  });
773
819
  var plugins = [emojiMarkdownPlugin];
774
820
  if (mentioned_users === null || mentioned_users === void 0 ? void 0 : mentioned_users.length) {
@@ -1028,7 +1074,6 @@ var List = function List(props) {
1028
1074
 
1029
1075
  if ((event.which === KEY_CODES.ENTER || event.which === KEY_CODES.TAB) && selectedItem !== undefined) {
1030
1076
  handleClick(event);
1031
- return setSelectedItem(undefined);
1032
1077
  }
1033
1078
 
1034
1079
  return null;
@@ -1537,13 +1582,6 @@ var ReactTextareaAutocomplete = /*#__PURE__*/function (_React$Component) {
1537
1582
  return data;
1538
1583
  });
1539
1584
 
1540
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "_createRegExp", function () {
1541
- var trigger = _this.props.trigger; // negative lookahead to match only the trigger + the actual token = "bladhwd:adawd:word test" => ":word"
1542
- // https://stackoverflow.com/a/8057827/2719917
1543
-
1544
- _this.tokenRegExp = new RegExp("([".concat(Object.keys(trigger).join(''), "])(?:(?!\\1)[^\\s])*$"));
1545
- });
1546
-
1547
1585
  _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "_closeAutocomplete", function () {
1548
1586
  _this.setState({
1549
1587
  currentTrigger: null,
@@ -1762,8 +1800,6 @@ var ReactTextareaAutocomplete = /*#__PURE__*/function (_React$Component) {
1762
1800
  _value = _this$props6.value; // TODO: it would be better to have the parent control state...
1763
1801
  // if (value) this.state.value = value;
1764
1802
 
1765
- _this._createRegExp();
1766
-
1767
1803
  if (!loadingComponent) {
1768
1804
  throw new Error('RTA: loadingComponent is not defined');
1769
1805
  }
@@ -1818,40 +1854,12 @@ var ReactTextareaAutocomplete = /*#__PURE__*/function (_React$Component) {
1818
1854
  });
1819
1855
  Listeners.startListen();
1820
1856
  }
1821
- }, {
1822
- key: "UNSAFE_componentWillReceiveProps",
1823
- value: function UNSAFE_componentWillReceiveProps(nextProps) {
1824
- this._update(nextProps);
1825
- }
1826
1857
  }, {
1827
1858
  key: "componentWillUnmount",
1828
1859
  value: function componentWillUnmount() {
1829
1860
  Listeners.stopListen();
1830
1861
  Listeners.remove(this.state.listenerIndex);
1831
1862
  }
1832
- }, {
1833
- key: "_update",
1834
- value: // TODO: This is an anti pattern in react, should come up with a better way
1835
- function _update(_ref) {
1836
- var trigger = _ref.trigger,
1837
- value = _ref.value;
1838
- var oldValue = this.state.value;
1839
- var oldTrigger = this.props.trigger;
1840
- if (value !== oldValue || !oldValue) this.setState({
1841
- value: value
1842
- });
1843
- /**
1844
- * check if trigger chars are changed, if so, change the regexp accordingly
1845
- */
1846
-
1847
- if (Object.keys(trigger).join('') !== Object.keys(oldTrigger).join('')) {
1848
- this._createRegExp();
1849
- }
1850
- }
1851
- /**
1852
- * Close autocomplete, also clean up trigger (to avoid slow promises)
1853
- */
1854
-
1855
1863
  }, {
1856
1864
  key: "renderSuggestionListContainer",
1857
1865
  value: function renderSuggestionListContainer() {
@@ -1872,8 +1880,8 @@ var ReactTextareaAutocomplete = /*#__PURE__*/function (_React$Component) {
1872
1880
  if (triggerProps.values && triggerProps.currentTrigger && !(disableMentions && triggerProps.currentTrigger === '@')) {
1873
1881
  return /*#__PURE__*/React__default['default'].createElement("div", {
1874
1882
  className: "rta__autocomplete ".concat(dropdownClassName || ''),
1875
- ref: function ref(_ref2) {
1876
- _this3.dropdownRef = _ref2;
1883
+ ref: function ref(_ref) {
1884
+ _this3.dropdownRef = _ref;
1877
1885
  },
1878
1886
  style: dropdownStyle
1879
1887
  }, /*#__PURE__*/React__default['default'].createElement(SuggestionList, _extends__default['default']({
@@ -1915,14 +1923,34 @@ var ReactTextareaAutocomplete = /*#__PURE__*/function (_React$Component) {
1915
1923
  onFocus: this.props.onFocus,
1916
1924
  onScroll: this._onScrollHandler,
1917
1925
  onSelect: this._selectHandler,
1918
- ref: function ref(_ref3) {
1919
- if (_this4.props.innerRef) _this4.props.innerRef(_ref3);
1920
- _this4.textareaRef = _ref3;
1926
+ ref: function ref(_ref2) {
1927
+ if (_this4.props.innerRef) _this4.props.innerRef(_ref2);
1928
+ _this4.textareaRef = _ref2;
1921
1929
  },
1922
1930
  style: style,
1923
1931
  value: value
1924
1932
  }, this.props.additionalTextareaProps)));
1925
1933
  }
1934
+ }], [{
1935
+ key: "getDerivedStateFromProps",
1936
+ value:
1937
+ /**
1938
+ * setup to emulate the UNSAFE_componentWillReceiveProps
1939
+ */
1940
+ function getDerivedStateFromProps(props, state) {
1941
+ if (props.value !== state.propsValue || !state.value) {
1942
+ return {
1943
+ propsValue: props.value,
1944
+ value: props.value
1945
+ };
1946
+ } else {
1947
+ return null;
1948
+ }
1949
+ }
1950
+ /**
1951
+ * Close autocomplete, also clean up trigger (to avoid slow promises)
1952
+ */
1953
+
1926
1954
  }]);
1927
1955
 
1928
1956
  return ReactTextareaAutocomplete;
@@ -2325,7 +2353,7 @@ var useUserRole = function (message, onlySenderCanEdit, disableQuotedMessages) {
2325
2353
  (isMyMessage && channelCapabilities['delete-own-message']);
2326
2354
  var canFlag = !isMyMessage;
2327
2355
  var canMute = !isMyMessage && (channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.mutes);
2328
- var canQuote = !disableQuotedMessages;
2356
+ var canQuote = !disableQuotedMessages && channelCapabilities['quote-message'];
2329
2357
  var canReact = (channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.reactions) !== false && channelCapabilities['send-reaction'];
2330
2358
  var canReply = (channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.replies) !== false && channelCapabilities['send-reply'];
2331
2359
  return {
@@ -2721,8 +2749,7 @@ var CustomMessageActionsList = function (props) {
2721
2749
  var customActionsArray = Object.keys(customMessageActions);
2722
2750
  return (React__default['default'].createElement(React__default['default'].Fragment, null, customActionsArray.map(function (customAction) {
2723
2751
  var customHandler = customMessageActions[customAction];
2724
- return (React__default['default'].createElement("button", { key: customAction, onClick: function (event) { return customHandler(message, event); } },
2725
- React__default['default'].createElement("li", { className: 'str-chat__message-actions-list-item' }, customAction)));
2752
+ return (React__default['default'].createElement("button", { "aria-selected": 'false', className: 'str-chat__message-actions-list-item', key: customAction, onClick: function (event) { return customHandler(message, event); }, role: 'option' }, customAction));
2726
2753
  })));
2727
2754
  };
2728
2755
  var UnMemoizedMessageActionsBox = function (props) {
@@ -2749,32 +2776,26 @@ var UnMemoizedMessageActionsBox = function (props) {
2749
2776
  }, [messageListRect, mine, open]);
2750
2777
  var handleQuote = function () {
2751
2778
  setQuotedMessage(message);
2752
- var elements = document.getElementsByClassName('str-chat__textarea__textarea');
2779
+ var elements = message.parent_id
2780
+ ? document.querySelectorAll('.str-chat__thread .str-chat__textarea__textarea')
2781
+ : document.getElementsByClassName('str-chat__textarea__textarea');
2753
2782
  var textarea = elements.item(0);
2754
2783
  if (textarea instanceof HTMLTextAreaElement) {
2755
2784
  textarea.focus();
2756
2785
  }
2757
2786
  };
2758
2787
  return (React__default['default'].createElement("div", { className: "str-chat__message-actions-box\n " + (open ? 'str-chat__message-actions-box--open' : '') + "\n " + (mine ? 'str-chat__message-actions-box--mine' : '') + "\n " + (reverse ? 'str-chat__message-actions-box--reverse' : '') + "\n ", "data-testid": 'message-actions-box', ref: checkIfReverse },
2759
- React__default['default'].createElement("ul", { className: 'str-chat__message-actions-list' },
2788
+ React__default['default'].createElement("div", { "aria-label": 'Message Options', className: 'str-chat__message-actions-list', role: 'listbox' },
2760
2789
  customMessageActions && (React__default['default'].createElement(CustomMessageActionsList, { customMessageActions: customMessageActions, message: message })),
2761
- messageActions.indexOf(MESSAGE_ACTIONS.quote) > -1 &&
2762
- !message.parent_id &&
2763
- !message.quoted_message && (React__default['default'].createElement("button", { onClick: handleQuote },
2764
- React__default['default'].createElement("li", { className: 'str-chat__message-actions-list-item' }, t('Reply')))),
2765
- messageActions.indexOf(MESSAGE_ACTIONS.pin) > -1 && !message.parent_id && (React__default['default'].createElement("button", { onClick: handlePin },
2766
- React__default['default'].createElement("li", { className: 'str-chat__message-actions-list-item' }, !message.pinned ? t('Pin') : t('Unpin')))),
2767
- messageActions.indexOf(MESSAGE_ACTIONS.flag) > -1 && (React__default['default'].createElement("button", { onClick: handleFlag },
2768
- React__default['default'].createElement("li", { className: 'str-chat__message-actions-list-item' }, t('Flag')))),
2769
- messageActions.indexOf(MESSAGE_ACTIONS.mute) > -1 && (React__default['default'].createElement("button", { onClick: handleMute },
2770
- React__default['default'].createElement("li", { className: 'str-chat__message-actions-list-item' }, isUserMuted() ? t('Unmute') : t('Mute')))),
2771
- messageActions.indexOf(MESSAGE_ACTIONS.edit) > -1 && (React__default['default'].createElement("button", { onClick: handleEdit },
2772
- React__default['default'].createElement("li", { className: 'str-chat__message-actions-list-item' }, t('Edit Message')))),
2773
- messageActions.indexOf(MESSAGE_ACTIONS.delete) > -1 && (React__default['default'].createElement("button", { onClick: handleDelete },
2774
- React__default['default'].createElement("li", { className: 'str-chat__message-actions-list-item' }, t('Delete')))))));
2790
+ messageActions.indexOf(MESSAGE_ACTIONS.quote) > -1 && !message.quoted_message && (React__default['default'].createElement("button", { "aria-selected": 'false', className: 'str-chat__message-actions-list-item', onClick: handleQuote, role: 'option' }, t('Reply'))),
2791
+ messageActions.indexOf(MESSAGE_ACTIONS.pin) > -1 && !message.parent_id && (React__default['default'].createElement("button", { "aria-selected": 'false', className: 'str-chat__message-actions-list-item', onClick: handlePin, role: 'option' }, !message.pinned ? t('Pin') : t('Unpin'))),
2792
+ messageActions.indexOf(MESSAGE_ACTIONS.flag) > -1 && (React__default['default'].createElement("button", { "aria-selected": 'false', className: 'str-chat__message-actions-list-item', onClick: handleFlag, role: 'option' }, t('Flag'))),
2793
+ messageActions.indexOf(MESSAGE_ACTIONS.mute) > -1 && (React__default['default'].createElement("button", { "aria-selected": 'false', className: 'str-chat__message-actions-list-item', onClick: handleMute, role: 'option' }, isUserMuted() ? t('Unmute') : t('Mute'))),
2794
+ messageActions.indexOf(MESSAGE_ACTIONS.edit) > -1 && (React__default['default'].createElement("button", { "aria-selected": 'false', className: 'str-chat__message-actions-list-item', onClick: handleEdit, role: 'option' }, t('Edit Message'))),
2795
+ messageActions.indexOf(MESSAGE_ACTIONS.delete) > -1 && (React__default['default'].createElement("button", { "aria-selected": 'false', className: 'str-chat__message-actions-list-item', onClick: handleDelete, role: 'option' }, t('Delete'))))));
2775
2796
  };
2776
2797
  /**
2777
- * A popup box that displays the available actions on a message, such edit, delete, pin, etc.
2798
+ * A popup box that displays the available actions on a message, such as edit, delete, pin, etc.
2778
2799
  */
2779
2800
  var MessageActionsBox = React__default['default'].memo(UnMemoizedMessageActionsBox);
2780
2801
 
@@ -2816,7 +2837,8 @@ var MessageActions = function (props) {
2816
2837
  return null;
2817
2838
  return (React__default['default'].createElement(MessageActionsWrapper, { customWrapperClass: customWrapperClass, inline: inline, setActionsBoxOpen: setActionsBoxOpen },
2818
2839
  React__default['default'].createElement(MessageActionsBox, { getMessageActions: getMessageActions, handleDelete: handleDelete, handleEdit: setEditingState, handleFlag: handleFlag, handleMute: handleMute, handlePin: handlePin, isUserMuted: isMuted, mine: mine ? mine() : isMyMessage(), open: actionsBoxOpen }),
2819
- React__default['default'].createElement(ActionsIcon$1, null)));
2840
+ React__default['default'].createElement("button", { "aria-expanded": actionsBoxOpen, "aria-haspopup": 'true', "aria-label": 'Open Message Actions Menu' },
2841
+ React__default['default'].createElement(ActionsIcon$1, null))));
2820
2842
  };
2821
2843
  var MessageActionsWrapper = function (props) {
2822
2844
  var children = props.children, customWrapperClass = props.customWrapperClass, inline = props.inline, setActionsBoxOpen = props.setActionsBoxOpen;
@@ -2856,15 +2878,15 @@ var UnMemoizedMessageOptions = function (props) {
2856
2878
  if (isMyMessage() && displayLeft) {
2857
2879
  return (React__default['default'].createElement("div", { className: "str-chat__message-" + theme + "__actions", "data-testid": 'message-options-left' },
2858
2880
  showActionsBox && (React__default['default'].createElement(MessageActions, { ActionsIcon: ActionsIcon$1, messageWrapperRef: messageWrapperRef })),
2859
- shouldShowReplies && (React__default['default'].createElement("div", { className: "str-chat__message-" + theme + "__actions__action str-chat__message-" + theme + "__actions__action--thread", "data-testid": 'thread-action', onClick: handleOpenThread },
2881
+ shouldShowReplies && (React__default['default'].createElement("button", { "aria-label": 'Open Thread', className: "str-chat__message-" + theme + "__actions__action str-chat__message-" + theme + "__actions__action--thread", "data-testid": 'thread-action', onClick: handleOpenThread },
2860
2882
  React__default['default'].createElement(ThreadIcon$1, null))),
2861
- shouldShowReactions && (React__default['default'].createElement("div", { className: "str-chat__message-" + theme + "__actions__action str-chat__message-" + theme + "__actions__action--reactions", "data-testid": 'message-reaction-action', onClick: onReactionListClick },
2883
+ shouldShowReactions && (React__default['default'].createElement("button", { "aria-label": 'Open Reaction Selector', className: "str-chat__message-" + theme + "__actions__action str-chat__message-" + theme + "__actions__action--reactions", "data-testid": 'message-reaction-action', onClick: onReactionListClick },
2862
2884
  React__default['default'].createElement(ReactionIcon$1, null)))));
2863
2885
  }
2864
2886
  return (React__default['default'].createElement("div", { className: "str-chat__message-" + theme + "__actions", "data-testid": 'message-options' },
2865
- shouldShowReactions && (React__default['default'].createElement("div", { className: "str-chat__message-" + theme + "__actions__action str-chat__message-" + theme + "__actions__action--reactions", "data-testid": 'message-reaction-action', onClick: onReactionListClick },
2887
+ shouldShowReactions && (React__default['default'].createElement("button", { "aria-label": 'Open Reaction Selector', className: "str-chat__message-" + theme + "__actions__action str-chat__message-" + theme + "__actions__action--reactions", "data-testid": 'message-reaction-action', onClick: onReactionListClick },
2866
2888
  React__default['default'].createElement(ReactionIcon$1, null))),
2867
- shouldShowReplies && (React__default['default'].createElement("div", { className: "str-chat__message-" + theme + "__actions__action str-chat__message-" + theme + "__actions__action--thread", "data-testid": 'thread-action', onClick: handleOpenThread },
2889
+ shouldShowReplies && (React__default['default'].createElement("button", { "aria-label": 'Open Thread', className: "str-chat__message-" + theme + "__actions__action str-chat__message-" + theme + "__actions__action--thread", "data-testid": 'thread-action', onClick: handleOpenThread },
2868
2890
  React__default['default'].createElement(ThreadIcon$1, null))),
2869
2891
  showActionsBox && (React__default['default'].createElement(MessageActions, { ActionsIcon: ActionsIcon$1, messageWrapperRef: messageWrapperRef }))));
2870
2892
  };
@@ -3743,7 +3765,7 @@ var searchLocalUsers = function (params) {
3743
3765
  var transliterate;
3744
3766
  return __generator(this, function (_a) {
3745
3767
  switch (_a.label) {
3746
- case 0: return [4 /*yield*/, Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@sindresorhus/transliterate')); })];
3768
+ case 0: return [4 /*yield*/, Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@stream-io/transliterate')); })];
3747
3769
  case 1:
3748
3770
  transliterate = (_a.sent()).default;
3749
3771
  updatedName = transliterate(user.name || '').toLowerCase();
@@ -4106,7 +4128,7 @@ var FileUploadIconFlat = function () {
4106
4128
  var SendButton = function (_a) {
4107
4129
  var sendMessage = _a.sendMessage;
4108
4130
  var t = useTranslationContext('SendButton').t;
4109
- return (React__default['default'].createElement("button", { className: 'str-chat__send-button', onClick: sendMessage },
4131
+ return (React__default['default'].createElement("button", { "aria-label": 'Send', className: 'str-chat__send-button', onClick: sendMessage },
4110
4132
  React__default['default'].createElement("svg", { height: '17', viewBox: '0 0 18 17', width: '18', xmlns: 'http://www.w3.org/2000/svg' },
4111
4133
  React__default['default'].createElement("title", null, t('Send')),
4112
4134
  React__default['default'].createElement("path", { d: 'M0 17.015l17.333-8.508L0 0v6.617l12.417 1.89L0 10.397z', fill: '#006cff', fillRule: 'evenodd' }))));
@@ -4132,7 +4154,8 @@ var UploadsPreview = function () {
4132
4154
  }
4133
4155
  }, [device, numberOfUploads, text]);
4134
4156
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
4135
- imageOrder.length > 0 && (React__default['default'].createElement(reactFileUtils.ImagePreviewer, { disabled: maxNumberOfFiles !== undefined && numberOfUploads >= maxNumberOfFiles, handleFiles: uploadNewFiles, handleRemove: removeImage, handleRetry: uploadImage, imageUploads: imagesToPreview, multiple: multipleUploads })),
4157
+ imageOrder.length > 0 && (React__default['default'].createElement(reactFileUtils.ImagePreviewer, { disabled: !multipleUploads ||
4158
+ (maxNumberOfFiles !== undefined && numberOfUploads >= maxNumberOfFiles), handleFiles: uploadNewFiles, handleRemove: removeImage, handleRetry: uploadImage, imageUploads: imagesToPreview, multiple: multipleUploads })),
4136
4159
  fileOrder.length > 0 && (React__default['default'].createElement(reactFileUtils.FilePreviewer, { handleFiles: uploadNewFiles, handleRemove: removeFile, handleRetry: uploadFile, uploads: filesToPreview }))));
4137
4160
  };
4138
4161
 
@@ -4142,32 +4165,34 @@ var UnMemoizedChatAutoComplete = function (props) {
4142
4165
  var messageInput = useMessageInputContext('ChatAutoComplete');
4143
4166
  var cooldownRemaining = messageInput.cooldownRemaining, disabled = messageInput.disabled, emojiIndex = messageInput.emojiIndex, innerRef = messageInput.textareaRef;
4144
4167
  var placeholder = props.placeholder || t('Type your message');
4145
- var emojiReplace = function (word) {
4146
- var found = (emojiIndex === null || emojiIndex === void 0 ? void 0 : emojiIndex.search(word)) || [];
4147
- var emoji = found
4148
- .filter(Boolean)
4149
- .slice(0, 10)
4150
- .find(function (_a) {
4151
- var emoticons = _a.emoticons;
4152
- return !!(emoticons === null || emoticons === void 0 ? void 0 : emoticons.includes(word));
4153
- });
4154
- if (!emoji || !('native' in emoji))
4155
- return null;
4156
- return emoji.native;
4157
- };
4168
+ var emojiReplace = props.wordReplace
4169
+ ? function (word) { var _a; return (_a = props.wordReplace) === null || _a === void 0 ? void 0 : _a.call(props, word, emojiIndex); }
4170
+ : function (word) {
4171
+ var found = (emojiIndex === null || emojiIndex === void 0 ? void 0 : emojiIndex.search(word)) || [];
4172
+ var emoji = found
4173
+ .filter(Boolean)
4174
+ .slice(0, 10)
4175
+ .find(function (_a) {
4176
+ var emoticons = _a.emoticons;
4177
+ return !!(emoticons === null || emoticons === void 0 ? void 0 : emoticons.includes(word));
4178
+ });
4179
+ if (!emoji || !('native' in emoji))
4180
+ return null;
4181
+ return emoji.native;
4182
+ };
4158
4183
  var updateInnerRef = React.useCallback(function (ref) {
4159
4184
  if (innerRef) {
4160
4185
  innerRef.current = ref;
4161
4186
  }
4162
4187
  }, [innerRef]);
4163
- return (React__default['default'].createElement(ReactTextareaAutocomplete, { additionalTextareaProps: messageInput.additionalTextareaProps, className: 'str-chat__textarea__textarea', closeCommandsList: messageInput.closeCommandsList, closeMentionsList: messageInput.closeMentionsList, containerClassName: 'str-chat__textarea', disabled: disabled || !!cooldownRemaining, disableMentions: messageInput.disableMentions, dropdownClassName: 'str-chat__emojisearch', grow: messageInput.grow, handleSubmit: props.handleSubmit || messageInput.handleSubmit, innerRef: updateInnerRef, itemClassName: 'str-chat__emojisearch__item', keycodeSubmitKeys: messageInput.keycodeSubmitKeys, listClassName: 'str-chat__emojisearch__list', loadingComponent: LoadingIndicator, maxRows: messageInput.maxRows, minChar: 0, onChange: props.onChange || messageInput.handleChange, onFocus: props.onFocus, onPaste: props.onPaste || messageInput.onPaste, placeholder: cooldownRemaining ? t('Slow Mode ON') : placeholder, replaceWord: emojiReplace, rows: props.rows || 1, showCommandsList: messageInput.showCommandsList, showMentionsList: messageInput.showMentionsList, SuggestionItem: SuggestionItem, SuggestionList: SuggestionList, trigger: messageInput.autocompleteTriggers || {}, value: props.value || messageInput.text }));
4188
+ return (React__default['default'].createElement(ReactTextareaAutocomplete, { additionalTextareaProps: messageInput.additionalTextareaProps, "aria-label": cooldownRemaining ? t('Slow Mode ON') : placeholder, className: 'str-chat__textarea__textarea', closeCommandsList: messageInput.closeCommandsList, closeMentionsList: messageInput.closeMentionsList, containerClassName: 'str-chat__textarea', disabled: disabled || !!cooldownRemaining, disableMentions: messageInput.disableMentions, dropdownClassName: 'str-chat__emojisearch', grow: messageInput.grow, handleSubmit: props.handleSubmit || messageInput.handleSubmit, innerRef: updateInnerRef, itemClassName: 'str-chat__emojisearch__item', keycodeSubmitKeys: messageInput.keycodeSubmitKeys, listClassName: 'str-chat__emojisearch__list', loadingComponent: LoadingIndicator, maxRows: messageInput.maxRows, minChar: 0, onChange: props.onChange || messageInput.handleChange, onFocus: props.onFocus, onPaste: props.onPaste || messageInput.onPaste, placeholder: cooldownRemaining ? t('Slow Mode ON') : placeholder, replaceWord: emojiReplace, rows: props.rows || 1, showCommandsList: messageInput.showCommandsList, showMentionsList: messageInput.showMentionsList, SuggestionItem: SuggestionItem, SuggestionList: SuggestionList, trigger: messageInput.autocompleteTriggers || {}, value: props.value || messageInput.text }));
4164
4189
  };
4165
4190
  var ChatAutoComplete = React__default['default'].memo(UnMemoizedChatAutoComplete);
4166
4191
 
4167
4192
  var EditMessageForm = function () {
4168
4193
  var _a = useChannelStateContext('EditMessageForm'), acceptedFiles = _a.acceptedFiles, multipleUploads = _a.multipleUploads;
4169
4194
  var t = useTranslationContext('EditMessageForm').t;
4170
- var _b = useMessageInputContext('EditMessageForm'), clearEditingState = _b.clearEditingState, handleSubmit = _b.handleSubmit, isUploadEnabled = _b.isUploadEnabled, maxFilesLeft = _b.maxFilesLeft, openEmojiPicker = _b.openEmojiPicker, uploadNewFiles = _b.uploadNewFiles;
4195
+ var _b = useMessageInputContext('EditMessageForm'), clearEditingState = _b.clearEditingState, closeEmojiPicker = _b.closeEmojiPicker, emojiPickerIsOpen = _b.emojiPickerIsOpen, handleSubmit = _b.handleSubmit, isUploadEnabled = _b.isUploadEnabled, maxFilesLeft = _b.maxFilesLeft, openEmojiPicker = _b.openEmojiPicker, uploadNewFiles = _b.uploadNewFiles;
4171
4196
  var _c = useComponentContext('EditMessageForm'), _d = _c.EmojiIcon, EmojiIcon = _d === void 0 ? EmojiIconSmall : _d, _e = _c.FileUploadIcon, FileUploadIcon$1 = _e === void 0 ? FileUploadIcon : _e;
4172
4197
  React.useEffect(function () {
4173
4198
  var onKeyDown = function (event) {
@@ -4185,7 +4210,7 @@ var EditMessageForm = function () {
4185
4210
  React__default['default'].createElement(ChatAutoComplete, null),
4186
4211
  React__default['default'].createElement("div", { className: 'str-chat__message-team-form-footer' },
4187
4212
  React__default['default'].createElement("div", { className: 'str-chat__edit-message-form-options' },
4188
- React__default['default'].createElement("span", { className: 'str-chat__input-emojiselect', onClick: openEmojiPicker },
4213
+ React__default['default'].createElement("button", { "aria-label": 'Open Emoji Picker', className: 'str-chat__input-emojiselect', onClick: emojiPickerIsOpen ? closeEmojiPicker : openEmojiPicker },
4189
4214
  React__default['default'].createElement(EmojiIcon, null)),
4190
4215
  isUploadEnabled && (React__default['default'].createElement("div", { className: 'str-chat__fileupload-wrapper', "data-testid": 'fileinput' },
4191
4216
  React__default['default'].createElement(Tooltip, null, maxFilesLeft
@@ -4472,7 +4497,7 @@ var useFileUploads = function (props, state, dispatch) {
4472
4497
  };
4473
4498
 
4474
4499
  var apiMaxNumberOfFiles = 10;
4475
- var useAttachments = function (props, state, dispatch) {
4500
+ var useAttachments = function (props, state, dispatch, textareaRef) {
4476
4501
  var noFiles = props.noFiles;
4477
4502
  var fileUploads = state.fileUploads, imageUploads = state.imageUploads;
4478
4503
  var _a = useChannelStateContext('useAttachments'), maxNumberOfFiles = _a.maxNumberOfFiles, multipleUploads = _a.multipleUploads;
@@ -4493,6 +4518,7 @@ var useAttachments = function (props, state, dispatch) {
4493
4518
  var numberOfUploads = numberOfImages + numberOfFiles;
4494
4519
  var maxFilesLeft = maxFilesAllowed - numberOfUploads;
4495
4520
  var uploadNewFiles = React.useCallback(function (files) {
4521
+ var _a;
4496
4522
  Array.from(files)
4497
4523
  .slice(0, maxFilesLeft)
4498
4524
  .forEach(function (file) {
@@ -4506,6 +4532,7 @@ var useAttachments = function (props, state, dispatch) {
4506
4532
  dispatch({ file: file, id: id, state: 'uploading', type: 'setFileUpload' });
4507
4533
  }
4508
4534
  });
4535
+ (_a = textareaRef === null || textareaRef === void 0 ? void 0 : textareaRef.current) === null || _a === void 0 ? void 0 : _a.focus();
4509
4536
  }, [maxFilesLeft, noFiles]);
4510
4537
  return {
4511
4538
  maxFilesLeft: maxFilesLeft,
@@ -4588,9 +4615,10 @@ var useMessageInputText = function (props, state, dispatch) {
4588
4615
  };
4589
4616
  };
4590
4617
 
4591
- var useEmojiPicker = function (state, dispatch, insertText) {
4618
+ var useEmojiPicker = function (state, dispatch, insertText, textareaRef, closeEmojiPickerOnClick) {
4592
4619
  var emojiPickerRef = React.useRef(null);
4593
4620
  var closeEmojiPicker = React.useCallback(function (event) {
4621
+ event.preventDefault();
4594
4622
  if (emojiPickerRef.current && !emojiPickerRef.current.contains(event.target)) {
4595
4623
  dispatch({
4596
4624
  type: 'setEmojiPickerIsOpen',
@@ -4599,6 +4627,7 @@ var useEmojiPicker = function (state, dispatch, insertText) {
4599
4627
  }
4600
4628
  }, [emojiPickerRef]);
4601
4629
  var openEmojiPicker = React.useCallback(function (event) {
4630
+ event.preventDefault();
4602
4631
  dispatch({
4603
4632
  type: 'setEmojiPickerIsOpen',
4604
4633
  value: true,
@@ -4634,9 +4663,17 @@ var useEmojiPicker = function (state, dispatch, insertText) {
4634
4663
  document.removeEventListener('keydown', handleEmojiEscape);
4635
4664
  };
4636
4665
  }, [closeEmojiPicker, state.emojiPickerIsOpen]);
4637
- var onSelectEmoji = React.useCallback(function (emoji) { return insertText(emoji.native); }, [
4638
- insertText,
4639
- ]);
4666
+ var onSelectEmoji = React.useCallback(function (emoji) {
4667
+ var _a;
4668
+ insertText(emoji.native);
4669
+ if (closeEmojiPickerOnClick) {
4670
+ dispatch({
4671
+ type: 'setEmojiPickerIsOpen',
4672
+ value: false,
4673
+ });
4674
+ }
4675
+ (_a = textareaRef === null || textareaRef === void 0 ? void 0 : textareaRef.current) === null || _a === void 0 ? void 0 : _a.focus();
4676
+ }, [insertText]);
4640
4677
  return {
4641
4678
  closeEmojiPicker: closeEmojiPicker,
4642
4679
  emojiPickerRef: emojiPickerRef,
@@ -4958,7 +4995,7 @@ var messageInputReducer = function (state, action) {
4958
4995
  * hook for MessageInput state
4959
4996
  */
4960
4997
  var useMessageInputState = function (props) {
4961
- var message = props.message;
4998
+ var closeEmojiPickerOnClick = props.closeEmojiPickerOnClick, message = props.message;
4962
4999
  var _a = useChannelStateContext('useMessageInputState'), _b = _a.channelCapabilities, channelCapabilities = _b === void 0 ? {} : _b, channelConfig = _a.channelConfig;
4963
5000
  var _c = React.useReducer(messageInputReducer, message, initState), state = _c[0], dispatch = _c[1];
4964
5001
  var _d = useMessageInputText(props, state, dispatch), handleChange = _d.handleChange, insertText = _d.insertText, textareaRef = _d.textareaRef;
@@ -4974,14 +5011,14 @@ var useMessageInputState = function (props) {
4974
5011
  var closeCommandsList = function () { return setShowCommandsList(false); };
4975
5012
  var openMentionsList = function () {
4976
5013
  dispatch({
4977
- getNewText: function () { return '@'; },
5014
+ getNewText: function (currentText) { return currentText + '@'; },
4978
5015
  type: 'setText',
4979
5016
  });
4980
5017
  setShowMentionsList(true);
4981
5018
  };
4982
5019
  var closeMentionsList = function () { return setShowMentionsList(false); };
4983
- var _g = useEmojiPicker(state, dispatch, insertText), closeEmojiPicker = _g.closeEmojiPicker, emojiPickerRef = _g.emojiPickerRef, handleEmojiKeyDown = _g.handleEmojiKeyDown, onSelectEmoji = _g.onSelectEmoji, openEmojiPicker = _g.openEmojiPicker;
4984
- var _h = useAttachments(props, state, dispatch), maxFilesLeft = _h.maxFilesLeft, numberOfUploads = _h.numberOfUploads, removeFile = _h.removeFile, removeImage = _h.removeImage, uploadFile = _h.uploadFile, uploadImage = _h.uploadImage, uploadNewFiles = _h.uploadNewFiles;
5020
+ var _g = useEmojiPicker(state, dispatch, insertText, textareaRef, closeEmojiPickerOnClick), closeEmojiPicker = _g.closeEmojiPicker, emojiPickerRef = _g.emojiPickerRef, handleEmojiKeyDown = _g.handleEmojiKeyDown, onSelectEmoji = _g.onSelectEmoji, openEmojiPicker = _g.openEmojiPicker;
5021
+ var _h = useAttachments(props, state, dispatch, textareaRef), maxFilesLeft = _h.maxFilesLeft, numberOfUploads = _h.numberOfUploads, removeFile = _h.removeFile, removeImage = _h.removeImage, uploadFile = _h.uploadFile, uploadImage = _h.uploadImage, uploadNewFiles = _h.uploadNewFiles;
4985
5022
  var handleSubmit = useSubmitHandler(props, state, dispatch, numberOfUploads).handleSubmit;
4986
5023
  var onPaste = usePasteHandler(uploadNewFiles, insertText).onPaste;
4987
5024
  var isUploadEnabled = (channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.uploads) !== false && channelCapabilities['upload-file'] !== false;
@@ -5004,15 +5041,16 @@ var QuotedMessagePreviewHeader = function () {
5004
5041
  var t = useTranslationContext('QuotedMessagePreview').t;
5005
5042
  return (React__default['default'].createElement("div", { className: 'quoted-message-preview-header' },
5006
5043
  React__default['default'].createElement("div", null, t('Reply to Message')),
5007
- React__default['default'].createElement("button", { className: 'str-chat__square-button', onClick: function () { return setQuotedMessage(undefined); } },
5044
+ React__default['default'].createElement("button", { "aria-label": 'Cancel Reply', className: 'str-chat__square-button', onClick: function () { return setQuotedMessage(undefined); } },
5008
5045
  React__default['default'].createElement("svg", { height: '10', width: '10', xmlns: 'http://www.w3.org/2000/svg' },
5009
5046
  React__default['default'].createElement("path", { d: 'M9.916 1.027L8.973.084 5 4.058 1.027.084l-.943.943L4.058 5 .084 8.973l.943.943L5 5.942l3.973 3.974.943-.943L5.942 5z', fillRule: 'evenodd' })))));
5010
5047
  };
5011
5048
  var QuotedMessagePreview = function (props) {
5012
5049
  var _a;
5013
5050
  var quotedMessage = props.quotedMessage;
5014
- var Attachment = useComponentContext('QuotedMessagePreview').Attachment;
5051
+ var _b = useComponentContext('QuotedMessagePreview'), Attachment = _b.Attachment, ContextAvatar = _b.Avatar;
5015
5052
  var userLanguage = useTranslationContext('QuotedMessagePreview').userLanguage;
5053
+ var Avatar$1 = ContextAvatar || Avatar;
5016
5054
  var quotedMessageText = ((_a = quotedMessage.i18n) === null || _a === void 0 ? void 0 : _a[userLanguage + "_text"]) ||
5017
5055
  quotedMessage.text;
5018
5056
  // @ts-expect-error
@@ -5025,7 +5063,7 @@ var QuotedMessagePreview = function (props) {
5025
5063
  return (React__default['default'].createElement("div", { className: 'quoted-message-preview' },
5026
5064
  React__default['default'].createElement(QuotedMessagePreviewHeader, null),
5027
5065
  React__default['default'].createElement("div", { className: 'quoted-message-preview-content' },
5028
- quotedMessage.user && (React__default['default'].createElement(Avatar, { image: quotedMessage.user.image, name: quotedMessage.user.name || quotedMessage.user.id, size: 20, user: quotedMessage.user })),
5066
+ quotedMessage.user && (React__default['default'].createElement(Avatar$1, { image: quotedMessage.user.image, name: quotedMessage.user.name || quotedMessage.user.id, size: 20, user: quotedMessage.user })),
5029
5067
  React__default['default'].createElement("div", { className: 'quoted-message-preview-content-inner' },
5030
5068
  quotedMessageAttachment && React__default['default'].createElement(Attachment, { attachments: [quotedMessageAttachment] }),
5031
5069
  React__default['default'].createElement("div", null, quotedMessageText)))));
@@ -5034,17 +5072,17 @@ var QuotedMessagePreview = function (props) {
5034
5072
  var MessageInputFlat = function () {
5035
5073
  var _a = useChannelStateContext('MessageInputFlat'), acceptedFiles = _a.acceptedFiles, multipleUploads = _a.multipleUploads, quotedMessage = _a.quotedMessage;
5036
5074
  var t = useTranslationContext('MessageInputFlat').t;
5037
- var _b = useMessageInputContext('MessageInputFlat'), closeEmojiPicker = _b.closeEmojiPicker, cooldownInterval = _b.cooldownInterval, cooldownRemaining = _b.cooldownRemaining, emojiPickerIsOpen = _b.emojiPickerIsOpen, handleEmojiKeyDown = _b.handleEmojiKeyDown, handleSubmit = _b.handleSubmit, isUploadEnabled = _b.isUploadEnabled, maxFilesLeft = _b.maxFilesLeft, openEmojiPicker = _b.openEmojiPicker, setCooldownRemaining = _b.setCooldownRemaining, uploadNewFiles = _b.uploadNewFiles;
5075
+ var _b = useMessageInputContext('MessageInputFlat'), closeEmojiPicker = _b.closeEmojiPicker, cooldownInterval = _b.cooldownInterval, cooldownRemaining = _b.cooldownRemaining, emojiPickerIsOpen = _b.emojiPickerIsOpen, handleSubmit = _b.handleSubmit, isUploadEnabled = _b.isUploadEnabled, maxFilesLeft = _b.maxFilesLeft, openEmojiPicker = _b.openEmojiPicker, setCooldownRemaining = _b.setCooldownRemaining, uploadNewFiles = _b.uploadNewFiles;
5038
5076
  var _c = useComponentContext('MessageInputFlat'), _d = _c.CooldownTimer, CooldownTimer$1 = _d === void 0 ? CooldownTimer : _d, _e = _c.EmojiIcon, EmojiIcon = _e === void 0 ? EmojiIconLarge : _e, _f = _c.FileUploadIcon, FileUploadIcon = _f === void 0 ? FileUploadIconFlat : _f, _g = _c.QuotedMessagePreview, QuotedMessagePreview$1 = _g === void 0 ? QuotedMessagePreview : _g, _h = _c.SendButton, SendButton$1 = _h === void 0 ? SendButton : _h;
5039
- return (React__default['default'].createElement("div", { className: "str-chat__input-flat " + (SendButton$1 ? 'str-chat__input-flat--send-button-active' : null) + " " + (quotedMessage ? 'str-chat__input-flat-quoted' : null) },
5077
+ return (React__default['default'].createElement("div", { className: "str-chat__input-flat " + (SendButton$1 ? 'str-chat__input-flat--send-button-active' : null) + " " + (quotedMessage && !quotedMessage.parent_id ? 'str-chat__input-flat-quoted' : null) },
5040
5078
  React__default['default'].createElement(reactFileUtils.ImageDropzone, { accept: acceptedFiles, disabled: !isUploadEnabled || maxFilesLeft === 0 || !!cooldownRemaining, handleFiles: uploadNewFiles, maxNumberOfFiles: maxFilesLeft, multiple: multipleUploads },
5041
- quotedMessage && React__default['default'].createElement(QuotedMessagePreview$1, { quotedMessage: quotedMessage }),
5079
+ quotedMessage && !quotedMessage.parent_id && (React__default['default'].createElement(QuotedMessagePreview$1, { quotedMessage: quotedMessage })),
5042
5080
  React__default['default'].createElement("div", { className: 'str-chat__input-flat-wrapper' },
5043
5081
  React__default['default'].createElement("div", { className: 'str-chat__input-flat--textarea-wrapper' },
5044
5082
  isUploadEnabled && React__default['default'].createElement(UploadsPreview, null),
5045
5083
  React__default['default'].createElement("div", { className: 'str-chat__emojiselect-wrapper' },
5046
5084
  React__default['default'].createElement(Tooltip, null, emojiPickerIsOpen ? t('Close emoji picker') : t('Open emoji picker')),
5047
- React__default['default'].createElement("span", { className: 'str-chat__input-flat-emojiselect', onClick: emojiPickerIsOpen ? closeEmojiPicker : openEmojiPicker, onKeyDown: handleEmojiKeyDown, role: 'button', tabIndex: 0 }, cooldownRemaining ? (React__default['default'].createElement("div", { className: 'str-chat__input-flat-cooldown' },
5085
+ React__default['default'].createElement("button", { "aria-label": 'Emoji picker', className: 'str-chat__input-flat-emojiselect', onClick: emojiPickerIsOpen ? closeEmojiPicker : openEmojiPicker }, cooldownRemaining ? (React__default['default'].createElement("div", { className: 'str-chat__input-flat-cooldown' },
5048
5086
  React__default['default'].createElement(CooldownTimer$1, { cooldownInterval: cooldownInterval, setCooldownRemaining: setCooldownRemaining }))) : (React__default['default'].createElement(EmojiIcon, null)))),
5049
5087
  React__default['default'].createElement(EmojiPicker, null),
5050
5088
  React__default['default'].createElement(ChatAutoComplete, null),
@@ -5180,13 +5218,14 @@ var UnMemoizedMessageInput = function (props) {
5180
5218
  var MessageInput = React__default['default'].memo(UnMemoizedMessageInput);
5181
5219
 
5182
5220
  var MessageInputSmall = function () {
5183
- var _a = useChannelStateContext('MessageInputSmall'), acceptedFiles = _a.acceptedFiles, multipleUploads = _a.multipleUploads;
5221
+ var _a = useChannelStateContext('MessageInputSmall'), acceptedFiles = _a.acceptedFiles, multipleUploads = _a.multipleUploads, quotedMessage = _a.quotedMessage;
5184
5222
  var t = useTranslationContext('MessageInputSmall').t;
5185
- var _b = useMessageInputContext('MessageInputSmall'), closeEmojiPicker = _b.closeEmojiPicker, cooldownInterval = _b.cooldownInterval, cooldownRemaining = _b.cooldownRemaining, emojiPickerIsOpen = _b.emojiPickerIsOpen, handleEmojiKeyDown = _b.handleEmojiKeyDown, handleSubmit = _b.handleSubmit, isUploadEnabled = _b.isUploadEnabled, maxFilesLeft = _b.maxFilesLeft, openEmojiPicker = _b.openEmojiPicker, setCooldownRemaining = _b.setCooldownRemaining, uploadNewFiles = _b.uploadNewFiles;
5186
- var _c = useComponentContext('MessageInputSmall'), _d = _c.CooldownTimer, CooldownTimer$1 = _d === void 0 ? CooldownTimer : _d, _e = _c.EmojiIcon, EmojiIcon = _e === void 0 ? EmojiIconSmall : _e, _f = _c.FileUploadIcon, FileUploadIcon = _f === void 0 ? FileUploadIconFlat : _f, _g = _c.SendButton, SendButton$1 = _g === void 0 ? SendButton : _g;
5223
+ var _b = useMessageInputContext('MessageInputSmall'), closeEmojiPicker = _b.closeEmojiPicker, cooldownInterval = _b.cooldownInterval, cooldownRemaining = _b.cooldownRemaining, emojiPickerIsOpen = _b.emojiPickerIsOpen, handleSubmit = _b.handleSubmit, isUploadEnabled = _b.isUploadEnabled, maxFilesLeft = _b.maxFilesLeft, openEmojiPicker = _b.openEmojiPicker, setCooldownRemaining = _b.setCooldownRemaining, uploadNewFiles = _b.uploadNewFiles;
5224
+ var _c = useComponentContext('MessageInputSmall'), _d = _c.CooldownTimer, CooldownTimer$1 = _d === void 0 ? CooldownTimer : _d, _e = _c.EmojiIcon, EmojiIcon = _e === void 0 ? EmojiIconSmall : _e, _f = _c.FileUploadIcon, FileUploadIcon = _f === void 0 ? FileUploadIconFlat : _f, _g = _c.SendButton, SendButton$1 = _g === void 0 ? SendButton : _g, _h = _c.QuotedMessagePreview, QuotedMessagePreview$1 = _h === void 0 ? QuotedMessagePreview : _h;
5187
5225
  return (React__default['default'].createElement("div", { className: 'str-chat__small-message-input__wrapper' },
5188
5226
  React__default['default'].createElement(reactFileUtils.ImageDropzone, { accept: acceptedFiles, disabled: !isUploadEnabled || maxFilesLeft === 0 || !!cooldownRemaining, handleFiles: uploadNewFiles, maxNumberOfFiles: maxFilesLeft, multiple: multipleUploads },
5189
- React__default['default'].createElement("div", { className: "str-chat__small-message-input " + (SendButton$1 ? 'str-chat__small-message-input--send-button-active' : null) },
5227
+ React__default['default'].createElement("div", { className: "str-chat__small-message-input " + (SendButton$1 ? 'str-chat__small-message-input--send-button-active' : null) + " " + (quotedMessage && quotedMessage.parent_id ? 'str-chat__input-flat-quoted' : null) },
5228
+ quotedMessage && quotedMessage.parent_id && (React__default['default'].createElement(QuotedMessagePreview$1, { quotedMessage: quotedMessage })),
5190
5229
  React__default['default'].createElement("div", { className: 'str-chat__small-message-input--textarea-wrapper' },
5191
5230
  isUploadEnabled && React__default['default'].createElement(UploadsPreview, null),
5192
5231
  React__default['default'].createElement(ChatAutoComplete, null),
@@ -5201,7 +5240,7 @@ var MessageInputSmall = function () {
5201
5240
  React__default['default'].createElement(FileUploadIcon, null))))),
5202
5241
  React__default['default'].createElement("div", { className: 'str-chat__emojiselect-wrapper' },
5203
5242
  React__default['default'].createElement(Tooltip, null, emojiPickerIsOpen ? t('Close emoji picker') : t('Open emoji picker')),
5204
- React__default['default'].createElement("span", { className: 'str-chat__small-message-input-emojiselect', onClick: emojiPickerIsOpen ? closeEmojiPicker : openEmojiPicker, onKeyDown: handleEmojiKeyDown, role: 'button', tabIndex: 0 },
5243
+ React__default['default'].createElement("button", { "aria-label": 'Emoji picker', className: 'str-chat__small-message-input-emojiselect', onClick: emojiPickerIsOpen ? closeEmojiPicker : openEmojiPicker },
5205
5244
  React__default['default'].createElement(EmojiIcon, null))))),
5206
5245
  React__default['default'].createElement(EmojiPicker, { small: true })),
5207
5246
  !cooldownRemaining && React__default['default'].createElement(SendButton$1, { sendMessage: handleSubmit })))));
@@ -5228,38 +5267,6 @@ var MML = function (props) {
5228
5267
  React__default['default'].createElement(MMLReact, { className: "mml-align-" + align, Loading: null, onSubmit: actionHandler, source: source, Success: null, theme: (theme || '').replace(' ', '-') })));
5229
5268
  };
5230
5269
 
5231
- var Modal = function (props) {
5232
- var children = props.children, onClose = props.onClose, open = props.open;
5233
- var t = useTranslationContext('Modal').t;
5234
- var innerRef = React.useRef(null);
5235
- var handleClick = function (event) {
5236
- var _a;
5237
- if (event.target instanceof HTMLDivElement &&
5238
- !((_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target)) &&
5239
- onClose) {
5240
- onClose();
5241
- }
5242
- };
5243
- React.useEffect(function () {
5244
- if (!open)
5245
- return function () { return null; };
5246
- var handleEscKey = function (event) {
5247
- if (event instanceof KeyboardEvent && event.key === 'Escape' && onClose) {
5248
- onClose();
5249
- }
5250
- };
5251
- document.addEventListener('keypress', handleEscKey);
5252
- return function () { return document.removeEventListener('keypress', handleEscKey); };
5253
- }, [onClose, open]);
5254
- var openClasses = open ? 'str-chat__modal--open' : 'str-chat__modal--closed';
5255
- return (React__default['default'].createElement("div", { className: "str-chat__modal " + openClasses, onClick: handleClick },
5256
- React__default['default'].createElement("div", { className: 'str-chat__modal__close-button' },
5257
- t('Close'),
5258
- React__default['default'].createElement("svg", { height: '10', width: '10', xmlns: 'http://www.w3.org/2000/svg' },
5259
- React__default['default'].createElement("path", { d: 'M9.916 1.027L8.973.084 5 4.058 1.027.084l-.943.943L4.058 5 .084 8.973l.943.943L5 5.942l3.973 3.974.943-.943L5.942 5z', fillRule: 'evenodd' }))),
5260
- React__default['default'].createElement("div", { className: 'str-chat__modal__inner', ref: innerRef }, children)));
5261
- };
5262
-
5263
5270
  var isMutableRef = function (ref) {
5264
5271
  if (ref) {
5265
5272
  return ref.current !== undefined;
@@ -5337,12 +5344,13 @@ var UnMemoizedReactionSelector = React__default['default'].forwardRef(function (
5337
5344
  React__default['default'].createElement("ul", { className: 'str-chat__message-reactions-list' }, reactionOptions.map(function (reactionOption) {
5338
5345
  var latestUser = getLatestUserForReactionType(reactionOption.id);
5339
5346
  var count = reactionCounts && reactionCounts[reactionOption.id];
5340
- return (React__default['default'].createElement("li", { className: 'str-chat__message-reactions-list-item', "data-text": reactionOption.id, key: "item-" + reactionOption.id, onClick: function (event) { return handleReaction(reactionOption.id, event); } },
5341
- !!count && detailedView && (React__default['default'].createElement(React__default['default'].Fragment, null,
5342
- React__default['default'].createElement("div", { className: 'latest-user', onClick: hideTooltip, onMouseEnter: function (e) { return showTooltip(e, reactionOption.id); }, onMouseLeave: hideTooltip }, latestUser ? (React__default['default'].createElement(Avatar$1, { image: latestUser.image, name: latestUser.name, size: 20, user: latestUser })) : (React__default['default'].createElement("div", { className: 'latest-user-not-found' }))))),
5343
- React__default['default'].createElement(React.Suspense, { fallback: null },
5344
- React__default['default'].createElement(Emoji, __assign({ data: emojiData, emoji: reactionOption, size: 20 }, (reactionsAreCustom ? additionalEmojiProps : emojiSetDef)))),
5345
- Boolean(count) && detailedView && (React__default['default'].createElement("span", { className: 'str-chat__message-reactions-list-item__count' }, count || ''))));
5347
+ return (React__default['default'].createElement("li", { key: "item-" + reactionOption.id },
5348
+ React__default['default'].createElement("button", { "aria-label": "Select Reaction: " + reactionOption.name, className: 'str-chat__message-reactions-list-item', "data-text": reactionOption.id, onClick: function (event) { return handleReaction(reactionOption.id, event); } },
5349
+ !!count && detailedView && (React__default['default'].createElement(React__default['default'].Fragment, null,
5350
+ React__default['default'].createElement("div", { className: 'latest-user', onClick: hideTooltip, onMouseEnter: function (e) { return showTooltip(e, reactionOption.id); }, onMouseLeave: hideTooltip }, latestUser ? (React__default['default'].createElement(Avatar$1, { image: latestUser.image, name: latestUser.name, size: 20, user: latestUser })) : (React__default['default'].createElement("div", { className: 'latest-user-not-found' }))))),
5351
+ React__default['default'].createElement(React.Suspense, { fallback: null },
5352
+ React__default['default'].createElement(Emoji, __assign({ data: emojiData, emoji: reactionOption, size: 20 }, (reactionsAreCustom ? additionalEmojiProps : emojiSetDef)))),
5353
+ Boolean(count) && detailedView && (React__default['default'].createElement("span", { className: 'str-chat__message-reactions-list-item__count' }, count || '')))));
5346
5354
  }))));
5347
5355
  });
5348
5356
  /**
@@ -5392,14 +5400,15 @@ var UnMemoizedReactionsList = function (props) {
5392
5400
  var supportedReactionsArePresent = messageReactionTypes.some(function (type) { return supportedReactionMap[type]; });
5393
5401
  if (!supportedReactionsArePresent)
5394
5402
  return null;
5395
- return (React__default['default'].createElement("div", { className: "str-chat__reaction-list " + (reverse ? 'str-chat__reaction-list--reverse' : ''), "data-testid": 'reaction-list', onClick: onClick || onReactionListClick },
5403
+ return (React__default['default'].createElement("div", { "aria-label": 'Reaction list', className: "str-chat__reaction-list " + (reverse ? 'str-chat__reaction-list--reverse' : ''), "data-testid": 'reaction-list', onClick: onClick || onReactionListClick, onKeyPress: onClick || onReactionListClick, role: 'figure' },
5396
5404
  React__default['default'].createElement("ul", null,
5397
5405
  messageReactionTypes.map(function (reactionType) {
5398
5406
  var emojiObject = getEmojiByReactionType(reactionType);
5399
5407
  return emojiObject ? (React__default['default'].createElement("li", { key: emojiObject.id },
5400
- React__default['default'].createElement(React.Suspense, { fallback: null },
5401
- React__default['default'].createElement(Emoji, __assign({ data: emojiData, emoji: emojiObject, size: 16 }, (reactionsAreCustom ? additionalEmojiProps : emojiSetDef)))),
5402
- "\u00A0")) : null;
5408
+ React__default['default'].createElement("button", { "aria-label": "Reactions: " + reactionType },
5409
+ React__default['default'].createElement(React.Suspense, { fallback: null },
5410
+ React__default['default'].createElement(Emoji, __assign({ data: emojiData, emoji: emojiObject, size: 16 }, (reactionsAreCustom ? additionalEmojiProps : emojiSetDef)))),
5411
+ "\u00A0"))) : null;
5403
5412
  }),
5404
5413
  React__default['default'].createElement("li", null,
5405
5414
  React__default['default'].createElement("span", { className: 'str-chat__reaction-list--counter' }, getTotalReactionCount())))));
@@ -5468,7 +5477,7 @@ var UnMemoizedSimpleReactionsList = function (props) {
5468
5477
  messageReactionTypes.map(function (reactionType, i) {
5469
5478
  var _a;
5470
5479
  var emojiObject = getEmojiByReactionType(reactionType);
5471
- return emojiObject ? (React__default['default'].createElement("li", { className: 'str-chat__simple-reactions-list-item', key: emojiObject.id + "-" + i, onClick: function (event) { return handleReaction(reactionType, event); } },
5480
+ return emojiObject ? (React__default['default'].createElement("li", { className: 'str-chat__simple-reactions-list-item', key: emojiObject.id + "-" + i, onClick: function (event) { return handleReaction(reactionType, event); }, onKeyPress: function (event) { return handleReaction(reactionType, event); } },
5472
5481
  React__default['default'].createElement("span", { onMouseEnter: function () { return setTooltipReactionType(reactionType); } },
5473
5482
  React__default['default'].createElement(React.Suspense, { fallback: null },
5474
5483
  React__default['default'].createElement(Emoji, __assign({ data: emojiData, emoji: emojiObject, size: 13 }, (reactionsAreCustom ? additionalEmojiProps : emojiSetDef)))),
@@ -5504,6 +5513,8 @@ var MessageSimpleWithContext = function (props) {
5504
5513
  React__default['default'].createElement(MessageStatus$1, null),
5505
5514
  message.user && (React__default['default'].createElement(Avatar$1, { image: message.user.image, name: message.user.name || message.user.id, onClick: onUserClick, onMouseOver: onUserHover, user: message.user })),
5506
5515
  React__default['default'].createElement("div", { className: 'str-chat__message-inner', "data-testid": 'message-inner', onClick: message.status === 'failed' && message.errorStatusCode !== 403
5516
+ ? function () { return handleRetry(message); }
5517
+ : undefined, onKeyPress: message.status === 'failed' && message.errorStatusCode !== 403
5507
5518
  ? function () { return handleRetry(message); }
5508
5519
  : undefined },
5509
5520
  React__default['default'].createElement(React__default['default'].Fragment, null,
@@ -5823,7 +5834,7 @@ var ChannelInner = function (props) {
5823
5834
  return id;
5824
5835
  })
5825
5836
  : mentioned_users;
5826
- messageData = __assign({ attachments: attachments, id: id, mentioned_users: mentions, parent_id: parent_id, quoted_message_id: quotedMessage === null || quotedMessage === void 0 ? void 0 : quotedMessage.id, text: text }, customMessageData);
5837
+ messageData = __assign({ attachments: attachments, id: id, mentioned_users: mentions, parent_id: parent_id, quoted_message_id: parent_id === (quotedMessage === null || quotedMessage === void 0 ? void 0 : quotedMessage.parent_id) ? quotedMessage === null || quotedMessage === void 0 ? void 0 : quotedMessage.id : undefined, text: text }, customMessageData);
5827
5838
  _b.label = 1;
5828
5839
  case 1:
5829
5840
  _b.trys.push([1, 6, , 7]);
@@ -5842,7 +5853,7 @@ var ChannelInner = function (props) {
5842
5853
  if (messageResponse === null || messageResponse === void 0 ? void 0 : messageResponse.message) {
5843
5854
  updateMessage(__assign(__assign({}, messageResponse.message), { status: 'received' }));
5844
5855
  }
5845
- if (quotedMessage)
5856
+ if (quotedMessage && parent_id === (quotedMessage === null || quotedMessage === void 0 ? void 0 : quotedMessage.parent_id))
5846
5857
  setQuotedMessage(undefined);
5847
5858
  return [3 /*break*/, 7];
5848
5859
  case 6:
@@ -5900,6 +5911,14 @@ var ChannelInner = function (props) {
5900
5911
  /** THREAD */
5901
5912
  var openThread = function (message, event) {
5902
5913
  event.preventDefault();
5914
+ setQuotedMessage(function (current) {
5915
+ if ((current === null || current === void 0 ? void 0 : current.parent_id) !== (message === null || message === void 0 ? void 0 : message.parent_id)) {
5916
+ return undefined;
5917
+ }
5918
+ else {
5919
+ return current;
5920
+ }
5921
+ });
5903
5922
  dispatch({ channel: channel, message: message, type: 'openThread' });
5904
5923
  };
5905
5924
  var closeThread = function (event) {
@@ -6069,7 +6088,7 @@ var UnMemoizedChannelHeader = function (props) {
6069
6088
  var _c = (channel === null || channel === void 0 ? void 0 : channel.data) || {}, channelImage = _c.image, member_count = _c.member_count, name = _c.name, subtitle = _c.subtitle;
6070
6089
  var image = propImage || channelImage;
6071
6090
  return (React__default['default'].createElement("div", { className: 'str-chat__header-livestream' },
6072
- React__default['default'].createElement("div", { className: 'str-chat__header-hamburger', onClick: openMobileNav },
6091
+ React__default['default'].createElement("button", { "aria-label": 'Menu', className: 'str-chat__header-hamburger', onClick: openMobileNav },
6073
6092
  React__default['default'].createElement("span", { className: 'str-chat__header-hamburger--line' }),
6074
6093
  React__default['default'].createElement("span", { className: 'str-chat__header-hamburger--line' }),
6075
6094
  React__default['default'].createElement("span", { className: 'str-chat__header-hamburger--line' })),
@@ -6102,9 +6121,9 @@ var UnMemoizedChatDown = function (props) {
6102
6121
  return (React__default['default'].createElement("div", { className: 'str-chat__down' },
6103
6122
  React__default['default'].createElement(LoadingChannels, null),
6104
6123
  React__default['default'].createElement("div", { className: 'str-chat__down-main' },
6105
- React__default['default'].createElement("img", { "data-testid": 'chatdown-img', src: image || img }),
6124
+ React__default['default'].createElement("img", { alt: 'Connection error', "data-testid": 'chatdown-img', src: image || img }),
6106
6125
  React__default['default'].createElement("h1", null, type),
6107
- React__default['default'].createElement("h3", null, text || t('Error connecting to chat, refresh the page to try again.')))));
6126
+ React__default['default'].createElement("h3", { "aria-live": 'assertive' }, text || t('Error connecting to chat, refresh the page to try again.')))));
6108
6127
  };
6109
6128
  /**
6110
6129
  * A simple indicator that chat functionality isn't available, triggered when the Chat API is unavailable or your network isn't working.
@@ -6123,7 +6142,7 @@ var ChannelListMessenger = function (props) {
6123
6142
  return React__default['default'].createElement(LoadingIndicator, null);
6124
6143
  }
6125
6144
  return (React__default['default'].createElement("div", { className: 'str-chat__channel-list-messenger' },
6126
- React__default['default'].createElement("div", { className: 'str-chat__channel-list-messenger__main' }, children)));
6145
+ React__default['default'].createElement("div", { "aria-label": 'Channel list', className: 'str-chat__channel-list-messenger__main', role: 'listbox' }, children)));
6127
6146
  };
6128
6147
 
6129
6148
  var useChannelDeletedListener = function (setChannels, customHandler) {
@@ -6200,10 +6219,11 @@ var useChannelUpdatedListener = function (setChannels, customHandler, forceUpdat
6200
6219
  React.useEffect(function () {
6201
6220
  var handleEvent = function (event) {
6202
6221
  setChannels(function (channels) {
6222
+ var _a, _b, _c, _d, _e, _f;
6203
6223
  var channelIndex = channels.findIndex(function (channel) { var _a; return channel.cid === ((_a = event.channel) === null || _a === void 0 ? void 0 : _a.cid); });
6204
6224
  if (channelIndex > -1 && event.channel) {
6205
6225
  var newChannels = channels;
6206
- newChannels[channelIndex].data = event.channel;
6226
+ newChannels[channelIndex].data = __assign(__assign({}, event.channel), { hidden: (_b = (_a = event.channel) === null || _a === void 0 ? void 0 : _a.hidden) !== null && _b !== void 0 ? _b : (_c = newChannels[channelIndex].data) === null || _c === void 0 ? void 0 : _c.hidden, own_capabilities: (_e = (_d = event.channel) === null || _d === void 0 ? void 0 : _d.own_capabilities) !== null && _e !== void 0 ? _e : (_f = newChannels[channelIndex].data) === null || _f === void 0 ? void 0 : _f.own_capabilities });
6207
6227
  return __spreadArray([], newChannels);
6208
6228
  }
6209
6229
  return channels;
@@ -6518,7 +6538,7 @@ var UnMemoizedChannelPreviewMessenger = function (props) {
6518
6538
  channelPreviewButton.current.blur();
6519
6539
  }
6520
6540
  };
6521
- return (React__default['default'].createElement("button", { className: "str-chat__channel-preview-messenger " + unreadClass + " " + activeClass, "data-testid": 'channel-preview-button', onClick: onSelectChannel, ref: channelPreviewButton },
6541
+ return (React__default['default'].createElement("button", { "aria-label": "Select Channel: " + (displayTitle || ''), "aria-selected": active, className: "str-chat__channel-preview-messenger " + unreadClass + " " + activeClass, "data-testid": 'channel-preview-button', onClick: onSelectChannel, ref: channelPreviewButton, role: 'option' },
6522
6542
  React__default['default'].createElement("div", { className: 'str-chat__channel-preview-messenger--left' },
6523
6543
  React__default['default'].createElement(Avatar$1, { image: displayImage, name: avatarName, size: 40 })),
6524
6544
  React__default['default'].createElement("div", { className: 'str-chat__channel-preview-messenger--right' },
@@ -6661,20 +6681,20 @@ var isChannel = function (output) {
6661
6681
 
6662
6682
  var DefaultDropdownContainer = function (props) {
6663
6683
  var focusedUser = props.focusedUser, results = props.results, _a = props.SearchResultItem, SearchResultItem = _a === void 0 ? DefaultSearchResultItem : _a, selectResult = props.selectResult;
6664
- return (React__default['default'].createElement("div", null, results.map(function (result, index) { return (React__default['default'].createElement(SearchResultItem, { focusedUser: focusedUser, index: index, key: index, result: result, selectResult: selectResult })); })));
6684
+ return (React__default['default'].createElement(React__default['default'].Fragment, null, results.map(function (result, index) { return (React__default['default'].createElement(SearchResultItem, { focusedUser: focusedUser, index: index, key: index, result: result, selectResult: selectResult })); })));
6665
6685
  };
6666
6686
  var DefaultSearchResultItem = function (props) {
6667
- var _a;
6687
+ var _a, _b;
6668
6688
  var focusedUser = props.focusedUser, index = props.index, result = props.result, selectResult = props.selectResult;
6669
6689
  var focused = focusedUser === index;
6670
6690
  if (isChannel(result)) {
6671
6691
  var channel_1 = result;
6672
- return (React__default['default'].createElement("div", { className: "str-chat__channel-search-result " + (focused ? 'focused' : ''), onClick: function () { return selectResult(channel_1); } },
6692
+ return (React__default['default'].createElement("button", { "aria-label": "Select Channel: " + (((_a = channel_1.data) === null || _a === void 0 ? void 0 : _a.name) || ''), className: "str-chat__channel-search-result " + (focused ? 'focused' : ''), onClick: function () { return selectResult(channel_1); } },
6673
6693
  React__default['default'].createElement("div", { className: 'result-hashtag' }, "#"),
6674
- React__default['default'].createElement("p", { className: 'channel-search__result-text' }, (_a = channel_1.data) === null || _a === void 0 ? void 0 : _a.name)));
6694
+ React__default['default'].createElement("p", { className: 'channel-search__result-text' }, (_b = channel_1.data) === null || _b === void 0 ? void 0 : _b.name)));
6675
6695
  }
6676
6696
  else {
6677
- return (React__default['default'].createElement("div", { className: "str-chat__channel-search-result " + (focused ? 'focused' : ''), onClick: function () { return selectResult(result); } },
6697
+ return (React__default['default'].createElement("button", { "aria-label": "Select User Channel: " + (result.name || ''), className: "str-chat__channel-search-result " + (focused ? 'focused' : ''), onClick: function () { return selectResult(result); } },
6678
6698
  React__default['default'].createElement(Avatar, { image: result.image, user: result }),
6679
6699
  result.name || result.id));
6680
6700
  }
@@ -6720,7 +6740,7 @@ var SearchResults = function (props) {
6720
6740
  return (React__default['default'].createElement(ResultsContainer, null, SearchLoading ? (React__default['default'].createElement(SearchLoading, null)) : (React__default['default'].createElement("div", { className: 'str-chat__channel-search-container-searching' }, t('Searching...')))));
6721
6741
  }
6722
6742
  if (!results.length) {
6723
- return (React__default['default'].createElement(ResultsContainer, null, SearchEmpty ? (React__default['default'].createElement(SearchEmpty, null)) : (React__default['default'].createElement("div", { className: 'str-chat__channel-search-container-empty' }, t('No results found')))));
6743
+ return (React__default['default'].createElement(ResultsContainer, null, SearchEmpty ? (React__default['default'].createElement(SearchEmpty, null)) : (React__default['default'].createElement("div", { "aria-live": 'polite', className: 'str-chat__channel-search-container-empty' }, t('No results found')))));
6724
6744
  }
6725
6745
  return (React__default['default'].createElement(ResultsContainer, null,
6726
6746
  SearchResultsHeader && React__default['default'].createElement(SearchResultsHeader, null),
@@ -6845,7 +6865,7 @@ var UnMemoizedEmptyStateIndicator = function (props) {
6845
6865
  var listType = props.listType;
6846
6866
  var t = useTranslationContext('EmptyStateIndicator').t;
6847
6867
  if (listType === 'channel')
6848
- return React__default['default'].createElement("p", null, t('You have no channels currently'));
6868
+ return React__default['default'].createElement("p", { role: 'listitem' }, t('You have no channels currently'));
6849
6869
  if (listType === 'message')
6850
6870
  return null;
6851
6871
  return React__default['default'].createElement("p", null, "No items exist");
@@ -6855,7 +6875,7 @@ var EmptyStateIndicator = React__default['default'].memo(UnMemoizedEmptyStateInd
6855
6875
  var UnMemoizedLoadMoreButton = function (props) {
6856
6876
  var _a = props.children, children = _a === void 0 ? 'Load more' : _a, onClick = props.onClick, refreshing = props.refreshing;
6857
6877
  return (React__default['default'].createElement("div", { className: 'str-chat__load-more-button' },
6858
- React__default['default'].createElement("button", { className: 'str-chat__load-more-button__button', "data-testid": 'load-more-button', disabled: refreshing, onClick: onClick }, refreshing ? React__default['default'].createElement(reactFileUtils.LoadingIndicator, null) : children)));
6878
+ React__default['default'].createElement("button", { "aria-label": 'Load More Channels', className: 'str-chat__load-more-button__button', "data-testid": 'load-more-button', disabled: refreshing, onClick: onClick }, refreshing ? React__default['default'].createElement(reactFileUtils.LoadingIndicator, null) : children)));
6859
6879
  };
6860
6880
  var LoadMoreButton = React__default['default'].memo(UnMemoizedLoadMoreButton);
6861
6881
 
@@ -7094,19 +7114,19 @@ Dayjs__default['default'].updateLocale('it', {
7094
7114
  Dayjs__default['default'].updateLocale('ja', {
7095
7115
  calendar: {
7096
7116
  lastDay: '[昨日] LT',
7097
- lastWeek: '[過去] dddd [で] LT',
7117
+ lastWeek: 'dddd LT',
7098
7118
  nextDay: '[明日] LT',
7099
- nextWeek: 'dddd [] LT',
7100
- sameDay: '[今日は] LT',
7119
+ nextWeek: '[次の] dddd LT',
7120
+ sameDay: '[今日] LT',
7101
7121
  sameElse: 'L',
7102
7122
  },
7103
7123
  });
7104
7124
  Dayjs__default['default'].updateLocale('ko', {
7105
7125
  calendar: {
7106
7126
  lastDay: '[어제] LT',
7107
- lastWeek: '[마지막] dddd [~에] LT',
7127
+ lastWeek: '[지난] dddd LT',
7108
7128
  nextDay: '[내일] LT',
7109
- nextWeek: 'dddd [~에] LT',
7129
+ nextWeek: 'dddd LT',
7110
7130
  sameDay: '[오늘] LT',
7111
7131
  sameElse: 'L',
7112
7132
  },
@@ -7599,7 +7619,7 @@ var Streami18n = /** @class */ (function () {
7599
7619
  return Streami18n;
7600
7620
  }());
7601
7621
 
7602
- var version = '6.12.0';
7622
+ var version = '7.0.0';
7603
7623
 
7604
7624
  var useChat = function (_a) {
7605
7625
  var _b;
@@ -8334,7 +8354,7 @@ var UnMemoizedCustomNotification = function (props) {
8334
8354
  var active = props.active, children = props.children, type = props.type;
8335
8355
  if (!active)
8336
8356
  return null;
8337
- return (React__default['default'].createElement("div", { className: "str-chat__custom-notification notification-" + type, "data-testid": 'custom-notification' }, children));
8357
+ return (React__default['default'].createElement("div", { "aria-live": 'polite', className: "str-chat__custom-notification notification-" + type, "data-testid": 'custom-notification' }, children));
8338
8358
  };
8339
8359
  var CustomNotification = React__default['default'].memo(UnMemoizedCustomNotification);
8340
8360
 
@@ -8786,7 +8806,7 @@ var UnMemoizedMessageNotification = function (props) {
8786
8806
  var children = props.children, onClick = props.onClick, _a = props.showNotification, showNotification = _a === void 0 ? true : _a;
8787
8807
  if (!showNotification)
8788
8808
  return null;
8789
- return (React__default['default'].createElement("button", { className: 'str-chat__message-notification', "data-testid": 'message-notification', onClick: onClick }, children));
8809
+ return (React__default['default'].createElement("button", { "aria-live": 'polite', className: 'str-chat__message-notification', "data-testid": 'message-notification', onClick: onClick }, children));
8790
8810
  };
8791
8811
  var MessageNotification = React__default['default'].memo(UnMemoizedMessageNotification);
8792
8812
 
@@ -9119,12 +9139,8 @@ var VirtualizedMessageListWithContext = function (props) {
9119
9139
  var groupedByUser = shouldGroupByUser &&
9120
9140
  streamMessageIndex > 0 &&
9121
9141
  ((_a = message.user) === null || _a === void 0 ? void 0 : _a.id) === ((_b = messageList[streamMessageIndex - 1].user) === null || _b === void 0 ? void 0 : _b.id);
9122
- var firstOfGroup = shouldGroupByUser &&
9123
- streamMessageIndex > 0 &&
9124
- ((_c = message.user) === null || _c === void 0 ? void 0 : _c.id) !== ((_e = (_d = messageList[streamMessageIndex - 1]) === null || _d === void 0 ? void 0 : _d.user) === null || _e === void 0 ? void 0 : _e.id);
9125
- var endOfGroup = shouldGroupByUser &&
9126
- streamMessageIndex > 0 &&
9127
- ((_f = message.user) === null || _f === void 0 ? void 0 : _f.id) !== ((_h = (_g = messageList[streamMessageIndex + 1]) === null || _g === void 0 ? void 0 : _g.user) === null || _h === void 0 ? void 0 : _h.id);
9142
+ var firstOfGroup = shouldGroupByUser && ((_c = message.user) === null || _c === void 0 ? void 0 : _c.id) !== ((_e = (_d = messageList[streamMessageIndex - 1]) === null || _d === void 0 ? void 0 : _d.user) === null || _e === void 0 ? void 0 : _e.id);
9143
+ var endOfGroup = shouldGroupByUser && ((_f = message.user) === null || _f === void 0 ? void 0 : _f.id) !== ((_h = (_g = messageList[streamMessageIndex + 1]) === null || _g === void 0 ? void 0 : _g.user) === null || _h === void 0 ? void 0 : _h.id);
9128
9144
  return (React__default['default'].createElement(Message, { closeReactionSelectorOnClick: closeReactionSelectorOnClick, customMessageActions: props.customMessageActions, endOfGroup: endOfGroup, firstOfGroup: firstOfGroup, groupedByUser: groupedByUser, message: message, Message: MessageUIComponent, messageActions: props.messageActions }));
9129
9145
  }, [customMessageRenderer, shouldGroupByUser, numItemsPrepended]);
9130
9146
  var virtuosoComponents = React.useMemo(function () {
@@ -9205,7 +9221,7 @@ var DefaultThreadHeader = function (props) {
9205
9221
  React__default['default'].createElement("div", { className: 'str-chat__thread-header-details' },
9206
9222
  React__default['default'].createElement("strong", null, t('Thread')),
9207
9223
  React__default['default'].createElement("small", null, getReplyCount())),
9208
- React__default['default'].createElement("button", { className: 'str-chat__square-button', "data-testid": 'close-button', onClick: function (event) { return closeThread(event); } },
9224
+ React__default['default'].createElement("button", { "aria-label": 'Close thread', className: 'str-chat__square-button', "data-testid": 'close-button', onClick: function (event) { return closeThread(event); } },
9209
9225
  React__default['default'].createElement("svg", { height: '10', width: '10', xmlns: 'http://www.w3.org/2000/svg' },
9210
9226
  React__default['default'].createElement("path", { d: 'M9.916 1.027L8.973.084 5 4.058 1.027.084l-.943.943L4.058 5 .084 8.973l.943.943L5 5.942l3.973 3.974.943-.943L5.942 5z', fillRule: 'evenodd' })))));
9211
9227
  };
@@ -9253,10 +9269,7 @@ var ThreadInner = function (props) {
9253
9269
  var UnMemoizedWindow = function (props) {
9254
9270
  var children = props.children, _a = props.hideOnThread, hideOnThread = _a === void 0 ? false : _a;
9255
9271
  var thread = useChannelStateContext('Window').thread;
9256
- // If thread is active and window should hide on thread. Return null
9257
- if (thread && hideOnThread)
9258
- return null;
9259
- return React__default['default'].createElement("div", { className: "str-chat__main-panel" }, children);
9272
+ return (React__default['default'].createElement("div", { className: "str-chat__main-panel " + (hideOnThread && thread ? 'str-chat__main-panel--hideOnThread' : '') }, children));
9260
9273
  };
9261
9274
  /**
9262
9275
  * A UI component for conditionally displaying a Thread or Channel
@@ -9349,9 +9362,9 @@ exports.MessageText = MessageText;
9349
9362
  exports.MessageTimestamp = MessageTimestamp;
9350
9363
  exports.Modal = Modal;
9351
9364
  exports.ModalComponent = ModalComponent;
9352
- exports.ModalImage = ModalImage;
9353
9365
  exports.PinIcon = PinIcon;
9354
9366
  exports.PinIndicator = PinIndicator;
9367
+ exports.QuotedMessagePreview = QuotedMessagePreview;
9355
9368
  exports.ReactionIcon = ReactionIcon;
9356
9369
  exports.ReactionSelector = ReactionSelector;
9357
9370
  exports.ReactionsList = ReactionsList;