stream-chat-react 10.0.0-theming-v2.2 → 10.0.1

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 (93) hide show
  1. package/dist/browser.full-bundle.js +1839 -2237
  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/AttachmentActions.d.ts.map +1 -1
  6. package/dist/components/Attachment/AttachmentActions.js +1 -1
  7. package/dist/components/Attachment/AttachmentContainer.js +2 -2
  8. package/dist/components/AutoCompleteTextarea/Textarea.d.ts +7 -0
  9. package/dist/components/AutoCompleteTextarea/Textarea.d.ts.map +1 -1
  10. package/dist/components/AutoCompleteTextarea/Textarea.js +10 -1
  11. package/dist/components/Channel/Channel.d.ts.map +1 -1
  12. package/dist/components/Channel/Channel.js +31 -23
  13. package/dist/components/ChannelList/ChannelList.d.ts +3 -9
  14. package/dist/components/ChannelList/ChannelList.d.ts.map +1 -1
  15. package/dist/components/ChannelList/ChannelList.js +24 -26
  16. package/dist/components/ChannelSearch/ChannelSearch.d.ts +6 -3
  17. package/dist/components/ChannelSearch/ChannelSearch.d.ts.map +1 -1
  18. package/dist/components/ChannelSearch/ChannelSearch.js +19 -2
  19. package/dist/components/ChannelSearch/SearchBar.js +1 -1
  20. package/dist/components/ChannelSearch/SearchInput.d.ts +3 -1
  21. package/dist/components/ChannelSearch/SearchInput.d.ts.map +1 -1
  22. package/dist/components/ChannelSearch/SearchInput.js +2 -2
  23. package/dist/components/ChannelSearch/SearchResults.js +1 -2
  24. package/dist/components/ChannelSearch/hooks/useChannelSearch.d.ts +9 -7
  25. package/dist/components/ChannelSearch/hooks/useChannelSearch.d.ts.map +1 -1
  26. package/dist/components/ChannelSearch/hooks/useChannelSearch.js +23 -29
  27. package/dist/components/Message/MessageStatus.d.ts.map +1 -1
  28. package/dist/components/Message/MessageStatus.js +32 -30
  29. package/dist/components/MessageActions/MessageActionsBox.js +1 -1
  30. package/dist/components/MessageInput/CooldownTimer.d.ts +7 -0
  31. package/dist/components/MessageInput/CooldownTimer.d.ts.map +1 -0
  32. package/dist/components/MessageInput/CooldownTimer.js +17 -0
  33. package/dist/components/MessageInput/MessageInputFlat.d.ts.map +1 -1
  34. package/dist/components/MessageInput/MessageInputFlat.js +6 -3
  35. package/dist/components/MessageInput/MessageInputSmall.d.ts.map +1 -1
  36. package/dist/components/MessageInput/MessageInputSmall.js +1 -1
  37. package/dist/components/MessageInput/hooks/useCooldownTimer.d.ts +0 -5
  38. package/dist/components/MessageInput/hooks/useCooldownTimer.d.ts.map +1 -1
  39. package/dist/components/MessageInput/hooks/useCooldownTimer.js +1 -17
  40. package/dist/components/MessageInput/icons.d.ts.map +1 -1
  41. package/dist/components/MessageInput/icons.js +3 -2
  42. package/dist/components/MessageInput/index.d.ts +1 -0
  43. package/dist/components/MessageInput/index.d.ts.map +1 -1
  44. package/dist/components/MessageInput/index.js +1 -0
  45. package/dist/components/Reactions/ReactionsList.d.ts.map +1 -1
  46. package/dist/components/Reactions/ReactionsList.js +18 -3
  47. package/dist/components/Reactions/hooks/useProcessReactions.d.ts +1 -0
  48. package/dist/components/Reactions/hooks/useProcessReactions.d.ts.map +1 -1
  49. package/dist/components/Reactions/hooks/useProcessReactions.js +11 -0
  50. package/dist/components/Tooltip/Tooltip.d.ts +14 -2
  51. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  52. package/dist/components/Tooltip/Tooltip.js +22 -3
  53. package/dist/components/Tooltip/hooks/index.d.ts +2 -0
  54. package/dist/components/Tooltip/hooks/index.d.ts.map +1 -0
  55. package/dist/components/Tooltip/hooks/index.js +1 -0
  56. package/dist/components/Tooltip/hooks/useEnterLeaveHandlers.d.ts +7 -0
  57. package/dist/components/Tooltip/hooks/useEnterLeaveHandlers.d.ts.map +1 -0
  58. package/dist/components/Tooltip/hooks/useEnterLeaveHandlers.js +14 -0
  59. package/dist/context/ChannelActionContext.d.ts +1 -1
  60. package/dist/context/ChannelActionContext.d.ts.map +1 -1
  61. package/dist/context/ChannelStateContext.d.ts +1 -1
  62. package/dist/context/ComponentContext.d.ts +1 -1
  63. package/dist/context/ComponentContext.d.ts.map +1 -1
  64. package/dist/context/DefaultEmoji.d.ts +3 -0
  65. package/dist/context/DefaultEmoji.d.ts.map +1 -0
  66. package/dist/context/DefaultEmoji.js +3 -0
  67. package/dist/context/DefaultEmojiPicker.d.ts +3 -0
  68. package/dist/context/DefaultEmojiPicker.d.ts.map +1 -0
  69. package/dist/context/DefaultEmojiPicker.js +3 -0
  70. package/dist/context/EmojiContext.d.ts.map +1 -1
  71. package/dist/context/EmojiContext.js +2 -58
  72. package/dist/css/index.css +1 -1
  73. package/dist/css/index.css.map +1 -1
  74. package/dist/css/v2/index.css +1 -1
  75. package/dist/css/v2/index.css.map +1 -1
  76. package/dist/css/v2/index.layout.css +1 -1
  77. package/dist/css/v2/index.layout.css.map +1 -1
  78. package/dist/index.cjs.js +1275 -1647
  79. package/dist/index.cjs.js.map +1 -1
  80. package/dist/scss/Attachment.scss +45 -2
  81. package/dist/scss/Gallery.scss +12 -6
  82. package/dist/scss/ImageCarousel.scss +6 -0
  83. package/dist/scss/Message.scss +8 -2
  84. package/dist/scss/MessageInput.scss +1 -0
  85. package/dist/scss/v2/AttachmentList/AttachmentList-layout.scss +72 -46
  86. package/dist/scss/v2/Autocomplete/Autocomplete-layout.scss +2 -0
  87. package/dist/scss/v2/Message/Message-layout.scss +7 -18
  88. package/dist/scss/v2/MessageReactions/MessageReactions-layout.scss +1 -10
  89. package/dist/scss/v2/Tooltip/Tooltip-layout.scss +2 -23
  90. package/dist/version.d.ts +1 -1
  91. package/dist/version.d.ts.map +1 -1
  92. package/dist/version.js +1 -1
  93. package/package.json +7 -9
package/dist/index.cjs.js CHANGED
@@ -28,7 +28,7 @@ require('dayjs/locale/tr');
28
28
  require('dayjs/locale/en');
29
29
  var ImageGallery = require('react-image-gallery');
30
30
  var reactFileUtils = require('react-file-utils');
31
- var _defineProperty$3 = require('@babel/runtime/helpers/defineProperty');
31
+ var _defineProperty$2 = require('@babel/runtime/helpers/defineProperty');
32
32
  var _slicedToArray$2 = require('@babel/runtime/helpers/slicedToArray');
33
33
  var emojiRegex = require('emoji-regex');
34
34
  var linkify = require('linkifyjs');
@@ -54,6 +54,8 @@ var streamChat = require('stream-chat');
54
54
  var deepequal = require('react-fast-compare');
55
55
  var ReactDOM = require('react-dom');
56
56
  var reactVirtuoso = require('react-virtuoso');
57
+ var nimbleEmoji = require('emoji-mart/dist/components/emoji/nimble-emoji');
58
+ var nimblePicker = require('emoji-mart/dist/components/picker/nimble-picker');
57
59
 
58
60
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
59
61
 
@@ -88,7 +90,7 @@ var updateLocale__default = /*#__PURE__*/_interopDefaultLegacy(updateLocale);
88
90
  var localeData__default = /*#__PURE__*/_interopDefaultLegacy(localeData);
89
91
  var relativeTime__default = /*#__PURE__*/_interopDefaultLegacy(relativeTime);
90
92
  var ImageGallery__default = /*#__PURE__*/_interopDefaultLegacy(ImageGallery);
91
- var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty$3);
93
+ var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty$2);
92
94
  var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray$2);
93
95
  var emojiRegex__default = /*#__PURE__*/_interopDefaultLegacy(emojiRegex);
94
96
  var linkify__namespace = /*#__PURE__*/_interopNamespace(linkify);
@@ -110,6 +112,8 @@ var debounce__default = /*#__PURE__*/_interopDefaultLegacy(debounce$1);
110
112
  var throttle__default = /*#__PURE__*/_interopDefaultLegacy(throttle);
111
113
  var deepequal__default = /*#__PURE__*/_interopDefaultLegacy(deepequal);
112
114
  var ReactDOM__namespace = /*#__PURE__*/_interopNamespace(ReactDOM);
115
+ var nimbleEmoji__default = /*#__PURE__*/_interopDefaultLegacy(nimbleEmoji);
116
+ var nimblePicker__default = /*#__PURE__*/_interopDefaultLegacy(nimblePicker);
113
117
 
114
118
  /*! *****************************************************************************
115
119
  Copyright (c) Microsoft Corporation.
@@ -243,7 +247,7 @@ var UnMemoizedAttachmentActions = function (props) {
243
247
  var handleActionClick = function (event, name, value) { return actionHandler === null || actionHandler === void 0 ? void 0 : actionHandler(name, value, event); };
244
248
  return (React__default["default"].createElement("div", { className: 'str-chat__message-attachment-actions' },
245
249
  React__default["default"].createElement("div", { className: 'str-chat__message-attachment-actions-form' },
246
- React__default["default"].createElement("span", { key: 0 }, text),
250
+ React__default["default"].createElement("span", null, text),
247
251
  actions.map(function (action) { return (React__default["default"].createElement("button", { className: "str-chat__message-attachment-actions-button str-chat__message-attachment-actions-button--".concat(action.style), "data-testid": "".concat(action.name), "data-value": action.value, key: "".concat(id, "-").concat(action.value), onClick: function (event) { return handleActionClick(event, action.name, action.value); } }, action.text)); }))));
248
252
  };
249
253
  /**
@@ -514,32 +518,12 @@ var withComponentContext = function (Component) {
514
518
  return WithComponentContextComponent;
515
519
  };
516
520
 
517
- var DefaultEmoji = React__default["default"].lazy(function () { return __awaiter$1(void 0, void 0, void 0, function () {
518
- var emoji;
519
- return __generator$1(this, function (_a) {
520
- switch (_a.label) {
521
- case 0: return [4 /*yield*/, Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('emoji-mart/dist/components/emoji/nimble-emoji.js')); })];
522
- case 1:
523
- emoji = _a.sent();
524
- return [2 /*return*/, { default: emoji.default }];
525
- }
526
- });
527
- }); });
528
- var DefaultEmojiPicker = React__default["default"].lazy(function () { return __awaiter$1(void 0, void 0, void 0, function () {
529
- var emojiPicker;
530
- return __generator$1(this, function (_a) {
531
- switch (_a.label) {
532
- case 0: return [4 /*yield*/, Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('emoji-mart/dist/components/picker/nimble-picker.js')); })];
533
- case 1:
534
- emojiPicker = _a.sent();
535
- return [2 /*return*/, { default: emojiPicker.default }];
536
- }
537
- });
538
- }); });
521
+ var DefaultEmoji$1 = React__default["default"].lazy(function () { return Promise.resolve().then(function () { return DefaultEmoji; }); });
522
+ var DefaultEmojiPicker$1 = React__default["default"].lazy(function () { return Promise.resolve().then(function () { return DefaultEmojiPicker; }); });
539
523
  var EmojiContext = React__default["default"].createContext(undefined);
