stream-chat-react 6.12.2 → 6.13.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 (123) hide show
  1. package/dist/browser.full-bundle.js +1780 -18800
  2. package/dist/browser.full-bundle.js.map +1 -1
  3. package/dist/browser.full-bundle.min.js +5 -5
  4. package/dist/browser.full-bundle.min.js.map +1 -1
  5. package/dist/components/Attachment/Audio.js +2 -2
  6. package/dist/components/AutoCompleteTextarea/Item.d.ts.map +1 -1
  7. package/dist/components/AutoCompleteTextarea/Item.js +1 -1
  8. package/dist/components/AutoCompleteTextarea/List.d.ts.map +1 -1
  9. package/dist/components/AutoCompleteTextarea/List.js +0 -1
  10. package/dist/components/AutoCompleteTextarea/Textarea.d.ts +7 -6
  11. package/dist/components/AutoCompleteTextarea/Textarea.d.ts.map +1 -1
  12. package/dist/components/AutoCompleteTextarea/Textarea.js +9 -22
  13. package/dist/components/Channel/Channel.d.ts.map +1 -1
  14. package/dist/components/Channel/Channel.js +10 -2
  15. package/dist/components/ChannelHeader/ChannelHeader.js +1 -1
  16. package/dist/components/ChannelList/ChannelListMessenger.d.ts.map +1 -1
  17. package/dist/components/ChannelList/ChannelListMessenger.js +1 -1
  18. package/dist/components/ChannelList/hooks/useChannelUpdatedListener.d.ts.map +1 -1
  19. package/dist/components/ChannelList/hooks/useChannelUpdatedListener.js +13 -1
  20. package/dist/components/ChannelPreview/ChannelPreviewMessenger.d.ts.map +1 -1
  21. package/dist/components/ChannelPreview/ChannelPreviewMessenger.js +1 -1
  22. package/dist/components/ChannelSearch/SearchResults.d.ts.map +1 -1
  23. package/dist/components/ChannelSearch/SearchResults.js +6 -6
  24. package/dist/components/ChatAutoComplete/ChatAutoComplete.d.ts +3 -1
  25. package/dist/components/ChatAutoComplete/ChatAutoComplete.d.ts.map +1 -1
  26. package/dist/components/ChatAutoComplete/ChatAutoComplete.js +16 -14
  27. package/dist/components/ChatDown/ChatDown.d.ts.map +1 -1
  28. package/dist/components/ChatDown/ChatDown.js +2 -2
  29. package/dist/components/EmptyStateIndicator/EmptyStateIndicator.js +1 -1
  30. package/dist/components/Gallery/Gallery.d.ts.map +1 -1
  31. package/dist/components/Gallery/Gallery.js +5 -3
  32. package/dist/components/Gallery/Image.d.ts.map +1 -1
  33. package/dist/components/Gallery/Image.js +4 -2
  34. package/dist/components/Gallery/ModalWrapper.d.ts +3 -6
  35. package/dist/components/Gallery/ModalWrapper.d.ts.map +1 -1
  36. package/dist/components/Gallery/ModalWrapper.js +4 -7
  37. package/dist/components/Gallery/index.d.ts +0 -1
  38. package/dist/components/Gallery/index.d.ts.map +1 -1
  39. package/dist/components/Gallery/index.js +0 -1
  40. package/dist/components/LoadMore/LoadMoreButton.d.ts.map +1 -1
  41. package/dist/components/LoadMore/LoadMoreButton.js +1 -1
  42. package/dist/components/Message/MessageOptions.d.ts.map +1 -1
  43. package/dist/components/Message/MessageOptions.js +4 -4
  44. package/dist/components/Message/MessageSimple.d.ts.map +1 -1
  45. package/dist/components/Message/MessageSimple.js +2 -0
  46. package/dist/components/Message/hooks/useUserRole.js +1 -1
  47. package/dist/components/MessageActions/MessageActions.d.ts.map +1 -1
  48. package/dist/components/MessageActions/MessageActions.js +2 -1
  49. package/dist/components/MessageActions/MessageActionsBox.d.ts +1 -1
  50. package/dist/components/MessageActions/MessageActionsBox.d.ts.map +1 -1
  51. package/dist/components/MessageActions/MessageActionsBox.js +12 -19
  52. package/dist/components/MessageInput/EditMessageForm.d.ts.map +1 -1
  53. package/dist/components/MessageInput/EditMessageForm.js +2 -2
  54. package/dist/components/MessageInput/MessageInput.d.ts +1 -1
  55. package/dist/components/MessageInput/MessageInput.d.ts.map +1 -1
  56. package/dist/components/MessageInput/MessageInputFlat.d.ts.map +1 -1
  57. package/dist/components/MessageInput/MessageInputFlat.js +4 -4
  58. package/dist/components/MessageInput/MessageInputSmall.d.ts.map +1 -1
  59. package/dist/components/MessageInput/MessageInputSmall.js +7 -5
  60. package/dist/components/MessageInput/QuotedMessagePreview.d.ts.map +1 -1
  61. package/dist/components/MessageInput/QuotedMessagePreview.js +4 -3
  62. package/dist/components/MessageInput/UploadsPreview.d.ts.map +1 -1
  63. package/dist/components/MessageInput/UploadsPreview.js +2 -1
  64. package/dist/components/MessageInput/hooks/useEmojiPicker.d.ts +2 -2
  65. package/dist/components/MessageInput/hooks/useEmojiPicker.d.ts.map +1 -1
  66. package/dist/components/MessageInput/hooks/useEmojiPicker.js +2 -0
  67. package/dist/components/MessageInput/hooks/useMessageInputState.js +1 -1
  68. package/dist/components/MessageInput/hooks/utils.js +1 -1
  69. package/dist/components/MessageInput/icons.js +1 -1
  70. package/dist/components/MessageInput/index.d.ts +1 -0
  71. package/dist/components/MessageInput/index.d.ts.map +1 -1
  72. package/dist/components/MessageInput/index.js +1 -0
  73. package/dist/components/MessageList/CustomNotification.d.ts.map +1 -1
  74. package/dist/components/MessageList/CustomNotification.js +1 -1
  75. package/dist/components/MessageList/MessageNotification.d.ts.map +1 -1
  76. package/dist/components/MessageList/MessageNotification.js +1 -1
  77. package/dist/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
  78. package/dist/components/MessageList/VirtualizedMessageList.js +2 -6
  79. package/dist/components/Modal/Modal.d.ts.map +1 -1
  80. package/dist/components/Modal/Modal.js +8 -4
  81. package/dist/components/Reactions/ReactionSelector.d.ts.map +1 -1
  82. package/dist/components/Reactions/ReactionSelector.js +7 -6
  83. package/dist/components/Reactions/ReactionsList.d.ts.map +1 -1
  84. package/dist/components/Reactions/ReactionsList.js +5 -4
  85. package/dist/components/Reactions/SimpleReactionsList.d.ts.map +1 -1
  86. package/dist/components/Reactions/SimpleReactionsList.js +1 -1
  87. package/dist/components/SafeAnchor/SafeAnchor.d.ts.map +1 -1
  88. package/dist/components/SafeAnchor/SafeAnchor.js +1 -1
  89. package/dist/components/Thread/Thread.js +1 -1
  90. package/dist/components/Window/Window.d.ts +1 -1
  91. package/dist/components/Window/Window.d.ts.map +1 -1
  92. package/dist/components/Window/Window.js +1 -4
  93. package/dist/css/index.css +1 -1
  94. package/dist/index.cjs.js +206 -200
  95. package/dist/index.cjs.js.map +1 -1
  96. package/dist/scss/ChannelSearch.scss +3 -0
  97. package/dist/scss/Gallery.scss +6 -0
  98. package/dist/scss/LoadMoreButton.scss +1 -0
  99. package/dist/scss/Message.scss +19 -0
  100. package/dist/scss/MessageActions.scss +9 -0
  101. package/dist/scss/MessageInput.scss +11 -0
  102. package/dist/scss/MessageInputFlat.scss +15 -0
  103. package/dist/scss/MessageTeam.scss +8 -0
  104. package/dist/scss/Modal.scss +4 -0
  105. package/dist/scss/ReactionList.scss +7 -0
  106. package/dist/scss/ReactionSelector.scss +7 -0
  107. package/dist/scss/SendButton.scss +5 -0
  108. package/dist/scss/SmallMessageInput.scss +12 -0
  109. package/dist/scss/Thread.scss +24 -0
  110. package/dist/scss/_base.scss +4 -12
  111. package/dist/scss/_variables.scss +4 -1
  112. package/dist/scss/index.scss +1 -1
  113. package/dist/scss/vendor/react-file-utils.scss +2 -0
  114. package/dist/scss/vendor/react-image-gallery.scss +224 -0
  115. package/dist/utils.d.ts.map +1 -1
  116. package/dist/utils.js +24 -3
  117. package/dist/version.d.ts +1 -1
  118. package/dist/version.js +1 -1
  119. package/package.json +8 -5
  120. package/dist/components/Gallery/ModalImage.d.ts +0 -9
  121. package/dist/components/Gallery/ModalImage.d.ts.map +0 -1
  122. package/dist/components/Gallery/ModalImage.js +0 -6
  123. 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,7 +274,7 @@ 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
 
@@ -366,19 +366,46 @@ var UnMemoizedFileAttachment = function (props) {
366
366
  };
367
367
  var FileAttachment = React__default['default'].memo(UnMemoizedFileAttachment);
368
368
 
369
- var ModalImage = function (props) {
370
- var data = props.data;
371
- return (React__default['default'].createElement("div", { className: 'str-chat__modal-image__wrapper', "data-testid": 'modal-image' },
372
- 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)));
373
403
  };
374
404
 
375
405
  var ModalComponent = function (props) {
376
406
  var images = props.images, index = props.index, modalIsOpen = props.modalIsOpen, toggleModal = props.toggleModal;
377
- return (React__default['default'].createElement(Carousel.ModalGateway, null, modalIsOpen ? (React__default['default'].createElement(Carousel.Modal, { onClose: toggleModal },
378
- React__default['default'].createElement(Carousel__default['default'], { components: {
379
- // @ts-expect-error
380
- View: ModalImage,
381
- }, 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 })));
382
409
  };
383
410
 
384
411
  var UnMemoizedGallery = function (props) {
@@ -397,14 +424,16 @@ var UnMemoizedGallery = function (props) {
397
424
  };
398
425
  var formattedArray = React.useMemo(function () {
399
426
  return images.map(function (image) { return ({
427
+ original: image.image_url || image.thumb_url || '',
428
+ originalAlt: 'User uploaded content',
400
429
  source: image.image_url || image.thumb_url || '',
401
430
  }); });
402
431
  }, [images]);
403
- 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); } },
404
- 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 }))); });
405
434
  return (React__default['default'].createElement("div", { className: "str-chat__gallery " + (images.length > 3 ? 'str-chat__gallery--square' : '') },
406
435
  renderImages,
407
- 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: {
408
437
  backgroundImage: "url(" + images[3].image_url + ")",
409
438
  } },
410
439
  React__default['default'].createElement("p", null, t('{{ imageCount }} more', {
@@ -424,10 +453,12 @@ var ImageComponent = function (props) {
424
453
  var _a = React.useState(false), modalIsOpen = _a[0], setModalIsOpen = _a[1];
425
454
  var fallback = props.fallback, image_url = props.image_url, thumb_url = props.thumb_url;
426
455
  var imageSrc = sanitizeUrl.sanitizeUrl(image_url || thumb_url);
427
- var formattedArray = [{ source: imageSrc }];
456
+ var formattedArray = [
457
+ { original: imageSrc, originalAlt: 'User uploaded content', source: imageSrc },
458
+ ];
428
459
  var toggleModal = function () { return setModalIsOpen(!modalIsOpen); };
429
460
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
430
- 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 }),
431
462
  React__default['default'].createElement(ModalComponent, { images: formattedArray, index: 0, modalIsOpen: modalIsOpen, toggleModal: toggleModal })));
432
463
  };
433
464
 