540
524
  var EmojiProvider = function (_a) {
541
525
  var children = _a.children, value = _a.value;
542
- var _b = value.Emoji, Emoji = _b === void 0 ? DefaultEmoji : _b, emojiConfig = value.emojiConfig, _c = value.EmojiIndex, EmojiIndex = _c === void 0 ? DefaultEmojiIndex__default["default"] : _c, _d = value.EmojiPicker, EmojiPicker = _d === void 0 ? DefaultEmojiPicker : _d;
526
+ var _b = value.Emoji, Emoji = _b === void 0 ? DefaultEmoji$1 : _b, emojiConfig = value.emojiConfig, _c = value.EmojiIndex, EmojiIndex = _c === void 0 ? DefaultEmojiIndex__default["default"] : _c, _d = value.EmojiPicker, EmojiPicker = _d === void 0 ? DefaultEmojiPicker$1 : _d;
543
527
  var emojiContextValue = {
544
528
  Emoji: Emoji,
545
529
  emojiConfig: emojiConfig,
@@ -1744,7 +1728,7 @@ var AttachmentActionsContainer = function (_a) {
1744
1728
  var actionHandler = _a.actionHandler, attachment = _a.attachment, _c = _a.AttachmentActions, AttachmentActions$1 = _c === void 0 ? AttachmentActions : _c;
1745
1729
  if (!((_b = attachment.actions) === null || _b === void 0 ? void 0 : _b.length))
1746
1730
  return null;
1747
- return (React__default["default"].createElement(AttachmentActions$1, __assign({}, attachment, { actionHandler: function (event, name, value) { return actionHandler === null || actionHandler === void 0 ? void 0 : actionHandler(event, name, value); }, actions: attachment.actions, id: attachment.id || '', text: attachment.text || '' })));
1731
+ return (React__default["default"].createElement(AttachmentActions$1, __assign({}, attachment, { actionHandler: actionHandler, actions: attachment.actions, id: attachment.id || '', text: attachment.text || '' })));
1748
1732
  };
1749
1733
  var GalleryContainer = function (_a) {
1750
1734
  var attachment = _a.attachment, _b = _a.Gallery, Gallery$1 = _b === void 0 ? Gallery : _b;
@@ -1768,7 +1752,7 @@ var CardContainer = function (props) {
1768
1752
  var componentType = 'card';
1769
1753
  if (attachment.actions && attachment.actions.length) {
1770
1754
  return (React__default["default"].createElement(AttachmentWithinContainer, { attachment: attachment, componentType: componentType },
1771
- React__default["default"].createElement("div", { className: 'str-chat__attachment', key: "key-image-".concat(attachment.id) },
1755
+ React__default["default"].createElement("div", { className: 'str-chat__attachment' },
1772
1756
  React__default["default"].createElement(Card$1, __assign({}, attachment)),
1773
1757
  React__default["default"].createElement(AttachmentActionsContainer, __assign({}, props)))));
1774
1758
  }
@@ -3197,7 +3181,7 @@ var ReactTextareaAutocomplete = /*#__PURE__*/function (_React$Component) {
3197
3181
  });
3198
3182
 
3199
3183
  _defineProperty__default["default"](_assertThisInitialized__default["default"](_this), "_defaultShouldSubmit", function (event) {
3200
- return event.key === 'Enter' && !event.shiftKey;
3184
+ return event.key === 'Enter' && !event.shiftKey && !event.nativeEvent.isComposing;
3201
3185
  });
3202
3186
 
3203
3187
  _defineProperty__default["default"](_assertThisInitialized__default["default"](_this), "_handleKeyDown", function (event) {
@@ -4581,7 +4565,7 @@ var CustomMessageActionsList = function (props) {
4581
4565
  var customActionsArray = Object.keys(customMessageActions);
4582
4566
  return (React__default["default"].createElement(React__default["default"].Fragment, null, customActionsArray.map(function (customAction) {
4583
4567
  var customHandler = customMessageActions[customAction];
4584
- 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));
4568
+ return (React__default["default"].createElement("button", { "aria-selected": 'false', className: 'str-chat__message-actions-list-item str-chat__message-actions-list-item-button', key: customAction, onClick: function (event) { return customHandler(message, event); }, role: 'option' }, customAction));
4585
4569
  })));
4586
4570
  };
4587
4571
  var UnMemoizedMessageActionsBox = function (props) {
@@ -4749,876 +4733,183 @@ var UnMemoizedMessageRepliesCountButton = function (props) {
4749
4733
  };
4750
4734
  var MessageRepliesCountButton = React__default["default"].memo(UnMemoizedMessageRepliesCountButton);
4751
4735
 
4752
- var Tooltip = function (props) {
4753
- var children = props.children, rest = __rest(props, ["children"]);
4754
- return (React__default["default"].createElement("div", __assign({ className: 'str-chat__tooltip' }, rest), children));
4755
- };
4736
+ /**
4737
+ * Simple ponyfill for Object.fromEntries
4738
+ */
4756
4739
 
4757
- // TODO: remove after fully deprecating V1 theming
4758
- var TooltipContainer = function (_a) {
4759
- var children = _a.children;
4760
- var themeVersion = useChatContext('TooltipContainer').themeVersion;
4761
- return themeVersion === '2' ? (React__default["default"].createElement("div", { className: 'str-chat__message-status-tooltip-container' }, children)) : (React__default["default"].createElement(React__default["default"].Fragment, null, children));
4762
- };
4763
- var UnMemoizedMessageStatus = function (props) {
4764
- var _a;
4765
- var propAvatar = props.Avatar, _b = props.messageType, messageType = _b === void 0 ? 'simple' : _b, _c = props.tooltipUserNameMapper, tooltipUserNameMapper = _c === void 0 ? mapToUserNameOrId : _c;
4766
- var client = useChatContext('MessageStatus').client;
4767
- var contextAvatar = useComponentContext('MessageStatus').Avatar;
4768
- var _d = useMessageContext('MessageStatus'), isMyMessage = _d.isMyMessage, lastReceivedId = _d.lastReceivedId, message = _d.message, readBy = _d.readBy, threadList = _d.threadList;
4769
- var t = useTranslationContext('MessageStatus').t;
4770
- var themeVersion = useChatContext('MessageStatus').themeVersion;
4771
- var Avatar$1 = propAvatar || contextAvatar || Avatar;
4772
- if (!isMyMessage() || message.type === 'error') {
4773
- return null;
4774
- }
4775
- var justReadByMe = (readBy === null || readBy === void 0 ? void 0 : readBy.length) === 1 && readBy[0].id === ((_a = client.user) === null || _a === void 0 ? void 0 : _a.id);
4776
- var rootClassName = "str-chat__message-".concat(messageType, "-status str-chat__message-status");
4777
- if (message.status === 'sending') {
4778
- return (React__default["default"].createElement("span", { className: rootClassName, "data-testid": 'message-status-sending' },
4779
- React__default["default"].createElement(Tooltip, null, t('Sending...')),
4780
- React__default["default"].createElement(LoadingIndicator, null)));
4781
- }
4782
- if ((readBy === null || readBy === void 0 ? void 0 : readBy.length) && !threadList && !justReadByMe) {
4783
- var lastReadUser = readBy.filter(function (item) { var _a; return item.id !== ((_a = client.user) === null || _a === void 0 ? void 0 : _a.id); })[0];
4784
- return (React__default["default"].createElement("span", { className: rootClassName, "data-testid": 'message-status-read-by' },
4785
- React__default["default"].createElement(TooltipContainer, null,
4786
- React__default["default"].createElement(Tooltip, null, getReadByTooltipText(readBy, t, client, tooltipUserNameMapper)),
4787
- React__default["default"].createElement(Avatar$1, { image: lastReadUser.image, name: lastReadUser.name || lastReadUser.id, size: 15, user: lastReadUser })),
4788
- readBy.length > 2 && (React__default["default"].createElement("span", { className: "str-chat__message-".concat(messageType, "-status-number"), "data-testid": 'message-status-read-by-many' }, readBy.length - 1))));
4789
- }
4790
- if (message.status === 'received' && message.id === lastReceivedId && !threadList) {
4791
- return (React__default["default"].createElement("span", { className: rootClassName, "data-testid": 'message-status-received' },
4792
- React__default["default"].createElement(Tooltip, null, t('Delivered')),
4793
- themeVersion === '2' ? React__default["default"].createElement(MessageDeliveredIcon, null) : React__default["default"].createElement(DeliveredCheckIcon, null)));
4794
- }
4795
- return null;
4740
+ var fromEntries = function fromEntries(entries) {
4741
+ return entries.reduce(function (acc, _ref) {
4742
+ var key = _ref[0],
4743
+ value = _ref[1];
4744
+ acc[key] = value;
4745
+ return acc;
4746
+ }, {});
4796
4747
  };
4797
- var MessageStatus = React__default["default"].memo(UnMemoizedMessageStatus);
4748
+ /**
4749
+ * Small wrapper around `useLayoutEffect` to get rid of the warning on SSR envs
4750
+ */
4798
4751
 
4799
- var QuotedMessage = function () {
4800
- var _a, _b;
4801
- var _c = useComponentContext('QuotedMessage'), Attachment = _c.Attachment, ContextAvatar = _c.Avatar;
4802
- var _d = useMessageContext('QuotedMessage'), isMyMessage = _d.isMyMessage, message = _d.message;
4803
- var userLanguage = useTranslationContext('QuotedMessage').userLanguage;
4804
- var jumpToMessage = useChannelActionContext('QuotedMessage').jumpToMessage;
4805
- var Avatar$1 = ContextAvatar || Avatar;
4806
- var quoted_message = message.quoted_message;
4807
- if (!quoted_message)
4808
- return null;
4809
- var quotedMessageText = ((_a = quoted_message.i18n) === null || _a === void 0 ? void 0 : _a["".concat(userLanguage, "_text")]) ||
4810
- quoted_message.text;
4811
- // @ts-expect-error
4812
- var quotedMessageAttachment = quoted_message.attachments.length
4813
- ? // @ts-expect-error
4814
- quoted_message.attachments[0]
4815
- : null;
4816
- if (!quotedMessageText && !quotedMessageAttachment)
4817
- return null;
4818
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
4819
- React__default["default"].createElement("div", { className: clsx('str-chat__quoted-message-preview quoted-message', { mine: isMyMessage() }), onClickCapture: function (e) {
4820
- e.stopPropagation();
4821
- e.preventDefault();
4822
- jumpToMessage(quoted_message.id);
4823
- } },
4824
- quoted_message.user && (React__default["default"].createElement(Avatar$1, { image: quoted_message.user.image, name: quoted_message.user.name || quoted_message.user.id, size: 20, user: quoted_message.user })),
4825
- React__default["default"].createElement("div", { className: 'quoted-message-inner str-chat__quoted-message-bubble' },
4826
- quotedMessageAttachment && React__default["default"].createElement(Attachment, { attachments: [quotedMessageAttachment] }),
4827
- React__default["default"].createElement("div", null, quotedMessageText))),
4828
- ((_b = message.attachments) === null || _b === void 0 ? void 0 : _b.length) && message.quoted_message ? (React__default["default"].createElement(Attachment, { attachments: message.attachments })) : null));
4829
- };
4752
+ var useIsomorphicLayoutEffect = typeof window !== 'undefined' && window.document && window.document.createElement ? React__namespace.useLayoutEffect : React__namespace.useEffect;
4830
4753
 
4831
- var UnMemoizedMessageTextComponent = function (props) {
4832
- var _a;
4833
- var customInnerClass = props.customInnerClass, _b = props.customWrapperClass, customWrapperClass = _b === void 0 ? '' : _b, propMessage = props.message, _c = props.theme, theme = _c === void 0 ? 'simple' : _c;
4834
- var _d = useComponentContext('MessageText').QuotedMessage, QuotedMessage$1 = _d === void 0 ? QuotedMessage : _d;
4835
- var _e = useMessageContext('MessageText'), contextMessage = _e.message, onMentionsClickMessage = _e.onMentionsClickMessage, onMentionsHoverMessage = _e.onMentionsHoverMessage, _f = _e.renderText, renderText$1 = _f === void 0 ? renderText : _f, unsafeHTML = _e.unsafeHTML;
4836
- var _g = useTranslationContext('MessageText'), t = _g.t, userLanguage = _g.userLanguage;
4837
- var message = propMessage || contextMessage;
4838
- var hasAttachment = messageHasAttachments(message);
4839
- var messageTextToRender = ((_a = message.i18n) === null || _a === void 0 ? void 0 : _a["".concat(userLanguage, "_text")]) || message.text;
4840
- var messageText = React.useMemo(function () { return renderText$1(messageTextToRender, message.mentioned_users); }, [
4841
- message.mentioned_users,
4842
- messageTextToRender,
4843
- ]);
4844
- var wrapperClass = customWrapperClass || 'str-chat__message-text';
4845
- var innerClass = customInnerClass || "str-chat__message-text-inner str-chat__message-".concat(theme, "-text-inner");
4846
- if (!messageTextToRender && !message.quoted_message)
4847
- return null;
4848
- return (React__default["default"].createElement("div", { className: wrapperClass, tabIndex: 0 },
4849
- React__default["default"].createElement("div", { className: "\n ".concat(innerClass, "\n ").concat(hasAttachment ? " str-chat__message-".concat(theme, "-text-inner--has-attachment") : '', "\n ").concat(isOnlyEmojis(message.text) && !message.quoted_message
4850
- ? " str-chat__message-".concat(theme, "-text-inner--is-emoji")
4851
- : '', "\n ").trim(), "data-testid": 'message-text-inner-wrapper', onClick: onMentionsClickMessage, onMouseOver: onMentionsHoverMessage },
4852
- message.quoted_message && React__default["default"].createElement(QuotedMessage$1, null),
4853
- message.type === 'error' && (React__default["default"].createElement("div", { className: "str-chat__".concat(theme, "-message--error-message str-chat__message--error-message") }, t('Error · Unsent'))),
4854
- message.status === 'failed' && (React__default["default"].createElement("div", { className: "str-chat__".concat(theme, "-message--error-message str-chat__message--error-message") }, message.errorStatusCode !== 403
4855
- ? t('Message Failed · Click to try again')
4856
- : t('Message Failed · Unauthorized'))),
4857
- unsafeHTML && message.html ? (React__default["default"].createElement("div", { dangerouslySetInnerHTML: { __html: message.html } })) : (React__default["default"].createElement("div", null, messageText)))));
4858
- };
4859
- var MessageText = React__default["default"].memo(UnMemoizedMessageTextComponent);
4754
+ var top = 'top';
4755
+ var bottom = 'bottom';
4756
+ var right = 'right';
4757
+ var left = 'left';
4758
+ var auto = 'auto';
4759
+ var basePlacements = [top, bottom, right, left];
4760
+ var start = 'start';
4761
+ var end = 'end';
4762
+ var clippingParents = 'clippingParents';
4763
+ var viewport = 'viewport';
4764
+ var popper = 'popper';
4765
+ var reference = 'reference';
4766
+ var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {
4767
+ return acc.concat([placement + "-" + start, placement + "-" + end]);
4768
+ }, []);
4769
+ var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {
4770
+ return acc.concat([placement, placement + "-" + start, placement + "-" + end]);
4771
+ }, []); // modifiers that need to read the DOM
4860
4772
 
4861
- var notValidDateWarning = 'MessageTimestamp was called without a message, or message has invalid created_at date.';
4862
- var noParsingFunctionWarning = 'MessageTimestamp was called but there is no datetime parsing function available';
4863
- function getDateString(_a) {
4864
- var calendar = _a.calendar, format = _a.format, formatDate = _a.formatDate, messageCreatedAt = _a.messageCreatedAt, tDateTimeParser = _a.tDateTimeParser;
4865
- if (!messageCreatedAt ||
4866
- (typeof messageCreatedAt === 'string' && !Date.parse(messageCreatedAt))) {
4867
- console.warn(notValidDateWarning);
4868
- return null;
4869
- }
4870
- if (typeof formatDate === 'function') {
4871
- return formatDate(new Date(messageCreatedAt));
4872
- }
4873
- if (!tDateTimeParser) {
4874
- console.warn(noParsingFunctionWarning);
4875
- return null;
4876
- }
4877
- var parsedTime = tDateTimeParser(messageCreatedAt);
4878
- if (isDayOrMoment(parsedTime)) {
4879
- /**
4880
- * parsedTime.calendar is guaranteed on the type but is only
4881
- * available when a user calls dayjs.extend(calendar)
4882
- */
4883
- return calendar && parsedTime.calendar ? parsedTime.calendar() : parsedTime.format(format);
4884
- }
4885
- if (isDate(parsedTime)) {
4886
- return parsedTime.toDateString();
4887
- }
4888
- if (isNumberOrString(parsedTime)) {
4889
- return parsedTime;
4890
- }
4891
- return null;
4773
+ var beforeRead = 'beforeRead';
4774
+ var read = 'read';
4775
+ var afterRead = 'afterRead'; // pure-logic modifiers
4776
+
4777
+ var beforeMain = 'beforeMain';
4778
+ var main = 'main';
4779
+ var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)
4780
+
4781
+ var beforeWrite = 'beforeWrite';
4782
+ var write = 'write';
4783
+ var afterWrite = 'afterWrite';
4784
+ var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];
4785
+
4786
+ function getNodeName(element) {
4787
+ return element ? (element.nodeName || '').toLowerCase() : null;
4892
4788
  }
4893
4789
 
4894
- var defaultTimestampFormat = 'h:mmA';
4895
- var UnMemoizedMessageTimestamp = function (props) {
4896
- var _a = props.calendar, calendar = _a === void 0 ? false : _a, _b = props.customClass, customClass = _b === void 0 ? '' : _b, _c = props.format, format = _c === void 0 ? defaultTimestampFormat : _c, propMessage = props.message;
4897
- var _d = useMessageContext('MessageTimestamp'), formatDate = _d.formatDate, contextMessage = _d.message;
4898
- var tDateTimeParser = useTranslationContext('MessageTimestamp').tDateTimeParser;
4899
- var message = propMessage || contextMessage;
4900
- var messageCreatedAt = message.created_at && isDate(message.created_at)
4901
- ? message.created_at.toISOString()
4902
- : message.created_at;
4903
- var when = React.useMemo(function () { return getDateString({ calendar: calendar, format: format, formatDate: formatDate, messageCreatedAt: messageCreatedAt, tDateTimeParser: tDateTimeParser }); }, [formatDate, calendar, tDateTimeParser, format, messageCreatedAt]);
4904
- if (!when)
4905
- return null;
4906
- return (React__default["default"].createElement("time", { className: customClass, dateTime: messageCreatedAt, title: messageCreatedAt }, when));
4907
- };
4908
- var MessageTimestamp = React__default["default"].memo(UnMemoizedMessageTimestamp);
4790
+ function getWindow(node) {
4791
+ if (node == null) {
4792
+ return window;
4793
+ }
4909
4794
 
4910
- var CUSTOM_MESSAGE_TYPE = {
4911
- date: 'message.date',
4912
- intro: 'channel.intro',
4913
- };
4795
+ if (node.toString() !== '[object Window]') {
4796
+ var ownerDocument = node.ownerDocument;
4797
+ return ownerDocument ? ownerDocument.defaultView || window : window;
4798
+ }
4914
4799
 
4915
- var useCommandTrigger = function () {
4916
- var themeVersion = useChatContext('useCommandTrigger').themeVersion;
4917
- var channelConfig = useChannelStateContext('useCommandTrigger').channelConfig;
4918
- var commands = channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.commands;
4919
- return {
4920
- component: CommandItem,
4921
- dataProvider: function (query, text, onReady) {
4922
- if (text.indexOf('/') !== 0 || !commands) {
4923
- return [];
4924
- }
4925
- var selectedCommands = commands.filter(function (command) { var _a; return ((_a = command.name) === null || _a === void 0 ? void 0 : _a.indexOf(query)) !== -1; });
4926
- // sort alphabetically unless the you're matching the first char
4927
- selectedCommands.sort(function (a, b) {
4928
- var _a, _b;
4929
- var nameA = (_a = a.name) === null || _a === void 0 ? void 0 : _a.toLowerCase();
4930
- var nameB = (_b = b.name) === null || _b === void 0 ? void 0 : _b.toLowerCase();
4931
- if ((nameA === null || nameA === void 0 ? void 0 : nameA.indexOf(query)) === 0) {
4932
- nameA = "0".concat(nameA);
4933
- }
4934
- if ((nameB === null || nameB === void 0 ? void 0 : nameB.indexOf(query)) === 0) {
4935
- nameB = "0".concat(nameB);
4936
- }
4937
- // Should confirm possible null / undefined when TS is fully implemented
4938
- if (nameA != null && nameB != null) {
4939
- if (nameA < nameB) {
4940
- return -1;
4941
- }
4942
- if (nameA > nameB) {
4943
- return 1;
4944
- }
4945
- }
4946
- return 0;
4947
- });
4948
- var result = selectedCommands.slice(0, themeVersion === '2' ? 5 : 10);
4949
- if (onReady)
4950
- onReady(result.filter(function (result) {
4951
- return result.name !== undefined;
4952
- }), query);
4953
- return result;
4954
- },
4955
- output: function (entity) { return ({
4956
- caretPosition: 'next',
4957
- key: entity.name,
4958
- text: "/".concat(entity.name),
4959
- }); },
4960
- };
4961
- };
4800
+ return node;
4801
+ }
4962
4802
 
4963
- var UnMemoizedEmoticonItem = function (props) {
4964
- var entity = props.entity;
4965
- var hasEntity = Object.keys(entity).length;
4966
- var itemParts = entity === null || entity === void 0 ? void 0 : entity.itemNameParts;
4967
- var renderName = function () {
4968
- if (!hasEntity)
4969
- return null;
4970
- return (hasEntity &&
4971
- itemParts.parts.map(function (part, i) {
4972
- return part.toLowerCase() === itemParts.match.toLowerCase() ? (React__default["default"].createElement("span", { className: 'str-chat__emoji-item--highlight', key: "part-".concat(i) }, part)) : (React__default["default"].createElement("span", { className: 'str-chat__emoji-item--part', key: "part-".concat(i) }, part));
4973
- }));
4974
- };
4975
- return (React__default["default"].createElement("div", { className: 'str-chat__emoji-item' },
4976
- React__default["default"].createElement("span", { className: 'str-chat__emoji-item--entity' }, entity.native),
4977
- React__default["default"].createElement("span", { className: 'str-chat__emoji-item--name' }, renderName())));
4978
- };
4979
- var EmoticonItem = React__default["default"].memo(UnMemoizedEmoticonItem);
4803
+ function isElement(node) {
4804
+ var OwnElement = getWindow(node).Element;
4805
+ return node instanceof OwnElement || node instanceof Element;
4806
+ }
4980
4807
 
4981
- var useEmojiTrigger = function (emojiIndex) {
4982
- var themeVersion = useChatContext('useEmojiTrigger').themeVersion;
4983
- return {
4984
- component: EmoticonItem,
4985
- dataProvider: function (query, _, onReady) {
4986
- if (query.length === 0 || query.charAt(0).match(/[^a-zA-Z0-9+-]/)) {
4987
- return [];
4988
- }
4989
- var emojis = (emojiIndex === null || emojiIndex === void 0 ? void 0 : emojiIndex.search(query)) || [];
4990
- // emojiIndex.search sometimes returns undefined values, so filter those out first
4991
- var result = emojis.filter(Boolean).slice(0, themeVersion === '2' ? 7 : 10);
4992
- if (onReady)
4993
- onReady(result, query);
4994
- return result;
4995
- },
4996
- output: function (entity) { return ({
4997
- caretPosition: 'next',
4998
- key: entity.id,
4999
- text: "".concat('native' in entity ? entity.native : ''),
5000
- }); },
5001
- };
5002
- };
4808
+ function isHTMLElement(node) {
4809
+ var OwnElement = getWindow(node).HTMLElement;
4810
+ return node instanceof OwnElement || node instanceof HTMLElement;
4811
+ }
5003
4812
 
5004
- var accentsMap = {
5005
- a: 'á|à|ã|â|À|Á|Ã|Â',
5006
- c: 'ç|Ç',
5007
- e: 'é|è|ê|É|È|Ê',
5008
- i: 'í|ì|î|Í|Ì|Î',
5009
- n: 'ñ|Ñ',
5010
- o: 'ó|ò|ô|ő|õ|Ó|Ò|Ô|Õ',
5011
- u: 'ú|ù|û|ü|Ú|Ù|Û|Ü',
5012
- };
5013
- var removeDiacritics = function (text) {
5014
- if (!text)
5015
- return '';
5016
- return Object.keys(accentsMap).reduce(function (acc, current) { return acc.replace(new RegExp(accentsMap[current], 'g'), current); }, text);
5017
- };
5018
- var calculateLevenshtein = function (query, name) {
5019
- if (query.length === 0)
5020
- return name.length;
5021
- if (name.length === 0)
5022
- return query.length;
5023
- var matrix = [];
5024
- var i;
5025
- for (i = 0; i <= name.length; i++) {
5026
- matrix[i] = [i];
5027
- }
5028
- var j;
5029
- for (j = 0; j <= query.length; j++) {
5030
- matrix[0][j] = j;
5031
- }
5032
- for (i = 1; i <= name.length; i++) {
5033
- for (j = 1; j <= query.length; j++) {
5034
- if (name.charAt(i - 1) === query.charAt(j - 1)) {
5035
- matrix[i][j] = matrix[i - 1][j - 1];
5036
- }
5037
- else {
5038
- matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
5039
- Math.min(matrix[i][j - 1] + 1, // insertion
5040
- matrix[i - 1][j] + 1)); // deletion
5041
- }
5042
- }
5043
- }
5044
- return matrix[name.length][query.length];
5045
- };
5046
- var searchLocalUsers = function (params) {
5047
- var ownUserId = params.ownUserId, query = params.query, text = params.text, useMentionsTransliteration = params.useMentionsTransliteration, users = params.users;
5048
- var matchingUsers = users.filter(function (user) {
5049
- if (user.id === ownUserId)
5050
- return false;
5051
- if (!query)
5052
- return true;
5053
- var updatedId = removeDiacritics(user.id).toLowerCase();
5054
- var updatedName = removeDiacritics(user.name).toLowerCase();
5055
- var updatedQuery = removeDiacritics(query).toLowerCase();
5056
- if (useMentionsTransliteration) {
5057
- (function () { return __awaiter$1(void 0, void 0, void 0, function () {
5058
- var transliterate;
5059
- return __generator$1(this, function (_a) {
5060
- switch (_a.label) {
5061
- case 0: return [4 /*yield*/, Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@stream-io/transliterate')); })];
5062
- case 1:
5063
- transliterate = (_a.sent()).default;
5064
- updatedName = transliterate(user.name || '').toLowerCase();
5065
- updatedQuery = transliterate(query).toLowerCase();
5066
- updatedId = transliterate(user.id).toLowerCase();
5067
- return [2 /*return*/];
5068
- }
5069
- });
5070
- }); })();
5071
- }
5072
- var maxDistance = 3;
5073
- var lastDigits = text.slice(-(maxDistance + 1)).includes('@');
5074
- if (updatedName) {
5075
- var levenshtein_1 = calculateLevenshtein(updatedQuery, updatedName);
5076
- if (updatedName.includes(updatedQuery) || (levenshtein_1 <= maxDistance && lastDigits)) {
5077
- return true;
5078
- }
5079
- }
5080
- var levenshtein = calculateLevenshtein(updatedQuery, updatedId);
5081
- return updatedId.includes(updatedQuery) || (levenshtein <= maxDistance && lastDigits);
4813
+ function isShadowRoot(node) {
4814
+ // IE 11 has no ShadowRoot
4815
+ if (typeof ShadowRoot === 'undefined') {
4816
+ return false;
4817
+ }
4818
+
4819
+ var OwnElement = getWindow(node).ShadowRoot;
4820
+ return node instanceof OwnElement || node instanceof ShadowRoot;
4821
+ }
4822
+
4823
+ // and applies them to the HTMLElements such as popper and arrow
4824
+
4825
+ function applyStyles(_ref) {
4826
+ var state = _ref.state;
4827
+ Object.keys(state.elements).forEach(function (name) {
4828
+ var style = state.styles[name] || {};
4829
+ var attributes = state.attributes[name] || {};
4830
+ var element = state.elements[name]; // arrow is optional + virtual elements
4831
+
4832
+ if (!isHTMLElement(element) || !getNodeName(element)) {
4833
+ return;
4834
+ } // Flow doesn't support to extend this property, but it's the most
4835
+ // effective way to apply styles to an HTMLElement
4836
+ // $FlowFixMe[cannot-write]
4837
+
4838
+
4839
+ Object.assign(element.style, style);
4840
+ Object.keys(attributes).forEach(function (name) {
4841
+ var value = attributes[name];
4842
+
4843
+ if (value === false) {
4844
+ element.removeAttribute(name);
4845
+ } else {
4846
+ element.setAttribute(name, value === true ? '' : value);
4847
+ }
5082
4848
  });
5083
- return matchingUsers;
5084
- };
5085
- var checkUploadPermissions = function (params) { return __awaiter$1(void 0, void 0, void 0, function () {
5086
- var addNotification, file, getAppSettings, t, uploadType, appSettings, _a, allowed_file_extensions, allowed_mime_types, blocked_file_extensions, blocked_mime_types, sendErrorNotification, allowed, blocked, allowed, blocked;
5087
- var _b, _c;
5088
- return __generator$1(this, function (_d) {
5089
- switch (_d.label) {
5090
- case 0:
5091
- addNotification = params.addNotification, file = params.file, getAppSettings = params.getAppSettings, t = params.t, uploadType = params.uploadType;
5092
- appSettings = null;
5093
- return [4 /*yield*/, getAppSettings()];
5094
- case 1:
5095
- appSettings = _d.sent();
5096
- _a = (uploadType === 'image'
5097
- ? (_b = appSettings === null || appSettings === void 0 ? void 0 : appSettings.app) === null || _b === void 0 ? void 0 : _b.image_upload_config
5098
- : (_c = appSettings === null || appSettings === void 0 ? void 0 : appSettings.app) === null || _c === void 0 ? void 0 : _c.file_upload_config) || {}, allowed_file_extensions = _a.allowed_file_extensions, allowed_mime_types = _a.allowed_mime_types, blocked_file_extensions = _a.blocked_file_extensions, blocked_mime_types = _a.blocked_mime_types;
5099
- sendErrorNotification = function () {
5100
- return addNotification(t("Upload type: \"{{ type }}\" is not allowed", { type: file.type || 'unknown type' }), 'error');
5101
- };
5102
- if (allowed_file_extensions === null || allowed_file_extensions === void 0 ? void 0 : allowed_file_extensions.length) {
5103
- allowed = allowed_file_extensions.some(function (ext) {
5104
- return file.name.toLowerCase().endsWith(ext.toLowerCase());
5105
- });
5106
- if (!allowed) {
5107
- sendErrorNotification();
5108
- return [2 /*return*/, false];
5109
- }
5110
- }
5111
- if (blocked_file_extensions === null || blocked_file_extensions === void 0 ? void 0 : blocked_file_extensions.length) {
5112
- blocked = blocked_file_extensions.some(function (ext) {
5113
- return file.name.toLowerCase().endsWith(ext.toLowerCase());
5114
- });
5115
- if (blocked) {
5116
- sendErrorNotification();
5117
- return [2 /*return*/, false];
5118
- }
5119
- }
5120
- if (allowed_mime_types === null || allowed_mime_types === void 0 ? void 0 : allowed_mime_types.length) {
5121
- allowed = allowed_mime_types.some(function (type) { var _a; return type.toLowerCase() === ((_a = file.type) === null || _a === void 0 ? void 0 : _a.toLowerCase()); });
5122
- if (!allowed) {
5123
- sendErrorNotification();
5124
- return [2 /*return*/, false];
5125
- }
5126
- }
5127
- if (blocked_mime_types === null || blocked_mime_types === void 0 ? void 0 : blocked_mime_types.length) {
5128
- blocked = blocked_mime_types.some(function (type) { var _a; return type.toLowerCase() === ((_a = file.type) === null || _a === void 0 ? void 0 : _a.toLowerCase()); });
5129
- if (blocked) {
5130
- sendErrorNotification();
5131
- return [2 /*return*/, false];
5132
- }
5133
- }
5134
- return [2 /*return*/, true];
5135
- }
4849
+ });
4850
+ }
4851
+
4852
+ function effect$2(_ref2) {
4853
+ var state = _ref2.state;
4854
+ var initialStyles = {
4855
+ popper: {
4856
+ position: state.options.strategy,
4857
+ left: '0',
4858
+ top: '0',
4859
+ margin: '0'
4860
+ },
4861
+ arrow: {
4862
+ position: 'absolute'
4863
+ },
4864
+ reference: {}
4865
+ };
4866
+ Object.assign(state.elements.popper.style, initialStyles.popper);
4867
+ state.styles = initialStyles;
4868
+
4869
+ if (state.elements.arrow) {
4870
+ Object.assign(state.elements.arrow.style, initialStyles.arrow);
4871
+ }
4872
+
4873
+ return function () {
4874
+ Object.keys(state.elements).forEach(function (name) {
4875
+ var element = state.elements[name];
4876
+ var attributes = state.attributes[name] || {};
4877
+ var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them
4878
+
4879
+ var style = styleProperties.reduce(function (style, property) {
4880
+ style[property] = '';
4881
+ return style;
4882
+ }, {}); // arrow is optional + virtual elements
4883
+
4884
+ if (!isHTMLElement(element) || !getNodeName(element)) {
4885
+ return;
4886
+ }
4887
+
4888
+ Object.assign(element.style, style);
4889
+ Object.keys(attributes).forEach(function (attribute) {
4890
+ element.removeAttribute(attribute);
4891
+ });
5136
4892
  });
5137
- }); };
4893
+ };
4894
+ } // eslint-disable-next-line import/no-unused-modules
5138
4895
 
5139
- var useUserTrigger = function (params) {
5140
- var disableMentions = params.disableMentions, mentionAllAppUsers = params.mentionAllAppUsers, _a = params.mentionQueryParams, mentionQueryParams = _a === void 0 ? {} : _a, onSelectUser = params.onSelectUser, useMentionsTransliteration = params.useMentionsTransliteration;
5141
- var _b = React.useState(false), searching = _b[0], setSearching = _b[1];
5142
- var _c = useChatContext('useUserTrigger'), client = _c.client, mutes = _c.mutes, themeVersion = _c.themeVersion;
5143
- var channel = useChannelStateContext('useUserTrigger').channel;
5144
- var members = channel.state.members;
5145
- var watchers = channel.state.watchers;
5146
- var getMembersAndWatchers = React.useCallback(function () {
5147
- var memberUsers = members ? Object.values(members).map(function (_a) {
5148
- var user = _a.user;
5149
- return user;
5150
- }) : [];
5151
- var watcherUsers = watchers ? Object.values(watchers) : [];
5152
- var users = __spreadArray$1(__spreadArray$1([], memberUsers, true), watcherUsers, true);
5153
- // make sure we don't list users twice
5154
- var uniqueUsers = {};
5155
- users.forEach(function (user) {
5156
- if (user && !uniqueUsers[user.id]) {
5157
- uniqueUsers[user.id] = user;
5158
- }
5159
- });
5160
- return Object.values(uniqueUsers);
5161
- }, [members, watchers]);
5162
- var queryMembersThrottled = React.useCallback(throttle__default["default"](function (query, onReady) { return __awaiter$1(void 0, void 0, void 0, function () {
5163
- var response, users, error_1;
5164
- return __generator$1(this, function (_a) {
5165
- switch (_a.label) {
5166
- case 0:
5167
- _a.trys.push([0, 2, , 3]);
5168
- return [4 /*yield*/, channel.queryMembers({
5169
- name: { $autocomplete: query },
5170
- })];
5171
- case 1:
5172
- response = _a.sent();
5173
- users = response.members.map(function (member) { return member.user; });
5174
- if (onReady && users.length) {
5175
- onReady(users);
5176
- }
5177
- else {
5178
- onReady([]);
5179
- }
5180
- return [3 /*break*/, 3];
5181
- case 2:
5182
- error_1 = _a.sent();
5183
- console.log({ error: error_1 });
5184
- return [3 /*break*/, 3];
5185
- case 3: return [2 /*return*/];
5186
- }
5187
- });
5188
- }); }, 200), [channel]);
5189
- var queryUsers = function (query, onReady) { return __awaiter$1(void 0, void 0, void 0, function () {
5190
- var users, error_2;
5191
- return __generator$1(this, function (_a) {
5192
- switch (_a.label) {
5193
- case 0:
5194
- if (!query || searching)
5195
- return [2 /*return*/];
5196
- setSearching(true);
5197
- _a.label = 1;
5198
- case 1:
5199
- _a.trys.push([1, 3, , 4]);
5200
- return [4 /*yield*/, client.queryUsers(__assign({ $or: [{ id: { $autocomplete: query } }, { name: { $autocomplete: query } }], id: { $ne: client.userID } }, mentionQueryParams.filters), __assign({ id: 1 }, mentionQueryParams.sort), __assign({ limit: 10 }, mentionQueryParams.options))];
5201
- case 2:
5202
- users = (_a.sent()).users;
5203
- if (onReady && users.length) {
5204
- onReady(users);
5205
- }
5206
- else {
5207
- onReady([]);
5208
- }
5209
- return [3 /*break*/, 4];
5210
- case 3:
5211
- error_2 = _a.sent();
5212
- console.log({ error: error_2 });
5213
- return [3 /*break*/, 4];
5214
- case 4:
5215
- setSearching(false);
5216
- return [2 /*return*/];
5217
- }
5218
- });
5219
- }); };
5220
- var queryUsersThrottled = throttle__default["default"](queryUsers, 200);
5221
- return {
5222
- callback: function (item) { return onSelectUser(item); },
5223
- component: UserItem,
5224
- dataProvider: function (query, text, onReady) {
5225
- var _a, _b;
5226
- if (disableMentions)
5227
- return;
5228
- var filterMutes = function (data) {
5229
- if (text.includes('/unmute') && !mutes.length) {
5230
- return [];
5231
- }
5232
- if (!mutes.length)
5233
- return data;
5234
- if (text.includes('/unmute')) {
5235
- return data.filter(function (suggestion) {
5236
- return mutes.some(function (mute) { return mute.target.id === suggestion.id; });
5237
- });
5238
- }
5239
- return data.filter(function (suggestion) { return mutes.every(function (mute) { return mute.target.id !== suggestion.id; }); });
5240
- };
5241
- if (mentionAllAppUsers) {
5242
- return queryUsersThrottled(query, function (data) {
5243
- if (onReady)
5244
- onReady(filterMutes(data), query);
5245
- });
5246
- }
5247
- /**
5248
- * By default, we return maximum 100 members via queryChannels api call.
5249
- * Thus it is safe to assume, that if number of members in channel.state is < 100,
5250
- * then all the members are already available on client side and we don't need to
5251
- * make any api call to queryMembers endpoint.
5252
- */
5253
- if (!query || Object.values(members || {}).length < 100) {
5254
- var users = getMembersAndWatchers();
5255
- var params_1 = {
5256
- ownUserId: client.userID,
5257
- query: query,
5258
- text: text,
5259
- useMentionsTransliteration: useMentionsTransliteration,
5260
- users: users,
5261
- };
5262
- var matchingUsers = searchLocalUsers(params_1);
5263
- var usersToShow = (_b = (_a = mentionQueryParams.options) === null || _a === void 0 ? void 0 : _a.limit) !== null && _b !== void 0 ? _b : (themeVersion === '2' ? 7 : 10);
5264
- var data = matchingUsers.slice(0, usersToShow);
5265
- if (onReady)
5266
- onReady(filterMutes(data), query);
5267
- return data;
5268
- }
5269
- return queryMembersThrottled(query, function (data) {
5270
- if (onReady)
5271
- onReady(filterMutes(data), query);
5272
- });
5273
- },
5274
- output: function (entity) { return ({
5275
- caretPosition: 'next',
5276
- key: entity.id,
5277
- text: "@".concat(entity.name || entity.id),
5278
- }); },
5279
- };
5280
- };
5281
4896
 
5282
- var DefaultTriggerProvider = function (_a) {
5283
- var children = _a.children;
5284
- var currentValue = useMessageInputContext('DefaultTriggerProvider');
5285
- var defaultAutocompleteTriggers = {
5286
- '/': useCommandTrigger(),
5287
- ':': useEmojiTrigger(currentValue.emojiIndex),
5288
- '@': useUserTrigger({
5289
- disableMentions: currentValue.disableMentions,
5290
- mentionAllAppUsers: currentValue.mentionAllAppUsers,
5291
- mentionQueryParams: currentValue.mentionQueryParams,
5292
- onSelectUser: currentValue.onSelectUser,
5293
- useMentionsTransliteration: currentValue.useMentionsTransliteration,
5294
- }),
5295
- };
5296
- var newValue = __assign(__assign({}, currentValue), { autocompleteTriggers: defaultAutocompleteTriggers });
5297
- return React__default["default"].createElement(MessageInputContextProvider, { value: newValue }, children);
4897
+ var applyStyles$1 = {
4898
+ name: 'applyStyles',
4899
+ enabled: true,
4900
+ phase: 'write',
4901
+ fn: applyStyles,
4902
+ effect: effect$2,
4903
+ requires: ['computeStyles']
5298
4904
  };
5299
4905
 
5300
- var filterEmoji = function (emoji) {
5301
- return !(emoji.name === 'White Smiling Face' || emoji.name === 'White Frowning Face');
5302
- };
5303
- var EmojiPicker = function (_a) {
5304
- var small = _a.small;
5305
- var _b = useEmojiContext('EmojiPicker'), emojiConfig = _b.emojiConfig, EmojiPickerComponent = _b.EmojiPicker;
5306
- var t = useTranslationContext('EmojiPicker').t;
5307
- var _c = useMessageInputContext('EmojiPicker'), emojiPickerIsOpen = _c.emojiPickerIsOpen, emojiPickerRef = _c.emojiPickerRef, onSelectEmoji = _c.onSelectEmoji;
5308
- var emojiData = (emojiConfig || {}).emojiData;
5309
- if (!emojiPickerIsOpen || !emojiData)
5310
- return null;
5311
- return (React__default["default"].createElement("div", { className: clsx('str-chat__emoji-picker-container', {
5312
- 'str-chat__input--emojipicker': !small,
5313
- 'str-chat__small-message-input-emojipicker': small,
5314
- }), ref: emojiPickerRef },
5315
- React__default["default"].createElement(React.Suspense, { fallback: null },
5316
- React__default["default"].createElement(EmojiPickerComponent, { color: '#006CFF', data: emojiData, emoji: 'point_up', emojisToShowFilter: filterEmoji, native: true, onSelect: onSelectEmoji, set: 'facebook', showPreview: false, showSkinTones: false, title: t('Pick your emoji'), useButton: true }))));
5317
- };
4906
+ function getBasePlacement(placement) {
4907
+ return placement.split('-')[0];
4908
+ }
5318
4909
 
5319
- var EmojiIconLarge = function () {
5320
- var t = useTranslationContext('EmojiIconLarge').t;
5321
- return (React__default["default"].createElement("svg", { height: '28', width: '28', xmlns: 'http://www.w3.org/2000/svg' },
5322
- React__default["default"].createElement("title", null, t('Open emoji picker')),
5323
- React__default["default"].createElement("g", { clipRule: 'evenodd', fillRule: 'evenodd' },
5324
- React__default["default"].createElement("path", { d: 'M14 4.4C8.6 4.4 4.4 8.6 4.4 14c0 5.4 4.2 9.6 9.6 9.6c5.4 0 9.6-4.2 9.6-9.6c0-5.4-4.2-9.6-9.6-9.6zM2 14c0-6.6 5.4-12 12-12s12 5.4 12 12s-5.4 12-12 12s-12-5.4-12-12zM12.8 11c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8s.8-1.8 1.8-1.8s1.8.8 1.8 1.8zM18.8 11c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8s.8-1.8 1.8-1.8s1.8.8 1.8 1.8zM8.6 15.4c.6-.4 1.2-.2 1.6.2c.6.8 1.6 1.8 3 2c1.2.4 2.8.2 4.8-2c.4-.4 1.2-.6 1.6 0c.4.4.6 1.2 0 1.6c-2.2 2.6-4.8 3.4-7 3c-2-.4-3.6-1.8-4.4-3c-.4-.6-.2-1.2.4-1.8z' }))));
5325
- };
5326
- var EmojiIconSmall = function () {
5327
- var t = useTranslationContext('EmojiIconSmall').t;
5328
- return (React__default["default"].createElement("svg", { height: '14', width: '14', xmlns: 'http://www.w3.org/2000/svg' },
5329
- React__default["default"].createElement("title", null, t('Open emoji picker')),
5330
- React__default["default"].createElement("g", { clipRule: 'evenodd', fillRule: 'evenodd' },
5331
- React__default["default"].createElement("path", { d: 'M6.7 1.42C3.73 1.42 1.42 3.73 1.42 6.7c0 2.97 2.31 5.28 5.28 5.28c2.97 0 5.28-2.31 5.28-5.28c0-2.97-2.31-5.28-5.28-5.28zM.1 6.7c0-3.63 2.97-6.6 6.6-6.6s6.6 2.97 6.6 6.6s-2.97 6.6-6.6 6.6s-6.6-2.97-6.6-6.6zM6.04 5.05c0 .55-.44.99-.99.99s-.99-.44-.99-.99s.44-.99.99-.99s.99.44.99.99zM9.34 5.05c0 .55-.44.99-.99.99s-.99-.44-.99-.99s.44-.99.99-.99s.99.44.99.99zM3.73 7.47c.33-.22.66-.11.88.11c.33.44.88.99 1.65 1.1c.66.22 1.54.11 2.64-1.1c.22-.22.66-.33.88 0c.22.22.33.66 0 .88c-1.21 1.43-2.64 1.87-3.85 1.65c-1.1-.22-1.98-.99-2.42-1.65c-.22-.33-.11-.66.22-.99z' }))));
5332
- };
5333
- // ThemingV2 icon
5334
- var EmojiPickerIcon = function () { return (React__default["default"].createElement("svg", { preserveAspectRatio: 'xMinYMin', viewBox: '0 0 28 28', width: '100%', xmlns: 'http://www.w3.org/2000/svg' },
5335
- React__default["default"].createElement("g", { clipRule: 'evenodd', fillRule: 'evenodd' },
5336
- React__default["default"].createElement("path", { d: 'M14 4.4C8.6 4.4 4.4 8.6 4.4 14c0 5.4 4.2 9.6 9.6 9.6c5.4 0 9.6-4.2 9.6-9.6c0-5.4-4.2-9.6-9.6-9.6zM2 14c0-6.6 5.4-12 12-12s12 5.4 12 12s-5.4 12-12 12s-12-5.4-12-12zM12.8 11c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8s.8-1.8 1.8-1.8s1.8.8 1.8 1.8zM18.8 11c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8s.8-1.8 1.8-1.8s1.8.8 1.8 1.8zM8.6 15.4c.6-.4 1.2-.2 1.6.2c.6.8 1.6 1.8 3 2c1.2.4 2.8.2 4.8-2c.4-.4 1.2-.6 1.6 0c.4.4.6 1.2 0 1.6c-2.2 2.6-4.8 3.4-7 3c-2-.4-3.6-1.8-4.4-3c-.4-.6-.2-1.2.4-1.8z' })))); };
5337
- var FileUploadIcon = function () {
5338
- var t = useTranslationContext('FileUploadIcon').t;
5339
- return (React__default["default"].createElement("svg", { height: '14', width: '14', xmlns: 'http://www.w3.org/2000/svg' },
5340
- React__default["default"].createElement("title", null, t('Attach files')),
5341
- React__default["default"].createElement("path", { d: 'M7 .5c3.59 0 6.5 2.91 6.5 6.5s-2.91 6.5-6.5 6.5S.5 10.59.5 7 3.41.5 7 .5zm0 12c3.031 0 5.5-2.469 5.5-5.5S10.031 1.5 7 1.5A5.506 5.506 0 0 0 1.5 7c0 3.034 2.469 5.5 5.5 5.5zM7.506 3v3.494H11v1.05H7.506V11h-1.05V7.544H3v-1.05h3.456V3h1.05z', fillRule: 'nonzero' })));
5342
- };
5343
- var FileUploadIconFlat = function () {
5344
- var t = useTranslationContext('FileUploadIconFlat').t;
5345
- return (React__default["default"].createElement("svg", { height: '14', width: '14', xmlns: 'http://www.w3.org/2000/svg' },
5346
- React__default["default"].createElement("title", null, t('Attach files')),
5347
- React__default["default"].createElement("path", { d: 'M1.667.333h10.666c.737 0 1.334.597 1.334 1.334v10.666c0 .737-.597 1.334-1.334 1.334H1.667a1.333 1.333 0 0 1-1.334-1.334V1.667C.333.93.93.333 1.667.333zm2 1.334a1.667 1.667 0 1 0 0 3.333 1.667 1.667 0 0 0 0-3.333zm-2 9.333v1.333h10.666v-4l-2-2-4 4-2-2L1.667 11z', fillRule: 'nonzero' })));
5348
- };
5349
- var LoadingIndicatorIcon = function (_a) {
5350
- var _b = _a.size, size = _b === void 0 ? 20 : _b;
5351
- var id = React.useId();
5352
- return (React__default["default"].createElement("div", { className: 'str-chat__loading-indicator' },
5353
- React__default["default"].createElement("svg", { "data-testid": 'loading-indicator', height: size, viewBox: '0 0 30 30', width: size, xmlns: 'http://www.w3.org/2000/svg' },
5354
- React__default["default"].createElement("defs", null,
5355
- React__default["default"].createElement("linearGradient", { id: "".concat(id, "-linear-gradient"), x1: '50%', x2: '50%', y1: '0%', y2: '100%' },
5356
- React__default["default"].createElement("stop", { offset: '0%', stopColor: '#FFF', stopOpacity: '0' }),
5357
- React__default["default"].createElement("stop", { "data-testid": 'stop-color', offset: '100%', stopOpacity: '1' }))),
5358
- React__default["default"].createElement("path", { d: 'M2.518 23.321l1.664-1.11A12.988 12.988 0 0 0 15 28c7.18 0 13-5.82 13-13S22.18 2 15 2V0c8.284 0 15 6.716 15 15 0 8.284-6.716 15-15 15-5.206 0-9.792-2.652-12.482-6.679z', fill: "url(#".concat(id, "-linear-gradient)"), fillRule: 'evenodd' }))));
5359
- };
5360
- // ThemingV2 icon
5361
- var UploadIcon = function () { return (React__default["default"].createElement("svg", { "data-testid": 'attach', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
5362
- React__default["default"].createElement("g", { clipPath: 'url(#clip0_10878_5)' },
5363
- React__default["default"].createElement("path", { d: 'M12.9997 6.99993L10.9997 6.99993L10.9997 10.9999L6.99972 10.9999L6.99972 12.9999L10.9997 12.9999L10.9997 16.9999L12.9997 16.9999L12.9997 12.9999L16.9997 12.9999L16.9997 10.9999L12.9997 10.9999L12.9997 6.99993ZM11.9997 1.99992C6.47972 1.99992 1.99972 6.47993 1.99972 11.9999C1.99972 17.5199 6.47972 21.9999 11.9997 21.9999C17.5197 21.9999 21.9997 17.5199 21.9997 11.9999C21.9997 6.47993 17.5197 1.99992 11.9997 1.99992ZM11.9997 19.9999C7.58972 19.9999 3.99972 16.4099 3.99972 11.9999C3.99972 7.58993 7.58972 3.99993 11.9997 3.99993C16.4097 3.99993 19.9997 7.58993 19.9997 11.9999C19.9997 16.4099 16.4097 19.9999 11.9997 19.9999Z', fill: 'black' })),
5364
- React__default["default"].createElement("defs", null,
5365
- React__default["default"].createElement("clipPath", { id: 'clip0_10878_5' },
5366
- React__default["default"].createElement("rect", { fill: 'white', height: '24', width: '24' }))))); };
5367
- var CloseIcon$1 = function () { return (React__default["default"].createElement("svg", { "data-testid": 'close-no-outline', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
5368
- React__default["default"].createElement("path", { d: 'M19 6.41L17.59 5L12 10.59L6.41 5L5 6.41L10.59 12L5 17.59L6.41 19L12 13.41L17.59 19L19 17.59L13.41 12L19 6.41Z', fill: 'black' }))); };
5369
- var RetryIcon = function () { return (React__default["default"].createElement("svg", { "data-testid": 'retry', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
5370
- React__default["default"].createElement("path", { d: 'M17.6449 6.35C16.1949 4.9 14.2049 4 11.9949 4C7.57488 4 4.00488 7.58 4.00488 12C4.00488 16.42 7.57488 20 11.9949 20C15.7249 20 18.8349 17.45 19.7249 14H17.6449C16.8249 16.33 14.6049 18 11.9949 18C8.68488 18 5.99488 15.31 5.99488 12C5.99488 8.69 8.68488 6 11.9949 6C13.6549 6 15.1349 6.69 16.2149 7.78L12.9949 11H19.9949V4L17.6449 6.35Z', fill: 'black' }))); };
5371
- var DownloadIcon = function () { return (React__default["default"].createElement("svg", { "data-testid": 'download', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
5372
- React__default["default"].createElement("path", { d: 'M19.35 10.04C18.67 6.59 15.64 4 12 4C9.11 4 6.6 5.64 5.35 8.04C2.34 8.36 0 10.91 0 14C0 17.31 2.69 20 6 20H19C21.76 20 24 17.76 24 15C24 12.36 21.95 10.22 19.35 10.04ZM19 18H6C3.79 18 2 16.21 2 14C2 11.95 3.53 10.24 5.56 10.03L6.63 9.92L7.13 8.97C8.08 7.14 9.94 6 12 6C14.62 6 16.88 7.86 17.39 10.43L17.69 11.93L19.22 12.04C20.78 12.14 22 13.45 22 15C22 16.65 20.65 18 19 18ZM13.45 10H10.55V13H8L12 17L16 13H13.45V10Z', fill: 'black' }))); };
5373
- var SendIconV1 = function () {
5374
- var t = useTranslationContext('SendButton').t;
5375
- return (React__default["default"].createElement("svg", { height: '17', viewBox: '0 0 18 17', width: '18', xmlns: 'http://www.w3.org/2000/svg' },
5376
- React__default["default"].createElement("title", null, t('Send')),
5377
- React__default["default"].createElement("path", { d: 'M0 17.015l17.333-8.508L0 0v6.617l12.417 1.89L0 10.397z', fill: '#006cff', fillRule: 'evenodd' })));
5378
- };
5379
- var SendIconV2 = function () {
5380
- var t = useTranslationContext('SendButton').t;
5381
- return (React__default["default"].createElement("svg", { "data-testid": 'send', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
5382
- React__default["default"].createElement("title", null, t('Send')),
5383
- React__default["default"].createElement("path", { d: 'M4.00952 22L24 12L4.00952 2L4 9.77778L18.2857 12L4 14.2222L4.00952 22Z', fill: 'black' })));
5384
- };
5385
- var SendButton = function (_a) {
5386
- var sendMessage = _a.sendMessage, rest = __rest(_a, ["sendMessage"]);
5387
- var themeVersion = useChatContext('SendButton').themeVersion;
5388
- return (React__default["default"].createElement("button", __assign({ "aria-label": 'Send', className: 'str-chat__send-button', "data-testid": 'send-button', onClick: sendMessage, type: 'button' }, rest), themeVersion === '2' ? React__default["default"].createElement(SendIconV2, null) : React__default["default"].createElement(SendIconV1, null)));
5389
- };
5390
-
5391
- /**
5392
- * @deprecated This component has been deprecated in favor of `AttachmentPreviewList` as this component
5393
- * utilises outdated components from the package [`react-file-utils`](https://github.com/GetStream/react-file-utils)
5394
- * which will no longer receive updates for aforementioned components.
5395
- *
5396
- * **Will be removed with the complete transition to the theming V2.**
5397
- */
5398
- var UploadsPreview = function () {
5399
- var themeVersion = useChatContext('UploadsPreview').themeVersion;
5400
- var _a = useChannelStateContext('UploadsPreview'), _b = _a.maxNumberOfFiles, maxNumberOfFiles = _b === void 0 ? 0 : _b, multipleUploads = _a.multipleUploads;
5401
- var _c = useMessageInputContext('UploadsPreview'), fileOrder = _c.fileOrder, fileUploads = _c.fileUploads, imageOrder = _c.imageOrder, imageUploads = _c.imageUploads, _d = _c.numberOfUploads, numberOfUploads = _d === void 0 ? 0 : _d, removeFile = _c.removeFile, removeImage = _c.removeImage, uploadFile = _c.uploadFile, uploadImage = _c.uploadImage, uploadNewFiles = _c.uploadNewFiles;
5402
- var imagesToPreview = imageOrder
5403
- .map(function (id) { return imageUploads[id]; })
5404
- // filter OG scraped images
5405
- .filter(function (image) { return !image.og_scrape_url; });
5406
- var filesToPreview = fileOrder.map(function (id) { return fileUploads[id]; });
5407
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
5408
- imageOrder.length > 0 && (React__default["default"].createElement(reactFileUtils.ImagePreviewer, { disabled: !multipleUploads || numberOfUploads >= maxNumberOfFiles, handleFiles: uploadNewFiles, handleRemove: removeImage, handleRetry: uploadImage, imageUploads: imagesToPreview, multiple: multipleUploads })),
5409
- fileOrder.length > 0 && (React__default["default"].createElement(reactFileUtils.FilePreviewer, { fileIconProps: {
5410
- className: 'str-chat__file-icon',
5411
- version: themeVersion,
5412
- }, handleFiles: uploadNewFiles, handleRemove: removeFile, handleRetry: uploadFile, uploads: filesToPreview }))));
5413
- };
5414
-
5415
- var UnMemoizedChatAutoComplete = function (props) {
5416
- var _a = useComponentContext('ChatAutoComplete'), SuggestionItem = _a.AutocompleteSuggestionItem, SuggestionList = _a.AutocompleteSuggestionList;
5417
- var t = useTranslationContext('ChatAutoComplete').t;
5418
- var messageInput = useMessageInputContext('ChatAutoComplete');
5419
- var cooldownRemaining = messageInput.cooldownRemaining, disabled = messageInput.disabled, emojiIndex = messageInput.emojiIndex, innerRef = messageInput.textareaRef;
5420
- var placeholder = props.placeholder || t('Type your message');
5421
- var emojiReplace = props.wordReplace
5422
- ? function (word) { var _a; return (_a = props.wordReplace) === null || _a === void 0 ? void 0 : _a.call(props, word, emojiIndex); }
5423
- : function (word) {
5424
- var found = (emojiIndex === null || emojiIndex === void 0 ? void 0 : emojiIndex.search(word)) || [];
5425
- var emoji = found
5426
- .filter(Boolean)
5427
- .slice(0, 10)
5428
- .find(function (_a) {
5429
- var emoticons = _a.emoticons;
5430
- return !!(emoticons === null || emoticons === void 0 ? void 0 : emoticons.includes(word));
5431
- });
5432
- if (!emoji || !('native' in emoji))
5433
- return null;
5434
- return emoji.native;
5435
- };
5436
- var updateInnerRef = React.useCallback(function (ref) {
5437
- if (innerRef) {
5438
- innerRef.current = ref;
5439
- }
5440
- }, [innerRef]);
5441
- return (React__default["default"].createElement(ReactTextareaAutocomplete, { additionalTextareaProps: messageInput.additionalTextareaProps, "aria-label": cooldownRemaining ? t('Slow Mode ON') : placeholder, className: 'str-chat__textarea__textarea str-chat__message-textarea', closeCommandsList: messageInput.closeCommandsList, closeMentionsList: messageInput.closeMentionsList, containerClassName: 'str-chat__textarea str-chat__message-textarea-react-host', 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', listClassName: 'str-chat__emojisearch__list', loadingComponent: LoadingIndicator, maxRows: messageInput.maxRows, minChar: 0, onBlur: props.onBlur, 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, shouldSubmit: messageInput.shouldSubmit, showCommandsList: messageInput.showCommandsList, showMentionsList: messageInput.showMentionsList, SuggestionItem: SuggestionItem, SuggestionList: SuggestionList, trigger: messageInput.autocompleteTriggers || {}, value: props.value || messageInput.text }));
5442
- };
5443
- var ChatAutoComplete = React__default["default"].memo(UnMemoizedChatAutoComplete);
5444
-
5445
- /**
5446
- * Simple ponyfill for Object.fromEntries
5447
- */
5448
-
5449
- var fromEntries = function fromEntries(entries) {
5450
- return entries.reduce(function (acc, _ref) {
5451
- var key = _ref[0],
5452
- value = _ref[1];
5453
- acc[key] = value;
5454
- return acc;
5455
- }, {});
5456
- };
5457
- /**
5458
- * Small wrapper around `useLayoutEffect` to get rid of the warning on SSR envs
5459
- */
5460
-
5461
- var useIsomorphicLayoutEffect = typeof window !== 'undefined' && window.document && window.document.createElement ? React__namespace.useLayoutEffect : React__namespace.useEffect;
5462
-
5463
- var top = 'top';
5464
- var bottom = 'bottom';
5465
- var right = 'right';
5466
- var left = 'left';
5467
- var auto = 'auto';
5468
- var basePlacements = [top, bottom, right, left];
5469
- var start = 'start';
5470
- var end = 'end';
5471
- var clippingParents = 'clippingParents';
5472
- var viewport = 'viewport';
5473
- var popper = 'popper';
5474
- var reference = 'reference';
5475
- var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {
5476
- return acc.concat([placement + "-" + start, placement + "-" + end]);
5477
- }, []);
5478
- var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {
5479
- return acc.concat([placement, placement + "-" + start, placement + "-" + end]);
5480
- }, []); // modifiers that need to read the DOM
5481
-
5482
- var beforeRead = 'beforeRead';
5483
- var read = 'read';
5484
- var afterRead = 'afterRead'; // pure-logic modifiers
5485
-
5486
- var beforeMain = 'beforeMain';
5487
- var main = 'main';
5488
- var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)
5489
-
5490
- var beforeWrite = 'beforeWrite';
5491
- var write = 'write';
5492
- var afterWrite = 'afterWrite';
5493
- var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];
5494
-
5495
- function getNodeName(element) {
5496
- return element ? (element.nodeName || '').toLowerCase() : null;
5497
- }
5498
-
5499
- function getWindow(node) {
5500
- if (node == null) {
5501
- return window;
5502
- }
5503
-
5504
- if (node.toString() !== '[object Window]') {
5505
- var ownerDocument = node.ownerDocument;
5506
- return ownerDocument ? ownerDocument.defaultView || window : window;
5507
- }
5508
-
5509
- return node;
5510
- }
5511
-
5512
- function isElement(node) {
5513
- var OwnElement = getWindow(node).Element;
5514
- return node instanceof OwnElement || node instanceof Element;
5515
- }
5516
-
5517
- function isHTMLElement(node) {
5518
- var OwnElement = getWindow(node).HTMLElement;
5519
- return node instanceof OwnElement || node instanceof HTMLElement;
5520
- }
5521
-
5522
- function isShadowRoot(node) {
5523
- // IE 11 has no ShadowRoot
5524
- if (typeof ShadowRoot === 'undefined') {
5525
- return false;
5526
- }
5527
-
5528
- var OwnElement = getWindow(node).ShadowRoot;
5529
- return node instanceof OwnElement || node instanceof ShadowRoot;
5530
- }
5531
-
5532
- // and applies them to the HTMLElements such as popper and arrow
5533
-
5534
- function applyStyles(_ref) {
5535
- var state = _ref.state;
5536
- Object.keys(state.elements).forEach(function (name) {
5537
- var style = state.styles[name] || {};
5538
- var attributes = state.attributes[name] || {};
5539
- var element = state.elements[name]; // arrow is optional + virtual elements
5540
-
5541
- if (!isHTMLElement(element) || !getNodeName(element)) {
5542
- return;
5543
- } // Flow doesn't support to extend this property, but it's the most
5544
- // effective way to apply styles to an HTMLElement
5545
- // $FlowFixMe[cannot-write]
5546
-
5547
-
5548
- Object.assign(element.style, style);
5549
- Object.keys(attributes).forEach(function (name) {
5550
- var value = attributes[name];
5551
-
5552
- if (value === false) {
5553
- element.removeAttribute(name);
5554
- } else {
5555
- element.setAttribute(name, value === true ? '' : value);
5556
- }
5557
- });
5558
- });
5559
- }
5560
-
5561
- function effect$2(_ref2) {
5562
- var state = _ref2.state;
5563
- var initialStyles = {
5564
- popper: {
5565
- position: state.options.strategy,
5566
- left: '0',
5567
- top: '0',
5568
- margin: '0'
5569
- },
5570
- arrow: {
5571
- position: 'absolute'
5572
- },
5573
- reference: {}
5574
- };
5575
- Object.assign(state.elements.popper.style, initialStyles.popper);
5576
- state.styles = initialStyles;
5577
-
5578
- if (state.elements.arrow) {
5579
- Object.assign(state.elements.arrow.style, initialStyles.arrow);
5580
- }
5581
-
5582
- return function () {
5583
- Object.keys(state.elements).forEach(function (name) {
5584
- var element = state.elements[name];
5585
- var attributes = state.attributes[name] || {};
5586
- var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them
5587
-
5588
- var style = styleProperties.reduce(function (style, property) {
5589
- style[property] = '';
5590
- return style;
5591
- }, {}); // arrow is optional + virtual elements
5592
-
5593
- if (!isHTMLElement(element) || !getNodeName(element)) {
5594
- return;
5595
- }
5596
-
5597
- Object.assign(element.style, style);
5598
- Object.keys(attributes).forEach(function (attribute) {
5599
- element.removeAttribute(attribute);
5600
- });
5601
- });
5602
- };
5603
- } // eslint-disable-next-line import/no-unused-modules
5604
-
5605
-
5606
- var applyStyles$1 = {
5607
- name: 'applyStyles',
5608
- enabled: true,
5609
- phase: 'write',
5610
- fn: applyStyles,
5611
- effect: effect$2,
5612
- requires: ['computeStyles']
5613
- };
5614
-
5615
- function getBasePlacement(placement) {
5616
- return placement.split('-')[0];
5617
- }
5618
-
5619
- var max = Math.max;
5620
- var min = Math.min;
5621
- var round = Math.round;
4910
+ var max = Math.max;
4911
+ var min = Math.min;
4912
+ var round = Math.round;
5622
4913
 
5623
4914
  function getBoundingClientRect(element, includeScale) {
5624
4915
  if (includeScale === void 0) {
@@ -7253,97 +6544,822 @@ var usePopper = function usePopper(referenceElement, popperElement, options) {
7253
6544
  options = {};
7254
6545
  }
7255
6546
 
7256
- var prevOptions = React__namespace.useRef(null);
7257
- var optionsWithDefaults = {
7258
- onFirstUpdate: options.onFirstUpdate,
7259
- placement: options.placement || 'bottom',
7260
- strategy: options.strategy || 'absolute',
7261
- modifiers: options.modifiers || EMPTY_MODIFIERS
7262
- };
6547
+ var prevOptions = React__namespace.useRef(null);
6548
+ var optionsWithDefaults = {
6549
+ onFirstUpdate: options.onFirstUpdate,
6550
+ placement: options.placement || 'bottom',
6551
+ strategy: options.strategy || 'absolute',
6552
+ modifiers: options.modifiers || EMPTY_MODIFIERS
6553
+ };
6554
+
6555
+ var _React$useState = React__namespace.useState({
6556
+ styles: {
6557
+ popper: {
6558
+ position: optionsWithDefaults.strategy,
6559
+ left: '0',
6560
+ top: '0'
6561
+ },
6562
+ arrow: {
6563
+ position: 'absolute'
6564
+ }
6565
+ },
6566
+ attributes: {}
6567
+ }),
6568
+ state = _React$useState[0],
6569
+ setState = _React$useState[1];
6570
+
6571
+ var updateStateModifier = React__namespace.useMemo(function () {
6572
+ return {
6573
+ name: 'updateState',
6574
+ enabled: true,
6575
+ phase: 'write',
6576
+ fn: function fn(_ref) {
6577
+ var state = _ref.state;
6578
+ var elements = Object.keys(state.elements);
6579
+ ReactDOM__namespace.flushSync(function () {
6580
+ setState({
6581
+ styles: fromEntries(elements.map(function (element) {
6582
+ return [element, state.styles[element] || {}];
6583
+ })),
6584
+ attributes: fromEntries(elements.map(function (element) {
6585
+ return [element, state.attributes[element]];
6586
+ }))
6587
+ });
6588
+ });
6589
+ },
6590
+ requires: ['computeStyles']
6591
+ };
6592
+ }, []);
6593
+ var popperOptions = React__namespace.useMemo(function () {
6594
+ var newOptions = {
6595
+ onFirstUpdate: optionsWithDefaults.onFirstUpdate,
6596
+ placement: optionsWithDefaults.placement,
6597
+ strategy: optionsWithDefaults.strategy,
6598
+ modifiers: [].concat(optionsWithDefaults.modifiers, [updateStateModifier, {
6599
+ name: 'applyStyles',
6600
+ enabled: false
6601
+ }])
6602
+ };
6603
+
6604
+ if (deepequal__default["default"](prevOptions.current, newOptions)) {
6605
+ return prevOptions.current || newOptions;
6606
+ } else {
6607
+ prevOptions.current = newOptions;
6608
+ return newOptions;
6609
+ }
6610
+ }, [optionsWithDefaults.onFirstUpdate, optionsWithDefaults.placement, optionsWithDefaults.strategy, optionsWithDefaults.modifiers, updateStateModifier]);
6611
+ var popperInstanceRef = React__namespace.useRef();
6612
+ useIsomorphicLayoutEffect(function () {
6613
+ if (popperInstanceRef.current) {
6614
+ popperInstanceRef.current.setOptions(popperOptions);
6615
+ }
6616
+ }, [popperOptions]);
6617
+ useIsomorphicLayoutEffect(function () {
6618
+ if (referenceElement == null || popperElement == null) {
6619
+ return;
6620
+ }
6621
+
6622
+ var createPopper$1 = options.createPopper || createPopper;
6623
+ var popperInstance = createPopper$1(referenceElement, popperElement, popperOptions);
6624
+ popperInstanceRef.current = popperInstance;
6625
+ return function () {
6626
+ popperInstance.destroy();
6627
+ popperInstanceRef.current = null;
6628
+ };
6629
+ }, [referenceElement, popperElement, options.createPopper]);
6630
+ return {
6631
+ state: popperInstanceRef.current ? popperInstanceRef.current.state : null,
6632
+ styles: state.styles,
6633
+ attributes: state.attributes,
6634
+ update: popperInstanceRef.current ? popperInstanceRef.current.update : null,
6635
+ forceUpdate: popperInstanceRef.current ? popperInstanceRef.current.forceUpdate : null
6636
+ };
6637
+ };
6638
+
6639
+ var Tooltip = function (_a) {
6640
+ var children = _a.children, rest = __rest(_a, ["children"]);
6641
+ return (React__default["default"].createElement("div", __assign({ className: 'str-chat__tooltip' }, rest), children));
6642
+ };
6643
+ var PopperTooltip = function (_a) {
6644
+ var children = _a.children, _b = _a.offset, offset = _b === void 0 ? [0, 10] : _b, referenceElement = _a.referenceElement, _c = _a.placement, placement = _c === void 0 ? 'top' : _c, _d = _a.visible, visible = _d === void 0 ? false : _d;
6645
+ var _e = React.useState(null), popperElement = _e[0], setPopperElement = _e[1];
6646
+ var _f = usePopper(referenceElement, popperElement, {
6647
+ modifiers: [
6648
+ {
6649
+ name: 'offset',
6650
+ options: {
6651
+ offset: offset,
6652
+ },
6653
+ },
6654
+ ],
6655
+ placement: placement,
6656
+ }), attributes = _f.attributes, styles = _f.styles;
6657
+ if (!visible)
6658
+ return null;
6659
+ return (React__default["default"].createElement("div", __assign({ className: 'str-chat__tooltip', ref: setPopperElement, style: styles.popper }, attributes.popper), children));
6660
+ };
6661
+
6662
+ var useEnterLeaveHandlers = function (_a) {
6663
+ var _b = _a === void 0 ? {} : _a, onMouseEnter = _b.onMouseEnter, onMouseLeave = _b.onMouseLeave;
6664
+ var _c = React.useState(false), tooltipVisible = _c[0], setTooltipVisible = _c[1];
6665
+ var handleEnter = React.useCallback(function (e) {
6666
+ setTooltipVisible(true);
6667
+ onMouseEnter === null || onMouseEnter === void 0 ? void 0 : onMouseEnter(e);
6668
+ }, [onMouseEnter]);
6669
+ var handleLeave = React.useCallback(function (e) {
6670
+ setTooltipVisible(false);
6671
+ onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave(e);
6672
+ }, [onMouseLeave]);
6673
+ return { handleEnter: handleEnter, handleLeave: handleLeave, tooltipVisible: tooltipVisible };
6674
+ };
6675
+
6676
+ var UnMemoizedMessageStatus = function (props) {
6677
+ var _a;
6678
+ var propAvatar = props.Avatar, _b = props.messageType, messageType = _b === void 0 ? 'simple' : _b, _c = props.tooltipUserNameMapper, tooltipUserNameMapper = _c === void 0 ? mapToUserNameOrId : _c;
6679
+ var _d = useEnterLeaveHandlers(), handleEnter = _d.handleEnter, handleLeave = _d.handleLeave, tooltipVisible = _d.tooltipVisible;
6680
+ var client = useChatContext('MessageStatus').client;
6681
+ var contextAvatar = useComponentContext('MessageStatus').Avatar;
6682
+ var _e = useMessageContext('MessageStatus'), isMyMessage = _e.isMyMessage, lastReceivedId = _e.lastReceivedId, message = _e.message, readBy = _e.readBy, threadList = _e.threadList;
6683
+ var t = useTranslationContext('MessageStatus').t;
6684
+ var themeVersion = useChatContext('MessageStatus').themeVersion;
6685
+ var _f = React.useState(null), referenceElement = _f[0], setReferenceElement = _f[1];
6686
+ var Avatar$1 = propAvatar || contextAvatar || Avatar;
6687
+ if (!isMyMessage() || message.type === 'error')
6688
+ return null;
6689
+ var justReadByMe = (readBy === null || readBy === void 0 ? void 0 : readBy.length) === 1 && readBy[0].id === ((_a = client.user) === null || _a === void 0 ? void 0 : _a.id);
6690
+ var rootClassName = "str-chat__message-".concat(messageType, "-status str-chat__message-status");
6691
+ var sending = message.status === 'sending';
6692
+ var delivered = message.status === 'received' && message.id === lastReceivedId && !threadList;
6693
+ var deliveredAndRead = !!((readBy === null || readBy === void 0 ? void 0 : readBy.length) && !threadList && !justReadByMe);
6694
+ var lastReadUser = (deliveredAndRead
6695
+ ? readBy.filter(function (item) { var _a; return item.id !== ((_a = client.user) === null || _a === void 0 ? void 0 : _a.id); })
6696
+ : [])[0];
6697
+ return (React__default["default"].createElement("span", { className: rootClassName, "data-testid": clsx({
6698
+ 'message-status-read-by': deliveredAndRead,
6699
+ 'message-status-received': delivered && !deliveredAndRead,
6700
+ 'message-status-sending': sending,
6701
+ }), onMouseEnter: handleEnter, onMouseLeave: handleLeave, ref: setReferenceElement },
6702
+ sending && (React__default["default"].createElement(React__default["default"].Fragment, null,
6703
+ themeVersion === '1' && React__default["default"].createElement(Tooltip, null, t('Sending...')),
6704
+ themeVersion === '2' && (React__default["default"].createElement(PopperTooltip, { offset: [0, 5], referenceElement: referenceElement, visible: tooltipVisible }, t('Sending...'))),
6705
+ React__default["default"].createElement(LoadingIndicator, null))),
6706
+ delivered && !deliveredAndRead && (React__default["default"].createElement(React__default["default"].Fragment, null,
6707
+ themeVersion === '1' && React__default["default"].createElement(Tooltip, null, t('Delivered')),
6708
+ themeVersion === '2' && (React__default["default"].createElement(PopperTooltip, { offset: [0, 5], referenceElement: referenceElement, visible: tooltipVisible }, t('Delivered'))),
6709
+ themeVersion === '2' ? React__default["default"].createElement(MessageDeliveredIcon, null) : React__default["default"].createElement(DeliveredCheckIcon, null))),
6710
+ deliveredAndRead && (React__default["default"].createElement(React__default["default"].Fragment, null,
6711
+ themeVersion === '1' && (React__default["default"].createElement(Tooltip, null, getReadByTooltipText(readBy, t, client, tooltipUserNameMapper))),
6712
+ themeVersion === '2' && (React__default["default"].createElement(PopperTooltip, { offset: [0, 5], referenceElement: referenceElement, visible: tooltipVisible }, getReadByTooltipText(readBy, t, client, tooltipUserNameMapper))),
6713
+ React__default["default"].createElement(Avatar$1, { image: lastReadUser.image, name: lastReadUser.name || lastReadUser.id, size: 15, user: lastReadUser }),
6714
+ readBy.length > 2 && (React__default["default"].createElement("span", { className: "str-chat__message-".concat(messageType, "-status-number"), "data-testid": 'message-status-read-by-many' }, readBy.length - 1))))));
6715
+ };
6716
+ var MessageStatus = React__default["default"].memo(UnMemoizedMessageStatus);
6717
+
6718
+ var QuotedMessage = function () {
6719
+ var _a, _b;
6720
+ var _c = useComponentContext('QuotedMessage'), Attachment = _c.Attachment, ContextAvatar = _c.Avatar;
6721
+ var _d = useMessageContext('QuotedMessage'), isMyMessage = _d.isMyMessage, message = _d.message;
6722
+ var userLanguage = useTranslationContext('QuotedMessage').userLanguage;
6723
+ var jumpToMessage = useChannelActionContext('QuotedMessage').jumpToMessage;
6724
+ var Avatar$1 = ContextAvatar || Avatar;
6725
+ var quoted_message = message.quoted_message;
6726
+ if (!quoted_message)
6727
+ return null;
6728
+ var quotedMessageText = ((_a = quoted_message.i18n) === null || _a === void 0 ? void 0 : _a["".concat(userLanguage, "_text")]) ||
6729
+ quoted_message.text;
6730
+ // @ts-expect-error
6731
+ var quotedMessageAttachment = quoted_message.attachments.length
6732
+ ? // @ts-expect-error
6733
+ quoted_message.attachments[0]
6734
+ : null;
6735
+ if (!quotedMessageText && !quotedMessageAttachment)
6736
+ return null;
6737
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
6738
+ React__default["default"].createElement("div", { className: clsx('str-chat__quoted-message-preview quoted-message', { mine: isMyMessage() }), onClickCapture: function (e) {
6739
+ e.stopPropagation();
6740
+ e.preventDefault();
6741
+ jumpToMessage(quoted_message.id);
6742
+ } },
6743
+ quoted_message.user && (React__default["default"].createElement(Avatar$1, { image: quoted_message.user.image, name: quoted_message.user.name || quoted_message.user.id, size: 20, user: quoted_message.user })),
6744
+ React__default["default"].createElement("div", { className: 'quoted-message-inner str-chat__quoted-message-bubble' },
6745
+ quotedMessageAttachment && React__default["default"].createElement(Attachment, { attachments: [quotedMessageAttachment] }),
6746
+ React__default["default"].createElement("div", null, quotedMessageText))),
6747
+ ((_b = message.attachments) === null || _b === void 0 ? void 0 : _b.length) && message.quoted_message ? (React__default["default"].createElement(Attachment, { attachments: message.attachments })) : null));
6748
+ };
6749
+
6750
+ var UnMemoizedMessageTextComponent = function (props) {
6751
+ var _a;
6752
+ var customInnerClass = props.customInnerClass, _b = props.customWrapperClass, customWrapperClass = _b === void 0 ? '' : _b, propMessage = props.message, _c = props.theme, theme = _c === void 0 ? 'simple' : _c;
6753
+ var _d = useComponentContext('MessageText').QuotedMessage, QuotedMessage$1 = _d === void 0 ? QuotedMessage : _d;
6754
+ var _e = useMessageContext('MessageText'), contextMessage = _e.message, onMentionsClickMessage = _e.onMentionsClickMessage, onMentionsHoverMessage = _e.onMentionsHoverMessage, _f = _e.renderText, renderText$1 = _f === void 0 ? renderText : _f, unsafeHTML = _e.unsafeHTML;
6755
+ var _g = useTranslationContext('MessageText'), t = _g.t, userLanguage = _g.userLanguage;
6756
+ var message = propMessage || contextMessage;
6757
+ var hasAttachment = messageHasAttachments(message);
6758
+ var messageTextToRender = ((_a = message.i18n) === null || _a === void 0 ? void 0 : _a["".concat(userLanguage, "_text")]) || message.text;
6759
+ var messageText = React.useMemo(function () { return renderText$1(messageTextToRender, message.mentioned_users); }, [
6760
+ message.mentioned_users,
6761
+ messageTextToRender,
6762
+ ]);
6763
+ var wrapperClass = customWrapperClass || 'str-chat__message-text';
6764
+ var innerClass = customInnerClass || "str-chat__message-text-inner str-chat__message-".concat(theme, "-text-inner");
6765
+ if (!messageTextToRender && !message.quoted_message)
6766
+ return null;
6767
+ return (React__default["default"].createElement("div", { className: wrapperClass, tabIndex: 0 },
6768
+ React__default["default"].createElement("div", { className: "\n ".concat(innerClass, "\n ").concat(hasAttachment ? " str-chat__message-".concat(theme, "-text-inner--has-attachment") : '', "\n ").concat(isOnlyEmojis(message.text) && !message.quoted_message
6769
+ ? " str-chat__message-".concat(theme, "-text-inner--is-emoji")
6770
+ : '', "\n ").trim(), "data-testid": 'message-text-inner-wrapper', onClick: onMentionsClickMessage, onMouseOver: onMentionsHoverMessage },
6771
+ message.quoted_message && React__default["default"].createElement(QuotedMessage$1, null),
6772
+ message.type === 'error' && (React__default["default"].createElement("div", { className: "str-chat__".concat(theme, "-message--error-message str-chat__message--error-message") }, t('Error · Unsent'))),
6773
+ message.status === 'failed' && (React__default["default"].createElement("div", { className: "str-chat__".concat(theme, "-message--error-message str-chat__message--error-message") }, message.errorStatusCode !== 403
6774
+ ? t('Message Failed · Click to try again')
6775
+ : t('Message Failed · Unauthorized'))),
6776
+ unsafeHTML && message.html ? (React__default["default"].createElement("div", { dangerouslySetInnerHTML: { __html: message.html } })) : (React__default["default"].createElement("div", null, messageText)))));
6777
+ };
6778
+ var MessageText = React__default["default"].memo(UnMemoizedMessageTextComponent);
6779
+
6780
+ var notValidDateWarning = 'MessageTimestamp was called without a message, or message has invalid created_at date.';
6781
+ var noParsingFunctionWarning = 'MessageTimestamp was called but there is no datetime parsing function available';
6782
+ function getDateString(_a) {
6783
+ var calendar = _a.calendar, format = _a.format, formatDate = _a.formatDate, messageCreatedAt = _a.messageCreatedAt, tDateTimeParser = _a.tDateTimeParser;
6784
+ if (!messageCreatedAt ||
6785
+ (typeof messageCreatedAt === 'string' && !Date.parse(messageCreatedAt))) {
6786
+ console.warn(notValidDateWarning);
6787
+ return null;
6788
+ }
6789
+ if (typeof formatDate === 'function') {
6790
+ return formatDate(new Date(messageCreatedAt));
6791
+ }
6792
+ if (!tDateTimeParser) {
6793
+ console.warn(noParsingFunctionWarning);
6794
+ return null;
6795
+ }
6796
+ var parsedTime = tDateTimeParser(messageCreatedAt);
6797
+ if (isDayOrMoment(parsedTime)) {
6798
+ /**
6799
+ * parsedTime.calendar is guaranteed on the type but is only
6800
+ * available when a user calls dayjs.extend(calendar)
6801
+ */
6802
+ return calendar && parsedTime.calendar ? parsedTime.calendar() : parsedTime.format(format);
6803
+ }
6804
+ if (isDate(parsedTime)) {
6805
+ return parsedTime.toDateString();
6806
+ }
6807
+ if (isNumberOrString(parsedTime)) {
6808
+ return parsedTime;
6809
+ }
6810
+ return null;
6811
+ }
6812
+
6813
+ var defaultTimestampFormat = 'h:mmA';
6814
+ var UnMemoizedMessageTimestamp = function (props) {
6815
+ var _a = props.calendar, calendar = _a === void 0 ? false : _a, _b = props.customClass, customClass = _b === void 0 ? '' : _b, _c = props.format, format = _c === void 0 ? defaultTimestampFormat : _c, propMessage = props.message;
6816
+ var _d = useMessageContext('MessageTimestamp'), formatDate = _d.formatDate, contextMessage = _d.message;
6817
+ var tDateTimeParser = useTranslationContext('MessageTimestamp').tDateTimeParser;
6818
+ var message = propMessage || contextMessage;
6819
+ var messageCreatedAt = message.created_at && isDate(message.created_at)
6820
+ ? message.created_at.toISOString()
6821
+ : message.created_at;
6822
+ var when = React.useMemo(function () { return getDateString({ calendar: calendar, format: format, formatDate: formatDate, messageCreatedAt: messageCreatedAt, tDateTimeParser: tDateTimeParser }); }, [formatDate, calendar, tDateTimeParser, format, messageCreatedAt]);
6823
+ if (!when)
6824
+ return null;
6825
+ return (React__default["default"].createElement("time", { className: customClass, dateTime: messageCreatedAt, title: messageCreatedAt }, when));
6826
+ };
6827
+ var MessageTimestamp = React__default["default"].memo(UnMemoizedMessageTimestamp);
6828
+
6829
+ var CUSTOM_MESSAGE_TYPE = {
6830
+ date: 'message.date',
6831
+ intro: 'channel.intro',
6832
+ };
6833
+
6834
+ var useCommandTrigger = function () {
6835
+ var themeVersion = useChatContext('useCommandTrigger').themeVersion;
6836
+ var channelConfig = useChannelStateContext('useCommandTrigger').channelConfig;
6837
+ var commands = channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.commands;
6838
+ return {
6839
+ component: CommandItem,
6840
+ dataProvider: function (query, text, onReady) {
6841
+ if (text.indexOf('/') !== 0 || !commands) {
6842
+ return [];
6843
+ }
6844
+ var selectedCommands = commands.filter(function (command) { var _a; return ((_a = command.name) === null || _a === void 0 ? void 0 : _a.indexOf(query)) !== -1; });
6845
+ // sort alphabetically unless the you're matching the first char
6846
+ selectedCommands.sort(function (a, b) {
6847
+ var _a, _b;
6848
+ var nameA = (_a = a.name) === null || _a === void 0 ? void 0 : _a.toLowerCase();
6849
+ var nameB = (_b = b.name) === null || _b === void 0 ? void 0 : _b.toLowerCase();
6850
+ if ((nameA === null || nameA === void 0 ? void 0 : nameA.indexOf(query)) === 0) {
6851
+ nameA = "0".concat(nameA);
6852
+ }
6853
+ if ((nameB === null || nameB === void 0 ? void 0 : nameB.indexOf(query)) === 0) {
6854
+ nameB = "0".concat(nameB);
6855
+ }
6856
+ // Should confirm possible null / undefined when TS is fully implemented
6857
+ if (nameA != null && nameB != null) {
6858
+ if (nameA < nameB) {
6859
+ return -1;
6860
+ }
6861
+ if (nameA > nameB) {
6862
+ return 1;
6863
+ }
6864
+ }
6865
+ return 0;
6866
+ });
6867
+ var result = selectedCommands.slice(0, themeVersion === '2' ? 5 : 10);
6868
+ if (onReady)
6869
+ onReady(result.filter(function (result) {
6870
+ return result.name !== undefined;
6871
+ }), query);
6872
+ return result;
6873
+ },
6874
+ output: function (entity) { return ({
6875
+ caretPosition: 'next',
6876
+ key: entity.name,
6877
+ text: "/".concat(entity.name),
6878
+ }); },
6879
+ };
6880
+ };
6881
+
6882
+ var UnMemoizedEmoticonItem = function (props) {
6883
+ var entity = props.entity;
6884
+ var hasEntity = Object.keys(entity).length;
6885
+ var itemParts = entity === null || entity === void 0 ? void 0 : entity.itemNameParts;
6886
+ var renderName = function () {
6887
+ if (!hasEntity)
6888
+ return null;
6889
+ return (hasEntity &&
6890
+ itemParts.parts.map(function (part, i) {
6891
+ return part.toLowerCase() === itemParts.match.toLowerCase() ? (React__default["default"].createElement("span", { className: 'str-chat__emoji-item--highlight', key: "part-".concat(i) }, part)) : (React__default["default"].createElement("span", { className: 'str-chat__emoji-item--part', key: "part-".concat(i) }, part));
6892
+ }));
6893
+ };
6894
+ return (React__default["default"].createElement("div", { className: 'str-chat__emoji-item' },
6895
+ React__default["default"].createElement("span", { className: 'str-chat__emoji-item--entity' }, entity.native),
6896
+ React__default["default"].createElement("span", { className: 'str-chat__emoji-item--name' }, renderName())));
6897
+ };
6898
+ var EmoticonItem = React__default["default"].memo(UnMemoizedEmoticonItem);
6899
+
6900
+ var useEmojiTrigger = function (emojiIndex) {
6901
+ var themeVersion = useChatContext('useEmojiTrigger').themeVersion;
6902
+ return {
6903
+ component: EmoticonItem,
6904
+ dataProvider: function (query, _, onReady) {
6905
+ if (query.length === 0 || query.charAt(0).match(/[^a-zA-Z0-9+-]/)) {
6906
+ return [];
6907
+ }
6908
+ var emojis = (emojiIndex === null || emojiIndex === void 0 ? void 0 : emojiIndex.search(query)) || [];
6909
+ // emojiIndex.search sometimes returns undefined values, so filter those out first
6910
+ var result = emojis.filter(Boolean).slice(0, themeVersion === '2' ? 7 : 10);
6911
+ if (onReady)
6912
+ onReady(result, query);
6913
+ return result;
6914
+ },
6915
+ output: function (entity) { return ({
6916
+ caretPosition: 'next',
6917
+ key: entity.id,
6918
+ text: "".concat('native' in entity ? entity.native : ''),
6919
+ }); },
6920
+ };
6921
+ };
6922
+
6923
+ var accentsMap = {
6924
+ a: 'á|à|ã|â|À|Á|Ã|Â',
6925
+ c: 'ç|Ç',
6926
+ e: 'é|è|ê|É|È|Ê',
6927
+ i: 'í|ì|î|Í|Ì|Î',
6928
+ n: 'ñ|Ñ',
6929
+ o: 'ó|ò|ô|ő|õ|Ó|Ò|Ô|Õ',
6930
+ u: 'ú|ù|û|ü|Ú|Ù|Û|Ü',
6931
+ };
6932
+ var removeDiacritics = function (text) {
6933
+ if (!text)
6934
+ return '';
6935
+ return Object.keys(accentsMap).reduce(function (acc, current) { return acc.replace(new RegExp(accentsMap[current], 'g'), current); }, text);
6936
+ };
6937
+ var calculateLevenshtein = function (query, name) {
6938
+ if (query.length === 0)
6939
+ return name.length;
6940
+ if (name.length === 0)
6941
+ return query.length;
6942
+ var matrix = [];
6943
+ var i;
6944
+ for (i = 0; i <= name.length; i++) {
6945
+ matrix[i] = [i];
6946
+ }
6947
+ var j;
6948
+ for (j = 0; j <= query.length; j++) {
6949
+ matrix[0][j] = j;
6950
+ }
6951
+ for (i = 1; i <= name.length; i++) {
6952
+ for (j = 1; j <= query.length; j++) {
6953
+ if (name.charAt(i - 1) === query.charAt(j - 1)) {
6954
+ matrix[i][j] = matrix[i - 1][j - 1];
6955
+ }
6956
+ else {
6957
+ matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
6958
+ Math.min(matrix[i][j - 1] + 1, // insertion
6959
+ matrix[i - 1][j] + 1)); // deletion
6960
+ }
6961
+ }
6962
+ }
6963
+ return matrix[name.length][query.length];
6964
+ };
6965
+ var searchLocalUsers = function (params) {
6966
+ var ownUserId = params.ownUserId, query = params.query, text = params.text, useMentionsTransliteration = params.useMentionsTransliteration, users = params.users;
6967
+ var matchingUsers = users.filter(function (user) {
6968
+ if (user.id === ownUserId)
6969
+ return false;
6970
+ if (!query)
6971
+ return true;
6972
+ var updatedId = removeDiacritics(user.id).toLowerCase();
6973
+ var updatedName = removeDiacritics(user.name).toLowerCase();
6974
+ var updatedQuery = removeDiacritics(query).toLowerCase();
6975
+ if (useMentionsTransliteration) {
6976
+ (function () { return __awaiter$1(void 0, void 0, void 0, function () {
6977
+ var transliterate;
6978
+ return __generator$1(this, function (_a) {
6979
+ switch (_a.label) {
6980
+ case 0: return [4 /*yield*/, Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@stream-io/transliterate')); })];
6981
+ case 1:
6982
+ transliterate = (_a.sent()).default;
6983
+ updatedName = transliterate(user.name || '').toLowerCase();
6984
+ updatedQuery = transliterate(query).toLowerCase();
6985
+ updatedId = transliterate(user.id).toLowerCase();
6986
+ return [2 /*return*/];
6987
+ }
6988
+ });
6989
+ }); })();
6990
+ }
6991
+ var maxDistance = 3;
6992
+ var lastDigits = text.slice(-(maxDistance + 1)).includes('@');
6993
+ if (updatedName) {
6994
+ var levenshtein_1 = calculateLevenshtein(updatedQuery, updatedName);
6995
+ if (updatedName.includes(updatedQuery) || (levenshtein_1 <= maxDistance && lastDigits)) {
6996
+ return true;
6997
+ }
6998
+ }
6999
+ var levenshtein = calculateLevenshtein(updatedQuery, updatedId);
7000
+ return updatedId.includes(updatedQuery) || (levenshtein <= maxDistance && lastDigits);
7001
+ });
7002
+ return matchingUsers;
7003
+ };
7004
+ var checkUploadPermissions = function (params) { return __awaiter$1(void 0, void 0, void 0, function () {
7005
+ var addNotification, file, getAppSettings, t, uploadType, appSettings, _a, allowed_file_extensions, allowed_mime_types, blocked_file_extensions, blocked_mime_types, sendErrorNotification, allowed, blocked, allowed, blocked;
7006
+ var _b, _c;
7007
+ return __generator$1(this, function (_d) {
7008
+ switch (_d.label) {
7009
+ case 0:
7010
+ addNotification = params.addNotification, file = params.file, getAppSettings = params.getAppSettings, t = params.t, uploadType = params.uploadType;
7011
+ appSettings = null;
7012
+ return [4 /*yield*/, getAppSettings()];
7013
+ case 1:
7014
+ appSettings = _d.sent();
7015
+ _a = (uploadType === 'image'
7016
+ ? (_b = appSettings === null || appSettings === void 0 ? void 0 : appSettings.app) === null || _b === void 0 ? void 0 : _b.image_upload_config
7017
+ : (_c = appSettings === null || appSettings === void 0 ? void 0 : appSettings.app) === null || _c === void 0 ? void 0 : _c.file_upload_config) || {}, allowed_file_extensions = _a.allowed_file_extensions, allowed_mime_types = _a.allowed_mime_types, blocked_file_extensions = _a.blocked_file_extensions, blocked_mime_types = _a.blocked_mime_types;
7018
+ sendErrorNotification = function () {
7019
+ return addNotification(t("Upload type: \"{{ type }}\" is not allowed", { type: file.type || 'unknown type' }), 'error');
7020
+ };
7021
+ if (allowed_file_extensions === null || allowed_file_extensions === void 0 ? void 0 : allowed_file_extensions.length) {
7022
+ allowed = allowed_file_extensions.some(function (ext) {
7023
+ return file.name.toLowerCase().endsWith(ext.toLowerCase());
7024
+ });
7025
+ if (!allowed) {
7026
+ sendErrorNotification();
7027
+ return [2 /*return*/, false];
7028
+ }
7029
+ }
7030
+ if (blocked_file_extensions === null || blocked_file_extensions === void 0 ? void 0 : blocked_file_extensions.length) {
7031
+ blocked = blocked_file_extensions.some(function (ext) {
7032
+ return file.name.toLowerCase().endsWith(ext.toLowerCase());
7033
+ });
7034
+ if (blocked) {
7035
+ sendErrorNotification();
7036
+ return [2 /*return*/, false];
7037
+ }
7038
+ }
7039
+ if (allowed_mime_types === null || allowed_mime_types === void 0 ? void 0 : allowed_mime_types.length) {
7040
+ allowed = allowed_mime_types.some(function (type) { var _a; return type.toLowerCase() === ((_a = file.type) === null || _a === void 0 ? void 0 : _a.toLowerCase()); });
7041
+ if (!allowed) {
7042
+ sendErrorNotification();
7043
+ return [2 /*return*/, false];
7044
+ }
7045
+ }
7046
+ if (blocked_mime_types === null || blocked_mime_types === void 0 ? void 0 : blocked_mime_types.length) {
7047
+ blocked = blocked_mime_types.some(function (type) { var _a; return type.toLowerCase() === ((_a = file.type) === null || _a === void 0 ? void 0 : _a.toLowerCase()); });
7048
+ if (blocked) {
7049
+ sendErrorNotification();
7050
+ return [2 /*return*/, false];
7051
+ }
7052
+ }
7053
+ return [2 /*return*/, true];
7054
+ }
7055
+ });
7056
+ }); };
7057
+
7058
+ var useUserTrigger = function (params) {
7059
+ var disableMentions = params.disableMentions, mentionAllAppUsers = params.mentionAllAppUsers, _a = params.mentionQueryParams, mentionQueryParams = _a === void 0 ? {} : _a, onSelectUser = params.onSelectUser, useMentionsTransliteration = params.useMentionsTransliteration;
7060
+ var _b = React.useState(false), searching = _b[0], setSearching = _b[1];
7061
+ var _c = useChatContext('useUserTrigger'), client = _c.client, mutes = _c.mutes, themeVersion = _c.themeVersion;
7062
+ var channel = useChannelStateContext('useUserTrigger').channel;
7063
+ var members = channel.state.members;
7064
+ var watchers = channel.state.watchers;
7065
+ var getMembersAndWatchers = React.useCallback(function () {
7066
+ var memberUsers = members ? Object.values(members).map(function (_a) {
7067
+ var user = _a.user;
7068
+ return user;
7069
+ }) : [];
7070
+ var watcherUsers = watchers ? Object.values(watchers) : [];
7071
+ var users = __spreadArray$1(__spreadArray$1([], memberUsers, true), watcherUsers, true);
7072
+ // make sure we don't list users twice
7073
+ var uniqueUsers = {};
7074
+ users.forEach(function (user) {
7075
+ if (user && !uniqueUsers[user.id]) {
7076
+ uniqueUsers[user.id] = user;
7077
+ }
7078
+ });
7079
+ return Object.values(uniqueUsers);
7080
+ }, [members, watchers]);
7081
+ var queryMembersThrottled = React.useCallback(throttle__default["default"](function (query, onReady) { return __awaiter$1(void 0, void 0, void 0, function () {
7082
+ var response, users, error_1;
7083
+ return __generator$1(this, function (_a) {
7084
+ switch (_a.label) {
7085
+ case 0:
7086
+ _a.trys.push([0, 2, , 3]);
7087
+ return [4 /*yield*/, channel.queryMembers({
7088
+ name: { $autocomplete: query },
7089
+ })];
7090
+ case 1:
7091
+ response = _a.sent();
7092
+ users = response.members.map(function (member) { return member.user; });
7093
+ if (onReady && users.length) {
7094
+ onReady(users);
7095
+ }
7096
+ else {
7097
+ onReady([]);
7098
+ }
7099
+ return [3 /*break*/, 3];
7100
+ case 2:
7101
+ error_1 = _a.sent();
7102
+ console.log({ error: error_1 });
7103
+ return [3 /*break*/, 3];
7104
+ case 3: return [2 /*return*/];
7105
+ }
7106
+ });
7107
+ }); }, 200), [channel]);
7108
+ var queryUsers = function (query, onReady) { return __awaiter$1(void 0, void 0, void 0, function () {
7109
+ var users, error_2;
7110
+ return __generator$1(this, function (_a) {
7111
+ switch (_a.label) {
7112
+ case 0:
7113
+ if (!query || searching)
7114
+ return [2 /*return*/];
7115
+ setSearching(true);
7116
+ _a.label = 1;
7117
+ case 1:
7118
+ _a.trys.push([1, 3, , 4]);
7119
+ return [4 /*yield*/, client.queryUsers(__assign({ $or: [{ id: { $autocomplete: query } }, { name: { $autocomplete: query } }], id: { $ne: client.userID } }, mentionQueryParams.filters), __assign({ id: 1 }, mentionQueryParams.sort), __assign({ limit: 10 }, mentionQueryParams.options))];
7120
+ case 2:
7121
+ users = (_a.sent()).users;
7122
+ if (onReady && users.length) {
7123
+ onReady(users);
7124
+ }
7125
+ else {
7126
+ onReady([]);
7127
+ }
7128
+ return [3 /*break*/, 4];
7129
+ case 3:
7130
+ error_2 = _a.sent();
7131
+ console.log({ error: error_2 });
7132
+ return [3 /*break*/, 4];
7133
+ case 4:
7134
+ setSearching(false);
7135
+ return [2 /*return*/];
7136
+ }
7137
+ });
7138
+ }); };
7139
+ var queryUsersThrottled = throttle__default["default"](queryUsers, 200);
7140
+ return {
7141
+ callback: function (item) { return onSelectUser(item); },
7142
+ component: UserItem,
7143
+ dataProvider: function (query, text, onReady) {
7144
+ var _a, _b;
7145
+ if (disableMentions)
7146
+ return;
7147
+ var filterMutes = function (data) {
7148
+ if (text.includes('/unmute') && !mutes.length) {
7149
+ return [];
7150
+ }
7151
+ if (!mutes.length)
7152
+ return data;
7153
+ if (text.includes('/unmute')) {
7154
+ return data.filter(function (suggestion) {
7155
+ return mutes.some(function (mute) { return mute.target.id === suggestion.id; });
7156
+ });
7157
+ }
7158
+ return data.filter(function (suggestion) { return mutes.every(function (mute) { return mute.target.id !== suggestion.id; }); });
7159
+ };
7160
+ if (mentionAllAppUsers) {
7161
+ return queryUsersThrottled(query, function (data) {
7162
+ if (onReady)
7163
+ onReady(filterMutes(data), query);
7164
+ });
7165
+ }
7166
+ /**
7167
+ * By default, we return maximum 100 members via queryChannels api call.
7168
+ * Thus it is safe to assume, that if number of members in channel.state is < 100,
7169
+ * then all the members are already available on client side and we don't need to
7170
+ * make any api call to queryMembers endpoint.
7171
+ */
7172
+ if (!query || Object.values(members || {}).length < 100) {
7173
+ var users = getMembersAndWatchers();
7174
+ var params_1 = {
7175
+ ownUserId: client.userID,
7176
+ query: query,
7177
+ text: text,
7178
+ useMentionsTransliteration: useMentionsTransliteration,
7179
+ users: users,
7180
+ };
7181
+ var matchingUsers = searchLocalUsers(params_1);
7182
+ var usersToShow = (_b = (_a = mentionQueryParams.options) === null || _a === void 0 ? void 0 : _a.limit) !== null && _b !== void 0 ? _b : (themeVersion === '2' ? 7 : 10);
7183
+ var data = matchingUsers.slice(0, usersToShow);
7184
+ if (onReady)
7185
+ onReady(filterMutes(data), query);
7186
+ return data;
7187
+ }
7188
+ return queryMembersThrottled(query, function (data) {
7189
+ if (onReady)
7190
+ onReady(filterMutes(data), query);
7191
+ });
7192
+ },
7193
+ output: function (entity) { return ({
7194
+ caretPosition: 'next',
7195
+ key: entity.id,
7196
+ text: "@".concat(entity.name || entity.id),
7197
+ }); },
7198
+ };
7199
+ };
7200
+
7201
+ var DefaultTriggerProvider = function (_a) {
7202
+ var children = _a.children;
7203
+ var currentValue = useMessageInputContext('DefaultTriggerProvider');
7204
+ var defaultAutocompleteTriggers = {
7205
+ '/': useCommandTrigger(),
7206
+ ':': useEmojiTrigger(currentValue.emojiIndex),
7207
+ '@': useUserTrigger({
7208
+ disableMentions: currentValue.disableMentions,
7209
+ mentionAllAppUsers: currentValue.mentionAllAppUsers,
7210
+ mentionQueryParams: currentValue.mentionQueryParams,
7211
+ onSelectUser: currentValue.onSelectUser,
7212
+ useMentionsTransliteration: currentValue.useMentionsTransliteration,
7213
+ }),
7214
+ };
7215
+ var newValue = __assign(__assign({}, currentValue), { autocompleteTriggers: defaultAutocompleteTriggers });
7216
+ return React__default["default"].createElement(MessageInputContextProvider, { value: newValue }, children);
7217
+ };
7263
7218
 
7264
- var _React$useState = React__namespace.useState({
7265
- styles: {
7266
- popper: {
7267
- position: optionsWithDefaults.strategy,
7268
- left: '0',
7269
- top: '0'
7270
- },
7271
- arrow: {
7272
- position: 'absolute'
7273
- }
7274
- },
7275
- attributes: {}
7276
- }),
7277
- state = _React$useState[0],
7278
- setState = _React$useState[1];
7219
+ var filterEmoji = function (emoji) {
7220
+ return !(emoji.name === 'White Smiling Face' || emoji.name === 'White Frowning Face');
7221
+ };
7222
+ var EmojiPicker = function (_a) {
7223
+ var small = _a.small;
7224
+ var _b = useEmojiContext('EmojiPicker'), emojiConfig = _b.emojiConfig, EmojiPickerComponent = _b.EmojiPicker;
7225
+ var t = useTranslationContext('EmojiPicker').t;
7226
+ var _c = useMessageInputContext('EmojiPicker'), emojiPickerIsOpen = _c.emojiPickerIsOpen, emojiPickerRef = _c.emojiPickerRef, onSelectEmoji = _c.onSelectEmoji;
7227
+ var emojiData = (emojiConfig || {}).emojiData;
7228
+ if (!emojiPickerIsOpen || !emojiData)
7229
+ return null;
7230
+ return (React__default["default"].createElement("div", { className: clsx('str-chat__emoji-picker-container', {
7231
+ 'str-chat__input--emojipicker': !small,
7232
+ 'str-chat__small-message-input-emojipicker': small,
7233
+ }), ref: emojiPickerRef },
7234
+ React__default["default"].createElement(React.Suspense, { fallback: null },
7235
+ React__default["default"].createElement(EmojiPickerComponent, { color: '#006CFF', data: emojiData, emoji: 'point_up', emojisToShowFilter: filterEmoji, native: true, onSelect: onSelectEmoji, set: 'facebook', showPreview: false, showSkinTones: false, title: t('Pick your emoji'), useButton: true }))));
7236
+ };
7279
7237
 
7280
- var updateStateModifier = React__namespace.useMemo(function () {
7281
- return {
7282
- name: 'updateState',
7283
- enabled: true,
7284
- phase: 'write',
7285
- fn: function fn(_ref) {
7286
- var state = _ref.state;
7287
- var elements = Object.keys(state.elements);
7288
- ReactDOM__namespace.flushSync(function () {
7289
- setState({
7290
- styles: fromEntries(elements.map(function (element) {
7291
- return [element, state.styles[element] || {}];
7292
- })),
7293
- attributes: fromEntries(elements.map(function (element) {
7294
- return [element, state.attributes[element]];
7295
- }))
7296
- });
7297
- });
7298
- },
7299
- requires: ['computeStyles']
7300
- };
7301
- }, []);
7302
- var popperOptions = React__namespace.useMemo(function () {
7303
- var newOptions = {
7304
- onFirstUpdate: optionsWithDefaults.onFirstUpdate,
7305
- placement: optionsWithDefaults.placement,
7306
- strategy: optionsWithDefaults.strategy,
7307
- modifiers: [].concat(optionsWithDefaults.modifiers, [updateStateModifier, {
7308
- name: 'applyStyles',
7309
- enabled: false
7310
- }])
7311
- };
7238
+ var EmojiIconLarge = function () {
7239
+ var t = useTranslationContext('EmojiIconLarge').t;
7240
+ return (React__default["default"].createElement("svg", { height: '28', width: '28', xmlns: 'http://www.w3.org/2000/svg' },
7241
+ React__default["default"].createElement("title", null, t('Open emoji picker')),
7242
+ React__default["default"].createElement("g", { clipRule: 'evenodd', fillRule: 'evenodd' },
7243
+ React__default["default"].createElement("path", { d: 'M14 4.4C8.6 4.4 4.4 8.6 4.4 14c0 5.4 4.2 9.6 9.6 9.6c5.4 0 9.6-4.2 9.6-9.6c0-5.4-4.2-9.6-9.6-9.6zM2 14c0-6.6 5.4-12 12-12s12 5.4 12 12s-5.4 12-12 12s-12-5.4-12-12zM12.8 11c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8s.8-1.8 1.8-1.8s1.8.8 1.8 1.8zM18.8 11c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8s.8-1.8 1.8-1.8s1.8.8 1.8 1.8zM8.6 15.4c.6-.4 1.2-.2 1.6.2c.6.8 1.6 1.8 3 2c1.2.4 2.8.2 4.8-2c.4-.4 1.2-.6 1.6 0c.4.4.6 1.2 0 1.6c-2.2 2.6-4.8 3.4-7 3c-2-.4-3.6-1.8-4.4-3c-.4-.6-.2-1.2.4-1.8z' }))));
7244
+ };
7245
+ var EmojiIconSmall = function () {
7246
+ var t = useTranslationContext('EmojiIconSmall').t;
7247
+ return (React__default["default"].createElement("svg", { height: '14', width: '14', xmlns: 'http://www.w3.org/2000/svg' },
7248
+ React__default["default"].createElement("title", null, t('Open emoji picker')),
7249
+ React__default["default"].createElement("g", { clipRule: 'evenodd', fillRule: 'evenodd' },
7250
+ React__default["default"].createElement("path", { d: 'M6.7 1.42C3.73 1.42 1.42 3.73 1.42 6.7c0 2.97 2.31 5.28 5.28 5.28c2.97 0 5.28-2.31 5.28-5.28c0-2.97-2.31-5.28-5.28-5.28zM.1 6.7c0-3.63 2.97-6.6 6.6-6.6s6.6 2.97 6.6 6.6s-2.97 6.6-6.6 6.6s-6.6-2.97-6.6-6.6zM6.04 5.05c0 .55-.44.99-.99.99s-.99-.44-.99-.99s.44-.99.99-.99s.99.44.99.99zM9.34 5.05c0 .55-.44.99-.99.99s-.99-.44-.99-.99s.44-.99.99-.99s.99.44.99.99zM3.73 7.47c.33-.22.66-.11.88.11c.33.44.88.99 1.65 1.1c.66.22 1.54.11 2.64-1.1c.22-.22.66-.33.88 0c.22.22.33.66 0 .88c-1.21 1.43-2.64 1.87-3.85 1.65c-1.1-.22-1.98-.99-2.42-1.65c-.22-.33-.11-.66.22-.99z' }))));
7251
+ };
7252
+ // ThemingV2 icon
7253
+ var EmojiPickerIcon = function () { return (React__default["default"].createElement("svg", { preserveAspectRatio: 'xMinYMin', viewBox: '0 0 28 28', width: '100%', xmlns: 'http://www.w3.org/2000/svg' },
7254
+ React__default["default"].createElement("g", { clipRule: 'evenodd', fillRule: 'evenodd' },
7255
+ React__default["default"].createElement("path", { d: 'M14 4.4C8.6 4.4 4.4 8.6 4.4 14c0 5.4 4.2 9.6 9.6 9.6c5.4 0 9.6-4.2 9.6-9.6c0-5.4-4.2-9.6-9.6-9.6zM2 14c0-6.6 5.4-12 12-12s12 5.4 12 12s-5.4 12-12 12s-12-5.4-12-12zM12.8 11c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8s.8-1.8 1.8-1.8s1.8.8 1.8 1.8zM18.8 11c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8s.8-1.8 1.8-1.8s1.8.8 1.8 1.8zM8.6 15.4c.6-.4 1.2-.2 1.6.2c.6.8 1.6 1.8 3 2c1.2.4 2.8.2 4.8-2c.4-.4 1.2-.6 1.6 0c.4.4.6 1.2 0 1.6c-2.2 2.6-4.8 3.4-7 3c-2-.4-3.6-1.8-4.4-3c-.4-.6-.2-1.2.4-1.8z' })))); };
7256
+ var FileUploadIcon = function () {
7257
+ var t = useTranslationContext('FileUploadIcon').t;
7258
+ return (React__default["default"].createElement("svg", { height: '14', width: '14', xmlns: 'http://www.w3.org/2000/svg' },
7259
+ React__default["default"].createElement("title", null, t('Attach files')),
7260
+ React__default["default"].createElement("path", { d: 'M7 .5c3.59 0 6.5 2.91 6.5 6.5s-2.91 6.5-6.5 6.5S.5 10.59.5 7 3.41.5 7 .5zm0 12c3.031 0 5.5-2.469 5.5-5.5S10.031 1.5 7 1.5A5.506 5.506 0 0 0 1.5 7c0 3.034 2.469 5.5 5.5 5.5zM7.506 3v3.494H11v1.05H7.506V11h-1.05V7.544H3v-1.05h3.456V3h1.05z', fillRule: 'nonzero' })));
7261
+ };
7262
+ var FileUploadIconFlat = function () {
7263
+ var t = useTranslationContext('FileUploadIconFlat').t;
7264
+ return (React__default["default"].createElement("svg", { height: '14', width: '14', xmlns: 'http://www.w3.org/2000/svg' },
7265
+ React__default["default"].createElement("title", null, t('Attach files')),
7266
+ React__default["default"].createElement("path", { d: 'M1.667.333h10.666c.737 0 1.334.597 1.334 1.334v10.666c0 .737-.597 1.334-1.334 1.334H1.667a1.333 1.333 0 0 1-1.334-1.334V1.667C.333.93.93.333 1.667.333zm2 1.334a1.667 1.667 0 1 0 0 3.333 1.667 1.667 0 0 0 0-3.333zm-2 9.333v1.333h10.666v-4l-2-2-4 4-2-2L1.667 11z', fillRule: 'nonzero' })));
7267
+ };
7268
+ var LoadingIndicatorIcon = function (_a) {
7269
+ var _b = _a.size, size = _b === void 0 ? 20 : _b;
7270
+ var id = React.useMemo(function () { return nanoid.nanoid(); }, []);
7271
+ return (React__default["default"].createElement("div", { className: 'str-chat__loading-indicator' },
7272
+ React__default["default"].createElement("svg", { "data-testid": 'loading-indicator', height: size, viewBox: '0 0 30 30', width: size, xmlns: 'http://www.w3.org/2000/svg' },
7273
+ React__default["default"].createElement("defs", null,
7274
+ React__default["default"].createElement("linearGradient", { id: "".concat(id, "-linear-gradient"), x1: '50%', x2: '50%', y1: '0%', y2: '100%' },
7275
+ React__default["default"].createElement("stop", { offset: '0%', stopColor: '#FFF', stopOpacity: '0' }),
7276
+ React__default["default"].createElement("stop", { "data-testid": 'stop-color', offset: '100%', stopOpacity: '1' }))),
7277
+ React__default["default"].createElement("path", { d: 'M2.518 23.321l1.664-1.11A12.988 12.988 0 0 0 15 28c7.18 0 13-5.82 13-13S22.18 2 15 2V0c8.284 0 15 6.716 15 15 0 8.284-6.716 15-15 15-5.206 0-9.792-2.652-12.482-6.679z', fill: "url(#".concat(id, "-linear-gradient)"), fillRule: 'evenodd' }))));
7278
+ };
7279
+ // ThemingV2 icon
7280
+ var UploadIcon = function () { return (React__default["default"].createElement("svg", { "data-testid": 'attach', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
7281
+ React__default["default"].createElement("g", { clipPath: 'url(#clip0_10878_5)' },
7282
+ React__default["default"].createElement("path", { d: 'M12.9997 6.99993L10.9997 6.99993L10.9997 10.9999L6.99972 10.9999L6.99972 12.9999L10.9997 12.9999L10.9997 16.9999L12.9997 16.9999L12.9997 12.9999L16.9997 12.9999L16.9997 10.9999L12.9997 10.9999L12.9997 6.99993ZM11.9997 1.99992C6.47972 1.99992 1.99972 6.47993 1.99972 11.9999C1.99972 17.5199 6.47972 21.9999 11.9997 21.9999C17.5197 21.9999 21.9997 17.5199 21.9997 11.9999C21.9997 6.47993 17.5197 1.99992 11.9997 1.99992ZM11.9997 19.9999C7.58972 19.9999 3.99972 16.4099 3.99972 11.9999C3.99972 7.58993 7.58972 3.99993 11.9997 3.99993C16.4097 3.99993 19.9997 7.58993 19.9997 11.9999C19.9997 16.4099 16.4097 19.9999 11.9997 19.9999Z', fill: 'black' })),
7283
+ React__default["default"].createElement("defs", null,
7284
+ React__default["default"].createElement("clipPath", { id: 'clip0_10878_5' },
7285
+ React__default["default"].createElement("rect", { fill: 'white', height: '24', width: '24' }))))); };
7286
+ var CloseIcon$1 = function () { return (React__default["default"].createElement("svg", { "data-testid": 'close-no-outline', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
7287
+ React__default["default"].createElement("path", { d: 'M19 6.41L17.59 5L12 10.59L6.41 5L5 6.41L10.59 12L5 17.59L6.41 19L12 13.41L17.59 19L19 17.59L13.41 12L19 6.41Z', fill: 'black' }))); };
7288
+ var RetryIcon = function () { return (React__default["default"].createElement("svg", { "data-testid": 'retry', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
7289
+ React__default["default"].createElement("path", { d: 'M17.6449 6.35C16.1949 4.9 14.2049 4 11.9949 4C7.57488 4 4.00488 7.58 4.00488 12C4.00488 16.42 7.57488 20 11.9949 20C15.7249 20 18.8349 17.45 19.7249 14H17.6449C16.8249 16.33 14.6049 18 11.9949 18C8.68488 18 5.99488 15.31 5.99488 12C5.99488 8.69 8.68488 6 11.9949 6C13.6549 6 15.1349 6.69 16.2149 7.78L12.9949 11H19.9949V4L17.6449 6.35Z', fill: 'black' }))); };
7290
+ var DownloadIcon = function () { return (React__default["default"].createElement("svg", { "data-testid": 'download', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
7291
+ React__default["default"].createElement("path", { d: 'M19.35 10.04C18.67 6.59 15.64 4 12 4C9.11 4 6.6 5.64 5.35 8.04C2.34 8.36 0 10.91 0 14C0 17.31 2.69 20 6 20H19C21.76 20 24 17.76 24 15C24 12.36 21.95 10.22 19.35 10.04ZM19 18H6C3.79 18 2 16.21 2 14C2 11.95 3.53 10.24 5.56 10.03L6.63 9.92L7.13 8.97C8.08 7.14 9.94 6 12 6C14.62 6 16.88 7.86 17.39 10.43L17.69 11.93L19.22 12.04C20.78 12.14 22 13.45 22 15C22 16.65 20.65 18 19 18ZM13.45 10H10.55V13H8L12 17L16 13H13.45V10Z', fill: 'black' }))); };
7292
+ var SendIconV1 = function () {
7293
+ var t = useTranslationContext('SendButton').t;
7294
+ return (React__default["default"].createElement("svg", { height: '17', viewBox: '0 0 18 17', width: '18', xmlns: 'http://www.w3.org/2000/svg' },
7295
+ React__default["default"].createElement("title", null, t('Send')),
7296
+ React__default["default"].createElement("path", { d: 'M0 17.015l17.333-8.508L0 0v6.617l12.417 1.89L0 10.397z', fill: '#006cff', fillRule: 'evenodd' })));
7297
+ };
7298
+ var SendIconV2 = function () {
7299
+ var t = useTranslationContext('SendButton').t;
7300
+ return (React__default["default"].createElement("svg", { "data-testid": 'send', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
7301
+ React__default["default"].createElement("title", null, t('Send')),
7302
+ React__default["default"].createElement("path", { d: 'M4.00952 22L24 12L4.00952 2L4 9.77778L18.2857 12L4 14.2222L4.00952 22Z', fill: 'black' })));
7303
+ };
7304
+ var SendButton = function (_a) {
7305
+ var sendMessage = _a.sendMessage, rest = __rest(_a, ["sendMessage"]);
7306
+ var themeVersion = useChatContext('SendButton').themeVersion;
7307
+ return (React__default["default"].createElement("button", __assign({ "aria-label": 'Send', className: 'str-chat__send-button', "data-testid": 'send-button', onClick: sendMessage, type: 'button' }, rest), themeVersion === '2' ? React__default["default"].createElement(SendIconV2, null) : React__default["default"].createElement(SendIconV1, null)));
7308
+ };
7312
7309
 
7313
- if (deepequal__default["default"](prevOptions.current, newOptions)) {
7314
- return prevOptions.current || newOptions;
7315
- } else {
7316
- prevOptions.current = newOptions;
7317
- return newOptions;
7318
- }
7319
- }, [optionsWithDefaults.onFirstUpdate, optionsWithDefaults.placement, optionsWithDefaults.strategy, optionsWithDefaults.modifiers, updateStateModifier]);
7320
- var popperInstanceRef = React__namespace.useRef();
7321
- useIsomorphicLayoutEffect(function () {
7322
- if (popperInstanceRef.current) {
7323
- popperInstanceRef.current.setOptions(popperOptions);
7324
- }
7325
- }, [popperOptions]);
7326
- useIsomorphicLayoutEffect(function () {
7327
- if (referenceElement == null || popperElement == null) {
7328
- return;
7329
- }
7310
+ /**
7311
+ * @deprecated This component has been deprecated in favor of `AttachmentPreviewList` as this component
7312
+ * utilises outdated components from the package [`react-file-utils`](https://github.com/GetStream/react-file-utils)
7313
+ * which will no longer receive updates for aforementioned components.
7314
+ *
7315
+ * **Will be removed with the complete transition to the theming V2.**
7316
+ */
7317
+ var UploadsPreview = function () {
7318
+ var themeVersion = useChatContext('UploadsPreview').themeVersion;
7319
+ var _a = useChannelStateContext('UploadsPreview'), _b = _a.maxNumberOfFiles, maxNumberOfFiles = _b === void 0 ? 0 : _b, multipleUploads = _a.multipleUploads;
7320
+ var _c = useMessageInputContext('UploadsPreview'), fileOrder = _c.fileOrder, fileUploads = _c.fileUploads, imageOrder = _c.imageOrder, imageUploads = _c.imageUploads, _d = _c.numberOfUploads, numberOfUploads = _d === void 0 ? 0 : _d, removeFile = _c.removeFile, removeImage = _c.removeImage, uploadFile = _c.uploadFile, uploadImage = _c.uploadImage, uploadNewFiles = _c.uploadNewFiles;
7321
+ var imagesToPreview = imageOrder
7322
+ .map(function (id) { return imageUploads[id]; })
7323
+ // filter OG scraped images
7324
+ .filter(function (image) { return !image.og_scrape_url; });
7325
+ var filesToPreview = fileOrder.map(function (id) { return fileUploads[id]; });
7326
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
7327
+ imageOrder.length > 0 && (React__default["default"].createElement(reactFileUtils.ImagePreviewer, { disabled: !multipleUploads || numberOfUploads >= maxNumberOfFiles, handleFiles: uploadNewFiles, handleRemove: removeImage, handleRetry: uploadImage, imageUploads: imagesToPreview, multiple: multipleUploads })),
7328
+ fileOrder.length > 0 && (React__default["default"].createElement(reactFileUtils.FilePreviewer, { fileIconProps: {
7329
+ className: 'str-chat__file-icon',
7330
+ version: themeVersion,
7331
+ }, handleFiles: uploadNewFiles, handleRemove: removeFile, handleRetry: uploadFile, uploads: filesToPreview }))));
7332
+ };
7330
7333
 
7331
- var createPopper$1 = options.createPopper || createPopper;
7332
- var popperInstance = createPopper$1(referenceElement, popperElement, popperOptions);
7333
- popperInstanceRef.current = popperInstance;
7334
- return function () {
7335
- popperInstance.destroy();
7336
- popperInstanceRef.current = null;
7337
- };
7338
- }, [referenceElement, popperElement, options.createPopper]);
7339
- return {
7340
- state: popperInstanceRef.current ? popperInstanceRef.current.state : null,
7341
- styles: state.styles,
7342
- attributes: state.attributes,
7343
- update: popperInstanceRef.current ? popperInstanceRef.current.update : null,
7344
- forceUpdate: popperInstanceRef.current ? popperInstanceRef.current.forceUpdate : null
7345
- };
7334
+ var UnMemoizedChatAutoComplete = function (props) {
7335
+ var _a = useComponentContext('ChatAutoComplete'), SuggestionItem = _a.AutocompleteSuggestionItem, SuggestionList = _a.AutocompleteSuggestionList;
7336
+ var t = useTranslationContext('ChatAutoComplete').t;
7337
+ var messageInput = useMessageInputContext('ChatAutoComplete');
7338
+ var cooldownRemaining = messageInput.cooldownRemaining, disabled = messageInput.disabled, emojiIndex = messageInput.emojiIndex, innerRef = messageInput.textareaRef;
7339
+ var placeholder = props.placeholder || t('Type your message');
7340
+ var emojiReplace = props.wordReplace
7341
+ ? function (word) { var _a; return (_a = props.wordReplace) === null || _a === void 0 ? void 0 : _a.call(props, word, emojiIndex); }
7342
+ : function (word) {
7343
+ var found = (emojiIndex === null || emojiIndex === void 0 ? void 0 : emojiIndex.search(word)) || [];
7344
+ var emoji = found
7345
+ .filter(Boolean)
7346
+ .slice(0, 10)
7347
+ .find(function (_a) {
7348
+ var emoticons = _a.emoticons;
7349
+ return !!(emoticons === null || emoticons === void 0 ? void 0 : emoticons.includes(word));
7350
+ });
7351
+ if (!emoji || !('native' in emoji))
7352
+ return null;
7353
+ return emoji.native;
7354
+ };
7355
+ var updateInnerRef = React.useCallback(function (ref) {
7356
+ if (innerRef) {
7357
+ innerRef.current = ref;
7358
+ }
7359
+ }, [innerRef]);
7360
+ return (React__default["default"].createElement(ReactTextareaAutocomplete, { additionalTextareaProps: messageInput.additionalTextareaProps, "aria-label": cooldownRemaining ? t('Slow Mode ON') : placeholder, className: 'str-chat__textarea__textarea str-chat__message-textarea', closeCommandsList: messageInput.closeCommandsList, closeMentionsList: messageInput.closeMentionsList, containerClassName: 'str-chat__textarea str-chat__message-textarea-react-host', 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', listClassName: 'str-chat__emojisearch__list', loadingComponent: LoadingIndicator, maxRows: messageInput.maxRows, minChar: 0, onBlur: props.onBlur, 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, shouldSubmit: messageInput.shouldSubmit, showCommandsList: messageInput.showCommandsList, showMentionsList: messageInput.showMentionsList, SuggestionItem: SuggestionItem, SuggestionList: SuggestionList, trigger: messageInput.autocompleteTriggers || {}, value: props.value || messageInput.text }));
7346
7361
  };
7362
+ var ChatAutoComplete = React__default["default"].memo(UnMemoizedChatAutoComplete);
7347
7363
 
7348
7364
  /******************************************************************************
7349
7365
  Copyright (c) Microsoft Corporation.
@@ -7566,7 +7582,7 @@ var FILES_TO_IGNORE = [
7566
7582
  function fromEvent(evt) {
7567
7583
  return __awaiter(this, void 0, void 0, function () {
7568
7584
  return __generator(this, function (_a) {
7569
- if (isObject$1(evt) && isDataTransfer(evt.dataTransfer)) {
7585
+ if (isObject(evt) && isDataTransfer(evt.dataTransfer)) {
7570
7586
  return [2 /*return*/, getDataTransferFiles(evt.dataTransfer, evt.type)];
7571
7587
  }
7572
7588
  else if (isChangeEvt(evt)) {
@@ -7580,12 +7596,12 @@ function fromEvent(evt) {
7580
7596
  });
7581
7597
  }
7582
7598
  function isDataTransfer(value) {
7583
- return isObject$1(value);
7599
+ return isObject(value);
7584
7600
  }
7585
7601
  function isChangeEvt(value) {
7586
- return isObject$1(value) && isObject$1(value.target);
7602
+ return isObject(value) && isObject(value.target);
7587
7603
  }
7588
- function isObject$1(v) {
7604
+ function isObject(v) {
7589
7605
  return typeof v === 'object' && v !== null;
7590
7606
  }
7591
7607
  function getInputFiles(evt) {
@@ -7741,8 +7757,6 @@ function fromFileEntry(entry) {
7741
7757
  });
7742
7758
  }
7743
7759
 
7744
- var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
7745
-
7746
7760
  function unwrapExports (x) {
7747
7761
  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
7748
7762
  }
@@ -7791,9 +7805,9 @@ function _arrayWithoutHoles$1(arr) { if (Array.isArray(arr)) return _arrayLikeTo
7791
7805
 
7792
7806
  function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
7793
7807
 
7794
- function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$1(Object(source), !0).forEach(function (key) { _defineProperty$2(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
7808
+ function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$1(Object(source), !0).forEach(function (key) { _defineProperty$1(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
7795
7809
 
7796
- function _defineProperty$2(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
7810
+ function _defineProperty$1(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
7797
7811
 
7798
7812
  function _slicedToArray$1(arr, i) { return _arrayWithHoles$1(arr) || _iterableToArrayLimit$1(arr, i) || _unsupportedIterableToArray$1(arr, i) || _nonIterableRest$1(); }
7799
7813
 
@@ -8008,7 +8022,7 @@ function pickerOptionsFromAccept(accept) {
8008
8022
  mimeType = _ref5[0],
8009
8023
  ext = _ref5[1];
8010
8024
 
8011
- return _objectSpread$1(_objectSpread$1({}, agg), {}, _defineProperty$2({}, mimeType, ext));
8025
+ return _objectSpread$1(_objectSpread$1({}, agg), {}, _defineProperty$1({}, mimeType, ext));
8012
8026
  }, {});
8013
8027
  return [{
8014
8028
  accept: acceptForPicker
@@ -8121,9 +8135,9 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
8121
8135
 
8122
8136
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
8123
8137
 
8124
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty$1(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
8138
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
8125
8139
 
8126
- function _defineProperty$1(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
8140
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
8127
8141
 
8128
8142
  function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
8129
8143
 
@@ -8955,7 +8969,7 @@ function useDropzone() {
8955
8969
  onDrop = _ref2.onDrop,
8956
8970
  rest = _objectWithoutProperties(_ref2, _excluded3);
8957
8971
 
8958
- return _objectSpread(_objectSpread(_defineProperty$1({
8972
+ return _objectSpread(_objectSpread(_defineProperty({
8959
8973
  onKeyDown: composeKeyboardHandler(composeEventHandlers(onKeyDown, onKeyDownCb)),
8960
8974
  onFocus: composeKeyboardHandler(composeEventHandlers(onFocus, onFocusCb)),
8961
8975
  onBlur: composeKeyboardHandler(composeEventHandlers(onBlur, onBlurCb)),
@@ -8982,7 +8996,7 @@ function useDropzone() {
8982
8996
  onClick = _ref3.onClick,
8983
8997
  rest = _objectWithoutProperties(_ref3, _excluded4);
8984
8998
 
8985
- var inputProps = _defineProperty$1({
8999
+ var inputProps = _defineProperty({
8986
9000
  accept: acceptAttr,
8987
9001
  multiple: multiple,
8988
9002
  type: "file",
@@ -9058,491 +9072,6 @@ function reducer(state, action) {
9058
9072
 
9059
9073
  function noop() {}
9060
9074
 
9061
- /** Detect free variable `global` from Node.js. */
9062
- var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;
9063
-
9064
- var _freeGlobal = freeGlobal;
9065
-
9066
- /** Detect free variable `self`. */
9067
- var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
9068
-
9069
- /** Used as a reference to the global object. */
9070
- var root = _freeGlobal || freeSelf || Function('return this')();
9071
-
9072
- var _root = root;
9073
-
9074
- /** Built-in value references. */
9075
- var Symbol$1 = _root.Symbol;
9076
-
9077
- var _Symbol = Symbol$1;
9078
-
9079
- /** Used for built-in method references. */
9080
- var objectProto$3 = Object.prototype;
9081
-
9082
- /** Used to check objects for own properties. */
9083
- var hasOwnProperty$2 = objectProto$3.hasOwnProperty;
9084
-
9085
- /**
9086
- * Used to resolve the
9087
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
9088
- * of values.
9089
- */
9090
- var nativeObjectToString$1 = objectProto$3.toString;
9091
-
9092
- /** Built-in value references. */
9093
- var symToStringTag$1 = _Symbol ? _Symbol.toStringTag : undefined;
9094
-
9095
- /**
9096
- * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
9097
- *
9098
- * @private
9099
- * @param {*} value The value to query.
9100
- * @returns {string} Returns the raw `toStringTag`.
9101
- */
9102
- function getRawTag(value) {
9103
- var isOwn = hasOwnProperty$2.call(value, symToStringTag$1),
9104
- tag = value[symToStringTag$1];
9105
-
9106
- try {
9107
- value[symToStringTag$1] = undefined;
9108
- var unmasked = true;
9109
- } catch (e) {}
9110
-
9111
- var result = nativeObjectToString$1.call(value);
9112
- if (unmasked) {
9113
- if (isOwn) {
9114
- value[symToStringTag$1] = tag;
9115
- } else {
9116
- delete value[symToStringTag$1];
9117
- }
9118
- }
9119
- return result;
9120
- }
9121
-
9122
- var _getRawTag = getRawTag;
9123
-
9124
- /** Used for built-in method references. */
9125
- var objectProto$2 = Object.prototype;
9126
-
9127
- /**
9128
- * Used to resolve the
9129
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
9130
- * of values.
9131
- */
9132
- var nativeObjectToString = objectProto$2.toString;
9133
-
9134
- /**
9135
- * Converts `value` to a string using `Object.prototype.toString`.
9136
- *
9137
- * @private
9138
- * @param {*} value The value to convert.
9139
- * @returns {string} Returns the converted string.
9140
- */
9141
- function objectToString(value) {
9142
- return nativeObjectToString.call(value);
9143
- }
9144
-
9145
- var _objectToString = objectToString;
9146
-
9147
- /** `Object#toString` result references. */
9148
- var nullTag = '[object Null]',
9149
- undefinedTag = '[object Undefined]';
9150
-
9151
- /** Built-in value references. */
9152
- var symToStringTag = _Symbol ? _Symbol.toStringTag : undefined;
9153
-
9154
- /**
9155
- * The base implementation of `getTag` without fallbacks for buggy environments.
9156
- *
9157
- * @private
9158
- * @param {*} value The value to query.
9159
- * @returns {string} Returns the `toStringTag`.
9160
- */
9161
- function baseGetTag(value) {
9162
- if (value == null) {
9163
- return value === undefined ? undefinedTag : nullTag;
9164
- }
9165
- return (symToStringTag && symToStringTag in Object(value))
9166
- ? _getRawTag(value)
9167
- : _objectToString(value);
9168
- }
9169
-
9170
- var _baseGetTag = baseGetTag;
9171
-
9172
- /**
9173
- * Checks if `value` is the
9174
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
9175
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
9176
- *
9177
- * @static
9178
- * @memberOf _
9179
- * @since 0.1.0
9180
- * @category Lang
9181
- * @param {*} value The value to check.
9182
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
9183
- * @example
9184
- *
9185
- * _.isObject({});
9186
- * // => true
9187
- *
9188
- * _.isObject([1, 2, 3]);
9189
- * // => true
9190
- *
9191
- * _.isObject(_.noop);
9192
- * // => true
9193
- *
9194
- * _.isObject(null);
9195
- * // => false
9196
- */
9197
- function isObject(value) {
9198
- var type = typeof value;
9199
- return value != null && (type == 'object' || type == 'function');
9200
- }
9201
-
9202
- var isObject_1 = isObject;
9203
-
9204
- /** `Object#toString` result references. */
9205
- var asyncTag = '[object AsyncFunction]',
9206
- funcTag = '[object Function]',
9207
- genTag = '[object GeneratorFunction]',
9208
- proxyTag = '[object Proxy]';
9209
-
9210
- /**
9211
- * Checks if `value` is classified as a `Function` object.
9212
- *
9213
- * @static
9214
- * @memberOf _
9215
- * @since 0.1.0
9216
- * @category Lang
9217
- * @param {*} value The value to check.
9218
- * @returns {boolean} Returns `true` if `value` is a function, else `false`.
9219
- * @example
9220
- *
9221
- * _.isFunction(_);
9222
- * // => true
9223
- *
9224
- * _.isFunction(/abc/);
9225
- * // => false
9226
- */
9227
- function isFunction(value) {
9228
- if (!isObject_1(value)) {
9229
- return false;
9230
- }
9231
- // The use of `Object#toString` avoids issues with the `typeof` operator
9232
- // in Safari 9 which returns 'object' for typed arrays and other constructors.
9233
- var tag = _baseGetTag(value);
9234
- return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
9235
- }
9236
-
9237
- var isFunction_1 = isFunction;
9238
-
9239
- /** Used to detect overreaching core-js shims. */
9240
- var coreJsData = _root['__core-js_shared__'];
9241
-
9242
- var _coreJsData = coreJsData;
9243
-
9244
- /** Used to detect methods masquerading as native. */
9245
- var maskSrcKey = (function() {
9246
- var uid = /[^.]+$/.exec(_coreJsData && _coreJsData.keys && _coreJsData.keys.IE_PROTO || '');
9247
- return uid ? ('Symbol(src)_1.' + uid) : '';
9248
- }());
9249
-
9250
- /**
9251
- * Checks if `func` has its source masked.
9252
- *
9253
- * @private
9254
- * @param {Function} func The function to check.
9255
- * @returns {boolean} Returns `true` if `func` is masked, else `false`.
9256
- */
9257
- function isMasked(func) {
9258
- return !!maskSrcKey && (maskSrcKey in func);
9259
- }
9260
-
9261
- var _isMasked = isMasked;
9262
-
9263
- /** Used for built-in method references. */
9264
- var funcProto$1 = Function.prototype;
9265
-
9266
- /** Used to resolve the decompiled source of functions. */
9267
- var funcToString$1 = funcProto$1.toString;
9268
-
9269
- /**
9270
- * Converts `func` to its source code.
9271
- *
9272
- * @private
9273
- * @param {Function} func The function to convert.
9274
- * @returns {string} Returns the source code.
9275
- */
9276
- function toSource(func) {
9277
- if (func != null) {
9278
- try {
9279
- return funcToString$1.call(func);
9280
- } catch (e) {}
9281
- try {
9282
- return (func + '');
9283
- } catch (e) {}
9284
- }
9285
- return '';
9286
- }
9287
-
9288
- var _toSource = toSource;
9289
-
9290
- /**
9291
- * Used to match `RegExp`
9292
- * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
9293
- */
9294
- var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
9295
-
9296
- /** Used to detect host constructors (Safari). */
9297
- var reIsHostCtor = /^\[object .+?Constructor\]$/;
9298
-
9299
- /** Used for built-in method references. */
9300
- var funcProto = Function.prototype,
9301
- objectProto$1 = Object.prototype;
9302
-
9303
- /** Used to resolve the decompiled source of functions. */
9304
- var funcToString = funcProto.toString;
9305
-
9306
- /** Used to check objects for own properties. */
9307
- var hasOwnProperty$1 = objectProto$1.hasOwnProperty;
9308
-
9309
- /** Used to detect if a method is native. */
9310
- var reIsNative = RegExp('^' +
9311
- funcToString.call(hasOwnProperty$1).replace(reRegExpChar, '\\$&')
9312
- .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
9313
- );
9314
-
9315
- /**
9316
- * The base implementation of `_.isNative` without bad shim checks.
9317
- *
9318
- * @private
9319
- * @param {*} value The value to check.
9320
- * @returns {boolean} Returns `true` if `value` is a native function,
9321
- * else `false`.
9322
- */
9323
- function baseIsNative(value) {
9324
- if (!isObject_1(value) || _isMasked(value)) {
9325
- return false;
9326
- }
9327
- var pattern = isFunction_1(value) ? reIsNative : reIsHostCtor;
9328
- return pattern.test(_toSource(value));
9329
- }
9330
-
9331
- var _baseIsNative = baseIsNative;
9332
-
9333
- /**
9334
- * Gets the value at `key` of `object`.
9335
- *
9336
- * @private
9337
- * @param {Object} [object] The object to query.
9338
- * @param {string} key The key of the property to get.
9339
- * @returns {*} Returns the property value.
9340
- */
9341
- function getValue(object, key) {
9342
- return object == null ? undefined : object[key];
9343
- }
9344
-
9345
- var _getValue = getValue;
9346
-
9347
- /**
9348
- * Gets the native function at `key` of `object`.
9349
- *
9350
- * @private
9351
- * @param {Object} object The object to query.
9352
- * @param {string} key The key of the method to get.
9353
- * @returns {*} Returns the function if it's native, else `undefined`.
9354
- */
9355
- function getNative(object, key) {
9356
- var value = _getValue(object, key);
9357
- return _baseIsNative(value) ? value : undefined;
9358
- }
9359
-
9360
- var _getNative = getNative;
9361
-
9362
- var defineProperty = (function() {
9363
- try {
9364
- var func = _getNative(Object, 'defineProperty');
9365
- func({}, '', {});
9366
- return func;
9367
- } catch (e) {}
9368
- }());
9369
-
9370
- var _defineProperty = defineProperty;
9371
-
9372
- /**
9373
- * The base implementation of `assignValue` and `assignMergeValue` without
9374
- * value checks.
9375
- *
9376
- * @private
9377
- * @param {Object} object The object to modify.
9378
- * @param {string} key The key of the property to assign.
9379
- * @param {*} value The value to assign.
9380
- */
9381
- function baseAssignValue(object, key, value) {
9382
- if (key == '__proto__' && _defineProperty) {
9383
- _defineProperty(object, key, {
9384
- 'configurable': true,
9385
- 'enumerable': true,
9386
- 'value': value,
9387
- 'writable': true
9388
- });
9389
- } else {
9390
- object[key] = value;
9391
- }
9392
- }
9393
-
9394
- var _baseAssignValue = baseAssignValue;
9395
-
9396
- /**
9397
- * Performs a
9398
- * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
9399
- * comparison between two values to determine if they are equivalent.
9400
- *
9401
- * @static
9402
- * @memberOf _
9403
- * @since 4.0.0
9404
- * @category Lang
9405
- * @param {*} value The value to compare.
9406
- * @param {*} other The other value to compare.
9407
- * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
9408
- * @example
9409
- *
9410
- * var object = { 'a': 1 };
9411
- * var other = { 'a': 1 };
9412
- *
9413
- * _.eq(object, object);
9414
- * // => true
9415
- *
9416
- * _.eq(object, other);
9417
- * // => false
9418
- *
9419
- * _.eq('a', 'a');
9420
- * // => true
9421
- *
9422
- * _.eq('a', Object('a'));
9423
- * // => false
9424
- *
9425
- * _.eq(NaN, NaN);
9426
- * // => true
9427
- */
9428
- function eq(value, other) {
9429
- return value === other || (value !== value && other !== other);
9430
- }
9431
-
9432
- var eq_1 = eq;
9433
-
9434
- /** Used for built-in method references. */
9435
- var objectProto = Object.prototype;
9436
-
9437
- /** Used to check objects for own properties. */
9438
- var hasOwnProperty = objectProto.hasOwnProperty;
9439
-
9440
- /**
9441
- * Assigns `value` to `key` of `object` if the existing value is not equivalent
9442
- * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
9443
- * for equality comparisons.
9444
- *
9445
- * @private
9446
- * @param {Object} object The object to modify.
9447
- * @param {string} key The key of the property to assign.
9448
- * @param {*} value The value to assign.
9449
- */
9450
- function assignValue(object, key, value) {
9451
- var objValue = object[key];
9452
- if (!(hasOwnProperty.call(object, key) && eq_1(objValue, value)) ||
9453
- (value === undefined && !(key in object))) {
9454
- _baseAssignValue(object, key, value);
9455
- }
9456
- }
9457
-
9458
- var _assignValue = assignValue;
9459
-
9460
- /**
9461
- * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
9462
- *
9463
- * @private
9464
- * @param {Array} props The property identifiers.
9465
- * @param {Array} values The property values.
9466
- * @param {Function} assignFunc The function to assign values.
9467
- * @returns {Object} Returns the new object.
9468
- */
9469
- function baseZipObject(props, values, assignFunc) {
9470
- var index = -1,
9471
- length = props.length,
9472
- valsLength = values.length,
9473
- result = {};
9474
-
9475
- while (++index < length) {
9476
- var value = index < valsLength ? values[index] : undefined;
9477
- assignFunc(result, props[index], value);
9478
- }
9479
- return result;
9480
- }
9481
-
9482
- var _baseZipObject = baseZipObject;
9483
-
9484
- /**
9485
- * This method is like `_.fromPairs` except that it accepts two arrays,
9486
- * one of property identifiers and one of corresponding values.
9487
- *
9488
- * @static
9489
- * @memberOf _
9490
- * @since 0.4.0
9491
- * @category Array
9492
- * @param {Array} [props=[]] The property identifiers.
9493
- * @param {Array} [values=[]] The property values.
9494
- * @returns {Object} Returns the new object.
9495
- * @example
9496
- *
9497
- * _.zipObject(['a', 'b'], [1, 2]);
9498
- * // => { 'a': 1, 'b': 2 }
9499
- */
9500
- function zipObject(props, values) {
9501
- return _baseZipObject(props || [], values || [], _assignValue);
9502
- }
9503
-
9504
- var zipObject_1 = zipObject;
9505
-
9506
- var CooldownTimer = function (_a) {
9507
- var cooldownInterval = _a.cooldownInterval, setCooldownRemaining = _a.setCooldownRemaining;
9508
- var _b = React.useState(cooldownInterval), seconds = _b[0], setSeconds = _b[1];
9509
- React.useEffect(function () {
9510
- var countdownInterval = setInterval(function () {
9511
- if (seconds > 0) {
9512
- setSeconds(seconds - 1);
9513
- }
9514
- else {
9515
- setCooldownRemaining(0);
9516
- }
9517
- }, 1000);
9518
- return function () { return clearInterval(countdownInterval); };
9519
- });
9520
- return (React__default["default"].createElement("div", { className: 'str-chat__message-input-cooldown', "data-testid": 'cooldown-timer' }, seconds === 0 ? null : seconds));
9521
- };
9522
- var useCooldownTimer = function () {
9523
- var latestMessageDatesByChannels = useChatContext('useCooldownTimer').latestMessageDatesByChannels;
9524
- var channel = useChannelStateContext('useCooldownTimer').channel;
9525
- var _a = (channel.data ||
9526
- {}), cooldownInterval = _a.cooldown, own_capabilities = _a.own_capabilities;
9527
- var _b = React.useState(), cooldownRemaining = _b[0], setCooldownRemaining = _b[1];
9528
- var skipCooldown = !(own_capabilities === null || own_capabilities === void 0 ? void 0 : own_capabilities.includes('slow-mode'));
9529
- React.useEffect(function () {
9530
- var latestMessageDate = latestMessageDatesByChannels[channel.cid];
9531
- if (!cooldownInterval || !latestMessageDate) {
9532
- return;
9533
- }
9534
- var remainingCooldown = Math.round(cooldownInterval - (new Date().getTime() - latestMessageDate.getTime()) / 1000);
9535
- if (remainingCooldown > 0 && !skipCooldown) {
9536
- setCooldownRemaining(remainingCooldown);
9537
- }
9538
- }, [channel.id, cooldownInterval, latestMessageDatesByChannels[channel.cid]]);
9539
- return {
9540
- cooldownInterval: cooldownInterval || 0,
9541
- cooldownRemaining: cooldownRemaining,
9542
- setCooldownRemaining: setCooldownRemaining,
9543
- };
9544
- };
9545
-
9546
9075
  var QuotedMessagePreviewHeader = function () {
9547
9076
  var setQuotedMessage = useChannelActionContext('QuotedMessagePreview').setQuotedMessage;
9548
9077
  var t = useTranslationContext('QuotedMessagePreview').t;
@@ -9643,6 +9172,23 @@ var FilePreviewItem = function (_a) {
9643
9172
  state.uploading && React__default["default"].createElement(LoadingIndicatorIcon, { size: 17 }))));
9644
9173
  };
9645
9174
 
9175
+ var CooldownTimer = function (_a) {
9176
+ var cooldownInterval = _a.cooldownInterval, setCooldownRemaining = _a.setCooldownRemaining;
9177
+ var _b = React.useState(cooldownInterval), seconds = _b[0], setSeconds = _b[1];
9178
+ React.useEffect(function () {
9179
+ var countdownInterval = setInterval(function () {
9180
+ if (seconds > 0) {
9181
+ setSeconds(seconds - 1);
9182
+ }
9183
+ else {
9184
+ setCooldownRemaining(0);
9185
+ }
9186
+ }, 1000);
9187
+ return function () { return clearInterval(countdownInterval); };
9188
+ });
9189
+ return (React__default["default"].createElement("div", { className: 'str-chat__message-input-cooldown', "data-testid": 'cooldown-timer' }, seconds === 0 ? null : seconds));
9190
+ };
9191
+
9646
9192
  var MessageInputFlat = function () {
9647
9193
  var quotedMessage = useChannelStateContext('MessageInputFlat').quotedMessage;
9648
9194
  var setQuotedMessage = useChannelActionContext('MessageInputFlat').setQuotedMessage;
@@ -9711,7 +9257,11 @@ var MessageInputV2 = function () {
9711
9257
  }), attributes = _m.attributes, styles = _m.styles;
9712
9258
  var id = React.useMemo(function () { return nanoid.nanoid(); }, []);
9713
9259
  var accept = React.useMemo(function () {
9714
- return zipObject_1(acceptedFiles, Array.from({ length: acceptedFiles.length }, function () { return []; }));
9260
+ return acceptedFiles.reduce(function (mediaTypeMap, mediaType) {
9261
+ var _a;
9262
+ (_a = mediaTypeMap[mediaType]) !== null && _a !== void 0 ? _a : (mediaTypeMap[mediaType] = []);
9263
+ return mediaTypeMap;
9264
+ }, {});
9715
9265
  }, [acceptedFiles]);
9716
9266
  var _o = useDropzone({
9717
9267
  accept: accept,
@@ -9791,6 +9341,30 @@ var EditMessageForm = function () {
9791
9341
  React__default["default"].createElement("button", { className: 'str-chat__edit-message-send', type: 'submit' }, t('Send'))))))));
9792
9342
  };
9793
9343
 
9344
+ var useCooldownTimer = function () {
9345
+ var latestMessageDatesByChannels = useChatContext('useCooldownTimer').latestMessageDatesByChannels;
9346
+ var channel = useChannelStateContext('useCooldownTimer').channel;
9347
+ var _a = (channel.data ||
9348
+ {}), cooldownInterval = _a.cooldown, own_capabilities = _a.own_capabilities;
9349
+ var _b = React.useState(), cooldownRemaining = _b[0], setCooldownRemaining = _b[1];
9350
+ var skipCooldown = !(own_capabilities === null || own_capabilities === void 0 ? void 0 : own_capabilities.includes('slow-mode'));
9351
+ React.useEffect(function () {
9352
+ var latestMessageDate = latestMessageDatesByChannels[channel.cid];
9353
+ if (!cooldownInterval || !latestMessageDate) {
9354
+ return;
9355
+ }
9356
+ var remainingCooldown = Math.round(cooldownInterval - (new Date().getTime() - latestMessageDate.getTime()) / 1000);
9357
+ if (remainingCooldown > 0 && !skipCooldown) {
9358
+ setCooldownRemaining(remainingCooldown);
9359
+ }
9360
+ }, [channel.id, cooldownInterval, latestMessageDatesByChannels[channel.cid]]);
9361
+ return {
9362
+ cooldownInterval: cooldownInterval || 0,
9363
+ cooldownRemaining: cooldownRemaining,
9364
+ setCooldownRemaining: setCooldownRemaining,
9365
+ };
9366
+ };
9367
+
9794
9368
  var useEmojiIndex = function () {
9795
9369
  var _a = useEmojiContext('useEmojiIndex'), emojiConfig = _a.emojiConfig, EmojiIndex = _a.EmojiIndex;
9796
9370
  var emojiData = (emojiConfig || {}).emojiData;
@@ -10893,8 +10467,19 @@ var useProcessReactions = function (params) {
10893
10467
  ? Object.values(reactionCounts).reduce(function (total, count) { return total + count; }, 0)
10894
10468
  : 0;
10895
10469
  }, [reactionCounts, supportedReactionsArePresent]);
10470
+ var aggregatedUserNamesByType = React.useMemo(function () {
10471
+ return latestReactions.reduce(function (typeMap, _a) {
10472
+ var _b;
10473
+ var type = _a.type, user = _a.user;
10474
+ (_b = typeMap[type]) !== null && _b !== void 0 ? _b : (typeMap[type] = []);
10475
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
10476
+ typeMap[type].push((user === null || user === void 0 ? void 0 : user.name) || user.id);
10477
+ return typeMap;
10478
+ }, {});
10479
+ }, [latestReactions]);
10896
10480
  return {
10897
10481
  additionalEmojiProps: reactionsAreCustom ? additionalEmojiProps : emojiSetDef,
10482
+ aggregatedUserNamesByType: aggregatedUserNamesByType,
10898
10483
  emojiData: emojiData,
10899
10484
  getEmojiByReactionType: getEmojiByReactionType,
10900
10485
  iHaveReactedWithReaction: iHaveReactedWithReaction,
@@ -10906,11 +10491,23 @@ var useProcessReactions = function (params) {
10906
10491
  };
10907
10492
  };
10908
10493
 
10494
+ var ButtonWithTooltip = function (_a) {
10495
+ var children = _a.children, onMouseEnter = _a.onMouseEnter, onMouseLeave = _a.onMouseLeave, rest = __rest(_a, ["children", "onMouseEnter", "onMouseLeave"]);
10496
+ var _b = React.useState(null), referenceElement = _b[0], setReferenceElement = _b[1];
10497
+ var _c = useEnterLeaveHandlers({
10498
+ onMouseEnter: onMouseEnter,
10499
+ onMouseLeave: onMouseLeave,
10500
+ }), handleEnter = _c.handleEnter, handleLeave = _c.handleLeave, tooltipVisible = _c.tooltipVisible;
10501
+ var themeVersion = useChatContext('ButtonWithTooltip').themeVersion;
10502
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
10503
+ themeVersion === '2' && (React__default["default"].createElement(PopperTooltip, { referenceElement: referenceElement, visible: tooltipVisible }, rest.title)),
10504
+ React__default["default"].createElement("button", __assign({ onMouseEnter: handleEnter, onMouseLeave: handleLeave, ref: setReferenceElement }, rest), children)));
10505
+ };
10909
10506
  var UnMemoizedReactionsList = function (props) {
10910
10507
  var onClick = props.onClick, _a = props.reverse, reverse = _a === void 0 ? false : _a, rest = __rest(props, ["onClick", "reverse"]);
10911
10508
  var _b = useEmojiContext('ReactionsList'), Emoji = _b.Emoji, emojiConfig = _b.emojiConfig;
10912
10509
  var onReactionListClick = useMessageContext('ReactionsList').onReactionListClick;
10913
- var _c = useProcessReactions(__assign({ emojiConfig: emojiConfig }, rest)), additionalEmojiProps = _c.additionalEmojiProps, emojiData = _c.emojiData, getEmojiByReactionType = _c.getEmojiByReactionType, iHaveReactedWithReaction = _c.iHaveReactedWithReaction, latestReactions = _c.latestReactions, latestReactionTypes = _c.latestReactionTypes, reactionCounts = _c.reactionCounts, supportedReactionsArePresent = _c.supportedReactionsArePresent, totalReactionCount = _c.totalReactionCount;
10510
+ var _c = useProcessReactions(__assign({ emojiConfig: emojiConfig }, rest)), additionalEmojiProps = _c.additionalEmojiProps, aggregatedUserNamesByType = _c.aggregatedUserNamesByType, emojiData = _c.emojiData, getEmojiByReactionType = _c.getEmojiByReactionType, iHaveReactedWithReaction = _c.iHaveReactedWithReaction, latestReactions = _c.latestReactions, latestReactionTypes = _c.latestReactionTypes, reactionCounts = _c.reactionCounts, supportedReactionsArePresent = _c.supportedReactionsArePresent, totalReactionCount = _c.totalReactionCount;
10914
10511
  if (!latestReactions.length)
10915
10512
  return null;
10916
10513
  if (!supportedReactionsArePresent)
@@ -10925,7 +10522,7 @@ var UnMemoizedReactionsList = function (props) {
10925
10522
  return emojiObject ? (React__default["default"].createElement("li", { className: clsx('str-chat__message-reaction', {
10926
10523
  'str-chat__message-reaction-own': isOwnReaction,
10927
10524
  }), key: emojiObject.id },
10928
- React__default["default"].createElement("button", { "aria-label": "Reactions: ".concat(reactionType) },
10525
+ React__default["default"].createElement(ButtonWithTooltip, { "aria-label": "Reactions: ".concat(reactionType), title: aggregatedUserNamesByType[reactionType].join(', '), type: 'button' },
10929
10526
  React__default["default"].createElement(React.Suspense, { fallback: null },
10930
10527
  React__default["default"].createElement("span", { className: 'str-chat__message-reaction-emoji' },
10931
10528
  React__default["default"].createElement(Emoji, __assign({ data: emojiData, emoji: emojiObject, size: 16 }, additionalEmojiProps)))),
@@ -11595,30 +11192,38 @@ var ChannelInner = function (props) {
11595
11192
  });
11596
11193
  });
11597
11194
  };
11598
- var jumpToMessage = function (messageId) { return __awaiter$1(void 0, void 0, void 0, function () {
11599
- var indexOfMessage, hasMoreMessages;
11600
- return __generator$1(this, function (_a) {
11601
- switch (_a.label) {
11602
- case 0:
11603
- dispatch({ loadingMore: true, type: 'setLoadingMore' });
11604
- return [4 /*yield*/, channel.state.loadMessageIntoState(messageId)];
11605
- case 1:
11606
- _a.sent();
11607
- indexOfMessage = channel.state.messages.findIndex(function (message) { return message.id === messageId; });
11608
- hasMoreMessages = indexOfMessage >= Math.floor(DEFAULT_INITIAL_CHANNEL_PAGE_SIZE / 2);
11609
- loadMoreFinished(hasMoreMessages, channel.state.messages);
11610
- dispatch({
11611
- hasMoreNewer: channel.state.messages !== channel.state.latestMessages,
11612
- highlightedMessageId: messageId,
11613
- type: 'jumpToMessageFinished',
11614
- });
11615
- setTimeout(function () {
11616
- dispatch({ type: 'clearHighlightedMessage' });
11617
- }, 500);
11618
- return [2 /*return*/];
11619
- }
11620
- });
11621
- }); };
11195
+ var clearHighlightedMessageTimeoutId = React.useRef(null);
11196
+ var jumpToMessage = function (messageId, messageLimit) {
11197
+ if (messageLimit === void 0) { messageLimit = 100; }
11198
+ return __awaiter$1(void 0, void 0, void 0, function () {
11199
+ var indexOfMessage, hasMoreMessages;
11200
+ return __generator$1(this, function (_a) {
11201
+ switch (_a.label) {
11202
+ case 0:
11203
+ dispatch({ loadingMore: true, type: 'setLoadingMore' });
11204
+ return [4 /*yield*/, channel.state.loadMessageIntoState(messageId, undefined, messageLimit)];
11205
+ case 1:
11206
+ _a.sent();
11207
+ indexOfMessage = channel.state.messages.findIndex(function (message) { return message.id === messageId; });
11208
+ hasMoreMessages = indexOfMessage >= Math.floor(messageLimit / 2);
11209
+ loadMoreFinished(hasMoreMessages, channel.state.messages);
11210
+ dispatch({
11211
+ hasMoreNewer: channel.state.messages !== channel.state.latestMessages,
11212
+ highlightedMessageId: messageId,
11213
+ type: 'jumpToMessageFinished',
11214
+ });
11215
+ if (clearHighlightedMessageTimeoutId.current) {
11216
+ clearTimeout(clearHighlightedMessageTimeoutId.current);
11217
+ }
11218
+ clearHighlightedMessageTimeoutId.current = setTimeout(function () {
11219
+ clearHighlightedMessageTimeoutId.current = null;
11220
+ dispatch({ type: 'clearHighlightedMessage' });
11221
+ }, 500);
11222
+ return [2 /*return*/];
11223
+ }
11224
+ });
11225
+ });
11226
+ };
11622
11227
  var jumpToLatestMessage = function () { return __awaiter$1(void 0, void 0, void 0, function () {
11623
11228
  var hasMoreOlder;
11624
11229
  return __generator$1(this, function (_a) {
@@ -12517,149 +12122,34 @@ var ChannelPreview = function (props) {
12517
12122
  return (React__default["default"].createElement(Preview, __assign({}, props, { active: isActive, displayImage: displayImage, displayTitle: displayTitle, lastMessage: lastMessage, latestMessage: latestMessage, setActiveChannel: setActiveChannel, unread: unread })));
12518
12123
  };
12519
12124
 
12520
- var SearchInput = function (props) {
12521
- var inputRef = props.inputRef, onSearch = props.onSearch, placeholder = props.placeholder, query = props.query;
12522
- var t = useTranslationContext('SearchInput').t;
12523
- return (React__default["default"].createElement("input", { className: 'str-chat__channel-search-input', "data-testid": 'search-input', onChange: onSearch, placeholder: placeholder !== null && placeholder !== void 0 ? placeholder : t('Search'), ref: inputRef, type: 'text', value: query }));
12524
- };
12525
-
12526
- var MenuIcon = function () { return (React__default["default"].createElement("svg", { "data-testid": 'menu-icon', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
12527
- React__default["default"].createElement("path", { clipRule: 'evenodd', d: 'M3 8V6H21V8H3ZM3 13H21V11H3V13ZM3 18H21V16H3V18Z', fill: 'black', fillRule: 'evenodd' }))); };
12528
- var ReturnIcon = function () { return (React__default["default"].createElement("svg", { "data-testid": 'return-icon', fill: 'none', height: '20', viewBox: '0 0 22 22', width: '20', xmlns: 'http://www.w3.org/2000/svg' },
12529
- React__default["default"].createElement("path", { d: 'M21.6668 9.66666V12.3333H5.6529L12.9932 19.6736L11.1076 21.5592L0.54834 11L11.1076 0.440765L12.9932 2.32638L5.6529 9.66666H21.6668Z', fill: '#080707' }))); };
12530
- var XIcon = function () { return (React__default["default"].createElement("svg", { fill: 'none', height: '14', viewBox: '0 0 14 14', width: '14', xmlns: 'http://www.w3.org/2000/svg' },
12531
- React__default["default"].createElement("path", { d: 'M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z', fill: '#747881' }))); };
12532
- var SearchIcon = function (_a) {
12533
- var className = _a.className;
12534
- return (React__default["default"].createElement("svg", { className: className, fill: 'none', height: '18', viewBox: '0 0 18 18', width: '18', xmlns: 'http://www.w3.org/2000/svg' },
12535
- React__default["default"].createElement("path", { d: 'M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z', fill: '#747881' })));
12536
- };
12537
-
12538
12125
  var isChannel = function (output) { return output.cid != null; };
12539
12126
 
12540
- var DefaultSearchEmpty = function () {
12541
- var t = useTranslationContext('SearchResults').t;
12542
- return (React__default["default"].createElement("div", { "aria-live": 'polite', className: 'str-chat__channel-search-container-empty' },
12543
- React__default["default"].createElement(SearchIcon, null),
12544
- t('No results found')));
12545
- };
12546
- var DefaultSearchResultsHeader = function (_a) {
12547
- var results = _a.results;
12548
- var t = useTranslationContext('SearchResultsHeader').t;
12549
- return (React__default["default"].createElement("div", { className: 'str-chat__channel-search-results-header', "data-testid": 'channel-search-results-header' }, t('searchResultsCount', {
12550
- count: results.length,
12551
- })));
12552
- };
12553
- var DefaultSearchResultsList = function (props) {
12554
- var focusedUser = props.focusedUser, results = props.results, _a = props.SearchResultItem, SearchResultItem = _a === void 0 ? DefaultSearchResultItem : _a, selectResult = props.selectResult;
12555
- 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 })); })));
12556
- };
12557
- var DefaultSearchResultItem = function (props) {
12558
- var _a, _b;
12559
- var focusedUser = props.focusedUser, index = props.index, result = props.result, selectResult = props.selectResult;
12560
- var focused = focusedUser === index;
12561
- var themeVersion = useChatContext().themeVersion;
12562
- var className = clsx('str-chat__channel-search-result', focused && 'str-chat__channel-search-result--focused focused');
12563
- if (isChannel(result)) {
12564
- var channel_1 = result;
12565
- return themeVersion === '2' ? (React__default["default"].createElement(ChannelPreview, { channel: channel_1, className: className, onSelect: function () { return selectResult(channel_1); } })) : (React__default["default"].createElement("button", { "aria-label": "Select Channel: ".concat(((_a = channel_1.data) === null || _a === void 0 ? void 0 : _a.name) || ''), className: className, "data-testid": 'channel-search-result-channel', onClick: function () { return selectResult(channel_1); }, role: 'option' },
12566
- React__default["default"].createElement("div", { className: 'result-hashtag' }, "#"),
12567
- React__default["default"].createElement("p", { className: 'channel-search__result-text' }, (_b = channel_1.data) === null || _b === void 0 ? void 0 : _b.name)));
12568
- }
12569
- else {
12570
- return (React__default["default"].createElement("button", { "aria-label": "Select User Channel: ".concat(result.name || ''), className: className, "data-testid": 'channel-search-result-user', onClick: function () { return selectResult(result); }, role: 'option' },
12571
- React__default["default"].createElement(Avatar, { image: result.image, name: result.name || result.id, size: themeVersion === '2' ? 40 : undefined, user: result }),
12572
- React__default["default"].createElement("div", { className: 'str-chat__channel-search-result--display-name' }, result.name || result.id)));
12573
- }
12574
- };
12575
- var ResultsContainer = function (_a) {
12576
- var children = _a.children, popupResults = _a.popupResults;
12577
- var containerStyle = popupResults ? 'popup' : 'inline';
12578
- return (React__default["default"].createElement("div", { "aria-label": 'Channel search results', className: "str-chat__channel-search-container str-chat__channel-search-result-list ".concat(containerStyle) }, children));
12579
- };
12580
- var SearchResults = function (props) {
12581
- var popupResults = props.popupResults, results = props.results, searching = props.searching, _a = props.SearchEmpty, SearchEmpty = _a === void 0 ? DefaultSearchEmpty : _a, _b = props.SearchResultsHeader, SearchResultsHeader = _b === void 0 ? DefaultSearchResultsHeader : _b, SearchLoading = props.SearchLoading, _c = props.SearchResultItem, SearchResultItem = _c === void 0 ? DefaultSearchResultItem : _c, _d = props.SearchResultsList, SearchResultsList = _d === void 0 ? DefaultSearchResultsList : _d, selectResult = props.selectResult;
12582
- var t = useTranslationContext('SearchResults').t;
12583
- var _e = React.useState(), focusedResult = _e[0], setFocusedResult = _e[1];
12584
- var handleKeyDown = React.useCallback(function (event) {
12585
- if (event.key === 'ArrowUp') {
12586
- setFocusedResult(function (prevFocused) {
12587
- if (prevFocused === undefined)
12588
- return 0;
12589
- return prevFocused === 0 ? results.length - 1 : prevFocused - 1;
12590
- });
12591
- }
12592
- if (event.key === 'ArrowDown') {
12593
- setFocusedResult(function (prevFocused) {
12594
- if (prevFocused === undefined)
12595
- return 0;
12596
- return prevFocused === results.length - 1 ? 0 : prevFocused + 1;
12597
- });
12598
- }
12599
- if (event.key === 'Enter') {
12600
- event.preventDefault();
12601
- if (focusedResult !== undefined) {
12602
- selectResult(results[focusedResult]);
12603
- return setFocusedResult(undefined);
12604
- }
12605
- }
12606
- }, [focusedResult]);
12607
- React.useEffect(function () {
12608
- document.addEventListener('keydown', handleKeyDown, false);
12609
- return function () { return document.removeEventListener('keydown', handleKeyDown); };
12610
- }, [handleKeyDown]);
12611
- if (searching) {
12612
- return (React__default["default"].createElement(ResultsContainer, { popupResults: popupResults }, SearchLoading ? (React__default["default"].createElement(SearchLoading, null)) : (React__default["default"].createElement("div", { className: 'str-chat__channel-search-container-searching', "data-testid": 'search-in-progress-indicator' }, t('Searching...')))));
12613
- }
12614
- if (!results.length) {
12615
- return (React__default["default"].createElement(ResultsContainer, { popupResults: popupResults },
12616
- React__default["default"].createElement(SearchEmpty, null)));
12617
- }
12618
- return (React__default["default"].createElement(ResultsContainer, { popupResults: popupResults },
12619
- React__default["default"].createElement(SearchResultsHeader, { results: results }),
12620
- React__default["default"].createElement(SearchResultsList, { focusedUser: focusedResult, results: results, SearchResultItem: SearchResultItem, selectResult: selectResult })));
12621
- };
12622
-
12623
- var UnMemoizedChannelSearch = function (props) {
12624
- var clearState = props.clearState, SearchResultsList = props.SearchResultsList, inputRef = props.inputRef, onSearch = props.onSearch, placeholder = props.placeholder, _a = props.popupResults, popupResults = _a === void 0 ? false : _a, query = props.query, results = props.results, SearchEmpty = props.SearchEmpty, searching = props.searching, _b = props.SearchInput, SearchInput$1 = _b === void 0 ? SearchInput : _b, SearchLoading = props.SearchLoading, SearchResultItem = props.SearchResultItem, SearchResultsHeader = props.SearchResultsHeader, selectResult = props.selectResult;
12625
- return (React__default["default"].createElement("div", { className: 'str-chat__channel-search', "data-testid": 'channel-search' },
12626
- React__default["default"].createElement(SearchInput$1, { clearState: clearState, inputRef: inputRef, onSearch: onSearch, placeholder: placeholder, query: query }),
12627
- query && (React__default["default"].createElement(SearchResults, { popupResults: popupResults, results: results, SearchEmpty: SearchEmpty, searching: searching, SearchLoading: SearchLoading, SearchResultItem: SearchResultItem, SearchResultsHeader: SearchResultsHeader, SearchResultsList: SearchResultsList, selectResult: selectResult }))));
12628
- };
12629
- /**
12630
- * The ChannelSearch component makes a query users call and displays the results in a list.
12631
- * Clicking on a list item will navigate you into a channel with the selected user. It can be used
12632
- * on its own or added to the ChannelList component by setting the `showChannelSearch` prop to true.
12633
- */
12634
- var ChannelSearch = React__default["default"].memo(UnMemoizedChannelSearch);
12635
-
12636
12127
  var useChannelSearch = function (_a) {
12637
- var _b = _a.channelType, channelType = _b === void 0 ? 'messaging' : _b, _c = _a.clearSearchOnClickOutside, clearSearchOnClickOutside = _c === void 0 ? true : _c, _d = _a.enabled, enabled = _d === void 0 ? false : _d, onSelectResult = _a.onSelectResult, _e = _a.searchForChannels, searchForChannels = _e === void 0 ? false : _e, searchFunction = _a.searchFunction, searchQueryParams = _a.searchQueryParams, setChannels = _a.setChannels;
12128
+ var _b = _a.channelType, channelType = _b === void 0 ? 'messaging' : _b, _c = _a.clearSearchOnClickOutside, clearSearchOnClickOutside = _c === void 0 ? true : _c, _d = _a.disabled, disabled = _d === void 0 ? false : _d, onSearchCallback = _a.onSearch, onSearchExit = _a.onSearchExit, onSelectResult = _a.onSelectResult, _e = _a.searchForChannels, searchForChannels = _e === void 0 ? false : _e, searchFunction = _a.searchFunction, searchQueryParams = _a.searchQueryParams, setChannels = _a.setChannels;
12638
12129
  var _f = useChatContext('useChannelSearch'), client = _f.client, navOpen = _f.navOpen, setActiveChannel = _f.setActiveChannel, themeVersion = _f.themeVersion;
12639
12130
  var _g = React.useState(false), inputIsFocused = _g[0], setInputIsFocused = _g[1];
12640
12131
  var _h = React.useState(''), query = _h[0], setQuery = _h[1];
12641
12132
  var _j = React.useState([]), results = _j[0], setResults = _j[1];
12642
- var _k = React.useState(false), resultsOpen = _k[0], setResultsOpen = _k[1];
12643
- var _l = React.useState(false), searching = _l[0], setSearching = _l[1];
12133
+ var _k = React.useState(false), searching = _k[0], setSearching = _k[1];
12644
12134
  var inputRef = React.useRef(null);
12645
12135
  var searchBarRef = React.useRef(null);
12646
- var clearState = function () {
12136
+ var clearState = React.useCallback(function () {
12647
12137
  setQuery('');
12648
12138
  setResults([]);
12649
- setResultsOpen(false);
12650
12139
  setSearching(false);
12651
- };
12652
- var activateSearch = function () {
12140
+ }, []);
12141
+ var activateSearch = React.useCallback(function () {
12653
12142
  setInputIsFocused(true);
12654
- };
12655
- var exitSearch = function () {
12143
+ }, []);
12144
+ var exitSearch = React.useCallback(function () {
12656
12145
  var _a;
12657
12146
  setInputIsFocused(false);
12658
12147
  (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.blur();
12659
12148
  clearState();
12660
- };
12149
+ onSearchExit === null || onSearchExit === void 0 ? void 0 : onSearchExit();
12150
+ }, [clearState, onSearchExit]);
12661
12151
  React.useEffect(function () {
12662
- if (!enabled)
12152
+ if (disabled)
12663
12153
  return;
12664
12154
  var clickListener = function (event) {
12665
12155
  var _a, _b;
@@ -12670,17 +12160,15 @@ var useChannelSearch = function (_a) {
12670
12160
  : (_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.contains(event.target);
12671
12161
  if (isInputClick)
12672
12162
  return;
12673
- if ((navOpen && inputIsFocused) ||
12674
- (resultsOpen && clearSearchOnClickOutside) ||
12675
- (inputIsFocused && !query)) {
12163
+ if ((inputIsFocused && (!query || navOpen)) || clearSearchOnClickOutside) {
12676
12164
  exitSearch();
12677
12165
  }
12678
12166
  };
12679
12167
  document.addEventListener('click', clickListener);
12680
12168
  return function () { return document.removeEventListener('click', clickListener); };
12681
- }, [enabled, inputIsFocused, resultsOpen]);
12169
+ }, [disabled, inputIsFocused]);
12682
12170
  React.useEffect(function () {
12683
- if (!(inputRef.current && enabled))
12171
+ if (!inputRef.current || disabled)
12684
12172
  return;
12685
12173
  var handleKeyDown = function (event) {
12686
12174
  if (event.key === 'Escape')
@@ -12692,7 +12180,7 @@ var useChannelSearch = function (_a) {
12692
12180
  (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener('keydown', handleKeyDown);
12693
12181
  };
12694
12182
  }, []);
12695
- var selectResult = function (result) { return __awaiter$1(void 0, void 0, void 0, function () {
12183
+ var selectResult = React.useCallback(function (result) { return __awaiter$1(void 0, void 0, void 0, function () {
12696
12184
  var selectedChannel, newChannel;
12697
12185
  return __generator$1(this, function (_a) {
12698
12186
  switch (_a.label) {
@@ -12703,7 +12191,6 @@ var useChannelSearch = function (_a) {
12703
12191
  return [4 /*yield*/, onSelectResult({
12704
12192
  setQuery: setQuery,
12705
12193
  setResults: setResults,
12706
- setResultsOpen: setResultsOpen,
12707
12194
  setSearching: setSearching,
12708
12195
  }, result)];
12709
12196
  case 1:
@@ -12725,13 +12212,13 @@ var useChannelSearch = function (_a) {
12725
12212
  case 5:
12726
12213
  setChannels(function (channels) { return uniqBy__default["default"](__spreadArray$1([selectedChannel], channels, true), 'cid'); });
12727
12214
  if (clearSearchOnClickOutside) {
12728
- clearState();
12215
+ exitSearch();
12729
12216
  }
12730
12217
  return [2 /*return*/];
12731
12218
  }
12732
12219
  });
12733
- }); };
12734
- var getChannels = function (text) { return __awaiter$1(void 0, void 0, void 0, function () {
12220
+ }); }, [clearSearchOnClickOutside, client, exitSearch, onSelectResult]);
12221
+ var getChannels = React.useCallback(function (text) { return __awaiter$1(void 0, void 0, void 0, function () {
12735
12222
  var userResponse, channelResponse, _a, channels, users_1, users, error_1;
12736
12223
  var _b, _c, _d, _e, _f, _g;
12737
12224
  return __generator$1(this, function (_h) {
@@ -12752,14 +12239,12 @@ var useChannelSearch = function (_a) {
12752
12239
  case 3:
12753
12240
  _a = _h.sent(), channels = _a[0], users_1 = _a[1].users;
12754
12241
  setResults(__spreadArray$1(__spreadArray$1([], channels, true), users_1, true));
12755
- setResultsOpen(true);
12756
12242
  setSearching(false);
12757
12243
  return [2 /*return*/];
12758
12244
  case 4: return [4 /*yield*/, Promise.resolve(userResponse)];
12759
12245
  case 5:
12760
12246
  users = (_h.sent()).users;
12761
12247
  setResults(users);
12762
- setResultsOpen(true);
12763
12248
  return [3 /*break*/, 7];
12764
12249
  case 6:
12765
12250
  error_1 = _h.sent();
@@ -12771,17 +12256,16 @@ var useChannelSearch = function (_a) {
12771
12256
  return [2 /*return*/];
12772
12257
  }
12773
12258
  });
12774
- }); };
12259
+ }); }, [client, searching]);
12775
12260
  var getChannelsThrottled = throttle__default["default"](getChannels, 200);
12776
- var onSearch = function (event) {
12261
+ var onSearch = React.useCallback(function (event) {
12777
12262
  event.preventDefault();
12778
- if (!enabled)
12263
+ if (disabled)
12779
12264
  return;
12780
12265
  if (searchFunction) {
12781
12266
  searchFunction({
12782
12267
  setQuery: setQuery,
12783
12268
  setResults: setResults,
12784
- setResultsOpen: setResultsOpen,
12785
12269
  setSearching: setSearching,
12786
12270
  }, event);
12787
12271
  }
@@ -12789,7 +12273,8 @@ var useChannelSearch = function (_a) {
12789
12273
  setQuery(event.target.value);
12790
12274
  getChannelsThrottled(event.target.value);
12791
12275
  }
12792
- };
12276
+ onSearchCallback === null || onSearchCallback === void 0 ? void 0 : onSearchCallback(event);
12277
+ }, [disabled, getChannelsThrottled, searchFunction]);
12793
12278
  return {
12794
12279
  activateSearch: activateSearch,
12795
12280
  clearState: clearState,
@@ -12805,6 +12290,24 @@ var useChannelSearch = function (_a) {
12805
12290
  };
12806
12291
  };
12807
12292
 
12293
+ var MenuIcon = function () { return (React__default["default"].createElement("svg", { "data-testid": 'menu-icon', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
12294
+ React__default["default"].createElement("path", { clipRule: 'evenodd', d: 'M3 8V6H21V8H3ZM3 13H21V11H3V13ZM3 18H21V16H3V18Z', fill: 'black', fillRule: 'evenodd' }))); };
12295
+ var ReturnIcon = function () { return (React__default["default"].createElement("svg", { "data-testid": 'return-icon', fill: 'none', height: '20', viewBox: '0 0 22 22', width: '20', xmlns: 'http://www.w3.org/2000/svg' },
12296
+ React__default["default"].createElement("path", { d: 'M21.6668 9.66666V12.3333H5.6529L12.9932 19.6736L11.1076 21.5592L0.54834 11L11.1076 0.440765L12.9932 2.32638L5.6529 9.66666H21.6668Z', fill: '#080707' }))); };
12297
+ var XIcon = function () { return (React__default["default"].createElement("svg", { fill: 'none', height: '14', viewBox: '0 0 14 14', width: '14', xmlns: 'http://www.w3.org/2000/svg' },
12298
+ React__default["default"].createElement("path", { d: 'M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z', fill: '#747881' }))); };
12299
+ var SearchIcon = function (_a) {
12300
+ var className = _a.className;
12301
+ return (React__default["default"].createElement("svg", { className: className, fill: 'none', height: '18', viewBox: '0 0 18 18', width: '18', xmlns: 'http://www.w3.org/2000/svg' },
12302
+ React__default["default"].createElement("path", { d: 'M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z', fill: '#747881' })));
12303
+ };
12304
+
12305
+ var SearchInput = function (props) {
12306
+ var disabled = props.disabled, inputRef = props.inputRef, onSearch = props.onSearch, placeholder = props.placeholder, query = props.query;
12307
+ var t = useTranslationContext('SearchInput').t;
12308
+ return (React__default["default"].createElement("input", { className: 'str-chat__channel-search-input', "data-testid": 'search-input', disabled: disabled, onChange: onSearch, placeholder: placeholder !== null && placeholder !== void 0 ? placeholder : t('Search'), ref: inputRef, type: 'text', value: query }));
12309
+ };
12310
+
12808
12311
  var SearchBarButton = function (_a) {
12809
12312
  var children = _a.children, className = _a.className, onClick = _a.onClick;
12810
12313
  return (React__default["default"].createElement("button", { className: clsx('str-chat__channel-search-bar-button', className), "data-testid": 'search-bar-button', onClick: onClick }, children));
@@ -12856,7 +12359,7 @@ var SearchBar = function (props) {
12856
12359
  }, []);
12857
12360
  var handleClearClick = React.useCallback(function () {
12858
12361
  var _a;
12859
- inputProps.clearState();
12362
+ exitSearch();
12860
12363
  (_a = inputProps.inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
12861
12364
  }, []);
12862
12365
  return (React__default["default"].createElement("div", { className: 'str-chat__channel-search-bar', "data-testid": 'search-bar', ref: searchBarRef },
@@ -12873,6 +12376,104 @@ var SearchBar = function (props) {
12873
12376
  React__default["default"].createElement(AppMenu, null)))));
12874
12377
  };
12875
12378
 
12379
+ var DefaultSearchEmpty = function () {
12380
+ var t = useTranslationContext('SearchResults').t;
12381
+ return (React__default["default"].createElement("div", { "aria-live": 'polite', className: 'str-chat__channel-search-container-empty' },
12382
+ React__default["default"].createElement(SearchIcon, null),
12383
+ t('No results found')));
12384
+ };
12385
+ var DefaultSearchResultsHeader = function (_a) {
12386
+ var results = _a.results;
12387
+ var t = useTranslationContext('SearchResultsHeader').t;
12388
+ return (React__default["default"].createElement("div", { className: 'str-chat__channel-search-results-header', "data-testid": 'channel-search-results-header' }, t('searchResultsCount', {
12389
+ count: results.length,
12390
+ })));
12391
+ };
12392
+ var DefaultSearchResultsList = function (props) {
12393
+ var focusedUser = props.focusedUser, results = props.results, _a = props.SearchResultItem, SearchResultItem = _a === void 0 ? DefaultSearchResultItem : _a, selectResult = props.selectResult;
12394
+ 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 })); })));
12395
+ };
12396
+ var DefaultSearchResultItem = function (props) {
12397
+ var _a, _b;
12398
+ var focusedUser = props.focusedUser, index = props.index, result = props.result, selectResult = props.selectResult;
12399
+ var focused = focusedUser === index;
12400
+ var themeVersion = useChatContext().themeVersion;
12401
+ var className = clsx('str-chat__channel-search-result', focused && 'str-chat__channel-search-result--focused focused');
12402
+ if (isChannel(result)) {
12403
+ var channel_1 = result;
12404
+ return themeVersion === '2' ? (React__default["default"].createElement(ChannelPreview, { channel: channel_1, className: className, onSelect: function () { return selectResult(channel_1); } })) : (React__default["default"].createElement("button", { "aria-label": "Select Channel: ".concat(((_a = channel_1.data) === null || _a === void 0 ? void 0 : _a.name) || ''), className: className, "data-testid": 'channel-search-result-channel', onClick: function () { return selectResult(channel_1); }, role: 'option' },
12405
+ React__default["default"].createElement("div", { className: 'result-hashtag' }, "#"),
12406
+ React__default["default"].createElement("p", { className: 'channel-search__result-text' }, (_b = channel_1.data) === null || _b === void 0 ? void 0 : _b.name)));
12407
+ }
12408
+ else {
12409
+ return (React__default["default"].createElement("button", { "aria-label": "Select User Channel: ".concat(result.name || ''), className: className, "data-testid": 'channel-search-result-user', onClick: function () { return selectResult(result); }, role: 'option' },
12410
+ React__default["default"].createElement(Avatar, { image: result.image, name: result.name || result.id, size: themeVersion === '2' ? 40 : undefined, user: result }),
12411
+ React__default["default"].createElement("div", { className: 'str-chat__channel-search-result--display-name' }, result.name || result.id)));
12412
+ }
12413
+ };
12414
+ var ResultsContainer = function (_a) {
12415
+ var children = _a.children, popupResults = _a.popupResults;
12416
+ return (React__default["default"].createElement("div", { "aria-label": 'Channel search results', className: clsx("str-chat__channel-search-container str-chat__channel-search-result-list", popupResults ? 'popup' : 'inline') }, children));
12417
+ };
12418
+ var SearchResults = function (props) {
12419
+ var popupResults = props.popupResults, results = props.results, searching = props.searching, _a = props.SearchEmpty, SearchEmpty = _a === void 0 ? DefaultSearchEmpty : _a, _b = props.SearchResultsHeader, SearchResultsHeader = _b === void 0 ? DefaultSearchResultsHeader : _b, SearchLoading = props.SearchLoading, _c = props.SearchResultItem, SearchResultItem = _c === void 0 ? DefaultSearchResultItem : _c, _d = props.SearchResultsList, SearchResultsList = _d === void 0 ? DefaultSearchResultsList : _d, selectResult = props.selectResult;
12420
+ var t = useTranslationContext('SearchResults').t;
12421
+ var _e = React.useState(), focusedResult = _e[0], setFocusedResult = _e[1];
12422
+ var handleKeyDown = React.useCallback(function (event) {
12423
+ if (event.key === 'ArrowUp') {
12424
+ setFocusedResult(function (prevFocused) {
12425
+ if (prevFocused === undefined)
12426
+ return 0;
12427
+ return prevFocused === 0 ? results.length - 1 : prevFocused - 1;
12428
+ });
12429
+ }
12430
+ if (event.key === 'ArrowDown') {
12431
+ setFocusedResult(function (prevFocused) {
12432
+ if (prevFocused === undefined)
12433
+ return 0;
12434
+ return prevFocused === results.length - 1 ? 0 : prevFocused + 1;
12435
+ });
12436
+ }
12437
+ if (event.key === 'Enter') {
12438
+ event.preventDefault();
12439
+ if (focusedResult !== undefined) {
12440
+ selectResult(results[focusedResult]);
12441
+ return setFocusedResult(undefined);
12442
+ }
12443
+ }
12444
+ }, [focusedResult]);
12445
+ React.useEffect(function () {
12446
+ document.addEventListener('keydown', handleKeyDown, false);
12447
+ return function () { return document.removeEventListener('keydown', handleKeyDown); };
12448
+ }, [handleKeyDown]);
12449
+ if (searching) {
12450
+ return (React__default["default"].createElement(ResultsContainer, { popupResults: popupResults }, SearchLoading ? (React__default["default"].createElement(SearchLoading, null)) : (React__default["default"].createElement("div", { className: 'str-chat__channel-search-container-searching', "data-testid": 'search-in-progress-indicator' }, t('Searching...')))));
12451
+ }
12452
+ if (!results.length) {
12453
+ return (React__default["default"].createElement(ResultsContainer, { popupResults: popupResults },
12454
+ React__default["default"].createElement(SearchEmpty, null)));
12455
+ }
12456
+ return (React__default["default"].createElement(ResultsContainer, { popupResults: popupResults },
12457
+ React__default["default"].createElement(SearchResultsHeader, { results: results }),
12458
+ React__default["default"].createElement(SearchResultsList, { focusedUser: focusedResult, results: results, SearchResultItem: SearchResultItem, selectResult: selectResult })));
12459
+ };
12460
+
12461
+ var UnMemoizedChannelSearch = function (props) {
12462
+ var AppMenu = props.AppMenu, ClearInputIcon = props.ClearInputIcon, ExitSearchIcon = props.ExitSearchIcon, MenuIcon = props.MenuIcon, placeholder = props.placeholder, _a = props.popupResults, popupResults = _a === void 0 ? false : _a, _b = props.SearchBar, SearchBar$1 = _b === void 0 ? SearchBar : _b, SearchEmpty = props.SearchEmpty, _c = props.SearchInput, SearchInput$1 = _c === void 0 ? SearchInput : _c, SearchLoading = props.SearchLoading, SearchInputIcon = props.SearchInputIcon, SearchResultItem = props.SearchResultItem, SearchResultsList = props.SearchResultsList, SearchResultsHeader = props.SearchResultsHeader, channelSearchParams = __rest(props, ["AppMenu", "ClearInputIcon", "ExitSearchIcon", "MenuIcon", "placeholder", "popupResults", "SearchBar", "SearchEmpty", "SearchInput", "SearchLoading", "SearchInputIcon", "SearchResultItem", "SearchResultsList", "SearchResultsHeader"]);
12463
+ var themeVersion = useChatContext('ChannelSearch').themeVersion;
12464
+ var _d = useChannelSearch(channelSearchParams), activateSearch = _d.activateSearch, clearState = _d.clearState, exitSearch = _d.exitSearch, inputIsFocused = _d.inputIsFocused, inputRef = _d.inputRef, onSearch = _d.onSearch, query = _d.query, results = _d.results, searchBarRef = _d.searchBarRef, searching = _d.searching, selectResult = _d.selectResult;
12465
+ var showSearchBarV2 = themeVersion === '2';
12466
+ return (React__default["default"].createElement("div", { className: 'str-chat__channel-search', "data-testid": 'channel-search' },
12467
+ showSearchBarV2 ? (React__default["default"].createElement(SearchBar$1, { activateSearch: activateSearch, AppMenu: AppMenu, ClearInputIcon: ClearInputIcon, clearState: clearState, disabled: channelSearchParams.disabled, exitSearch: exitSearch, ExitSearchIcon: ExitSearchIcon, inputIsFocused: inputIsFocused, inputRef: inputRef, MenuIcon: MenuIcon, onSearch: onSearch, placeholder: placeholder, query: query, searchBarRef: searchBarRef, SearchInput: SearchInput$1, SearchInputIcon: SearchInputIcon })) : (React__default["default"].createElement(SearchInput$1, { clearState: clearState, disabled: channelSearchParams.disabled, inputRef: inputRef, onSearch: onSearch, placeholder: placeholder, query: query })),
12468
+ query && (React__default["default"].createElement(SearchResults, { popupResults: popupResults, results: results, SearchEmpty: SearchEmpty, searching: searching, SearchLoading: SearchLoading, SearchResultItem: SearchResultItem, SearchResultsHeader: SearchResultsHeader, SearchResultsList: SearchResultsList, selectResult: selectResult }))));
12469
+ };
12470
+ /**
12471
+ * The ChannelSearch component makes a query users call and displays the results in a list.
12472
+ * Clicking on a list item will navigate you into a channel with the selected user. It can be used
12473
+ * on its own or added to the ChannelList component by setting the `showChannelSearch` prop to true.
12474
+ */
12475
+ var ChannelSearch = React__default["default"].memo(UnMemoizedChannelSearch);
12476
+
12876
12477
  var ChatBubble = function () { return (React__default["default"].createElement("svg", { "data-testid": 'chat-bubble', fill: 'none', height: '96', viewBox: '0 0 136 136', width: '96', xmlns: 'http://www.w3.org/2000/svg' },
12877
12478
  React__default["default"].createElement("path", { d: 'M106 24.5H30C24.775 24.5 20.5 28.775 20.5 34V119.5L39.5 100.5H106C111.225 100.5 115.5 96.225 115.5 91V34C115.5 28.775 111.225 24.5 106 24.5ZM106 91H39.5L30 100.5V34H106V91Z', fill: '#B4B7BB' }))); };
12878
12479
 
@@ -12919,11 +12520,11 @@ var DEFAULT_FILTERS = {};
12919
12520
  var DEFAULT_OPTIONS = {};
12920
12521
  var DEFAULT_SORT = {};
12921
12522
  var UnMemoizedChannelList = function (props) {
12922
- var additionalChannelSearchProps = props.additionalChannelSearchProps, _a = props.Avatar, Avatar$1 = _a === void 0 ? Avatar : _a, allowNewMessagesFromUnfilteredChannels = props.allowNewMessagesFromUnfilteredChannels, channelRenderFilterFn = props.channelRenderFilterFn, _b = props.ChannelSearch, ChannelSearch$1 = _b === void 0 ? ChannelSearch : _b, customActiveChannel = props.customActiveChannel, _c = props.EmptyStateIndicator, EmptyStateIndicator$1 = _c === void 0 ? EmptyStateIndicator : _c, filters = props.filters, _d = props.LoadingErrorIndicator, LoadingErrorIndicator = _d === void 0 ? ChatDown : _d, _e = props.LoadingIndicator, LoadingIndicator = _e === void 0 ? LoadingChannels : _e, _f = props.List, List = _f === void 0 ? ChannelListMessenger : _f, lockChannelOrder = props.lockChannelOrder, onAddedToChannel = props.onAddedToChannel, onChannelDeleted = props.onChannelDeleted, onChannelHidden = props.onChannelHidden, onChannelTruncated = props.onChannelTruncated, onChannelUpdated = props.onChannelUpdated, onChannelVisible = props.onChannelVisible, onMessageNew = props.onMessageNew, onRemovedFromChannel = props.onRemovedFromChannel, options = props.options, _g = props.Paginator, Paginator = _g === void 0 ? LoadMorePaginator : _g, Preview = props.Preview, renderChannels = props.renderChannels, _h = props.SearchBar, SearchBar$1 = _h === void 0 ? SearchBar : _h, _j = props.sendChannelsToList, sendChannelsToList = _j === void 0 ? false : _j, _k = props.setActiveChannelOnMount, setActiveChannelOnMount = _k === void 0 ? true : _k, _l = props.showChannelSearch, showChannelSearch = _l === void 0 ? false : _l, _m = props.sort, sort = _m === void 0 ? DEFAULT_SORT : _m, _o = props.watchers, watchers = _o === void 0 ? {} : _o;
12923
- var _p = additionalChannelSearchProps || {}, AppMenu = _p.AppMenu, ClearInputIcon = _p.ClearInputIcon, ExitSearchIcon = _p.ExitSearchIcon, MenuIcon = _p.MenuIcon, placeholder = _p.placeholder, popupResults = _p.popupResults, SearchEmpty = _p.SearchEmpty, SearchInput = _p.SearchInput, SearchInputIcon = _p.SearchInputIcon, SearchLoading = _p.SearchLoading, SearchResultItem = _p.SearchResultItem, SearchResultsHeader = _p.SearchResultsHeader, SearchResultsList = _p.SearchResultsList, channelSearchParams = __rest(_p, ["AppMenu", "ClearInputIcon", "ExitSearchIcon", "MenuIcon", "placeholder", "popupResults", "SearchEmpty", "SearchInput", "SearchInputIcon", "SearchLoading", "SearchResultItem", "SearchResultsHeader", "SearchResultsList"]);
12924
- var _q = useChatContext('ChannelList'), channel = _q.channel, channelsQueryState = _q.channelsQueryState, client = _q.client, closeMobileNav = _q.closeMobileNav, customClasses = _q.customClasses, _r = _q.navOpen, navOpen = _r === void 0 ? false : _r, setActiveChannel = _q.setActiveChannel, theme = _q.theme, themeVersion = _q.themeVersion, useImageFlagEmojisOnWindows = _q.useImageFlagEmojisOnWindows;
12523
+ var additionalChannelSearchProps = props.additionalChannelSearchProps, _a = props.Avatar, Avatar$1 = _a === void 0 ? Avatar : _a, allowNewMessagesFromUnfilteredChannels = props.allowNewMessagesFromUnfilteredChannels, channelRenderFilterFn = props.channelRenderFilterFn, _b = props.ChannelSearch, ChannelSearch$1 = _b === void 0 ? ChannelSearch : _b, customActiveChannel = props.customActiveChannel, _c = props.EmptyStateIndicator, EmptyStateIndicator$1 = _c === void 0 ? EmptyStateIndicator : _c, filters = props.filters, _d = props.LoadingErrorIndicator, LoadingErrorIndicator = _d === void 0 ? ChatDown : _d, _e = props.LoadingIndicator, LoadingIndicator = _e === void 0 ? LoadingChannels : _e, _f = props.List, List = _f === void 0 ? ChannelListMessenger : _f, lockChannelOrder = props.lockChannelOrder, onAddedToChannel = props.onAddedToChannel, onChannelDeleted = props.onChannelDeleted, onChannelHidden = props.onChannelHidden, onChannelTruncated = props.onChannelTruncated, onChannelUpdated = props.onChannelUpdated, onChannelVisible = props.onChannelVisible, onMessageNew = props.onMessageNew, onRemovedFromChannel = props.onRemovedFromChannel, options = props.options, _g = props.Paginator, Paginator = _g === void 0 ? LoadMorePaginator : _g, Preview = props.Preview, renderChannels = props.renderChannels, _h = props.sendChannelsToList, sendChannelsToList = _h === void 0 ? false : _h, _j = props.setActiveChannelOnMount, setActiveChannelOnMount = _j === void 0 ? true : _j, _k = props.showChannelSearch, showChannelSearch = _k === void 0 ? false : _k, _l = props.sort, sort = _l === void 0 ? DEFAULT_SORT : _l, _m = props.watchers, watchers = _m === void 0 ? {} : _m;
12524
+ var _o = useChatContext('ChannelList'), channel = _o.channel, channelsQueryState = _o.channelsQueryState, client = _o.client, closeMobileNav = _o.closeMobileNav, customClasses = _o.customClasses, _p = _o.navOpen, navOpen = _p === void 0 ? false : _p, setActiveChannel = _o.setActiveChannel, theme = _o.theme, useImageFlagEmojisOnWindows = _o.useImageFlagEmojisOnWindows;
12925
12525
  var channelListRef = React.useRef(null);
12926
- var _s = React.useState(0), channelUpdateCount = _s[0], setChannelUpdateCount = _s[1];
12526
+ var _q = React.useState(0), channelUpdateCount = _q[0], setChannelUpdateCount = _q[1];
12527
+ var _r = React.useState(false), searchActive = _r[0], setSearchActive = _r[1];
12927
12528
  /**
12928
12529
  * Set a channel with id {customActiveChannel} as active and move it to the top of the list.
12929
12530
  * If customActiveChannel prop is absent, then set the first channel in list as active channel.
@@ -12968,9 +12569,22 @@ var UnMemoizedChannelList = function (props) {
12968
12569
  * force a re-render. Incrementing this dummy variable ensures the channel previews update.
12969
12570
  */
12970
12571
  var forceUpdate = function () { return setChannelUpdateCount(function (count) { return count + 1; }); };
12971
- var _t = usePaginatedChannels(client, filters || DEFAULT_FILTERS, sort || DEFAULT_SORT, options || DEFAULT_OPTIONS, activeChannelHandler), channels = _t.channels, hasNextPage = _t.hasNextPage, loadNextPage = _t.loadNextPage, setChannels = _t.setChannels;
12972
- var channelSearchController = useChannelSearch(__assign({ enabled: showChannelSearch, setChannels: setChannels }, channelSearchParams));
12973
- var activateSearch = channelSearchController.activateSearch, clearState = channelSearchController.clearState, exitSearch = channelSearchController.exitSearch, inputIsFocused = channelSearchController.inputIsFocused, inputRef = channelSearchController.inputRef, onSearch = channelSearchController.onSearch, query = channelSearchController.query, results = channelSearchController.results, searchBarRef = channelSearchController.searchBarRef, searching = channelSearchController.searching, selectResult = channelSearchController.selectResult;
12572
+ var onSearch = React.useCallback(function (event) {
12573
+ var _a;
12574
+ if (!event.target.value) {
12575
+ setSearchActive(false);
12576
+ }
12577
+ else {
12578
+ setSearchActive(true);
12579
+ }
12580
+ (_a = additionalChannelSearchProps === null || additionalChannelSearchProps === void 0 ? void 0 : additionalChannelSearchProps.onSearch) === null || _a === void 0 ? void 0 : _a.call(additionalChannelSearchProps, event);
12581
+ }, []);
12582
+ var onSearchExit = React.useCallback(function () {
12583
+ var _a;
12584
+ setSearchActive(false);
12585
+ (_a = additionalChannelSearchProps === null || additionalChannelSearchProps === void 0 ? void 0 : additionalChannelSearchProps.onSearchExit) === null || _a === void 0 ? void 0 : _a.call(additionalChannelSearchProps);
12586
+ }, []);
12587
+ var _s = usePaginatedChannels(client, filters || DEFAULT_FILTERS, sort || DEFAULT_SORT, options || DEFAULT_OPTIONS, activeChannelHandler), channels = _s.channels, hasNextPage = _s.hasNextPage, loadNextPage = _s.loadNextPage, setChannels = _s.setChannels;
12974
12588
  var loadedChannels = channelRenderFilterFn ? channelRenderFilterFn(channels) : channels;
12975
12589
  useMobileNavigation(channelListRef, navOpen, closeMobileNav);
12976
12590
  useMessageNewListener(setChannels, lockChannelOrder, allowNewMessagesFromUnfilteredChannels);
@@ -13015,12 +12629,11 @@ var UnMemoizedChannelList = function (props) {
13015
12629
  'str-chat--windows-flags': useImageFlagEmojisOnWindows && navigator.userAgent.match(/Win/),
13016
12630
  'str-chat-channel-list--open': navOpen,
13017
12631
  });
13018
- var showSearchV2 = themeVersion === '2' && !popupResults;
12632
+ var showChannelList = !searchActive || (additionalChannelSearchProps === null || additionalChannelSearchProps === void 0 ? void 0 : additionalChannelSearchProps.popupResults);
13019
12633
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
13020
12634
  React__default["default"].createElement("div", { className: className, ref: channelListRef },
13021
- showChannelSearch &&
13022
- (showSearchV2 ? (React__default["default"].createElement(SearchBar$1, { activateSearch: activateSearch, AppMenu: AppMenu, ClearInputIcon: ClearInputIcon, clearState: clearState, exitSearch: exitSearch, ExitSearchIcon: ExitSearchIcon, inputIsFocused: inputIsFocused, inputRef: inputRef, MenuIcon: MenuIcon, onSearch: onSearch, placeholder: placeholder, query: query, searchBarRef: searchBarRef, SearchInputIcon: SearchInputIcon })) : (React__default["default"].createElement(ChannelSearch$1, __assign({ placeholder: placeholder, popupResults: popupResults, SearchEmpty: SearchEmpty, SearchInput: SearchInput, SearchLoading: SearchLoading, SearchResultItem: SearchResultItem, SearchResultsHeader: SearchResultsHeader, SearchResultsList: SearchResultsList }, channelSearchController)))),
13023
- query && showSearchV2 ? (React__default["default"].createElement(SearchResults, { results: results, SearchEmpty: SearchEmpty, searching: searching, SearchLoading: SearchLoading, SearchResultItem: SearchResultItem, SearchResultsHeader: SearchResultsHeader, SearchResultsList: SearchResultsList, selectResult: selectResult })) : (React__default["default"].createElement(List, { error: channelsQueryState.error, loadedChannels: sendChannelsToList ? loadedChannels : undefined, loading: channelsQueryState.queryInProgress === 'reload', LoadingErrorIndicator: LoadingErrorIndicator, LoadingIndicator: LoadingIndicator, setChannels: setChannels }, !(loadedChannels === null || loadedChannels === void 0 ? void 0 : loadedChannels.length) ? (React__default["default"].createElement(EmptyStateIndicator$1, { listType: 'channel' })) : (React__default["default"].createElement(Paginator, { hasNextPage: hasNextPage, loadNextPage: loadNextPage, refreshing: channelsQueryState.queryInProgress === 'load-more' }, renderChannels
12635
+ showChannelSearch && (React__default["default"].createElement(ChannelSearch$1, __assign({ onSearch: onSearch, onSearchExit: onSearchExit, setChannels: setChannels }, additionalChannelSearchProps))),
12636
+ showChannelList && (React__default["default"].createElement(List, { error: channelsQueryState.error, loadedChannels: sendChannelsToList ? loadedChannels : undefined, loading: channelsQueryState.queryInProgress === 'reload', LoadingErrorIndicator: LoadingErrorIndicator, LoadingIndicator: LoadingIndicator, setChannels: setChannels }, !(loadedChannels === null || loadedChannels === void 0 ? void 0 : loadedChannels.length) ? (React__default["default"].createElement(EmptyStateIndicator$1, { listType: 'channel' })) : (React__default["default"].createElement(Paginator, { hasNextPage: hasNextPage, loadNextPage: loadNextPage, refreshing: channelsQueryState.queryInProgress === 'load-more' }, renderChannels
13024
12637
  ? renderChannels(loadedChannels, renderChannel)
13025
12638
  : loadedChannels.map(function (channel) { return renderChannel(channel); }))))))));
13026
12639
  };
@@ -13029,7 +12642,7 @@ var UnMemoizedChannelList = function (props) {
13029
12642
  */
13030
12643
  var ChannelList = React__default["default"].memo(UnMemoizedChannelList);
13031
12644
 
13032
- var version = '10.0.0-theming-v2.2';
12645
+ var version = '10.0.1';
13033
12646
 
13034
12647
  var useChat = function (_a) {
13035
12648
  var _b, _c;
@@ -15010,6 +14623,20 @@ var UnMemoizedWindow = function (props) {
15010
14623
  */
15011
14624
  var Window = React__default["default"].memo(UnMemoizedWindow);
15012
14625
 
14626
+ // @ts-expect-error
14627
+
14628
+ var DefaultEmoji = /*#__PURE__*/Object.freeze({
14629
+ __proto__: null,
14630
+ 'default': nimbleEmoji__default["default"]
14631
+ });
14632
+
14633
+ // @ts-expect-error
14634
+
14635
+ var DefaultEmojiPicker = /*#__PURE__*/Object.freeze({
14636
+ __proto__: null,
14637
+ 'default': nimblePicker__default["default"]
14638
+ });
14639
+
15013
14640
  exports.ATTACHMENT_GROUPS_ORDER = ATTACHMENT_GROUPS_ORDER;
15014
14641
  exports.ActionsIcon = ActionsIcon;
15015
14642
  exports.Attachment = Attachment;
@@ -15110,6 +14737,7 @@ exports.ModalGallery = ModalGallery;
15110
14737
  exports.PinIcon = PinIcon;
15111
14738
  exports.PinIndicator = PinIndicator;
15112
14739
  exports.PlayButton = PlayButton;
14740
+ exports.PopperTooltip = PopperTooltip;
15113
14741
  exports.ProgressBar = ProgressBar;
15114
14742
  exports.QuotedMessagePreview = QuotedMessagePreview;
15115
14743
  exports.QuotedMessagePreviewHeader = QuotedMessagePreviewHeader;