@@ -600,14 +631,12 @@ var Item = /*#__PURE__*/React__default['default'].forwardRef(function Item(props
600
631
  return /*#__PURE__*/React__default['default'].createElement("li", {
601
632
  className: "rta__item ".concat(className || ''),
602
633
  style: style
603
- }, /*#__PURE__*/React__default['default'].createElement("div", {
634
+ }, /*#__PURE__*/React__default['default'].createElement("button", {
604
635
  className: "rta__entity ".concat(selected ? 'rta__entity--selected' : ''),
605
636
  onClick: onClickHandler,
606
637
  onFocus: selectItem,
607
638
  onMouseEnter: selectItem,
608
- ref: innerRef,
609
- role: "button",
610
- tabIndex: 0
639
+ ref: innerRef
611
640
  }, /*#__PURE__*/React__default['default'].createElement(Component, {
612
641
  entity: item,
613
642
  selected: selected
@@ -684,6 +713,23 @@ var messageCodeBlocks = function (message) {
684
713
  var matches = message.match(codeRegex);
685
714
  return matches || [];
686
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
+ }
687
733
  var markDownRenderers = {
688
734
  // eslint-disable-next-line react/display-name
689
735
  link: function (props) {
@@ -748,7 +794,6 @@ var renderText = function (text, mentioned_users, options) {
748
794
  var newText = text;
749
795
  var markdownLinks = matchMarkdownLinks(newText);
750
796
  var codeBlocks = messageCodeBlocks(newText);
751
- var detectHttp = /(http(s?):\/\/)?(www\.)?/;
752
797
  // extract all valid links/emails within text and replace it with proper markup
753
798
  uniqBy__default['default'](linkify__namespace.find(newText), 'value').forEach(function (_a) {
754
799
  var href = _a.href, type = _a.type, value = _a.value;
@@ -764,8 +809,12 @@ var renderText = function (text, mentioned_users, options) {
764
809
  });
765
810
  if (noParsingNeeded.length > 0 || linkIsInBlock)
766
811
  return;
767
- var displayLink = type === 'email' ? value : value.replace(detectHttp, '');
768
- 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
+ }
769
818
  });
770
819
  var plugins = [emojiMarkdownPlugin];
771
820
  if (mentioned_users === null || mentioned_users === void 0 ? void 0 : mentioned_users.length) {
@@ -1025,7 +1074,6 @@ var List = function List(props) {
1025
1074
 
1026
1075
  if ((event.which === KEY_CODES.ENTER || event.which === KEY_CODES.TAB) && selectedItem !== undefined) {
1027
1076
  handleClick(event);
1028
- return setSelectedItem(undefined);
1029
1077
  }
1030
1078
 
1031
1079
  return null;
@@ -1534,13 +1582,6 @@ var ReactTextareaAutocomplete = /*#__PURE__*/function (_React$Component) {
1534
1582
  return data;
1535
1583
  });
1536
1584
 
1537
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "_createRegExp", function () {
1538
- var trigger = _this.props.trigger; // negative lookahead to match only the trigger + the actual token = "bladhwd:adawd:word test" => ":word"
1539
- // https://stackoverflow.com/a/8057827/2719917
1540
-
1541
- _this.tokenRegExp = new RegExp("([".concat(Object.keys(trigger).join(''), "])(?:(?!\\1)[^\\s])*$"));
1542
- });
1543
-
1544
1585
  _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "_closeAutocomplete", function () {
1545
1586
  _this.setState({
1546
1587
  currentTrigger: null,
@@ -1759,8 +1800,6 @@ var ReactTextareaAutocomplete = /*#__PURE__*/function (_React$Component) {
1759
1800
  _value = _this$props6.value; // TODO: it would be better to have the parent control state...
1760
1801
  // if (value) this.state.value = value;
1761
1802
 
1762
- _this._createRegExp();
1763
-
1764
1803
  if (!loadingComponent) {
1765
1804
  throw new Error('RTA: loadingComponent is not defined');
1766
1805
  }
@@ -1815,40 +1854,12 @@ var ReactTextareaAutocomplete = /*#__PURE__*/function (_React$Component) {
1815
1854
  });
1816
1855
  Listeners.startListen();
1817
1856
  }
1818
- }, {
1819
- key: "UNSAFE_componentWillReceiveProps",
1820
- value: function UNSAFE_componentWillReceiveProps(nextProps) {
1821
- this._update(nextProps);
1822
- }
1823
1857
  }, {
1824
1858
  key: "componentWillUnmount",
1825
1859
  value: function componentWillUnmount() {
1826
1860
  Listeners.stopListen();
1827
1861
  Listeners.remove(this.state.listenerIndex);
1828
1862
  }
1829
- }, {
1830
- key: "_update",
1831
- value: // TODO: This is an anti pattern in react, should come up with a better way
1832
- function _update(_ref) {
1833
- var trigger = _ref.trigger,
1834
- value = _ref.value;
1835
- var oldValue = this.state.value;
1836
- var oldTrigger = this.props.trigger;
1837
- if (value !== oldValue || !oldValue) this.setState({
1838
- value: value
1839
- });
1840
- /**
1841
- * check if trigger chars are changed, if so, change the regexp accordingly
1842
- */
1843
-
1844
- if (Object.keys(trigger).join('') !== Object.keys(oldTrigger).join('')) {
1845
- this._createRegExp();
1846
- }
1847
- }
1848
- /**
1849
- * Close autocomplete, also clean up trigger (to avoid slow promises)
1850
- */
1851
-
1852
1863
  }, {
1853
1864
  key: "renderSuggestionListContainer",
1854
1865
  value: function renderSuggestionListContainer() {
@@ -1869,8 +1880,8 @@ var ReactTextareaAutocomplete = /*#__PURE__*/function (_React$Component) {
1869
1880
  if (triggerProps.values && triggerProps.currentTrigger && !(disableMentions && triggerProps.currentTrigger === '@')) {
1870
1881
  return /*#__PURE__*/React__default['default'].createElement("div", {
1871
1882
  className: "rta__autocomplete ".concat(dropdownClassName || ''),
1872
- ref: function ref(_ref2) {
1873
- _this3.dropdownRef = _ref2;
1883
+ ref: function ref(_ref) {
1884
+ _this3.dropdownRef = _ref;
1874
1885
  },
1875
1886
  style: dropdownStyle
1876
1887
  }, /*#__PURE__*/React__default['default'].createElement(SuggestionList, _extends__default['default']({
@@ -1912,14 +1923,34 @@ var ReactTextareaAutocomplete = /*#__PURE__*/function (_React$Component) {
1912
1923
  onFocus: this.props.onFocus,
1913
1924
  onScroll: this._onScrollHandler,
1914
1925
  onSelect: this._selectHandler,
1915
- ref: function ref(_ref3) {
1916
- if (_this4.props.innerRef) _this4.props.innerRef(_ref3);
1917
- _this4.textareaRef = _ref3;
1926
+ ref: function ref(_ref2) {
1927
+ if (_this4.props.innerRef) _this4.props.innerRef(_ref2);
1928
+ _this4.textareaRef = _ref2;
1918
1929
  },
1919
1930
  style: style,
1920
1931
  value: value
1921
1932
  }, this.props.additionalTextareaProps)));
1922
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
+
1923
1954
  }]);
1924
1955
 
1925
1956
  return ReactTextareaAutocomplete;
@@ -2322,7 +2353,7 @@ var useUserRole = function (message, onlySenderCanEdit, disableQuotedMessages) {
2322
2353
  (isMyMessage && channelCapabilities['delete-own-message']);
2323
2354
  var canFlag = !isMyMessage;
2324
2355
  var canMute = !isMyMessage && (channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.mutes);
2325
- var canQuote = !disableQuotedMessages;
2356
+ var canQuote = !disableQuotedMessages && channelCapabilities['quote-message'];
2326
2357
  var canReact = (channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.reactions) !== false && channelCapabilities['send-reaction'];
2327
2358
  var canReply = (channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.replies) !== false && channelCapabilities['send-reply'];
2328
2359
  return {
@@ -2718,8 +2749,7 @@ var CustomMessageActionsList = function (props) {
2718
2749
  var customActionsArray = Object.keys(customMessageActions);
2719
2750
  return (React__default['default'].createElement(React__default['default'].Fragment, null, customActionsArray.map(function (customAction) {
2720
2751
  var customHandler = customMessageActions[customAction];
2721
- return (React__default['default'].createElement("button", { key: customAction, onClick: function (event) { return customHandler(message, event); } },
2722
- 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));
2723
2753
  })));
2724
2754
  };
2725
2755
  var UnMemoizedMessageActionsBox = function (props) {
@@ -2746,32 +2776,26 @@ var UnMemoizedMessageActionsBox = function (props) {
2746
2776
  }, [messageListRect, mine, open]);
2747
2777
  var handleQuote = function () {
2748
2778
  setQuotedMessage(message);
2749
- 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');
2750
2782
  var textarea = elements.item(0);
2751
2783
  if (textarea instanceof HTMLTextAreaElement) {
2752
2784
  textarea.focus();
2753
2785
  }
2754
2786
  };
2755
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 },
2756
- 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' },
2757
2789
  customMessageActions && (React__default['default'].createElement(CustomMessageActionsList, { customMessageActions: customMessageActions, message: message })),
2758
- messageActions.indexOf(MESSAGE_ACTIONS.quote) > -1 &&
2759
- !message.parent_id &&
2760
- !message.quoted_message && (React__default['default'].createElement("button", { onClick: handleQuote },
2761
- React__default['default'].createElement("li", { className: 'str-chat__message-actions-list-item' }, t('Reply')))),
2762
- messageActions.indexOf(MESSAGE_ACTIONS.pin) > -1 && !message.parent_id && (React__default['default'].createElement("button", { onClick: handlePin },
2763
- React__default['default'].createElement("li", { className: 'str-chat__message-actions-list-item' }, !message.pinned ? t('Pin') : t('Unpin')))),
2764
- messageActions.indexOf(MESSAGE_ACTIONS.flag) > -1 && (React__default['default'].createElement("button", { onClick: handleFlag },
2765
- React__default['default'].createElement("li", { className: 'str-chat__message-actions-list-item' }, t('Flag')))),
2766
- messageActions.indexOf(MESSAGE_ACTIONS.mute) > -1 && (React__default['default'].createElement("button", { onClick: handleMute },
2767
- React__default['default'].createElement("li", { className: 'str-chat__message-actions-list-item' }, isUserMuted() ? t('Unmute') : t('Mute')))),
2768
- messageActions.indexOf(MESSAGE_ACTIONS.edit) > -1 && (React__default['default'].createElement("button", { onClick: handleEdit },
2769
- React__default['default'].createElement("li", { className: 'str-chat__message-actions-list-item' }, t('Edit Message')))),
2770
- messageActions.indexOf(MESSAGE_ACTIONS.delete) > -1 && (React__default['default'].createElement("button", { onClick: handleDelete },
2771
- 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'))))));
2772
2796
  };
2773
2797
  /**
2774
- * 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.
2775
2799
  */
2776
2800
  var MessageActionsBox = React__default['default'].memo(UnMemoizedMessageActionsBox);
2777
2801
 
@@ -2813,7 +2837,8 @@ var MessageActions = function (props) {
2813
2837
  return null;
2814
2838
  return (React__default['default'].createElement(MessageActionsWrapper, { customWrapperClass: customWrapperClass, inline: inline, setActionsBoxOpen: setActionsBoxOpen },
2815
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 }),
2816
- 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))));
2817
2842
  };
2818
2843
  var MessageActionsWrapper = function (props) {
2819
2844
  var children = props.children, customWrapperClass = props.customWrapperClass, inline = props.inline, setActionsBoxOpen = props.setActionsBoxOpen;
@@ -2853,15 +2878,15 @@ var UnMemoizedMessageOptions = function (props) {
2853
2878
  if (isMyMessage() && displayLeft) {
2854
2879
  return (React__default['default'].createElement("div", { className: "str-chat__message-" + theme + "__actions", "data-testid": 'message-options-left' },
2855
2880
  showActionsBox && (React__default['default'].createElement(MessageActions, { ActionsIcon: ActionsIcon$1, messageWrapperRef: messageWrapperRef })),
2856
- 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 },
2857
2882
  React__default['default'].createElement(ThreadIcon$1, null))),
2858
- 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 },
2859
2884
  React__default['default'].createElement(ReactionIcon$1, null)))));
2860
2885
  }
2861
2886
  return (React__default['default'].createElement("div", { className: "str-chat__message-" + theme + "__actions", "data-testid": 'message-options' },
2862
- 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 },
2863
2888
  React__default['default'].createElement(ReactionIcon$1, null))),
2864
- 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 },
2865
2890
  React__default['default'].createElement(ThreadIcon$1, null))),
2866
2891
  showActionsBox && (React__default['default'].createElement(MessageActions, { ActionsIcon: ActionsIcon$1, messageWrapperRef: messageWrapperRef }))));
2867
2892
  };
@@ -3740,7 +3765,7 @@ var searchLocalUsers = function (params) {
3740
3765
  var transliterate;
3741
3766
  return __generator(this, function (_a) {
3742
3767
  switch (_a.label) {
3743
- 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')); })];
3744
3769
  case 1:
3745
3770
  transliterate = (_a.sent()).default;
3746
3771
  updatedName = transliterate(user.name || '').toLowerCase();
@@ -4103,7 +4128,7 @@ var FileUploadIconFlat = function () {
4103
4128
  var SendButton = function (_a) {
4104
4129
  var sendMessage = _a.sendMessage;
4105
4130
  var t = useTranslationContext('SendButton').t;
4106
- 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 },
4107
4132
  React__default['default'].createElement("svg", { height: '17', viewBox: '0 0 18 17', width: '18', xmlns: 'http://www.w3.org/2000/svg' },
4108
4133
  React__default['default'].createElement("title", null, t('Send')),
4109
4134
  React__default['default'].createElement("path", { d: 'M0 17.015l17.333-8.508L0 0v6.617l12.417 1.89L0 10.397z', fill: '#006cff', fillRule: 'evenodd' }))));
@@ -4129,7 +4154,8 @@ var UploadsPreview = function () {
4129
4154
  }
4130
4155
  }, [device, numberOfUploads, text]);
4131
4156
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
4132
- 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 })),
4133
4159
  fileOrder.length > 0 && (React__default['default'].createElement(reactFileUtils.FilePreviewer, { handleFiles: uploadNewFiles, handleRemove: removeFile, handleRetry: uploadFile, uploads: filesToPreview }))));
4134
4160
  };
4135
4161
 
@@ -4139,32 +4165,34 @@ var UnMemoizedChatAutoComplete = function (props) {
4139
4165
  var messageInput = useMessageInputContext('ChatAutoComplete');
4140
4166
  var cooldownRemaining = messageInput.cooldownRemaining, disabled = messageInput.disabled, emojiIndex = messageInput.emojiIndex, innerRef = messageInput.textareaRef;
4141
4167
  var placeholder = props.placeholder || t('Type your message');
4142
- var emojiReplace = function (word) {
4143
- var found = (emojiIndex === null || emojiIndex === void 0 ? void 0 : emojiIndex.search(word)) || [];
4144
- var emoji = found
4145
- .filter(Boolean)
4146
- .slice(0, 10)
4147
- .find(function (_a) {
4148
- var emoticons = _a.emoticons;
4149
- return !!(emoticons === null || emoticons === void 0 ? void 0 : emoticons.includes(word));
4150
- });
4151
- if (!emoji || !('native' in emoji))
4152
- return null;
4153
- return emoji.native;
4154
- };
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
+ };
4155
4183
  var updateInnerRef = React.useCallback(function (ref) {
4156
4184
  if (innerRef) {
4157
4185
  innerRef.current = ref;
4158
4186
  }
4159
4187
  }, [innerRef]);
4160
- 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 }));
4161
4189
  };
4162
4190
  var ChatAutoComplete = React__default['default'].memo(UnMemoizedChatAutoComplete);
4163
4191
 
4164
4192
  var EditMessageForm = function () {
4165
4193
  var _a = useChannelStateContext('EditMessageForm'), acceptedFiles = _a.acceptedFiles, multipleUploads = _a.multipleUploads;
4166
4194
  var t = useTranslationContext('EditMessageForm').t;
4167
- 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;
4168
4196
  var _c = useComponentContext('EditMessageForm'), _d = _c.EmojiIcon, EmojiIcon = _d === void 0 ? EmojiIconSmall : _d, _e = _c.FileUploadIcon, FileUploadIcon$1 = _e === void 0 ? FileUploadIcon : _e;
4169
4197
  React.useEffect(function () {
4170
4198
  var onKeyDown = function (event) {
@@ -4182,7 +4210,7 @@ var EditMessageForm = function () {
4182
4210
  React__default['default'].createElement(ChatAutoComplete, null),
4183
4211
  React__default['default'].createElement("div", { className: 'str-chat__message-team-form-footer' },
4184
4212
  React__default['default'].createElement("div", { className: 'str-chat__edit-message-form-options' },
4185
- 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 },
4186
4214
  React__default['default'].createElement(EmojiIcon, null)),
4187
4215
  isUploadEnabled && (React__default['default'].createElement("div", { className: 'str-chat__fileupload-wrapper', "data-testid": 'fileinput' },
4188
4216
  React__default['default'].createElement(Tooltip, null, maxFilesLeft
@@ -4590,6 +4618,7 @@ var useMessageInputText = function (props, state, dispatch) {
4590
4618
  var useEmojiPicker = function (state, dispatch, insertText, textareaRef, closeEmojiPickerOnClick) {
4591
4619
  var emojiPickerRef = React.useRef(null);
4592
4620
  var closeEmojiPicker = React.useCallback(function (event) {
4621
+ event.preventDefault();
4593
4622
  if (emojiPickerRef.current && !emojiPickerRef.current.contains(event.target)) {
4594
4623
  dispatch({
4595
4624
  type: 'setEmojiPickerIsOpen',
@@ -4598,6 +4627,7 @@ var useEmojiPicker = function (state, dispatch, insertText, textareaRef, closeEm
4598
4627
  }
4599
4628
  }, [emojiPickerRef]);
4600
4629
  var openEmojiPicker = React.useCallback(function (event) {
4630
+ event.preventDefault();
4601
4631
  dispatch({
4602
4632
  type: 'setEmojiPickerIsOpen',
4603
4633
  value: true,
@@ -4981,7 +5011,7 @@ var useMessageInputState = function (props) {
4981
5011
  var closeCommandsList = function () { return setShowCommandsList(false); };
4982
5012
  var openMentionsList = function () {
4983
5013
  dispatch({
4984
- getNewText: function () { return '@'; },
5014
+ getNewText: function (currentText) { return currentText + '@'; },
4985
5015
  type: 'setText',
4986
5016
  });
4987
5017
  setShowMentionsList(true);
@@ -5011,15 +5041,16 @@ var QuotedMessagePreviewHeader = function () {
5011
5041
  var t = useTranslationContext('QuotedMessagePreview').t;
5012
5042
  return (React__default['default'].createElement("div", { className: 'quoted-message-preview-header' },
5013
5043
  React__default['default'].createElement("div", null, t('Reply to Message')),
5014
- 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); } },
5015
5045
  React__default['default'].createElement("svg", { height: '10', width: '10', xmlns: 'http://www.w3.org/2000/svg' },
5016
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' })))));
5017
5047
  };
5018
5048
  var QuotedMessagePreview = function (props) {
5019
5049
  var _a;
5020
5050
  var quotedMessage = props.quotedMessage;
5021
- var Attachment = useComponentContext('QuotedMessagePreview').Attachment;
5051
+ var _b = useComponentContext('QuotedMessagePreview'), Attachment = _b.Attachment, ContextAvatar = _b.Avatar;
5022
5052
  var userLanguage = useTranslationContext('QuotedMessagePreview').userLanguage;
5053
+ var Avatar$1 = ContextAvatar || Avatar;
5023
5054
  var quotedMessageText = ((_a = quotedMessage.i18n) === null || _a === void 0 ? void 0 : _a[userLanguage + "_text"]) ||
5024
5055
  quotedMessage.text;
5025
5056
  // @ts-expect-error
@@ -5032,7 +5063,7 @@ var QuotedMessagePreview = function (props) {
5032
5063
  return (React__default['default'].createElement("div", { className: 'quoted-message-preview' },
5033
5064
  React__default['default'].createElement(QuotedMessagePreviewHeader, null),
5034
5065
  React__default['default'].createElement("div", { className: 'quoted-message-preview-content' },
5035
- 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 })),
5036
5067
  React__default['default'].createElement("div", { className: 'quoted-message-preview-content-inner' },
5037
5068
  quotedMessageAttachment && React__default['default'].createElement(Attachment, { attachments: [quotedMessageAttachment] }),
5038
5069
  React__default['default'].createElement("div", null, quotedMessageText)))));
@@ -5041,17 +5072,17 @@ var QuotedMessagePreview = function (props) {
5041
5072
  var MessageInputFlat = function () {
5042
5073
  var _a = useChannelStateContext('MessageInputFlat'), acceptedFiles = _a.acceptedFiles, multipleUploads = _a.multipleUploads, quotedMessage = _a.quotedMessage;
5043
5074
  var t = useTranslationContext('MessageInputFlat').t;
5044
- 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;
5045
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;
5046
- 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) },
5047
5078
  React__default['default'].createElement(reactFileUtils.ImageDropzone, { accept: acceptedFiles, disabled: !isUploadEnabled || maxFilesLeft === 0 || !!cooldownRemaining, handleFiles: uploadNewFiles, maxNumberOfFiles: maxFilesLeft, multiple: multipleUploads },
5048
- quotedMessage && React__default['default'].createElement(QuotedMessagePreview$1, { quotedMessage: quotedMessage }),
5079
+ quotedMessage && !quotedMessage.parent_id && (React__default['default'].createElement(QuotedMessagePreview$1, { quotedMessage: quotedMessage })),
5049
5080
  React__default['default'].createElement("div", { className: 'str-chat__input-flat-wrapper' },
5050
5081
  React__default['default'].createElement("div", { className: 'str-chat__input-flat--textarea-wrapper' },
5051
5082
  isUploadEnabled && React__default['default'].createElement(UploadsPreview, null),
5052
5083
  React__default['default'].createElement("div", { className: 'str-chat__emojiselect-wrapper' },
5053
5084
  React__default['default'].createElement(Tooltip, null, emojiPickerIsOpen ? t('Close emoji picker') : t('Open emoji picker')),
5054
- 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' },
5055
5086
  React__default['default'].createElement(CooldownTimer$1, { cooldownInterval: cooldownInterval, setCooldownRemaining: setCooldownRemaining }))) : (React__default['default'].createElement(EmojiIcon, null)))),
5056
5087
  React__default['default'].createElement(EmojiPicker, null),
5057
5088
  React__default['default'].createElement(ChatAutoComplete, null),
@@ -5187,13 +5218,14 @@ var UnMemoizedMessageInput = function (props) {
5187
5218
  var MessageInput = React__default['default'].memo(UnMemoizedMessageInput);
5188
5219
 
5189
5220
  var MessageInputSmall = function () {
5190
- var _a = useChannelStateContext('MessageInputSmall'), acceptedFiles = _a.acceptedFiles, multipleUploads = _a.multipleUploads;
5221
+ var _a = useChannelStateContext('MessageInputSmall'), acceptedFiles = _a.acceptedFiles, multipleUploads = _a.multipleUploads, quotedMessage = _a.quotedMessage;
5191
5222
  var t = useTranslationContext('MessageInputSmall').t;
5192
- 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;
5193
- 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;
5194
5225
  return (React__default['default'].createElement("div", { className: 'str-chat__small-message-input__wrapper' },
5195
5226
  React__default['default'].createElement(reactFileUtils.ImageDropzone, { accept: acceptedFiles, disabled: !isUploadEnabled || maxFilesLeft === 0 || !!cooldownRemaining, handleFiles: uploadNewFiles, maxNumberOfFiles: maxFilesLeft, multiple: multipleUploads },
5196
- 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 })),
5197
5229
  React__default['default'].createElement("div", { className: 'str-chat__small-message-input--textarea-wrapper' },
5198
5230
  isUploadEnabled && React__default['default'].createElement(UploadsPreview, null),
5199
5231
  React__default['default'].createElement(ChatAutoComplete, null),
@@ -5208,7 +5240,7 @@ var MessageInputSmall = function () {
5208
5240
  React__default['default'].createElement(FileUploadIcon, null))))),
5209
5241
  React__default['default'].createElement("div", { className: 'str-chat__emojiselect-wrapper' },
5210
5242
  React__default['default'].createElement(Tooltip, null, emojiPickerIsOpen ? t('Close emoji picker') : t('Open emoji picker')),
5211
- 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 },
5212
5244
  React__default['default'].createElement(EmojiIcon, null))))),
5213
5245
  React__default['default'].createElement(EmojiPicker, { small: true })),
5214
5246
  !cooldownRemaining && React__default['default'].createElement(SendButton$1, { sendMessage: handleSubmit })))));
@@ -5235,38 +5267,6 @@ var MML = function (props) {
5235
5267
  React__default['default'].createElement(MMLReact, { className: "mml-align-" + align, Loading: null, onSubmit: actionHandler, source: source, Success: null, theme: (theme || '').replace(' ', '-') })));
5236
5268
  };
5237
5269
 
5238
- var Modal = function (props) {
5239
- var children = props.children, onClose = props.onClose, open = props.open;
5240
- var t = useTranslationContext('Modal').t;
5241
- var innerRef = React.useRef(null);
5242
- var handleClick = function (event) {
5243
- var _a;
5244
- if (event.target instanceof HTMLDivElement &&
5245
- !((_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target)) &&
5246
- onClose) {
5247
- onClose();
5248
- }
5249
- };
5250
- React.useEffect(function () {
5251
- if (!open)
5252
- return function () { return null; };
5253
- var handleEscKey = function (event) {
5254
- if (event instanceof KeyboardEvent && event.key === 'Escape' && onClose) {
5255
- onClose();
5256
- }
5257
- };
5258
- document.addEventListener('keypress', handleEscKey);
5259
- return function () { return document.removeEventListener('keypress', handleEscKey); };
5260
- }, [onClose, open]);
5261
- var openClasses = open ? 'str-chat__modal--open' : 'str-chat__modal--closed';
5262
- return (React__default['default'].createElement("div", { className: "str-chat__modal " + openClasses, onClick: handleClick },
5263
- React__default['default'].createElement("div", { className: 'str-chat__modal__close-button' },
5264
- t('Close'),
5265
- React__default['default'].createElement("svg", { height: '10', width: '10', xmlns: 'http://www.w3.org/2000/svg' },
5266
- 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' }))),
5267
- React__default['default'].createElement("div", { className: 'str-chat__modal__inner', ref: innerRef }, children)));
5268
- };
5269
-
5270
5270
  var isMutableRef = function (ref) {
5271
5271
  if (ref) {
5272
5272
  return ref.current !== undefined;
@@ -5344,12 +5344,13 @@ var UnMemoizedReactionSelector = React__default['default'].forwardRef(function (
5344
5344
  React__default['default'].createElement("ul", { className: 'str-chat__message-reactions-list' }, reactionOptions.map(function (reactionOption) {
5345
5345
  var latestUser = getLatestUserForReactionType(reactionOption.id);
5346
5346
  var count = reactionCounts && reactionCounts[reactionOption.id];
5347
- 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); } },
5348
- !!count && detailedView && (React__default['default'].createElement(React__default['default'].Fragment, null,
5349
- 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' }))))),
5350
- React__default['default'].createElement(React.Suspense, { fallback: null },
5351
- React__default['default'].createElement(Emoji, __assign({ data: emojiData, emoji: reactionOption, size: 20 }, (reactionsAreCustom ? additionalEmojiProps : emojiSetDef)))),
5352
- 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 || '')))));
5353
5354
  }))));
5354
5355
  });
5355
5356
  /**
@@ -5399,14 +5400,15 @@ var UnMemoizedReactionsList = function (props) {
5399
5400
  var supportedReactionsArePresent = messageReactionTypes.some(function (type) { return supportedReactionMap[type]; });
5400
5401
  if (!supportedReactionsArePresent)
5401
5402
  return null;
5402
- 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' },
5403
5404
  React__default['default'].createElement("ul", null,
5404
5405
  messageReactionTypes.map(function (reactionType) {
5405
5406
  var emojiObject = getEmojiByReactionType(reactionType);
5406
5407
  return emojiObject ? (React__default['default'].createElement("li", { key: emojiObject.id },
5407
- React__default['default'].createElement(React.Suspense, { fallback: null },
5408
- React__default['default'].createElement(Emoji, __assign({ data: emojiData, emoji: emojiObject, size: 16 }, (reactionsAreCustom ? additionalEmojiProps : emojiSetDef)))),
5409
- "\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;
5410
5412
  }),
5411
5413
  React__default['default'].createElement("li", null,
5412
5414
  React__default['default'].createElement("span", { className: 'str-chat__reaction-list--counter' }, getTotalReactionCount())))));
@@ -5475,7 +5477,7 @@ var UnMemoizedSimpleReactionsList = function (props) {
5475
5477
  messageReactionTypes.map(function (reactionType, i) {
5476
5478
  var _a;
5477
5479
  var emojiObject = getEmojiByReactionType(reactionType);
5478
- 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); } },
5479
5481
  React__default['default'].createElement("span", { onMouseEnter: function () { return setTooltipReactionType(reactionType); } },
5480
5482
  React__default['default'].createElement(React.Suspense, { fallback: null },
5481
5483
  React__default['default'].createElement(Emoji, __assign({ data: emojiData, emoji: emojiObject, size: 13 }, (reactionsAreCustom ? additionalEmojiProps : emojiSetDef)))),
@@ -5511,6 +5513,8 @@ var MessageSimpleWithContext = function (props) {
5511
5513
  React__default['default'].createElement(MessageStatus$1, null),
5512
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 })),
5513
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
5514
5518
  ? function () { return handleRetry(message); }
5515
5519
  : undefined },
5516
5520
  React__default['default'].createElement(React__default['default'].Fragment, null,
@@ -5830,7 +5834,7 @@ var ChannelInner = function (props) {
5830
5834
  return id;
5831
5835
  })
5832
5836
  : mentioned_users;
5833
- 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);
5834
5838
  _b.label = 1;
5835
5839
  case 1:
5836
5840
  _b.trys.push([1, 6, , 7]);
@@ -5849,7 +5853,7 @@ var ChannelInner = function (props) {
5849
5853
  if (messageResponse === null || messageResponse === void 0 ? void 0 : messageResponse.message) {
5850
5854
  updateMessage(__assign(__assign({}, messageResponse.message), { status: 'received' }));
5851
5855
  }
5852
- if (quotedMessage)
5856
+ if (quotedMessage && parent_id === (quotedMessage === null || quotedMessage === void 0 ? void 0 : quotedMessage.parent_id))
5853
5857
  setQuotedMessage(undefined);
5854
5858
  return [3 /*break*/, 7];
5855
5859
  case 6:
@@ -5907,6 +5911,14 @@ var ChannelInner = function (props) {
5907
5911
  /** THREAD */
5908
5912
  var openThread = function (message, event) {
5909
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
+ });
5910
5922
  dispatch({ channel: channel, message: message, type: 'openThread' });
5911
5923
  };
5912
5924
  var closeThread = function (event) {
@@ -6076,7 +6088,7 @@ var UnMemoizedChannelHeader = function (props) {
6076
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;
6077
6089
  var image = propImage || channelImage;
6078
6090
  return (React__default['default'].createElement("div", { className: 'str-chat__header-livestream' },
6079
- 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 },
6080
6092
  React__default['default'].createElement("span", { className: 'str-chat__header-hamburger--line' }),
6081
6093
  React__default['default'].createElement("span", { className: 'str-chat__header-hamburger--line' }),
6082
6094
  React__default['default'].createElement("span", { className: 'str-chat__header-hamburger--line' })),
@@ -6109,9 +6121,9 @@ var UnMemoizedChatDown = function (props) {
6109
6121
  return (React__default['default'].createElement("div", { className: 'str-chat__down' },
6110
6122
  React__default['default'].createElement(LoadingChannels, null),
6111
6123
  React__default['default'].createElement("div", { className: 'str-chat__down-main' },
6112
- 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 }),
6113
6125
  React__default['default'].createElement("h1", null, type),
6114
- 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.')))));
6115
6127
  };
6116
6128
  /**
6117
6129
  * A simple indicator that chat functionality isn't available, triggered when the Chat API is unavailable or your network isn't working.
@@ -6130,7 +6142,7 @@ var ChannelListMessenger = function (props) {
6130
6142
  return React__default['default'].createElement(LoadingIndicator, null);
6131
6143
  }
6132
6144
  return (React__default['default'].createElement("div", { className: 'str-chat__channel-list-messenger' },
6133
- 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)));
6134
6146
  };
6135
6147
 
6136
6148
  var useChannelDeletedListener = function (setChannels, customHandler) {
@@ -6207,10 +6219,11 @@ var useChannelUpdatedListener = function (setChannels, customHandler, forceUpdat
6207
6219
  React.useEffect(function () {
6208
6220
  var handleEvent = function (event) {
6209
6221
  setChannels(function (channels) {
6222
+ var _a, _b, _c, _d, _e, _f;
6210
6223
  var channelIndex = channels.findIndex(function (channel) { var _a; return channel.cid === ((_a = event.channel) === null || _a === void 0 ? void 0 : _a.cid); });
6211
6224
  if (channelIndex > -1 && event.channel) {
6212
6225
  var newChannels = channels;
6213
- 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 });
6214
6227
  return __spreadArray([], newChannels);
6215
6228
  }
6216
6229
  return channels;
@@ -6525,7 +6538,7 @@ var UnMemoizedChannelPreviewMessenger = function (props) {
6525
6538
  channelPreviewButton.current.blur();
6526
6539
  }
6527
6540
  };
6528
- 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' },
6529
6542
  React__default['default'].createElement("div", { className: 'str-chat__channel-preview-messenger--left' },
6530
6543
  React__default['default'].createElement(Avatar$1, { image: displayImage, name: avatarName, size: 40 })),
6531
6544
  React__default['default'].createElement("div", { className: 'str-chat__channel-preview-messenger--right' },
@@ -6668,20 +6681,20 @@ var isChannel = function (output) {
6668
6681
 
6669
6682
  var DefaultDropdownContainer = function (props) {
6670
6683
  var focusedUser = props.focusedUser, results = props.results, _a = props.SearchResultItem, SearchResultItem = _a === void 0 ? DefaultSearchResultItem : _a, selectResult = props.selectResult;
6671
- 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 })); })));
6672
6685
  };
6673
6686
  var DefaultSearchResultItem = function (props) {
6674
- var _a;
6687
+ var _a, _b;
6675
6688
  var focusedUser = props.focusedUser, index = props.index, result = props.result, selectResult = props.selectResult;
6676
6689
  var focused = focusedUser === index;
6677
6690
  if (isChannel(result)) {
6678
6691
  var channel_1 = result;
6679
- 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); } },
6680
6693
  React__default['default'].createElement("div", { className: 'result-hashtag' }, "#"),
6681
- 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)));
6682
6695
  }
6683
6696
  else {
6684
- 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); } },
6685
6698
  React__default['default'].createElement(Avatar, { image: result.image, user: result }),
6686
6699
  result.name || result.id));
6687
6700
  }
@@ -6727,7 +6740,7 @@ var SearchResults = function (props) {
6727
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...')))));
6728
6741
  }
6729
6742
  if (!results.length) {
6730
- 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')))));
6731
6744
  }
6732
6745
  return (React__default['default'].createElement(ResultsContainer, null,
6733
6746
  SearchResultsHeader && React__default['default'].createElement(SearchResultsHeader, null),
@@ -6852,7 +6865,7 @@ var UnMemoizedEmptyStateIndicator = function (props) {
6852
6865
  var listType = props.listType;
6853
6866
  var t = useTranslationContext('EmptyStateIndicator').t;
6854
6867
  if (listType === 'channel')
6855
- 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'));
6856
6869
  if (listType === 'message')
6857
6870
  return null;
6858
6871
  return React__default['default'].createElement("p", null, "No items exist");
@@ -6862,7 +6875,7 @@ var EmptyStateIndicator = React__default['default'].memo(UnMemoizedEmptyStateInd
6862
6875
  var UnMemoizedLoadMoreButton = function (props) {
6863
6876
  var _a = props.children, children = _a === void 0 ? 'Load more' : _a, onClick = props.onClick, refreshing = props.refreshing;
6864
6877
  return (React__default['default'].createElement("div", { className: 'str-chat__load-more-button' },
6865
- 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)));
6866
6879
  };
6867
6880
  var LoadMoreButton = React__default['default'].memo(UnMemoizedLoadMoreButton);
6868
6881
 
@@ -7606,7 +7619,7 @@ var Streami18n = /** @class */ (function () {
7606
7619
  return Streami18n;
7607
7620
  }());
7608
7621
 
7609
- var version = '6.12.2';
7622
+ var version = '6.13.0';
7610
7623
 
7611
7624
  var useChat = function (_a) {
7612
7625
  var _b;
@@ -8341,7 +8354,7 @@ var UnMemoizedCustomNotification = function (props) {
8341
8354
  var active = props.active, children = props.children, type = props.type;
8342
8355
  if (!active)
8343
8356
  return null;
8344
- 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));
8345
8358
  };
8346
8359
  var CustomNotification = React__default['default'].memo(UnMemoizedCustomNotification);
8347
8360
 
@@ -8793,7 +8806,7 @@ var UnMemoizedMessageNotification = function (props) {
8793
8806
  var children = props.children, onClick = props.onClick, _a = props.showNotification, showNotification = _a === void 0 ? true : _a;
8794
8807
  if (!showNotification)
8795
8808
  return null;
8796
- 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));
8797
8810
  };
8798
8811
  var MessageNotification = React__default['default'].memo(UnMemoizedMessageNotification);
8799
8812
 
@@ -9126,12 +9139,8 @@ var VirtualizedMessageListWithContext = function (props) {
9126
9139
  var groupedByUser = shouldGroupByUser &&
9127
9140
  streamMessageIndex > 0 &&
9128
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);
9129
- var firstOfGroup = shouldGroupByUser &&
9130
- streamMessageIndex > 0 &&
9131
- ((_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);
9132
- var endOfGroup = shouldGroupByUser &&
9133
- streamMessageIndex > 0 &&
9134
- ((_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);
9135
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 }));
9136
9145
  }, [customMessageRenderer, shouldGroupByUser, numItemsPrepended]);
9137
9146
  var virtuosoComponents = React.useMemo(function () {
@@ -9212,7 +9221,7 @@ var DefaultThreadHeader = function (props) {
9212
9221
  React__default['default'].createElement("div", { className: 'str-chat__thread-header-details' },
9213
9222
  React__default['default'].createElement("strong", null, t('Thread')),
9214
9223
  React__default['default'].createElement("small", null, getReplyCount())),
9215
- 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); } },
9216
9225
  React__default['default'].createElement("svg", { height: '10', width: '10', xmlns: 'http://www.w3.org/2000/svg' },
9217
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' })))));
9218
9227
  };
@@ -9260,10 +9269,7 @@ var ThreadInner = function (props) {
9260
9269
  var UnMemoizedWindow = function (props) {
9261
9270
  var children = props.children, _a = props.hideOnThread, hideOnThread = _a === void 0 ? false : _a;
9262
9271
  var thread = useChannelStateContext('Window').thread;
9263
- // If thread is active and window should hide on thread. Return null
9264
- if (thread && hideOnThread)
9265
- return null;
9266
- 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));
9267
9273
  };
9268
9274
  /**
9269
9275
  * A UI component for conditionally displaying a Thread or Channel
@@ -9356,9 +9362,9 @@ exports.MessageText = MessageText;
9356
9362
  exports.MessageTimestamp = MessageTimestamp;
9357
9363
  exports.Modal = Modal;
9358
9364
  exports.ModalComponent = ModalComponent;
9359
- exports.ModalImage = ModalImage;
9360
9365
  exports.PinIcon = PinIcon;
9361
9366
  exports.PinIndicator = PinIndicator;
9367
+ exports.QuotedMessagePreview = QuotedMessagePreview;
9362
9368
  exports.ReactionIcon = ReactionIcon;
9363
9369
  exports.ReactionSelector = ReactionSelector;
9364
9370
  exports.ReactionsList = ReactionsList;