stream-chat-react 6.8.0 → 6.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/CHANGELOG.md +1633 -0
  2. package/dist/browser.full-bundle.js +11245 -10648
  3. package/dist/browser.full-bundle.js.map +1 -1
  4. package/dist/browser.full-bundle.min.js +3 -3
  5. package/dist/browser.full-bundle.min.js.map +1 -1
  6. package/dist/components/Attachment/Card.js +1 -1
  7. package/dist/components/AutoCompleteTextarea/Header.d.ts +2 -0
  8. package/dist/components/AutoCompleteTextarea/Header.d.ts.map +1 -1
  9. package/dist/components/AutoCompleteTextarea/Header.js +10 -9
  10. package/dist/components/AutoCompleteTextarea/List.d.ts.map +1 -1
  11. package/dist/components/AutoCompleteTextarea/List.js +2 -2
  12. package/dist/components/Avatar/Avatar.d.ts.map +1 -1
  13. package/dist/components/Avatar/Avatar.js +3 -1
  14. package/dist/components/Channel/Channel.d.ts +2 -0
  15. package/dist/components/Channel/Channel.d.ts.map +1 -1
  16. package/dist/components/Channel/Channel.js +82 -102
  17. package/dist/components/Channel/hooks/useCreateChannelStateContext.d.ts +7 -0
  18. package/dist/components/Channel/hooks/useCreateChannelStateContext.d.ts.map +1 -0
  19. package/dist/components/Channel/hooks/useCreateChannelStateContext.js +92 -0
  20. package/dist/components/Channel/hooks/useCreateTypingContext.d.ts +4 -0
  21. package/dist/components/Channel/hooks/useCreateTypingContext.d.ts.map +1 -0
  22. package/dist/components/Channel/hooks/useCreateTypingContext.js +9 -0
  23. package/dist/components/Channel/hooks/useEditMessageHandler.js +1 -1
  24. package/dist/components/ChannelHeader/ChannelHeader.d.ts.map +1 -1
  25. package/dist/components/ChannelHeader/ChannelHeader.js +3 -3
  26. package/dist/components/ChannelList/ChannelList.d.ts.map +1 -1
  27. package/dist/components/ChannelList/ChannelList.js +3 -3
  28. package/dist/components/ChannelList/hooks/useChannelDeletedListener.js +1 -1
  29. package/dist/components/ChannelList/hooks/useChannelHiddenListener.js +1 -1
  30. package/dist/components/ChannelList/hooks/useChannelTruncatedListener.js +1 -1
  31. package/dist/components/ChannelList/hooks/useChannelUpdatedListener.js +1 -1
  32. package/dist/components/ChannelList/hooks/useChannelVisibleListener.js +1 -1
  33. package/dist/components/ChannelList/hooks/useConnectionRecoveredListener.js +1 -1
  34. package/dist/components/ChannelList/hooks/useMessageNewListener.js +1 -1
  35. package/dist/components/ChannelList/hooks/useNotificationAddedToChannelListener.d.ts.map +1 -1
  36. package/dist/components/ChannelList/hooks/useNotificationAddedToChannelListener.js +1 -1
  37. package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.d.ts +1 -1
  38. package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.d.ts.map +1 -1
  39. package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.js +3 -5
  40. package/dist/components/ChannelList/hooks/useNotificationRemovedFromChannelListener.d.ts.map +1 -1
  41. package/dist/components/ChannelList/hooks/useNotificationRemovedFromChannelListener.js +1 -1
  42. package/dist/components/ChannelList/hooks/usePaginatedChannels.d.ts +0 -1
  43. package/dist/components/ChannelList/hooks/usePaginatedChannels.d.ts.map +1 -1
  44. package/dist/components/ChannelList/hooks/usePaginatedChannels.js +7 -15
  45. package/dist/components/ChannelList/hooks/useUserPresenceChangedListener.js +1 -1
  46. package/dist/components/ChannelPreview/ChannelPreview.js +2 -2
  47. package/dist/components/ChannelPreview/hooks/useIsChannelMuted.js +1 -1
  48. package/dist/components/ChannelSearch/ChannelSearch.js +1 -1
  49. package/dist/components/ChannelSearch/SearchInput.js +1 -1
  50. package/dist/components/ChannelSearch/SearchResults.js +1 -1
  51. package/dist/components/Chat/Chat.d.ts +1 -1
  52. package/dist/components/Chat/Chat.d.ts.map +1 -1
  53. package/dist/components/Chat/Chat.js +14 -12
  54. package/dist/components/Chat/hooks/useChat.js +1 -1
  55. package/dist/components/Chat/hooks/useCreateChatContext.d.ts +4 -0
  56. package/dist/components/Chat/hooks/useCreateChatContext.d.ts.map +1 -0
  57. package/dist/components/Chat/hooks/useCreateChatContext.js +21 -0
  58. package/dist/components/ChatAutoComplete/ChatAutoComplete.d.ts +1 -0
  59. package/dist/components/ChatAutoComplete/ChatAutoComplete.d.ts.map +1 -1
  60. package/dist/components/ChatAutoComplete/ChatAutoComplete.js +3 -3
  61. package/dist/components/ChatDown/ChatDown.js +1 -1
  62. package/dist/components/DateSeparator/DateSeparator.js +1 -1
  63. package/dist/components/EmptyStateIndicator/EmptyStateIndicator.js +1 -1
  64. package/dist/components/EventComponent/EventComponent.js +1 -1
  65. package/dist/components/Gallery/Gallery.js +1 -1
  66. package/dist/components/Loading/LoadingErrorIndicator.js +1 -1
  67. package/dist/components/MML/MML.js +1 -1
  68. package/dist/components/Message/FixedHeightMessage.js +4 -4
  69. package/dist/components/Message/Message.d.ts.map +1 -1
  70. package/dist/components/Message/Message.js +3 -6
  71. package/dist/components/Message/MessageCommerce.js +2 -2
  72. package/dist/components/Message/MessageDeleted.js +1 -1
  73. package/dist/components/Message/MessageLivestream.d.ts.map +1 -1
  74. package/dist/components/Message/MessageLivestream.js +5 -6
  75. package/dist/components/Message/MessageOptions.js +1 -1
  76. package/dist/components/Message/MessageRepliesCountButton.js +1 -1
  77. package/dist/components/Message/MessageSimple.js +2 -2
  78. package/dist/components/Message/MessageStatus.d.ts.map +1 -1
  79. package/dist/components/Message/MessageStatus.js +4 -4
  80. package/dist/components/Message/MessageTeam.js +3 -3
  81. package/dist/components/Message/MessageText.d.ts.map +1 -1
  82. package/dist/components/Message/MessageText.js +3 -3
  83. package/dist/components/Message/MessageTimestamp.d.ts.map +1 -1
  84. package/dist/components/Message/MessageTimestamp.js +2 -2
  85. package/dist/components/Message/QuotedMessage.js +3 -3
  86. package/dist/components/Message/hooks/useActionHandler.d.ts.map +1 -1
  87. package/dist/components/Message/hooks/useActionHandler.js +2 -2
  88. package/dist/components/Message/hooks/useDeleteHandler.js +3 -3
  89. package/dist/components/Message/hooks/useFlagHandler.js +2 -2
  90. package/dist/components/Message/hooks/useMentionsHandler.js +1 -1
  91. package/dist/components/Message/hooks/useMuteHandler.js +3 -3
  92. package/dist/components/Message/hooks/useOpenThreadHandler.d.ts.map +1 -1
  93. package/dist/components/Message/hooks/useOpenThreadHandler.js +1 -1
  94. package/dist/components/Message/hooks/usePinHandler.d.ts.map +1 -1
  95. package/dist/components/Message/hooks/usePinHandler.js +10 -17
  96. package/dist/components/Message/hooks/useReactionHandler.d.ts.map +1 -1
  97. package/dist/components/Message/hooks/useReactionHandler.js +5 -6
  98. package/dist/components/Message/hooks/useRetryHandler.js +1 -1
  99. package/dist/components/Message/hooks/useUserRole.d.ts +2 -2
  100. package/dist/components/Message/hooks/useUserRole.d.ts.map +1 -1
  101. package/dist/components/Message/hooks/useUserRole.js +8 -6
  102. package/dist/components/Message/types.d.ts +1 -1
  103. package/dist/components/Message/types.d.ts.map +1 -1
  104. package/dist/components/Message/utils.d.ts.map +1 -1
  105. package/dist/components/Message/utils.js +1 -0
  106. package/dist/components/MessageActions/MessageActions.js +2 -2
  107. package/dist/components/MessageActions/MessageActionsBox.d.ts.map +1 -1
  108. package/dist/components/MessageActions/MessageActionsBox.js +3 -3
  109. package/dist/components/MessageInput/DefaultTriggerProvider.d.ts.map +1 -1
  110. package/dist/components/MessageInput/DefaultTriggerProvider.js +1 -1
  111. package/dist/components/MessageInput/EditMessageForm.d.ts.map +1 -1
  112. package/dist/components/MessageInput/EditMessageForm.js +4 -4
  113. package/dist/components/MessageInput/EmojiPicker.js +3 -3
  114. package/dist/components/MessageInput/MessageInput.d.ts +1 -1
  115. package/dist/components/MessageInput/MessageInput.d.ts.map +1 -1
  116. package/dist/components/MessageInput/MessageInput.js +3 -2
  117. package/dist/components/MessageInput/MessageInputFlat.js +4 -4
  118. package/dist/components/MessageInput/MessageInputSmall.d.ts.map +1 -1
  119. package/dist/components/MessageInput/MessageInputSmall.js +4 -4
  120. package/dist/components/MessageInput/QuotedMessagePreview.d.ts.map +1 -1
  121. package/dist/components/MessageInput/QuotedMessagePreview.js +4 -4
  122. package/dist/components/MessageInput/UploadsPreview.d.ts.map +1 -1
  123. package/dist/components/MessageInput/UploadsPreview.js +2 -2
  124. package/dist/components/MessageInput/hooks/useAttachments.d.ts.map +1 -1
  125. package/dist/components/MessageInput/hooks/useAttachments.js +1 -1
  126. package/dist/components/MessageInput/hooks/useCommandTrigger.d.ts.map +1 -1
  127. package/dist/components/MessageInput/hooks/useCommandTrigger.js +2 -3
  128. package/dist/components/MessageInput/hooks/useCooldownTimer.js +2 -2
  129. package/dist/components/MessageInput/hooks/useCreateMessageInputContext.d.ts +4 -0
  130. package/dist/components/MessageInput/hooks/useCreateMessageInputContext.d.ts.map +1 -0
  131. package/dist/components/MessageInput/hooks/useCreateMessageInputContext.js +91 -0
  132. package/dist/components/MessageInput/hooks/useEmojiIndex.js +1 -1
  133. package/dist/components/MessageInput/hooks/useFileUploads.js +3 -3
  134. package/dist/components/MessageInput/hooks/useImageUploads.d.ts.map +1 -1
  135. package/dist/components/MessageInput/hooks/useImageUploads.js +3 -3
  136. package/dist/components/MessageInput/hooks/useMessageInputState.d.ts.map +1 -1
  137. package/dist/components/MessageInput/hooks/useMessageInputState.js +2 -3
  138. package/dist/components/MessageInput/hooks/useMessageInputText.js +1 -1
  139. package/dist/components/MessageInput/hooks/useSubmitHandler.js +3 -3
  140. package/dist/components/MessageInput/hooks/useUserTrigger.js +3 -2
  141. package/dist/components/MessageInput/hooks/utils.d.ts +1 -0
  142. package/dist/components/MessageInput/hooks/utils.d.ts.map +1 -1
  143. package/dist/components/MessageInput/hooks/utils.js +7 -4
  144. package/dist/components/MessageInput/icons.js +5 -5
  145. package/dist/components/MessageList/ConnectionStatus.js +2 -2
  146. package/dist/components/MessageList/MessageList.d.ts +1 -9
  147. package/dist/components/MessageList/MessageList.d.ts.map +1 -1
  148. package/dist/components/MessageList/MessageList.js +10 -18
  149. package/dist/components/MessageList/MessageListNotifications.d.ts +11 -0
  150. package/dist/components/MessageList/MessageListNotifications.d.ts.map +1 -0
  151. package/dist/components/MessageList/MessageListNotifications.js +12 -0
  152. package/dist/components/MessageList/VirtualizedMessageList.d.ts +4 -2
  153. package/dist/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
  154. package/dist/components/MessageList/VirtualizedMessageList.js +13 -14
  155. package/dist/components/MessageList/hooks/useEnrichedMessages.d.ts.map +1 -1
  156. package/dist/components/MessageList/hooks/useEnrichedMessages.js +2 -2
  157. package/dist/components/MessageList/hooks/useGiphyPreview.js +1 -1
  158. package/dist/components/MessageList/hooks/useMessageListElements.d.ts.map +1 -1
  159. package/dist/components/MessageList/hooks/useMessageListElements.js +2 -2
  160. package/dist/components/MessageList/hooks/useMessageListScrollManager.js +1 -1
  161. package/dist/components/Modal/Modal.js +1 -1
  162. package/dist/components/Reactions/ReactionSelector.d.ts.map +1 -1
  163. package/dist/components/Reactions/ReactionSelector.js +3 -3
  164. package/dist/components/Reactions/ReactionsList.d.ts.map +1 -1
  165. package/dist/components/Reactions/ReactionsList.js +2 -2
  166. package/dist/components/Reactions/SimpleReactionsList.js +2 -2
  167. package/dist/components/Thread/Thread.d.ts.map +1 -1
  168. package/dist/components/Thread/Thread.js +8 -9
  169. package/dist/components/TypingIndicator/TypingIndicator.d.ts.map +1 -1
  170. package/dist/components/TypingIndicator/TypingIndicator.js +3 -3
  171. package/dist/components/Window/Window.js +1 -1
  172. package/dist/context/ChannelActionContext.d.ts +2 -2
  173. package/dist/context/ChannelActionContext.d.ts.map +1 -1
  174. package/dist/context/ChannelActionContext.js +8 -3
  175. package/dist/context/ChannelStateContext.d.ts +4 -3
  176. package/dist/context/ChannelStateContext.d.ts.map +1 -1
  177. package/dist/context/ChannelStateContext.js +8 -3
  178. package/dist/context/ChatContext.d.ts +4 -3
  179. package/dist/context/ChatContext.d.ts.map +1 -1
  180. package/dist/context/ChatContext.js +9 -2
  181. package/dist/context/ComponentContext.d.ts +3 -3
  182. package/dist/context/ComponentContext.d.ts.map +1 -1
  183. package/dist/context/ComponentContext.js +8 -3
  184. package/dist/context/EmojiContext.d.ts +2 -2
  185. package/dist/context/EmojiContext.d.ts.map +1 -1
  186. package/dist/context/EmojiContext.js +8 -3
  187. package/dist/context/MessageContext.d.ts +3 -3
  188. package/dist/context/MessageContext.d.ts.map +1 -1
  189. package/dist/context/MessageContext.js +9 -2
  190. package/dist/context/MessageInputContext.d.ts +1 -4
  191. package/dist/context/MessageInputContext.d.ts.map +1 -1
  192. package/dist/context/MessageInputContext.js +4 -6
  193. package/dist/context/TranslationContext.d.ts +1 -1
  194. package/dist/context/TranslationContext.d.ts.map +1 -1
  195. package/dist/context/TranslationContext.js +8 -1
  196. package/dist/context/TypingContext.d.ts +2 -2
  197. package/dist/context/TypingContext.d.ts.map +1 -1
  198. package/dist/context/TypingContext.js +9 -2
  199. package/dist/css/index.css +1 -1
  200. package/dist/i18n/Streami18n.js +2 -2
  201. package/dist/i18n/de.json +4 -4
  202. package/dist/index.cjs.js +661 -426
  203. package/dist/index.cjs.js.map +1 -1
  204. package/dist/scss/Avatar.scss +19 -2
  205. package/dist/scss/Message.scss +2 -1
  206. package/dist/scss/MessageList.scss +10 -2
  207. package/dist/scss/MessageNotification.scss +36 -0
  208. package/dist/scss/_base.scss +4 -3
  209. package/dist/scss/_variables.scss +1 -1
  210. package/dist/utils.d.ts +9 -2
  211. package/dist/utils.d.ts.map +1 -1
  212. package/dist/utils.js +27 -20
  213. package/dist/version.d.ts +1 -1
  214. package/dist/version.d.ts.map +1 -1
  215. package/dist/version.js +1 -1
  216. package/package.json +6 -5
package/dist/index.cjs.js CHANGED
@@ -308,7 +308,14 @@ var TranslationProvider = function (_a) {
308
308
  var children = _a.children, value = _a.value;
309
309
  return (React__default['default'].createElement(TranslationContext.Provider, { value: value }, children));
310
310
  };
311
- var useTranslationContext = function () { return React.useContext(TranslationContext); };
311
+ var useTranslationContext = function (componentName) {
312
+ var contextValue = React.useContext(TranslationContext);
313
+ if (!contextValue) {
314
+ console.warn("The useTranslationContext hook was called outside of the TranslationContext provider. Make sure this hook is called within a child of the Chat component. The errored call is located in the " + componentName + " component.");
315
+ return {};
316
+ }
317
+ return contextValue;
318
+ };
312
319
  var withTranslationContext = function (Component) {
313
320
  var WithTranslationContextComponent = function (props) {
314
321
  var translationContext = useTranslationContext();
@@ -320,7 +327,7 @@ var withTranslationContext = function (Component) {
320
327
 
321
328
  var UnMemoizedCard = function (props) {
322
329
  var image_url = props.image_url, og_scrape_url = props.og_scrape_url, text = props.text, thumb_url = props.thumb_url, title = props.title, title_link = props.title_link, type = props.type;
323
- var t = useTranslationContext().t;
330
+ var t = useTranslationContext('Card').t;
324
331
  var image = thumb_url || image_url;
325
332
  var trimUrl = function (url) {
326
333
  if (url !== undefined && url !== null) {
@@ -381,7 +388,7 @@ var UnMemoizedGallery = function (props) {
381
388
  var images = props.images;
382
389
  var _a = React.useState(0), index = _a[0], setIndex = _a[1];
383
390
  var _b = React.useState(false), modalOpen = _b[0], setModalOpen = _b[1];
384
- var t = useTranslationContext().t;
391
+ var t = useTranslationContext('Gallery').t;
385
392
  var toggleModal = function (selectedIndex) {
386
393
  if (modalOpen) {
387
394
  setModalOpen(false);
@@ -610,13 +617,18 @@ var Item = /*#__PURE__*/React__default['default'].forwardRef(function Item(props
610
617
  })));
611
618
  });
612
619
 
613
- var ComponentContext = React__default['default'].createContext({});
620
+ var ComponentContext = React__default['default'].createContext(undefined);
614
621
  var ComponentProvider = function (_a) {
615
622
  var children = _a.children, value = _a.value;
616
623
  return (React__default['default'].createElement(ComponentContext.Provider, { value: value }, children));
617
624
  };
618
- var useComponentContext = function () {
619
- return React.useContext(ComponentContext);
625
+ var useComponentContext = function (componentName) {
626
+ var contextValue = React.useContext(ComponentContext);
627
+ if (!contextValue) {
628
+ console.warn("The useComponentContext hook was called outside of the ComponentContext provider. Make sure this hook is called within a child of the Channel component. The errored call is located in the " + componentName + " component.");
629
+ return {};
630
+ }
631
+ return contextValue;
620
632
  };
621
633
  /**
622
634
  * Typescript currently does not support partial inference, so if ComponentContext
@@ -778,46 +790,54 @@ function generateRandomId() {
778
790
  // prettier-ignore
779
791
  return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
780
792
  }
781
- var smartRender = function (ElementOrComponentOrLiteral, props, fallback) {
782
- if (ElementOrComponentOrLiteral === undefined && fallback) {
783
- ElementOrComponentOrLiteral = fallback;
784
- }
785
- if (React__default['default'].isValidElement(ElementOrComponentOrLiteral)) {
786
- // Flow cast through any, to make flow believe it's a React.Element
787
- var element = ElementOrComponentOrLiteral;
788
- return element;
789
- }
790
- // Flow cast through any to remove React.Element after previous check
791
- var ComponentOrLiteral = ElementOrComponentOrLiteral;
792
- if (typeof ComponentOrLiteral === 'string' ||
793
- typeof ComponentOrLiteral === 'number' ||
794
- typeof ComponentOrLiteral === 'boolean' ||
795
- ComponentOrLiteral == null) {
796
- return ComponentOrLiteral;
797
- }
798
- return React__default['default'].createElement(ComponentOrLiteral, __assign({}, props));
799
- };
800
-
801
- var DefaultSuggestionListHeader = function (_a) {
802
- var value = _a.value;
803
- var t = useTranslationContext().t;
804
- if (value[0] === '/') {
793
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt#getting_whole_characters
794
+ var getWholeChar = function (str, i) {
795
+ var code = str.charCodeAt(i);
796
+ if (Number.isNaN(code))
797
+ return '';
798
+ if (code < 0xd800 || code > 0xdfff)
799
+ return str.charAt(i);
800
+ if (0xd800 <= code && code <= 0xdbff) {
801
+ if (str.length <= i + 1) {
802
+ throw 'High surrogate without following low surrogate';
803
+ }
804
+ var next = str.charCodeAt(i + 1);
805
+ if (0xdc00 > next || next > 0xdfff) {
806
+ throw 'High surrogate without following low surrogate';
807
+ }
808
+ return str.charAt(i) + str.charAt(i + 1);
809
+ }
810
+ if (i === 0) {
811
+ throw 'Low surrogate without preceding high surrogate';
812
+ }
813
+ var prev = str.charCodeAt(i - 1);
814
+ if (0xd800 > prev || prev > 0xdbff) {
815
+ throw 'Low surrogate without preceding high surrogate';
816
+ }
817
+ return '';
818
+ };
819
+
820
+ var DefaultSuggestionListHeader = function (props) {
821
+ var currentTrigger = props.currentTrigger, value = props.value;
822
+ var t = useTranslationContext('DefaultSuggestionListHeader').t;
823
+ var triggerIndex = value.lastIndexOf(currentTrigger);
824
+ if (currentTrigger === '/') {
805
825
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
806
826
  t('Commands matching'),
807
827
  " ",
808
- React__default['default'].createElement("strong", null, value.replace('/', ''))));
828
+ React__default['default'].createElement("strong", null, value.slice(triggerIndex + 1))));
809
829
  }
810
- if (value[0] === ':') {
830
+ if (currentTrigger === ':') {
811
831
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
812
832
  t('Emoji matching'),
813
833
  " ",
814
- React__default['default'].createElement("strong", null, value.replace(':', ''))));
834
+ React__default['default'].createElement("strong", null, value.slice(triggerIndex + 1))));
815
835
  }
816
- if (value[0] === '@') {
836
+ if (currentTrigger === '@') {
817
837
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
818
838
  t('People matching'),
819
839
  " ",
820
- React__default['default'].createElement("strong", null, value.replace('@', ''))));
840
+ React__default['default'].createElement("strong", null, value.slice(triggerIndex + 1))));
821
841
  }
822
842
  return null;
823
843
  };
@@ -1045,6 +1065,7 @@ var List = function List(props) {
1045
1065
  }, /*#__PURE__*/React__default['default'].createElement("li", {
1046
1066
  className: "rta__list-header"
1047
1067
  }, /*#__PURE__*/React__default['default'].createElement(SuggestionHeader, {
1068
+ currentTrigger: currentTrigger,
1048
1069
  value: propValue
1049
1070
  })), values.map(function (item, i) {
1050
1071
  return /*#__PURE__*/React__default['default'].createElement(SuggestionItem, {
@@ -1058,7 +1079,8 @@ var List = function List(props) {
1058
1079
  itemsRef[i] = _ref;
1059
1080
  },
1060
1081
  selected: isSelected(item),
1061
- style: itemStyle
1082
+ style: itemStyle,
1083
+ value: propValue
1062
1084
  });
1063
1085
  }));
1064
1086
  };
@@ -1901,7 +1923,8 @@ var Avatar = function (props) {
1901
1923
  setError(false);
1902
1924
  setLoaded(false);
1903
1925
  }, [image]);
1904
- var initials = ((name === null || name === void 0 ? void 0 : name.toString()) || '').charAt(0);
1926
+ var nameStr = (name === null || name === void 0 ? void 0 : name.toString()) || '';
1927
+ var initials = getWholeChar(nameStr, 0);
1905
1928
  return (React__default['default'].createElement("div", { className: "str-chat__avatar str-chat__avatar--" + shape, "data-testid": 'avatar', onClick: onClick, onMouseOver: onMouseOver, style: {
1906
1929
  flexBasis: size + "px",
1907
1930
  fontSize: size / 2 + "px",
@@ -2018,12 +2041,119 @@ var defaultMinimalEmojis = [
2018
2041
  // use this only for small lists like in ReactionSelector
2019
2042
  var getStrippedEmojiData = function (data) { return (__assign(__assign({}, data), { emojis: {} })); };
2020
2043
 
2021
- var ChatContext = React__default['default'].createContext({});
2044
+ var useCreateChannelStateContext = function (value) {
2045
+ var _a;
2046
+ var acceptedFiles = value.acceptedFiles, channel = value.channel, _b = value.channelCapabilitiesArray, channelCapabilitiesArray = _b === void 0 ? [] : _b, channelConfig = value.channelConfig, error = value.error, hasMore = value.hasMore, loading = value.loading, loadingMore = value.loadingMore, maxNumberOfFiles = value.maxNumberOfFiles, members = value.members, _c = value.messages, messages = _c === void 0 ? [] : _c, multipleUploads = value.multipleUploads, mutes = value.mutes, notifications = value.notifications, pinnedMessages = value.pinnedMessages, quotedMessage = value.quotedMessage, _d = value.read, read = _d === void 0 ? {} : _d, skipMessageDataMemoization = value.skipMessageDataMemoization, thread = value.thread, threadHasMore = value.threadHasMore, threadLoadingMore = value.threadLoadingMore, _e = value.threadMessages, threadMessages = _e === void 0 ? [] : _e, watcherCount = value.watcherCount, watcher_count = value.watcher_count, watchers = value.watchers;
2047
+ var channelId = channel.cid;
2048
+ var lastRead = channel.initialized && ((_a = channel.lastRead()) === null || _a === void 0 ? void 0 : _a.getTime());
2049
+ var membersLength = Object.keys(members || []).length;
2050
+ var notificationsLength = notifications.length;
2051
+ var readUsers = Object.values(read);
2052
+ var readUsersLength = readUsers.length;
2053
+ var readUsersLastReads = readUsers.map(function (_a) {
2054
+ var last_read = _a.last_read;
2055
+ return last_read.toISOString();
2056
+ }).join();
2057
+ var threadMessagesLength = threadMessages === null || threadMessages === void 0 ? void 0 : threadMessages.length;
2058
+ var channelCapabilities = {};
2059
+ channelCapabilitiesArray.forEach(function (capability) {
2060
+ channelCapabilities[capability] = true;
2061
+ });
2062
+ var memoizedMessageData = skipMessageDataMemoization
2063
+ ? messages
2064
+ : messages
2065
+ .map(function (_a) {
2066
+ var deleted_at = _a.deleted_at, latest_reactions = _a.latest_reactions, pinned = _a.pinned, reply_count = _a.reply_count, status = _a.status, updated_at = _a.updated_at;
2067
+ return "" + deleted_at + (latest_reactions ? latest_reactions.map(function (_a) {
2068
+ var type = _a.type;
2069
+ return type;
2070
+ }).join() : '') + pinned + reply_count + status + (updated_at && (isDayOrMoment(updated_at) || isDate(updated_at))
2071
+ ? updated_at.toISOString()
2072
+ : updated_at || '');
2073
+ })
2074
+ .join();
2075
+ var memoizedThreadMessageData = threadMessages
2076
+ .map(function (_a) {
2077
+ var deleted_at = _a.deleted_at, latest_reactions = _a.latest_reactions, pinned = _a.pinned, status = _a.status, updated_at = _a.updated_at;
2078
+ return "" + deleted_at + (latest_reactions ? latest_reactions.map(function (_a) {
2079
+ var type = _a.type;
2080
+ return type;
2081
+ }).join() : '') + pinned + status + (updated_at && (isDayOrMoment(updated_at) || isDate(updated_at))
2082
+ ? updated_at.toISOString()
2083
+ : updated_at || '');
2084
+ })
2085
+ .join();
2086
+ var channelStateContext = React.useMemo(function () { return ({
2087
+ acceptedFiles: acceptedFiles,
2088
+ channel: channel,
2089
+ channelCapabilities: channelCapabilities,
2090
+ channelConfig: channelConfig,
2091
+ error: error,
2092
+ hasMore: hasMore,
2093
+ loading: loading,
2094
+ loadingMore: loadingMore,
2095
+ maxNumberOfFiles: maxNumberOfFiles,
2096
+ members: members,
2097
+ messages: messages,
2098
+ multipleUploads: multipleUploads,
2099
+ mutes: mutes,
2100
+ notifications: notifications,
2101
+ pinnedMessages: pinnedMessages,
2102
+ quotedMessage: quotedMessage,
2103
+ read: read,
2104
+ thread: thread,
2105
+ threadHasMore: threadHasMore,
2106
+ threadLoadingMore: threadLoadingMore,
2107
+ threadMessages: threadMessages,
2108
+ watcher_count: watcher_count,
2109
+ watcherCount: watcherCount,
2110
+ watchers: watchers,
2111
+ }); }, [
2112
+ channelId,
2113
+ error,
2114
+ hasMore,
2115
+ lastRead,
2116
+ loading,
2117
+ loadingMore,
2118
+ membersLength,
2119
+ memoizedMessageData,
2120
+ memoizedThreadMessageData,
2121
+ notificationsLength,
2122
+ quotedMessage,
2123
+ readUsersLength,
2124
+ readUsersLastReads,
2125
+ skipMessageDataMemoization,
2126
+ thread,
2127
+ threadHasMore,
2128
+ threadLoadingMore,
2129
+ threadMessagesLength,
2130
+ watcherCount,
2131
+ ]);
2132
+ return channelStateContext;
2133
+ };
2134
+
2135
+ var useCreateTypingContext = function (value) {
2136
+ var typing = value.typing;
2137
+ var typingValue = Object.keys(typing || {}).join();
2138
+ var typingContext = React.useMemo(function () { return ({
2139
+ typing: typing,
2140
+ }); }, [typingValue]);
2141
+ return typingContext;
2142
+ };
2143
+
2144
+ var ChatContext = React__default['default'].createContext(undefined);
2022
2145
  var ChatProvider = function (_a) {
2023
2146
  var children = _a.children, value = _a.value;
2024
2147
  return (React__default['default'].createElement(ChatContext.Provider, { value: value }, children));
2025
2148
  };
2026
- var useChatContext = function () { return React.useContext(ChatContext); };
2149
+ var useChatContext = function (componentName) {
2150
+ var contextValue = React.useContext(ChatContext);
2151
+ if (!contextValue) {
2152
+ console.warn("The useChatContext hook was called outside of the ChatContext provider. Make sure this hook is called within a child of the Chat component. The errored call is located in the " + componentName + " component.");
2153
+ return {};
2154
+ }
2155
+ return contextValue;
2156
+ };
2027
2157
  /**
2028
2158
  * Typescript currently does not support partial inference so if ChatContext
2029
2159
  * typing is desired while using the HOC withChatContext the Props for the
@@ -2039,7 +2169,7 @@ var withChatContext = function (Component) {
2039
2169
  };
2040
2170
 
2041
2171
  var useEditMessageHandler = function (doUpdateMessageRequest) {
2042
- var _a = useChatContext(), channel = _a.channel, client = _a.client;
2172
+ var _a = useChatContext('useEditMessageHandler'), channel = _a.channel, client = _a.client;
2043
2173
  return function (updatedMessage) {
2044
2174
  if (doUpdateMessageRequest && channel) {
2045
2175
  return Promise.resolve(doUpdateMessageRequest(channel.cid, updatedMessage));
@@ -2100,7 +2230,7 @@ var LoadingChannels = React__default['default'].memo(UnMemoizedLoadingChannels);
2100
2230
  */
2101
2231
  var UnMemoizedLoadingErrorIndicator = function (_a) {
2102
2232
  var error = _a.error;
2103
- var t = useTranslationContext().t;
2233
+ var t = useTranslationContext('LoadingErrorIndicator').t;
2104
2234
  if (!error)
2105
2235
  return null;
2106
2236
  return React__default['default'].createElement("div", null, t('Error: {{ errorMessage }}', { errorMessage: error.message }));
@@ -2124,13 +2254,18 @@ var LoadingIndicator = React__default['default'].memo(UnMemoizedLoadingIndicator
2124
2254
  return prevProps.color === nextProps.color && prevProps.size === nextProps.size;
2125
2255
  });
2126
2256
 
2127
- var ChannelStateContext = React__default['default'].createContext({});
2257
+ var ChannelStateContext = React__default['default'].createContext(undefined);
2128
2258
  var ChannelStateProvider = function (_a) {
2129
2259
  var children = _a.children, value = _a.value;
2130
2260
  return (React__default['default'].createElement(ChannelStateContext.Provider, { value: value }, children));
2131
2261
  };
2132
- var useChannelStateContext = function () {
2133
- return React.useContext(ChannelStateContext);
2262
+ var useChannelStateContext = function (componentName) {
2263
+ var contextValue = React.useContext(ChannelStateContext);
2264
+ if (!contextValue) {
2265
+ console.warn("The useChannelStateContext hook was called outside of the ChannelStateContext provider. Make sure this hook is called within a child of the Channel component. The errored call is located in the " + componentName + " component.");
2266
+ return {};
2267
+ }
2268
+ return contextValue;
2134
2269
  };
2135
2270
  /**
2136
2271
  * Typescript currently does not support partial inference, so if ChannelStateContext
@@ -2150,21 +2285,23 @@ var withChannelStateContext = function (Component) {
2150
2285
 
2151
2286
  var useUserRole = function (message, onlySenderCanEdit, disableQuotedMessages) {
2152
2287
  var _a, _b, _c;
2153
- var _d = useChannelStateContext(), channel = _d.channel, channelConfig = _d.channelConfig;
2154
- var client = useChatContext().client;
2288
+ var _d = useChannelStateContext('useUserRole'), channel = _d.channel, _e = _d.channelCapabilities, channelCapabilities = _e === void 0 ? {} : _e, channelConfig = _d.channelConfig;
2289
+ var client = useChatContext('useUserRole').client;
2155
2290
  var isAdmin = ((_a = client.user) === null || _a === void 0 ? void 0 : _a.role) === 'admin' || channel.state.membership.role === 'admin';
2156
2291
  var isMyMessage = client.userID === ((_b = message.user) === null || _b === void 0 ? void 0 : _b.id);
2157
2292
  var isOwner = channel.state.membership.role === 'owner';
2158
2293
  var isModerator = ((_c = client.user) === null || _c === void 0 ? void 0 : _c.role) === 'channel_moderator' ||
2159
2294
  channel.state.membership.role === 'channel_moderator' ||
2160
2295
  channel.state.membership.role === 'moderator';
2161
- var canEdit = isMyMessage || (!onlySenderCanEdit && (isModerator || isAdmin));
2162
- var canDelete = isMyMessage || isModerator || isAdmin;
2296
+ var canEdit = (!onlySenderCanEdit && channelCapabilities['update-any-message']) ||
2297
+ (isMyMessage && channelCapabilities['update-own-message']);
2298
+ var canDelete = channelCapabilities['delete-any-message'] ||
2299
+ (isMyMessage && channelCapabilities['delete-own-message']);
2163
2300
  var canFlag = !isMyMessage;
2164
2301
  var canMute = !isMyMessage && (channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.mutes);
2165
2302
  var canQuote = !disableQuotedMessages;
2166
- var canReact = channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.reactions;
2167
- var canReply = channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.replies;
2303
+ var canReact = (channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.reactions) !== false && channelCapabilities['send-reaction'];
2304
+ var canReply = (channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.replies) !== false && channelCapabilities['send-reply'];
2168
2305
  return {
2169
2306
  canDelete: canDelete,
2170
2307
  canEdit: canEdit,
@@ -2182,7 +2319,7 @@ var useUserRole = function (message, onlySenderCanEdit, disableQuotedMessages) {
2182
2319
 
2183
2320
  var MessageDeleted = function (props) {
2184
2321
  var message = props.message;
2185
- var t = useTranslationContext().t;
2322
+ var t = useTranslationContext('MessageDeleted').t;
2186
2323
  var isMyMessage = useUserRole(message).isMyMessage;
2187
2324
  var messageClasses = isMyMessage
2188
2325
  ? 'str-chat__message str-chat__message--me str-chat__message-simple str-chat__message-simple--me'
@@ -2261,6 +2398,7 @@ var MESSAGE_ACTIONS = {
2261
2398
  react: 'react',
2262
2399
  reply: 'reply',
2263
2400
  };
2401
+ // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release
2264
2402
  var defaultPinPermissions = {
2265
2403
  commerce: {
2266
2404
  admin: true,
@@ -2490,13 +2628,18 @@ var getReadByTooltipText = function (users, t, client) {
2490
2628
  return outStr;
2491
2629
  };
2492
2630
 
2493
- var ChannelActionContext = React__default['default'].createContext({});
2631
+ var ChannelActionContext = React__default['default'].createContext(undefined);
2494
2632
  var ChannelActionProvider = function (_a) {
2495
2633
  var children = _a.children, value = _a.value;
2496
2634
  return (React__default['default'].createElement(ChannelActionContext.Provider, { value: value }, children));
2497
2635
  };
2498
- var useChannelActionContext = function () {
2499
- return React.useContext(ChannelActionContext);
2636
+ var useChannelActionContext = function (componentName) {
2637
+ var contextValue = React.useContext(ChannelActionContext);
2638
+ if (!contextValue) {
2639
+ console.warn("The useChannelActionContext hook was called outside of the ChannelActionContext provider. Make sure this hook is called within a child of the Channel component. The errored call is located in the " + componentName + " component.");
2640
+ return {};
2641
+ }
2642
+ return contextValue;
2500
2643
  };
2501
2644
  /**
2502
2645
  * Typescript currently does not support partial inference, so if ChannelActionContext
@@ -2514,12 +2657,19 @@ var withChannelActionContext = function (Component) {
2514
2657
  return WithChannelActionContextComponent;
2515
2658
  };
2516
2659
 
2517
- var MessageContext = React__default['default'].createContext({});
2660
+ var MessageContext = React__default['default'].createContext(undefined);
2518
2661
  var MessageProvider = function (_a) {
2519
2662
  var children = _a.children, value = _a.value;
2520
2663
  return (React__default['default'].createElement(MessageContext.Provider, { value: value }, children));
2521
2664
  };
2522
- var useMessageContext = function () { return React.useContext(MessageContext); };
2665
+ var useMessageContext = function (componentName) {
2666
+ var contextValue = React.useContext(MessageContext);
2667
+ if (!contextValue) {
2668
+ console.warn("The useMessageContext hook was called outside of the MessageContext provider. Make sure this hook is called within the Message's UI component. The errored call is located in the " + componentName + " component.");
2669
+ return {};
2670
+ }
2671
+ return contextValue;
2672
+ };
2523
2673
  /**
2524
2674
  * Typescript currently does not support partial inference, so if MessageContext
2525
2675
  * typing is desired while using the HOC withMessageContext, the Props for the
@@ -2547,9 +2697,9 @@ var CustomMessageActionsList = function (props) {
2547
2697
  };
2548
2698
  var UnMemoizedMessageActionsBox = function (props) {
2549
2699
  var getMessageActions = props.getMessageActions, handleDelete = props.handleDelete, handleEdit = props.handleEdit, handleFlag = props.handleFlag, handleMute = props.handleMute, handlePin = props.handlePin, isUserMuted = props.isUserMuted, mine = props.mine, _a = props.open, open = _a === void 0 ? false : _a;
2550
- var setQuotedMessage = useChannelActionContext().setQuotedMessage;
2551
- var _b = useMessageContext(), customMessageActions = _b.customMessageActions, message = _b.message, messageListRect = _b.messageListRect;
2552
- var t = useTranslationContext().t;
2700
+ var setQuotedMessage = useChannelActionContext('MessageActionsBox').setQuotedMessage;
2701
+ var _b = useMessageContext('MessageActionsBox'), customMessageActions = _b.customMessageActions, message = _b.message, messageListRect = _b.messageListRect;
2702
+ var t = useTranslationContext('MessageActionsBox').t;
2553
2703
  var _c = React.useState(false), reverse = _c[0], setReverse = _c[1];
2554
2704
  var messageActions = getMessageActions();
2555
2705
  var checkIfReverse = React.useCallback(function (containerElement) {
@@ -2600,8 +2750,8 @@ var MessageActionsBox = React__default['default'].memo(UnMemoizedMessageActionsB
2600
2750
 
2601
2751
  var MessageActions = function (props) {
2602
2752
  var _a = props.ActionsIcon, ActionsIcon$1 = _a === void 0 ? ActionsIcon : _a, _b = props.customWrapperClass, customWrapperClass = _b === void 0 ? '' : _b, propGetMessageActions = props.getMessageActions, propHandleDelete = props.handleDelete, propHandleFlag = props.handleFlag, propHandleMute = props.handleMute, propHandlePin = props.handlePin, inline = props.inline, propMessage = props.message, messageWrapperRef = props.messageWrapperRef, mine = props.mine;
2603
- var mutes = useChatContext().mutes;
2604
- var _c = useMessageContext(), customMessageActions = _c.customMessageActions, contextGetMessageActions = _c.getMessageActions, contextHandleDelete = _c.handleDelete, contextHandleFlag = _c.handleFlag, contextHandleMute = _c.handleMute, contextHandlePin = _c.handlePin, isMyMessage = _c.isMyMessage, contextMessage = _c.message, setEditingState = _c.setEditingState;
2753
+ var mutes = useChatContext('MessageActions').mutes;
2754
+ var _c = useMessageContext('MessageActions'), customMessageActions = _c.customMessageActions, contextGetMessageActions = _c.getMessageActions, contextHandleDelete = _c.handleDelete, contextHandleFlag = _c.handleFlag, contextHandleMute = _c.handleMute, contextHandlePin = _c.handlePin, isMyMessage = _c.isMyMessage, contextMessage = _c.message, setEditingState = _c.setEditingState;
2605
2755
  var getMessageActions = propGetMessageActions || contextGetMessageActions;
2606
2756
  var handleDelete = propHandleDelete || contextHandleDelete;
2607
2757
  var handleFlag = propHandleFlag || contextHandleFlag;
@@ -2658,7 +2808,7 @@ var MessageActionsWrapper = function (props) {
2658
2808
 
2659
2809
  var UnMemoizedMessageOptions = function (props) {
2660
2810
  var _a = props.ActionsIcon, ActionsIcon$1 = _a === void 0 ? ActionsIcon : _a, _b = props.displayLeft, displayLeft = _b === void 0 ? true : _b, _c = props.displayReplies, displayReplies = _c === void 0 ? true : _c, propHandleOpenThread = props.handleOpenThread, messageWrapperRef = props.messageWrapperRef, _d = props.ReactionIcon, ReactionIcon$1 = _d === void 0 ? ReactionIcon : _d, _e = props.theme, theme = _e === void 0 ? 'simple' : _e, _f = props.ThreadIcon, ThreadIcon$1 = _f === void 0 ? ThreadIcon : _f;
2661
- var _g = useMessageContext(), customMessageActions = _g.customMessageActions, getMessageActions = _g.getMessageActions, contextHandleOpenThread = _g.handleOpenThread, initialMessage = _g.initialMessage, isMyMessage = _g.isMyMessage, message = _g.message, onReactionListClick = _g.onReactionListClick, threadList = _g.threadList;
2811
+ var _g = useMessageContext('MessageOptions'), customMessageActions = _g.customMessageActions, getMessageActions = _g.getMessageActions, contextHandleOpenThread = _g.handleOpenThread, initialMessage = _g.initialMessage, isMyMessage = _g.isMyMessage, message = _g.message, onReactionListClick = _g.onReactionListClick, threadList = _g.threadList;
2662
2812
  var handleOpenThread = propHandleOpenThread || contextHandleOpenThread;
2663
2813
  var messageActions = getMessageActions();
2664
2814
  var showActionsBox = showMessageActionsBox(messageActions) || !!customMessageActions;
@@ -2692,7 +2842,7 @@ var MessageOptions = React__default['default'].memo(UnMemoizedMessageOptions);
2692
2842
 
2693
2843
  var UnMemoizedMessageRepliesCountButton = function (props) {
2694
2844
  var labelPlural = props.labelPlural, labelSingle = props.labelSingle, onClick = props.onClick, _a = props.reply_count, reply_count = _a === void 0 ? 0 : _a;
2695
- var t = useTranslationContext().t;
2845
+ var t = useTranslationContext('MessageRepliesCountButton').t;
2696
2846
  var singleReplyText;
2697
2847
  var pluralReplyText;
2698
2848
  if (reply_count === 1) {
@@ -2730,10 +2880,10 @@ var Tooltip = function (props) {
2730
2880
  var UnMemoizedMessageStatus = function (props) {
2731
2881
  var _a;
2732
2882
  var propAvatar = props.Avatar, _b = props.messageType, messageType = _b === void 0 ? 'simple' : _b;
2733
- var client = useChatContext().client;
2734
- var contextAvatar = useComponentContext().Avatar;
2735
- var _c = useMessageContext(), isMyMessage = _c.isMyMessage, lastReceivedId = _c.lastReceivedId, message = _c.message, readBy = _c.readBy, threadList = _c.threadList;
2736
- var t = useTranslationContext().t;
2883
+ var client = useChatContext('MessageStatus').client;
2884
+ var contextAvatar = useComponentContext('MessageStatus').Avatar;
2885
+ var _c = useMessageContext('MessageStatus'), isMyMessage = _c.isMyMessage, lastReceivedId = _c.lastReceivedId, message = _c.message, readBy = _c.readBy, threadList = _c.threadList;
2886
+ var t = useTranslationContext('MessageStatus').t;
2737
2887
  var Avatar$1 = propAvatar || contextAvatar || Avatar;
2738
2888
  if (!isMyMessage() || message.type === 'error') {
2739
2889
  return null;
@@ -2763,8 +2913,8 @@ var MessageStatus = React__default['default'].memo(UnMemoizedMessageStatus);
2763
2913
  var handleActionWarning = "Action handler was called, but it is missing one of its required arguments. \nMake sure the ChannelAction and ChannelState contexts are properly set and the hook is initialized with a valid message.";
2764
2914
  function useActionHandler(message) {
2765
2915
  var _this = this;
2766
- var _a = useChannelActionContext(), removeMessage = _a.removeMessage, updateMessage = _a.updateMessage;
2767
- var channel = useChannelStateContext().channel;
2916
+ var _a = useChannelActionContext('useActionHandler'), removeMessage = _a.removeMessage, updateMessage = _a.updateMessage;
2917
+ var channel = useChannelStateContext('useActionHandler').channel;
2768
2918
  return function (dataOrName, value, event) { return __awaiter(_this, void 0, void 0, function () {
2769
2919
  var messageID, formData, data;
2770
2920
  return __generator(this, function (_a) {
@@ -2822,9 +2972,9 @@ var useBreakpoint = function () {
2822
2972
  var useDeleteHandler = function (message, notifications) {
2823
2973
  if (notifications === void 0) { notifications = {}; }
2824
2974
  var getErrorNotification = notifications.getErrorNotification, notify = notifications.notify;
2825
- var updateMessage = useChannelActionContext().updateMessage;
2826
- var client = useChatContext().client;
2827
- var t = useTranslationContext().t;
2975
+ var updateMessage = useChannelActionContext('useDeleteHandler').updateMessage;
2976
+ var client = useChatContext('useDeleteHandler').client;
2977
+ var t = useTranslationContext('useDeleteHandler').t;
2828
2978
  return function (event) { return __awaiter(void 0, void 0, void 0, function () {
2829
2979
  var data, errorMessage;
2830
2980
  return __generator(this, function (_a) {
@@ -2877,8 +3027,8 @@ var useEditHandler = function (customInitialState, customSetEditing, customClear
2877
3027
  var missingUseFlagHandlerParameterWarning = 'useFlagHandler was called but it is missing one or more necessary parameters.';
2878
3028
  var useFlagHandler = function (message, notifications) {
2879
3029
  if (notifications === void 0) { notifications = {}; }
2880
- var client = useChatContext().client;
2881
- var t = useTranslationContext().t;
3030
+ var client = useChatContext('useFlagHandler').client;
3031
+ var t = useTranslationContext('useFlagHandler').t;
2882
3032
  return function (event) { return __awaiter(void 0, void 0, void 0, function () {
2883
3033
  var getErrorNotification, getSuccessNotification, notify, successMessage, errorMessage;
2884
3034
  var _a;
@@ -2924,7 +3074,7 @@ function createEventHandler(fn, message) {
2924
3074
  };
2925
3075
  }
2926
3076
  var useMentionsHandler = function (message, customMentionHandler) {
2927
- var _a = useChannelActionContext(), contextOnMentionsClick = _a.onMentionsClick, contextOnMentionsHover = _a.onMentionsHover;
3077
+ var _a = useChannelActionContext('useMentionsHandler'), contextOnMentionsClick = _a.onMentionsClick, contextOnMentionsHover = _a.onMentionsHover;
2928
3078
  var onMentionsClick = (customMentionHandler === null || customMentionHandler === void 0 ? void 0 : customMentionHandler.onMentionsClick) || contextOnMentionsClick || (function () { return null; });
2929
3079
  var onMentionsHover = (customMentionHandler === null || customMentionHandler === void 0 ? void 0 : customMentionHandler.onMentionsHover) || contextOnMentionsHover || (function () { return null; });
2930
3080
  return {
@@ -2968,9 +3118,9 @@ var useMobilePress = function () {
2968
3118
  var missingUseMuteHandlerParamsWarning = 'useMuteHandler was called but it is missing one or more necessary parameter.';
2969
3119
  var useMuteHandler = function (message, notifications) {
2970
3120
  if (notifications === void 0) { notifications = {}; }
2971
- var mutes = useChannelStateContext().mutes;
2972
- var client = useChatContext().client;
2973
- var t = useTranslationContext().t;
3121
+ var mutes = useChannelStateContext('useMuteHandler').mutes;
3122
+ var client = useChatContext('useMuteHandler').client;
3123
+ var t = useTranslationContext('useMuteHandler').t;
2974
3124
  return function (event) { return __awaiter(void 0, void 0, void 0, function () {
2975
3125
  var getErrorNotification, getSuccessNotification, notify, successMessage, errorMessage, fallbackMessage, successMessage, errorMessage;
2976
3126
  return __generator(this, function (_a) {
@@ -3031,7 +3181,7 @@ var useMuteHandler = function (message, notifications) {
3031
3181
  };
3032
3182
 
3033
3183
  var useOpenThreadHandler = function (message, customOpenThread) {
3034
- var channelOpenThread = useChannelActionContext().openThread;
3184
+ var channelOpenThread = useChannelActionContext('useOpenThreadHandler').openThread;
3035
3185
  var openThread = customOpenThread || channelOpenThread;
3036
3186
  return function (event) {
3037
3187
  if (!openThread || !message) {
@@ -3042,25 +3192,17 @@ var useOpenThreadHandler = function (message, customOpenThread) {
3042
3192
  };
3043
3193
  };
3044
3194
 
3045
- var usePinHandler = function (message, permissions, notifications) {
3046
- if (permissions === void 0) { permissions = defaultPinPermissions; }
3195
+ var usePinHandler = function (message,
3196
+ // @ts-expect-error @deprecated in favor of `channelCapabilities` - TODO: remove in next major release
3197
+ permissions, // eslint-disable-line
3198
+ notifications) {
3047
3199
  if (notifications === void 0) { notifications = {}; }
3048
3200
  var getErrorNotification = notifications.getErrorNotification, notify = notifications.notify;
3049
- var updateMessage = useChannelActionContext().updateMessage;
3050
- var channel = useChannelStateContext().channel;
3051
- var client = useChatContext().client;
3052
- var t = useTranslationContext().t;
3053
- var canPin = function () {
3054
- if (!channel || !permissions || !permissions[channel.type]) {
3055
- return false;
3056
- }
3057
- var currentChannelPermissions = permissions[channel.type];
3058
- var currentRole = channel.state.membership.role;
3059
- if (currentChannelPermissions && currentRole && currentChannelPermissions[currentRole]) {
3060
- return true;
3061
- }
3062
- return false;
3063
- };
3201
+ var updateMessage = useChannelActionContext('usePinHandler').updateMessage;
3202
+ var _a = useChannelStateContext('usePinHandler').channelCapabilities, channelCapabilities = _a === void 0 ? {} : _a;
3203
+ var client = useChatContext('usePinHandler').client;
3204
+ var t = useTranslationContext('usePinHandler').t;
3205
+ var canPin = !!channelCapabilities['pin-message'];
3064
3206
  var handlePin = function (event) { return __awaiter(void 0, void 0, void 0, function () {
3065
3207
  var optimisticMessage, messageResponse, errorMessage, optimisticMessage, messageResponse, errorMessage;
3066
3208
  return __generator(this, function (_a) {
@@ -3108,14 +3250,14 @@ var usePinHandler = function (message, permissions, notifications) {
3108
3250
  }
3109
3251
  });
3110
3252
  }); };
3111
- return { canPin: canPin(), handlePin: handlePin };
3253
+ return { canPin: canPin, handlePin: handlePin };
3112
3254
  };
3113
3255
 
3114
3256
  var reactionHandlerWarning = "Reaction handler was called, but it is missing one of its required arguments.\nMake sure the ChannelAction and ChannelState contexts are properly set and the hook is initialized with a valid message.";
3115
3257
  var useReactionHandler = function (message) {
3116
- var updateMessage = useChannelActionContext().updateMessage;
3117
- var channel = useChannelStateContext().channel;
3118
- var client = useChatContext().client;
3258
+ var updateMessage = useChannelActionContext('useReactionHandler').updateMessage;
3259
+ var channel = useChannelStateContext('useReactionHandler').channel;
3260
+ var client = useChatContext('useReactionHandler').client;
3119
3261
  var createMessagePreview = React.useCallback(function (add, reaction, message) {
3120
3262
  var _a, _b;
3121
3263
  var newReactionCounts = (message === null || message === void 0 ? void 0 : message.reaction_counts) || {};
@@ -3230,11 +3372,10 @@ var useReactionHandler = function (message) {
3230
3372
  }); };
3231
3373
  };
3232
3374
  var useReactionClick = function (message, reactionSelectorRef, messageWrapperRef, closeReactionSelectorOnClick) {
3233
- var _a, _b;
3234
- var channel = useChannelStateContext().channel;
3375
+ var _a = useChannelStateContext('useReactionClick'), _b = _a.channelCapabilities, channelCapabilities = _b === void 0 ? {} : _b, channelConfig = _a.channelConfig;
3235
3376
  var _c = React.useState(false), showDetailedReactions = _c[0], setShowDetailedReactions = _c[1];
3236
3377
  var hasListener = React.useRef(false);
3237
- var isReactionEnabled = ((_b = (_a = channel === null || channel === void 0 ? void 0 : channel.getConfig) === null || _a === void 0 ? void 0 : _a.call(channel)) === null || _b === void 0 ? void 0 : _b.reactions) !== false;
3378
+ var isReactionEnabled = (channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.reactions) !== false && channelCapabilities['send-reaction'];
3238
3379
  var messageDeleted = !!(message === null || message === void 0 ? void 0 : message.deleted_at);
3239
3380
  var closeDetailedReactions = React.useCallback(function (event) {
3240
3381
  var _a;
@@ -3295,7 +3436,7 @@ var useReactionClick = function (message, reactionSelectorRef, messageWrapperRef
3295
3436
  };
3296
3437
 
3297
3438
  var useRetryHandler = function (customRetrySendMessage) {
3298
- var contextRetrySendMessage = useChannelActionContext().retrySendMessage;
3439
+ var contextRetrySendMessage = useChannelActionContext('useRetryHandler').retrySendMessage;
3299
3440
  var retrySendMessage = customRetrySendMessage || contextRetrySendMessage;
3300
3441
  return function (message) { return __awaiter(void 0, void 0, void 0, function () {
3301
3442
  return __generator(this, function (_a) {
@@ -3329,9 +3470,9 @@ var useUserHandler = function (message, eventHandlers) { return ({
3329
3470
 
3330
3471
  var QuotedMessage = function () {
3331
3472
  var _a, _b;
3332
- var Attachment = useComponentContext().Attachment;
3333
- var _c = useMessageContext(), isMyMessage = _c.isMyMessage, message = _c.message;
3334
- var userLanguage = useTranslationContext().userLanguage;
3473
+ var Attachment = useComponentContext('QuotedMessage').Attachment;
3474
+ var _c = useMessageContext('QuotedMessage'), isMyMessage = _c.isMyMessage, message = _c.message;
3475
+ var userLanguage = useTranslationContext('QuotedMessage').userLanguage;
3335
3476
  var quoted_message = message.quoted_message;
3336
3477
  if (!quoted_message)
3337
3478
  return null;
@@ -3356,9 +3497,9 @@ var QuotedMessage = function () {
3356
3497
  var UnMemoizedMessageTextComponent = function (props) {
3357
3498
  var _a;
3358
3499
  var customInnerClass = props.customInnerClass, _b = props.customWrapperClass, customWrapperClass = _b === void 0 ? '' : _b, propMessage = props.message, _c = props.theme, theme = _c === void 0 ? 'simple' : _c;
3359
- var _d = useComponentContext().QuotedMessage, QuotedMessage$1 = _d === void 0 ? QuotedMessage : _d;
3360
- var _e = useMessageContext(), contextMessage = _e.message, onMentionsClickMessage = _e.onMentionsClickMessage, onMentionsHoverMessage = _e.onMentionsHoverMessage, _f = _e.renderText, renderText$1 = _f === void 0 ? renderText : _f, unsafeHTML = _e.unsafeHTML;
3361
- var _g = useTranslationContext(), t = _g.t, userLanguage = _g.userLanguage;
3500
+ var _d = useComponentContext('MessageText').QuotedMessage, QuotedMessage$1 = _d === void 0 ? QuotedMessage : _d;
3501
+ 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;
3502
+ var _g = useTranslationContext('MessageText'), t = _g.t, userLanguage = _g.userLanguage;
3362
3503
  var handleMobilePress = useMobilePress().handleMobilePress;
3363
3504
  var message = propMessage || contextMessage;
3364
3505
  var hasAttachment = messageHasAttachments(message);
@@ -3417,8 +3558,8 @@ function getDateString(messageCreatedAt, formatDate, calendar, tDateTimeParser,
3417
3558
  }
3418
3559
  var UnMemoizedMessageTimestamp = function (props) {
3419
3560
  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;
3420
- var _d = useMessageContext(), formatDate = _d.formatDate, contextMessage = _d.message;
3421
- var tDateTimeParser = useTranslationContext().tDateTimeParser;
3561
+ var _d = useMessageContext('MessageTimestamp'), formatDate = _d.formatDate, contextMessage = _d.message;
3562
+ var tDateTimeParser = useTranslationContext('MessageTimestamp').tDateTimeParser;
3422
3563
  var message = propMessage || contextMessage;
3423
3564
  var createdAt = message.created_at;
3424
3565
  var when = React.useMemo(function () { return getDateString(createdAt, formatDate, calendar, tDateTimeParser, format); }, [formatDate, calendar, tDateTimeParser, format, createdAt]);
@@ -3429,9 +3570,8 @@ var UnMemoizedMessageTimestamp = function (props) {
3429
3570
  var MessageTimestamp = React__default['default'].memo(UnMemoizedMessageTimestamp);
3430
3571
 
3431
3572
  var useCommandTrigger = function () {
3432
- var _a, _b;
3433
- var channel = useChannelStateContext().channel;
3434
- var commands = (_b = (_a = channel === null || channel === void 0 ? void 0 : channel.getConfig) === null || _a === void 0 ? void 0 : _a.call(channel)) === null || _b === void 0 ? void 0 : _b.commands;
3573
+ var channelConfig = useChannelStateContext('useCommandTrigger').channelConfig;
3574
+ var commands = channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.commands;
3435
3575
  return {
3436
3576
  component: CommandItem,
3437
3577
  dataProvider: function (query, text, onReady) {
@@ -3518,7 +3658,7 @@ var accentsMap = {
3518
3658
  e: 'é|è|ê|É|È|Ê',
3519
3659
  i: 'í|ì|î|Í|Ì|Î',
3520
3660
  n: 'ñ|Ñ',
3521
- o: 'ó|ò|ô|õ|Ó|Ò|Ô|Õ',
3661
+ o: 'ó|ò|ô|ő|õ|Ó|Ò|Ô|Õ',
3522
3662
  u: 'ú|ù|û|ü|Ú|Ù|Û|Ü',
3523
3663
  };
3524
3664
  var removeDiacritics = function (text) {
@@ -3555,7 +3695,7 @@ var calculateLevenshtein = function (query, name) {
3555
3695
  return matrix[name.length][query.length];
3556
3696
  };
3557
3697
  var searchLocalUsers = function (params) {
3558
- var ownUserId = params.ownUserId, query = params.query, useMentionsTransliteration = params.useMentionsTransliteration, users = params.users;
3698
+ var ownUserId = params.ownUserId, query = params.query, text = params.text, useMentionsTransliteration = params.useMentionsTransliteration, users = params.users;
3559
3699
  var matchingUsers = users.filter(function (user) {
3560
3700
  if (user.id === ownUserId)
3561
3701
  return false;
@@ -3580,13 +3720,16 @@ var searchLocalUsers = function (params) {
3580
3720
  });
3581
3721
  }); })();
3582
3722
  }
3723
+ var maxDistance = 3;
3724
+ var lastDigits = text.slice(-(maxDistance + 1)).includes('@');
3583
3725
  if (updatedName) {
3584
3726
  var levenshtein_1 = calculateLevenshtein(updatedQuery, updatedName);
3585
- if (updatedName.includes(updatedQuery) || levenshtein_1 <= 3)
3727
+ if (updatedName.includes(updatedQuery) || (levenshtein_1 <= maxDistance && lastDigits)) {
3586
3728
  return true;
3729
+ }
3587
3730
  }
3588
3731
  var levenshtein = calculateLevenshtein(updatedQuery, updatedId);
3589
- return updatedId.includes(updatedQuery) || levenshtein <= 3;
3732
+ return updatedId.includes(updatedQuery) || (levenshtein <= maxDistance && lastDigits);
3590
3733
  });
3591
3734
  return matchingUsers;
3592
3735
  };
@@ -3615,8 +3758,8 @@ var UserItem = React__default['default'].memo(UnMemoizedUserItem);
3615
3758
  var useUserTrigger = function (params) {
3616
3759
  var disableMentions = params.disableMentions, mentionAllAppUsers = params.mentionAllAppUsers, _a = params.mentionQueryParams, mentionQueryParams = _a === void 0 ? {} : _a, onSelectUser = params.onSelectUser, useMentionsTransliteration = params.useMentionsTransliteration;
3617
3760
  var _b = React.useState(false), searching = _b[0], setSearching = _b[1];
3618
- var _c = useChatContext(), client = _c.client, mutes = _c.mutes;
3619
- var channel = useChannelStateContext().channel;
3761
+ var _c = useChatContext('useUserTrigger'), client = _c.client, mutes = _c.mutes;
3762
+ var channel = useChannelStateContext('useUserTrigger').channel;
3620
3763
  var members = channel.state.members;
3621
3764
  var watchers = channel.state.watchers;
3622
3765
  var getMembersAndWatchers = React.useCallback(function () {
@@ -3731,6 +3874,7 @@ var useUserTrigger = function (params) {
3731
3874
  var params_1 = {
3732
3875
  ownUserId: client.userID,
3733
3876
  query: query,
3877
+ text: text,
3734
3878
  useMentionsTransliteration: useMentionsTransliteration,
3735
3879
  users: users,
3736
3880
  };
@@ -3759,20 +3903,18 @@ var MessageInputContextProvider = function (_a) {
3759
3903
  var children = _a.children, value = _a.value;
3760
3904
  return (React__default['default'].createElement(MessageInputContext.Provider, { value: value }, children));
3761
3905
  };
3762
- /**
3763
- * hook for MessageInput context
3764
- */
3765
- var useMessageInputContext = function () {
3906
+ var useMessageInputContext = function (componentName) {
3766
3907
  var contextValue = React.useContext(MessageInputContext);
3767
- if (contextValue === undefined) {
3768
- console.warn('Empty MessageInputContext consumed. Make sure you wrap every component that uses MessageInputContext with a MessageInputContextProvider');
3908
+ if (!contextValue) {
3909
+ console.warn("The useMessageInputContext hook was called outside of the MessageInputContext provider. Make sure this hook is called within the MessageInput's UI component. The errored call is located in the " + componentName + " component.");
3910
+ return {};
3769
3911
  }
3770
3912
  return contextValue;
3771
3913
  };
3772
3914
 
3773
3915
  var DefaultTriggerProvider = function (_a) {
3774
3916
  var children = _a.children;
3775
- var currentValue = useMessageInputContext();
3917
+ var currentValue = useMessageInputContext('DefaultTriggerProvider');
3776
3918
  var defaultAutocompleteTriggers = {
3777
3919
  '/': useCommandTrigger(),
3778
3920
  ':': useEmojiTrigger(currentValue.emojiIndex),
@@ -3810,7 +3952,7 @@ var DefaultEmojiPicker = React__default['default'].lazy(function () { return __a
3810
3952
  }
3811
3953
  });
3812
3954
  }); });
3813
- var EmojiContext = React__default['default'].createContext({});
3955
+ var EmojiContext = React__default['default'].createContext(undefined);
3814
3956
  var EmojiProvider = function (_a) {
3815
3957
  var children = _a.children, value = _a.value;
3816
3958
  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;
@@ -3822,8 +3964,13 @@ var EmojiProvider = function (_a) {
3822
3964
  };
3823
3965
  return React__default['default'].createElement(EmojiContext.Provider, { value: emojiContextValue }, children);
3824
3966
  };
3825
- var useEmojiContext = function () {
3826
- return React.useContext(EmojiContext);
3967
+ var useEmojiContext = function (componentName) {
3968
+ var contextValue = React.useContext(EmojiContext);
3969
+ if (!contextValue) {
3970
+ console.warn("The useEmojiContext hook was called outside of the EmojiContext provider. Make sure this hook is called within a child of the Channel component. The errored call is located in the " + componentName + " component.");
3971
+ return {};
3972
+ }
3973
+ return contextValue;
3827
3974
  };
3828
3975
  /**
3829
3976
  * Typescript currently does not support partial inference, so if EmojiContext
@@ -3849,9 +3996,9 @@ var filterEmoji = function (emoji) {
3849
3996
  };
3850
3997
  var EmojiPicker = function (props) {
3851
3998
  var small = props.small;
3852
- var _a = useEmojiContext(), emojiConfig = _a.emojiConfig, EmojiPickerComponent = _a.EmojiPicker;
3853
- var t = useTranslationContext().t;
3854
- var messageInput = useMessageInputContext();
3999
+ var _a = useEmojiContext('EmojiPicker'), emojiConfig = _a.emojiConfig, EmojiPickerComponent = _a.EmojiPicker;
4000
+ var t = useTranslationContext('EmojiPicker').t;
4001
+ var messageInput = useMessageInputContext('EmojiPicker');
3855
4002
  var emojiData = (emojiConfig || {}).emojiData;
3856
4003
  if (messageInput.emojiPickerIsOpen && emojiData) {
3857
4004
  var className = small
@@ -3865,34 +4012,34 @@ var EmojiPicker = function (props) {
3865
4012
  };
3866
4013
 
3867
4014
  var EmojiIconLarge = function () {
3868
- var t = useTranslationContext().t;
4015
+ var t = useTranslationContext('EmojiIconLarge').t;
3869
4016
  return (React__default['default'].createElement("svg", { height: '28', width: '28', xmlns: 'http://www.w3.org/2000/svg' },
3870
4017
  React__default['default'].createElement("title", null, t('Open emoji picker')),
3871
4018
  React__default['default'].createElement("g", { clipRule: 'evenodd', fillRule: 'evenodd' },
3872
4019
  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' }))));
3873
4020
  };
3874
4021
  var EmojiIconSmall = function () {
3875
- var t = useTranslationContext().t;
4022
+ var t = useTranslationContext('EmojiIconSmall').t;
3876
4023
  return (React__default['default'].createElement("svg", { height: '14', width: '14', xmlns: 'http://www.w3.org/2000/svg' },
3877
4024
  React__default['default'].createElement("title", null, t('Open emoji picker')),
3878
4025
  React__default['default'].createElement("g", { clipRule: 'evenodd', fillRule: 'evenodd' },
3879
4026
  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' }))));
3880
4027
  };
3881
4028
  var FileUploadIcon = function () {
3882
- var t = useTranslationContext().t;
4029
+ var t = useTranslationContext('FileUploadIcon').t;
3883
4030
  return (React__default['default'].createElement("svg", { height: '14', width: '14', xmlns: 'http://www.w3.org/2000/svg' },
3884
4031
  React__default['default'].createElement("title", null, t('Attach files')),
3885
4032
  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' })));
3886
4033
  };
3887
4034
  var FileUploadIconFlat = function () {
3888
- var t = useTranslationContext().t;
4035
+ var t = useTranslationContext('FileUploadIconFlat').t;
3889
4036
  return (React__default['default'].createElement("svg", { height: '14', width: '14', xmlns: 'http://www.w3.org/2000/svg' },
3890
4037
  React__default['default'].createElement("title", null, t('Attach files')),
3891
4038
  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' })));
3892
4039
  };
3893
4040
  var SendButton = function (_a) {
3894
4041
  var sendMessage = _a.sendMessage;
3895
- var t = useTranslationContext().t;
4042
+ var t = useTranslationContext('SendButton').t;
3896
4043
  return (React__default['default'].createElement("button", { className: 'str-chat__send-button', onClick: sendMessage },
3897
4044
  React__default['default'].createElement("svg", { height: '17', viewBox: '0 0 18 17', width: '18', xmlns: 'http://www.w3.org/2000/svg' },
3898
4045
  React__default['default'].createElement("title", null, t('Send')),
@@ -3900,8 +4047,8 @@ var SendButton = function (_a) {
3900
4047
  };
3901
4048
 
3902
4049
  var UploadsPreview = function () {
3903
- var _a = useChannelStateContext(), maxNumberOfFiles = _a.maxNumberOfFiles, multipleUploads = _a.multipleUploads;
3904
- var messageInput = useMessageInputContext();
4050
+ var _a = useChannelStateContext('UploadsPreview'), maxNumberOfFiles = _a.maxNumberOfFiles, multipleUploads = _a.multipleUploads;
4051
+ var messageInput = useMessageInputContext('UploadsPreview');
3905
4052
  var fileOrder = messageInput.fileOrder, fileUploads = messageInput.fileUploads, imageOrder = messageInput.imageOrder, imageUploads = messageInput.imageUploads, numberOfUploads = messageInput.numberOfUploads, removeFile = messageInput.removeFile, removeImage = messageInput.removeImage, text = messageInput.text, uploadFile = messageInput.uploadFile, uploadImage = messageInput.uploadImage, uploadNewFiles = messageInput.uploadNewFiles;
3906
4053
  var imagesToPreview = imageOrder.map(function (id) { return imageUploads[id]; });
3907
4054
  var filesToPreview = fileOrder.map(function (id) { return fileUploads[id]; });
@@ -3924,9 +4071,9 @@ var UploadsPreview = function () {
3924
4071
  };
3925
4072
 
3926
4073
  var UnMemoizedChatAutoComplete = function (props) {
3927
- var _a = useComponentContext(), SuggestionItem = _a.AutocompleteSuggestionItem, SuggestionList = _a.AutocompleteSuggestionList;
3928
- var t = useTranslationContext().t;
3929
- var messageInput = useMessageInputContext();
4074
+ var _a = useComponentContext('ChatAutoComplete'), SuggestionItem = _a.AutocompleteSuggestionItem, SuggestionList = _a.AutocompleteSuggestionList;
4075
+ var t = useTranslationContext('ChatAutoComplete').t;
4076
+ var messageInput = useMessageInputContext('ChatAutoComplete');
3930
4077
  var cooldownRemaining = messageInput.cooldownRemaining, disabled = messageInput.disabled, emojiIndex = messageInput.emojiIndex, innerRef = messageInput.textareaRef;
3931
4078
  var placeholder = props.placeholder || t('Type your message');
3932
4079
  var emojiReplace = function (word) {
@@ -3952,10 +4099,10 @@ var UnMemoizedChatAutoComplete = function (props) {
3952
4099
  var ChatAutoComplete = React__default['default'].memo(UnMemoizedChatAutoComplete);
3953
4100
 
3954
4101
  var EditMessageForm = function () {
3955
- var _a = useChannelStateContext(), acceptedFiles = _a.acceptedFiles, multipleUploads = _a.multipleUploads;
3956
- var t = useTranslationContext().t;
3957
- var _b = useMessageInputContext(), clearEditingState = _b.clearEditingState, handleSubmit = _b.handleSubmit, isUploadEnabled = _b.isUploadEnabled, maxFilesLeft = _b.maxFilesLeft, openEmojiPicker = _b.openEmojiPicker, uploadNewFiles = _b.uploadNewFiles;
3958
- var _c = useComponentContext(), _d = _c.EmojiIcon, EmojiIcon = _d === void 0 ? EmojiIconSmall : _d, _e = _c.FileUploadIcon, FileUploadIcon$1 = _e === void 0 ? FileUploadIcon : _e;
4102
+ var _a = useChannelStateContext('EditMessageForm'), acceptedFiles = _a.acceptedFiles, multipleUploads = _a.multipleUploads;
4103
+ var t = useTranslationContext('EditMessageForm').t;
4104
+ var _b = useMessageInputContext('EditMessageForm'), clearEditingState = _b.clearEditingState, handleSubmit = _b.handleSubmit, isUploadEnabled = _b.isUploadEnabled, maxFilesLeft = _b.maxFilesLeft, openEmojiPicker = _b.openEmojiPicker, uploadNewFiles = _b.uploadNewFiles;
4105
+ var _c = useComponentContext('EditMessageForm'), _d = _c.EmojiIcon, EmojiIcon = _d === void 0 ? EmojiIconSmall : _d, _e = _c.FileUploadIcon, FileUploadIcon$1 = _e === void 0 ? FileUploadIcon : _e;
3959
4106
  React.useEffect(function () {
3960
4107
  var onKeyDown = function (event) {
3961
4108
  if (event.keyCode === KEY_CODES.ESC && clearEditingState)
@@ -4018,8 +4165,8 @@ var checkUserRoles = function (globalRole, channelRole) {
4018
4165
  };
4019
4166
  var useCooldownTimer = function () {
4020
4167
  var _a, _b;
4021
- var client = useChatContext().client;
4022
- var channel = useChannelStateContext().channel;
4168
+ var client = useChatContext('useCooldownTimer').client;
4169
+ var channel = useChannelStateContext('useCooldownTimer').channel;
4023
4170
  var cooldownInterval = (channel.data || {}).cooldown;
4024
4171
  var _c = React.useState(), cooldownRemaining = _c[0], setCooldownRemaining = _c[1];
4025
4172
  var globalRole = ((_a = client.user) === null || _a === void 0 ? void 0 : _a.role) || '';
@@ -4040,7 +4187,7 @@ var useCooldownTimer = function () {
4040
4187
  };
4041
4188
 
4042
4189
  var useEmojiIndex = function () {
4043
- var _a = useEmojiContext(), emojiConfig = _a.emojiConfig, EmojiIndex = _a.EmojiIndex;
4190
+ var _a = useEmojiContext('useEmojiIndex'), emojiConfig = _a.emojiConfig, EmojiIndex = _a.EmojiIndex;
4044
4191
  var emojiData = (emojiConfig || {}).emojiData;
4045
4192
  var emojiIndex = React.useMemo(function () {
4046
4193
  if (EmojiIndex) {
@@ -4054,9 +4201,9 @@ var useEmojiIndex = function () {
4054
4201
  var useImageUploads = function (props, state, dispatch) {
4055
4202
  var doImageUploadRequest = props.doImageUploadRequest, errorHandler = props.errorHandler;
4056
4203
  var imageUploads = state.imageUploads;
4057
- var channel = useChannelStateContext().channel;
4058
- var addNotification = useChannelActionContext().addNotification;
4059
- var t = useTranslationContext().t;
4204
+ var channel = useChannelStateContext('useImageUploads').channel;
4205
+ var addNotification = useChannelActionContext('useImageUploads').addNotification;
4206
+ var t = useTranslationContext('useImageUploads').t;
4060
4207
  var removeImage = React.useCallback(function (id) {
4061
4208
  dispatch({ id: id, type: 'removeImageUpload' });
4062
4209
  // TODO: cancel upload if still uploading
@@ -4157,9 +4304,9 @@ var useImageUploads = function (props, state, dispatch) {
4157
4304
  var useFileUploads = function (props, state, dispatch) {
4158
4305
  var doFileUploadRequest = props.doFileUploadRequest, errorHandler = props.errorHandler;
4159
4306
  var fileUploads = state.fileUploads;
4160
- var channel = useChannelStateContext().channel;
4161
- var addNotification = useChannelActionContext().addNotification;
4162
- var t = useTranslationContext().t;
4307
+ var channel = useChannelStateContext('useFileUploads').channel;
4308
+ var addNotification = useChannelActionContext('useFileUploads').addNotification;
4309
+ var t = useTranslationContext('useFileUploads').t;
4163
4310
  var uploadFile = React.useCallback(function (id) {
4164
4311
  dispatch({ id: id, state: 'uploading', type: 'setFileUpload' });
4165
4312
  }, []);
@@ -4234,7 +4381,7 @@ var apiMaxNumberOfFiles = 10;
4234
4381
  var useAttachments = function (props, state, dispatch) {
4235
4382
  var noFiles = props.noFiles;
4236
4383
  var fileUploads = state.fileUploads, imageUploads = state.imageUploads;
4237
- var _a = useChannelStateContext(), maxNumberOfFiles = _a.maxNumberOfFiles, multipleUploads = _a.multipleUploads;
4384
+ var _a = useChannelStateContext('useAttachments'), maxNumberOfFiles = _a.maxNumberOfFiles, multipleUploads = _a.multipleUploads;
4238
4385
  var _b = useFileUploads(props, state, dispatch), removeFile = _b.removeFile, uploadFile = _b.uploadFile;
4239
4386
  var _c = useImageUploads(props, state, dispatch), removeImage = _c.removeImage, uploadImage = _c.uploadImage;
4240
4387
  // Number of files that the user can still add. Should never be more than the amount allowed by the API.
@@ -4278,7 +4425,7 @@ var useAttachments = function (props, state, dispatch) {
4278
4425
  };
4279
4426
 
4280
4427
  var useMessageInputText = function (props, state, dispatch) {
4281
- var channel = useChannelStateContext().channel;
4428
+ var channel = useChannelStateContext('useMessageInputText').channel;
4282
4429
  var additionalTextareaProps = props.additionalTextareaProps, focus = props.focus, parent = props.parent, _a = props.publishTypingEvent, publishTypingEvent = _a === void 0 ? true : _a;
4283
4430
  var text = state.text;
4284
4431
  var textareaRef = React.useRef();
@@ -4415,9 +4562,9 @@ var getAttachmentTypeFromMime = function (mime) {
4415
4562
  var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
4416
4563
  var clearEditingState = props.clearEditingState, message = props.message, overrideSubmitHandler = props.overrideSubmitHandler, parent = props.parent, publishTypingEvent = props.publishTypingEvent;
4417
4564
  var attachments = state.attachments, fileOrder = state.fileOrder, fileUploads = state.fileUploads, imageOrder = state.imageOrder, imageUploads = state.imageUploads, mentioned_users = state.mentioned_users, text = state.text;
4418
- var channel = useChannelStateContext().channel;
4419
- var _a = useChannelActionContext(), addNotification = _a.addNotification, editMessage = _a.editMessage, sendMessage = _a.sendMessage;
4420
- var t = useTranslationContext().t;
4565
+ var channel = useChannelStateContext('useSubmitHandler').channel;
4566
+ var _a = useChannelActionContext('useSubmitHandler'), addNotification = _a.addNotification, editMessage = _a.editMessage, sendMessage = _a.sendMessage;
4567
+ var t = useTranslationContext('useSubmitHandler').t;
4421
4568
  var getAttachmentsFromUploads = function () {
4422
4569
  var imageAttachments = imageOrder
4423
4570
  .map(function (id) { return imageUploads[id]; })
@@ -4717,9 +4864,8 @@ var messageInputReducer = function (state, action) {
4717
4864
  * hook for MessageInput state
4718
4865
  */
4719
4866
  var useMessageInputState = function (props) {
4720
- var _a, _b;
4721
4867
  var message = props.message;
4722
- var channel = useChannelStateContext().channel;
4868
+ var _a = useChannelStateContext('useMessageInputState'), _b = _a.channelCapabilities, channelCapabilities = _b === void 0 ? {} : _b, channelConfig = _a.channelConfig;
4723
4869
  var _c = React.useReducer(messageInputReducer, message, initState), state = _c[0], dispatch = _c[1];
4724
4870
  var _d = useMessageInputText(props, state, dispatch), handleChange = _d.handleChange, insertText = _d.insertText, textareaRef = _d.textareaRef;
4725
4871
  var _e = React.useState(false), showCommandsList = _e[0], setShowCommandsList = _e[1];
@@ -4735,7 +4881,7 @@ var useMessageInputState = function (props) {
4735
4881
  var _g = useAttachments(props, state, dispatch), maxFilesLeft = _g.maxFilesLeft, numberOfUploads = _g.numberOfUploads, removeFile = _g.removeFile, removeImage = _g.removeImage, uploadFile = _g.uploadFile, uploadImage = _g.uploadImage, uploadNewFiles = _g.uploadNewFiles;
4736
4882
  var handleSubmit = useSubmitHandler(props, state, dispatch, numberOfUploads).handleSubmit;
4737
4883
  var onPaste = usePasteHandler(uploadNewFiles, insertText).onPaste;
4738
- var isUploadEnabled = ((_b = (_a = channel === null || channel === void 0 ? void 0 : channel.getConfig) === null || _a === void 0 ? void 0 : _a.call(channel)) === null || _b === void 0 ? void 0 : _b.uploads) !== false;
4884
+ var isUploadEnabled = (channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.uploads) !== false && channelCapabilities['upload-file'] !== false;
4739
4885
  var onSelectUser = React.useCallback(function (item) {
4740
4886
  dispatch({ type: 'addMentionedUser', user: item });
4741
4887
  }, []);
@@ -4751,8 +4897,8 @@ var useMessageInputState = function (props) {
4751
4897
  };
4752
4898
 
4753
4899
  var QuotedMessagePreviewHeader = function () {
4754
- var setQuotedMessage = useChannelActionContext().setQuotedMessage;
4755
- var t = useTranslationContext().t;
4900
+ var setQuotedMessage = useChannelActionContext('QuotedMessagePreview').setQuotedMessage;
4901
+ var t = useTranslationContext('QuotedMessagePreview').t;
4756
4902
  return (React__default['default'].createElement("div", { className: 'quoted-message-preview-header' },
4757
4903
  React__default['default'].createElement("div", null, t('Reply to Message')),
4758
4904
  React__default['default'].createElement("button", { className: 'str-chat__square-button', onClick: function () { return setQuotedMessage(undefined); } },
@@ -4762,8 +4908,8 @@ var QuotedMessagePreviewHeader = function () {
4762
4908
  var QuotedMessagePreview = function (props) {
4763
4909
  var _a;
4764
4910
  var quotedMessage = props.quotedMessage;
4765
- var Attachment = useComponentContext().Attachment;
4766
- var userLanguage = useTranslationContext().userLanguage;
4911
+ var Attachment = useComponentContext('QuotedMessagePreview').Attachment;
4912
+ var userLanguage = useTranslationContext('QuotedMessagePreview').userLanguage;
4767
4913
  var quotedMessageText = ((_a = quotedMessage.i18n) === null || _a === void 0 ? void 0 : _a[userLanguage + "_text"]) ||
4768
4914
  quotedMessage.text;
4769
4915
  // @ts-expect-error
@@ -4783,10 +4929,10 @@ var QuotedMessagePreview = function (props) {
4783
4929
  };
4784
4930
 
4785
4931
  var MessageInputFlat = function () {
4786
- var _a = useChannelStateContext(), acceptedFiles = _a.acceptedFiles, multipleUploads = _a.multipleUploads, quotedMessage = _a.quotedMessage;
4787
- var t = useTranslationContext().t;
4788
- var _b = useMessageInputContext(), closeEmojiPicker = _b.closeEmojiPicker, cooldownInterval = _b.cooldownInterval, cooldownRemaining = _b.cooldownRemaining, emojiPickerIsOpen = _b.emojiPickerIsOpen, handleEmojiKeyDown = _b.handleEmojiKeyDown, handleSubmit = _b.handleSubmit, isUploadEnabled = _b.isUploadEnabled, maxFilesLeft = _b.maxFilesLeft, openEmojiPicker = _b.openEmojiPicker, setCooldownRemaining = _b.setCooldownRemaining, uploadNewFiles = _b.uploadNewFiles;
4789
- var _c = useComponentContext(), _d = _c.CooldownTimer, CooldownTimer$1 = _d === void 0 ? CooldownTimer : _d, _e = _c.EmojiIcon, EmojiIcon = _e === void 0 ? EmojiIconLarge : _e, _f = _c.FileUploadIcon, FileUploadIcon = _f === void 0 ? FileUploadIconFlat : _f, _g = _c.QuotedMessagePreview, QuotedMessagePreview$1 = _g === void 0 ? QuotedMessagePreview : _g, _h = _c.SendButton, SendButton$1 = _h === void 0 ? SendButton : _h;
4932
+ var _a = useChannelStateContext('MessageInputFlat'), acceptedFiles = _a.acceptedFiles, multipleUploads = _a.multipleUploads, quotedMessage = _a.quotedMessage;
4933
+ var t = useTranslationContext('MessageInputFlat').t;
4934
+ var _b = useMessageInputContext('MessageInputFlat'), closeEmojiPicker = _b.closeEmojiPicker, cooldownInterval = _b.cooldownInterval, cooldownRemaining = _b.cooldownRemaining, emojiPickerIsOpen = _b.emojiPickerIsOpen, handleEmojiKeyDown = _b.handleEmojiKeyDown, handleSubmit = _b.handleSubmit, isUploadEnabled = _b.isUploadEnabled, maxFilesLeft = _b.maxFilesLeft, openEmojiPicker = _b.openEmojiPicker, setCooldownRemaining = _b.setCooldownRemaining, uploadNewFiles = _b.uploadNewFiles;
4935
+ var _c = useComponentContext('MessageInputFlat'), _d = _c.CooldownTimer, CooldownTimer$1 = _d === void 0 ? CooldownTimer : _d, _e = _c.EmojiIcon, EmojiIcon = _e === void 0 ? EmojiIconLarge : _e, _f = _c.FileUploadIcon, FileUploadIcon = _f === void 0 ? FileUploadIconFlat : _f, _g = _c.QuotedMessagePreview, QuotedMessagePreview$1 = _g === void 0 ? QuotedMessagePreview : _g, _h = _c.SendButton, SendButton$1 = _h === void 0 ? SendButton : _h;
4790
4936
  return (React__default['default'].createElement("div", { className: "str-chat__input-flat " + (SendButton$1 ? 'str-chat__input-flat--send-button-active' : null) + " " + (quotedMessage ? 'str-chat__input-flat-quoted' : null) },
4791
4937
  React__default['default'].createElement(reactFileUtils.ImageDropzone, { accept: acceptedFiles, disabled: !isUploadEnabled || maxFilesLeft === 0 || !!cooldownRemaining, handleFiles: uploadNewFiles, maxNumberOfFiles: maxFilesLeft, multiple: multipleUploads },
4792
4938
  quotedMessage && React__default['default'].createElement(QuotedMessagePreview$1, { quotedMessage: quotedMessage }),
@@ -4809,13 +4955,104 @@ var MessageInputFlat = function () {
4809
4955
  !cooldownRemaining && React__default['default'].createElement(SendButton$1, { sendMessage: handleSubmit })))));
4810
4956
  };
4811
4957
 
4958
+ var useCreateMessageInputContext = function (value) {
4959
+ var additionalTextareaProps = value.additionalTextareaProps, attachments = value.attachments, autocompleteTriggers = value.autocompleteTriggers, clearEditingState = value.clearEditingState, closeCommandsList = value.closeCommandsList, closeEmojiPicker = value.closeEmojiPicker, cooldownInterval = value.cooldownInterval, cooldownRemaining = value.cooldownRemaining, disabled = value.disabled, disableMentions = value.disableMentions, doFileUploadRequest = value.doFileUploadRequest, doImageUploadRequest = value.doImageUploadRequest, emojiIndex = value.emojiIndex, emojiPickerIsOpen = value.emojiPickerIsOpen, emojiPickerRef = value.emojiPickerRef, errorHandler = value.errorHandler, fileOrder = value.fileOrder, fileUploads = value.fileUploads, focus = value.focus, grow = value.grow, handleChange = value.handleChange, handleEmojiKeyDown = value.handleEmojiKeyDown, handleSubmit = value.handleSubmit, imageOrder = value.imageOrder, imageUploads = value.imageUploads, insertText = value.insertText, isUploadEnabled = value.isUploadEnabled, keycodeSubmitKeys = value.keycodeSubmitKeys, maxFilesLeft = value.maxFilesLeft, maxRows = value.maxRows, mentionAllAppUsers = value.mentionAllAppUsers, mentioned_users = value.mentioned_users, mentionQueryParams = value.mentionQueryParams, message = value.message, noFiles = value.noFiles, numberOfUploads = value.numberOfUploads, onPaste = value.onPaste, onSelectEmoji = value.onSelectEmoji, onSelectUser = value.onSelectUser, openCommandsList = value.openCommandsList, openEmojiPicker = value.openEmojiPicker, overrideSubmitHandler = value.overrideSubmitHandler, parent = value.parent, publishTypingEvent = value.publishTypingEvent, removeFile = value.removeFile, removeImage = value.removeImage, setCooldownRemaining = value.setCooldownRemaining, setText = value.setText, showCommandsList = value.showCommandsList, text = value.text, textareaRef = value.textareaRef, uploadFile = value.uploadFile, uploadImage = value.uploadImage, uploadNewFiles = value.uploadNewFiles, useMentionsTransliteration = value.useMentionsTransliteration;
4960
+ var editing = message === null || message === void 0 ? void 0 : message.editing;
4961
+ var fileUploadsValue = Object.entries(fileUploads)
4962
+ // eslint-disable-next-line
4963
+ .map(function (_a) {
4964
+ _a[0]; var value = _a[1];
4965
+ return value.state;
4966
+ })
4967
+ .join();
4968
+ var imageUploadsValue = Object.entries(imageUploads)
4969
+ // eslint-disable-next-line
4970
+ .map(function (_a) {
4971
+ _a[0]; var value = _a[1];
4972
+ return value.state;
4973
+ })
4974
+ .join();
4975
+ var mentionedUsersLength = mentioned_users.length;
4976
+ var parentId = parent === null || parent === void 0 ? void 0 : parent.id;
4977
+ var messageInputContext = React.useMemo(function () { return ({
4978
+ additionalTextareaProps: additionalTextareaProps,
4979
+ attachments: attachments,
4980
+ autocompleteTriggers: autocompleteTriggers,
4981
+ clearEditingState: clearEditingState,
4982
+ closeCommandsList: closeCommandsList,
4983
+ closeEmojiPicker: closeEmojiPicker,
4984
+ cooldownInterval: cooldownInterval,
4985
+ cooldownRemaining: cooldownRemaining,
4986
+ disabled: disabled,
4987
+ disableMentions: disableMentions,
4988
+ doFileUploadRequest: doFileUploadRequest,
4989
+ doImageUploadRequest: doImageUploadRequest,
4990
+ emojiIndex: emojiIndex,
4991
+ emojiPickerIsOpen: emojiPickerIsOpen,
4992
+ emojiPickerRef: emojiPickerRef,
4993
+ errorHandler: errorHandler,
4994
+ fileOrder: fileOrder,
4995
+ fileUploads: fileUploads,
4996
+ focus: focus,
4997
+ grow: grow,
4998
+ handleChange: handleChange,
4999
+ handleEmojiKeyDown: handleEmojiKeyDown,
5000
+ handleSubmit: handleSubmit,
5001
+ imageOrder: imageOrder,
5002
+ imageUploads: imageUploads,
5003
+ insertText: insertText,
5004
+ isUploadEnabled: isUploadEnabled,
5005
+ keycodeSubmitKeys: keycodeSubmitKeys,
5006
+ maxFilesLeft: maxFilesLeft,
5007
+ maxRows: maxRows,
5008
+ mentionAllAppUsers: mentionAllAppUsers,
5009
+ mentioned_users: mentioned_users,
5010
+ mentionQueryParams: mentionQueryParams,
5011
+ message: message,
5012
+ noFiles: noFiles,
5013
+ numberOfUploads: numberOfUploads,
5014
+ onPaste: onPaste,
5015
+ onSelectEmoji: onSelectEmoji,
5016
+ onSelectUser: onSelectUser,
5017
+ openCommandsList: openCommandsList,
5018
+ openEmojiPicker: openEmojiPicker,
5019
+ overrideSubmitHandler: overrideSubmitHandler,
5020
+ parent: parent,
5021
+ publishTypingEvent: publishTypingEvent,
5022
+ removeFile: removeFile,
5023
+ removeImage: removeImage,
5024
+ setCooldownRemaining: setCooldownRemaining,
5025
+ setText: setText,
5026
+ showCommandsList: showCommandsList,
5027
+ text: text,
5028
+ textareaRef: textareaRef,
5029
+ uploadFile: uploadFile,
5030
+ uploadImage: uploadImage,
5031
+ uploadNewFiles: uploadNewFiles,
5032
+ useMentionsTransliteration: useMentionsTransliteration,
5033
+ }); }, [
5034
+ cooldownInterval,
5035
+ cooldownRemaining,
5036
+ editing,
5037
+ emojiPickerIsOpen,
5038
+ fileUploadsValue,
5039
+ imageUploadsValue,
5040
+ isUploadEnabled,
5041
+ mentionedUsersLength,
5042
+ parentId,
5043
+ publishTypingEvent,
5044
+ text,
5045
+ ]);
5046
+ return messageInputContext;
5047
+ };
5048
+
4812
5049
  var UnMemoizedMessageInput = function (props) {
4813
5050
  var PropInput = props.Input;
4814
- var _a = useComponentContext(), ContextInput = _a.Input, _b = _a.TriggerProvider, TriggerProvider = _b === void 0 ? DefaultTriggerProvider : _b;
5051
+ var _a = useComponentContext('MessageInput'), ContextInput = _a.Input, _b = _a.TriggerProvider, TriggerProvider = _b === void 0 ? DefaultTriggerProvider : _b;
4815
5052
  var Input = PropInput || ContextInput || MessageInputFlat;
4816
5053
  var messageInputState = useMessageInputState(props);
4817
5054
  var cooldownTimerState = useCooldownTimer();
4818
- var messageInputContextValue = __assign(__assign(__assign({}, cooldownTimerState), messageInputState), props);
5055
+ var messageInputContextValue = useCreateMessageInputContext(__assign(__assign(__assign({}, cooldownTimerState), messageInputState), props));
4819
5056
  return (React__default['default'].createElement(MessageInputContextProvider, { value: messageInputContextValue },
4820
5057
  React__default['default'].createElement(TriggerProvider, null,
4821
5058
  React__default['default'].createElement(Input, null))));
@@ -4826,10 +5063,10 @@ var UnMemoizedMessageInput = function (props) {
4826
5063
  var MessageInput = React__default['default'].memo(UnMemoizedMessageInput);
4827
5064
 
4828
5065
  var MessageInputSmall = function () {
4829
- var _a = useChannelStateContext(), acceptedFiles = _a.acceptedFiles, multipleUploads = _a.multipleUploads;
4830
- var t = useTranslationContext().t;
4831
- var _b = useMessageInputContext(), closeEmojiPicker = _b.closeEmojiPicker, cooldownInterval = _b.cooldownInterval, cooldownRemaining = _b.cooldownRemaining, emojiPickerIsOpen = _b.emojiPickerIsOpen, handleEmojiKeyDown = _b.handleEmojiKeyDown, handleSubmit = _b.handleSubmit, isUploadEnabled = _b.isUploadEnabled, maxFilesLeft = _b.maxFilesLeft, openEmojiPicker = _b.openEmojiPicker, setCooldownRemaining = _b.setCooldownRemaining, uploadNewFiles = _b.uploadNewFiles;
4832
- var _c = useComponentContext(), _d = _c.CooldownTimer, CooldownTimer$1 = _d === void 0 ? CooldownTimer : _d, _e = _c.EmojiIcon, EmojiIcon = _e === void 0 ? EmojiIconSmall : _e, _f = _c.FileUploadIcon, FileUploadIcon = _f === void 0 ? FileUploadIconFlat : _f, _g = _c.SendButton, SendButton$1 = _g === void 0 ? SendButton : _g;
5066
+ var _a = useChannelStateContext('MessageInputSmall'), acceptedFiles = _a.acceptedFiles, multipleUploads = _a.multipleUploads;
5067
+ var t = useTranslationContext('MessageInputSmall').t;
5068
+ var _b = useMessageInputContext('MessageInputSmall'), closeEmojiPicker = _b.closeEmojiPicker, cooldownInterval = _b.cooldownInterval, cooldownRemaining = _b.cooldownRemaining, emojiPickerIsOpen = _b.emojiPickerIsOpen, handleEmojiKeyDown = _b.handleEmojiKeyDown, handleSubmit = _b.handleSubmit, isUploadEnabled = _b.isUploadEnabled, maxFilesLeft = _b.maxFilesLeft, openEmojiPicker = _b.openEmojiPicker, setCooldownRemaining = _b.setCooldownRemaining, uploadNewFiles = _b.uploadNewFiles;
5069
+ var _c = useComponentContext('MessageInputSmall'), _d = _c.CooldownTimer, CooldownTimer$1 = _d === void 0 ? CooldownTimer : _d, _e = _c.EmojiIcon, EmojiIcon = _e === void 0 ? EmojiIconSmall : _e, _f = _c.FileUploadIcon, FileUploadIcon = _f === void 0 ? FileUploadIconFlat : _f, _g = _c.SendButton, SendButton$1 = _g === void 0 ? SendButton : _g;
4833
5070
  return (React__default['default'].createElement("div", { className: 'str-chat__small-message-input__wrapper' },
4834
5071
  React__default['default'].createElement(reactFileUtils.ImageDropzone, { accept: acceptedFiles, disabled: !isUploadEnabled || maxFilesLeft === 0 || !!cooldownRemaining, handleFiles: uploadNewFiles, maxNumberOfFiles: maxFilesLeft, multiple: multipleUploads },
4835
5072
  React__default['default'].createElement("div", { className: "str-chat__small-message-input " + (SendButton$1 ? 'str-chat__small-message-input--send-button-active' : null) },
@@ -4869,14 +5106,14 @@ var MMLReact = React__default['default'].lazy(function () { return __awaiter(voi
4869
5106
  */
4870
5107
  var MML = function (props) {
4871
5108
  var actionHandler = props.actionHandler, _a = props.align, align = _a === void 0 ? 'right' : _a, source = props.source;
4872
- var theme = useChatContext().theme;
5109
+ var theme = useChatContext('MML').theme;
4873
5110
  return (React__default['default'].createElement(React.Suspense, { fallback: null },
4874
5111
  React__default['default'].createElement(MMLReact, { className: "mml-align-" + align, Loading: null, onSubmit: actionHandler, source: source, Success: null, theme: (theme || '').replace(' ', '-') })));
4875
5112
  };
4876
5113
 
4877
5114
  var Modal = function (props) {
4878
5115
  var children = props.children, onClose = props.onClose, open = props.open;
4879
- var t = useTranslationContext().t;
5116
+ var t = useTranslationContext('Modal').t;
4880
5117
  var innerRef = React.useRef(null);
4881
5118
  var handleClick = function (event) {
4882
5119
  var _a;
@@ -4916,9 +5153,9 @@ var isMutableRef = function (ref) {
4916
5153
  var UnMemoizedReactionSelector = React__default['default'].forwardRef(function (props, ref) {
4917
5154
  var _a;
4918
5155
  var _b = props.additionalEmojiProps, additionalEmojiProps = _b === void 0 ? {} : _b, propAvatar = props.Avatar, _c = props.detailedView, detailedView = _c === void 0 ? true : _c, propHandleReaction = props.handleReaction, propLatestReactions = props.latest_reactions, propReactionCounts = props.reaction_counts, propReactionOptions = props.reactionOptions, _d = props.reverse, reverse = _d === void 0 ? false : _d;
4919
- var contextAvatar = useComponentContext().Avatar;
4920
- var _e = useEmojiContext(), Emoji = _e.Emoji, emojiConfig = _e.emojiConfig;
4921
- var _f = useMessageContext(), contextHandleReaction = _f.handleReaction, message = _f.message;
5156
+ var contextAvatar = useComponentContext('ReactionSelector').Avatar;
5157
+ var _e = useEmojiContext('ReactionSelector'), Emoji = _e.Emoji, emojiConfig = _e.emojiConfig;
5158
+ var _f = useMessageContext('ReactionSelector'), contextHandleReaction = _f.handleReaction, message = _f.message;
4922
5159
  var _g = emojiConfig || {}, defaultMinimalEmojis = _g.defaultMinimalEmojis, fullEmojiData = _g.emojiData, emojiSetDef = _g.emojiSetDef;
4923
5160
  var Avatar$1 = propAvatar || contextAvatar || Avatar;
4924
5161
  var handleReaction = propHandleReaction || contextHandleReaction;
@@ -4998,8 +5235,8 @@ var ReactionSelector = React__default['default'].memo(UnMemoizedReactionSelector
4998
5235
 
4999
5236
  var UnMemoizedReactionsList = function (props) {
5000
5237
  var additionalEmojiProps = props.additionalEmojiProps, onClick = props.onClick, propReactionCounts = props.reaction_counts, propReactionOptions = props.reactionOptions, propReactions = props.reactions, _a = props.reverse, reverse = _a === void 0 ? false : _a;
5001
- var _b = useEmojiContext(), Emoji = _b.Emoji, emojiConfig = _b.emojiConfig;
5002
- var _c = useMessageContext(), message = _c.message, onReactionListClick = _c.onReactionListClick;
5238
+ var _b = useEmojiContext('ReactionsList'), Emoji = _b.Emoji, emojiConfig = _b.emojiConfig;
5239
+ var _c = useMessageContext('ReactionsList'), message = _c.message, onReactionListClick = _c.onReactionListClick;
5003
5240
  var _d = emojiConfig || {}, defaultMinimalEmojis = _d.defaultMinimalEmojis, fullEmojiData = _d.emojiData, emojiSetDef = _d.emojiSetDef;
5004
5241
  var reactions = propReactions || message.latest_reactions || [];
5005
5242
  var reactionCounts = propReactionCounts || message.reaction_counts || {};
@@ -5057,8 +5294,8 @@ var ReactionsList = React__default['default'].memo(UnMemoizedReactionsList);
5057
5294
 
5058
5295
  var UnMemoizedSimpleReactionsList = function (props) {
5059
5296
  var _a = props.additionalEmojiProps, additionalEmojiProps = _a === void 0 ? {} : _a, propHandleReaction = props.handleReaction, propReactionCounts = props.reaction_counts, propReactionOptions = props.reactionOptions, propReactions = props.reactions;
5060
- var _b = useEmojiContext(), Emoji = _b.Emoji, emojiConfig = _b.emojiConfig;
5061
- var _c = useMessageContext(), contextHandleReaction = _c.handleReaction, message = _c.message;
5297
+ var _b = useEmojiContext('SimpleReactionsList'), Emoji = _b.Emoji, emojiConfig = _b.emojiConfig;
5298
+ var _c = useMessageContext('SimpleReactionsList'), contextHandleReaction = _c.handleReaction, message = _c.message;
5062
5299
  var _d = emojiConfig || {}, defaultMinimalEmojis = _d.defaultMinimalEmojis, fullEmojiData = _d.emojiData, emojiSetDef = _d.emojiSetDef;
5063
5300
  var _e = React.useState(undefined), tooltipReactionType = _e[0], setTooltipReactionType = _e[1];
5064
5301
  var handleReaction = propHandleReaction || contextHandleReaction;
@@ -5130,7 +5367,7 @@ var SimpleReactionsList = React__default['default'].memo(UnMemoizedSimpleReactio
5130
5367
  var MessageSimpleWithContext = function (props) {
5131
5368
  var _a;
5132
5369
  var additionalMessageInputProps = props.additionalMessageInputProps, clearEditingState = props.clearEditingState, editing = props.editing, endOfGroup = props.endOfGroup, firstOfGroup = props.firstOfGroup, groupedByUser = props.groupedByUser, handleAction = props.handleAction, handleOpenThread = props.handleOpenThread, handleRetry = props.handleRetry, isMyMessage = props.isMyMessage, isReactionEnabled = props.isReactionEnabled, message = props.message, onUserClick = props.onUserClick, onUserHover = props.onUserHover, reactionSelectorRef = props.reactionSelectorRef, showDetailedReactions = props.showDetailedReactions, threadList = props.threadList;
5133
- var _b = useComponentContext(), Attachment = _b.Attachment, _c = _b.Avatar, Avatar$1 = _c === void 0 ? Avatar : _c, _d = _b.EditMessageInput, EditMessageInput = _d === void 0 ? EditMessageForm : _d, _e = _b.MessageDeleted, MessageDeleted$1 = _e === void 0 ? MessageDeleted : _e, _f = _b.MessageOptions, MessageOptions$1 = _f === void 0 ? MessageOptions : _f, _g = _b.MessageRepliesCountButton, MessageRepliesCountButton$1 = _g === void 0 ? MessageRepliesCountButton : _g, _h = _b.MessageStatus, MessageStatus$1 = _h === void 0 ? MessageStatus : _h, _j = _b.MessageTimestamp, MessageTimestamp$1 = _j === void 0 ? MessageTimestamp : _j, _k = _b.ReactionSelector, ReactionSelector$1 = _k === void 0 ? ReactionSelector : _k, _l = _b.ReactionsList, ReactionsList$1 = _l === void 0 ? ReactionsList : _l;
5370
+ var _b = useComponentContext('MessageSimple'), Attachment = _b.Attachment, _c = _b.Avatar, Avatar$1 = _c === void 0 ? Avatar : _c, _d = _b.EditMessageInput, EditMessageInput = _d === void 0 ? EditMessageForm : _d, _e = _b.MessageDeleted, MessageDeleted$1 = _e === void 0 ? MessageDeleted : _e, _f = _b.MessageOptions, MessageOptions$1 = _f === void 0 ? MessageOptions : _f, _g = _b.MessageRepliesCountButton, MessageRepliesCountButton$1 = _g === void 0 ? MessageRepliesCountButton : _g, _h = _b.MessageStatus, MessageStatus$1 = _h === void 0 ? MessageStatus : _h, _j = _b.MessageTimestamp, MessageTimestamp$1 = _j === void 0 ? MessageTimestamp : _j, _k = _b.ReactionSelector, ReactionSelector$1 = _k === void 0 ? ReactionSelector : _k, _l = _b.ReactionsList, ReactionsList$1 = _l === void 0 ? ReactionsList : _l;
5134
5371
  var messageWrapperRef = React.useRef(null);
5135
5372
  var hasAttachment = messageHasAttachments(message);
5136
5373
  var hasReactions = messageHasReactions(message);
@@ -5170,16 +5407,23 @@ var MemoizedMessageSimple = React__default['default'].memo(MessageSimpleWithCont
5170
5407
  * The default UI component that renders a message and receives functionality and logic from the MessageContext.
5171
5408
  */
5172
5409
  var MessageSimple = function (props) {
5173
- var messageContext = useMessageContext();
5410
+ var messageContext = useMessageContext('MessageSimple');
5174
5411
  return React__default['default'].createElement(MemoizedMessageSimple, __assign({}, messageContext, props));
5175
5412
  };
5176
5413
 
5177
- var TypingContext = React__default['default'].createContext({});
5414
+ var TypingContext = React__default['default'].createContext(undefined);
5178
5415
  var TypingProvider = function (_a) {
5179
5416
  var children = _a.children, value = _a.value;
5180
5417
  return (React__default['default'].createElement(TypingContext.Provider, { value: value }, children));
5181
5418
  };
5182
- var useTypingContext = function () { return React.useContext(TypingContext); };
5419
+ var useTypingContext = function (componentName) {
5420
+ var contextValue = React.useContext(TypingContext);
5421
+ if (!contextValue) {
5422
+ console.warn("The useTypingContext hook was called outside of the TypingContext provider. Make sure this hook is called within a child of the Channel component. The errored call is located in the " + componentName + " component.");
5423
+ return {};
5424
+ }
5425
+ return contextValue;
5426
+ };
5183
5427
  /**
5184
5428
  * Typescript currently does not support partial inference, so if TypingContext
5185
5429
  * typing is desired while using the HOC withTypingContext, the Props for the
@@ -5200,39 +5444,39 @@ var compressed=true;var categories=[{id:"people",name:"Smileys & People",emojis:
5200
5444
 
5201
5445
  var UnMemoizedChannel = function (props) {
5202
5446
  var propsChannel = props.channel, _a = props.EmptyPlaceholder, EmptyPlaceholder = _a === void 0 ? null : _a;
5203
- var contextChannel = useChatContext().channel;
5447
+ var contextChannel = useChatContext('Channel').channel;
5204
5448
  var channel = propsChannel || contextChannel;
5205
5449
  if (!(channel === null || channel === void 0 ? void 0 : channel.cid))
5206
5450
  return EmptyPlaceholder;
5207
5451
  return React__default['default'].createElement(ChannelInner, __assign({}, props, { channel: channel, key: channel.cid }));
5208
5452
  };
5209
5453
  var ChannelInner = function (props) {
5210
- var acceptedFiles = props.acceptedFiles, activeUnreadHandler = props.activeUnreadHandler, channel = props.channel, children = props.children, doMarkReadRequest = props.doMarkReadRequest, doSendMessageRequest = props.doSendMessageRequest, doUpdateMessageRequest = props.doUpdateMessageRequest, _a = props.emojiData, emojiData = _a === void 0 ? defaultEmojiData : _a, _b = props.LoadingErrorIndicator, LoadingErrorIndicator$1 = _b === void 0 ? LoadingErrorIndicator : _b, _c = props.LoadingIndicator, LoadingIndicator$1 = _c === void 0 ? LoadingIndicator : _c, maxNumberOfFiles = props.maxNumberOfFiles, _d = props.multipleUploads, multipleUploads = _d === void 0 ? true : _d, onMentionsClick = props.onMentionsClick, onMentionsHover = props.onMentionsHover;
5211
- var _e = useChatContext(), client = _e.client, customClasses = _e.customClasses, mutes = _e.mutes, theme = _e.theme, useImageFlagEmojisOnWindows = _e.useImageFlagEmojisOnWindows;
5212
- var t = useTranslationContext().t;
5213
- var _f = React.useState([]), notifications = _f[0], setNotifications = _f[1];
5214
- var _g = React.useState(), quotedMessage = _g[0], setQuotedMessage = _g[1];
5454
+ var _a;
5455
+ var acceptedFiles = props.acceptedFiles, activeUnreadHandler = props.activeUnreadHandler, channel = props.channel, children = props.children, doMarkReadRequest = props.doMarkReadRequest, doSendMessageRequest = props.doSendMessageRequest, doUpdateMessageRequest = props.doUpdateMessageRequest, _b = props.emojiData, emojiData = _b === void 0 ? defaultEmojiData : _b, _c = props.LoadingErrorIndicator, LoadingErrorIndicator$1 = _c === void 0 ? LoadingErrorIndicator : _c, _d = props.LoadingIndicator, LoadingIndicator$1 = _d === void 0 ? LoadingIndicator : _d, maxNumberOfFiles = props.maxNumberOfFiles, _e = props.multipleUploads, multipleUploads = _e === void 0 ? true : _e, onMentionsClick = props.onMentionsClick, onMentionsHover = props.onMentionsHover, skipMessageDataMemoization = props.skipMessageDataMemoization;
5456
+ var _f = useChatContext('Channel'), client = _f.client, customClasses = _f.customClasses, mutes = _f.mutes, theme = _f.theme, useImageFlagEmojisOnWindows = _f.useImageFlagEmojisOnWindows;
5457
+ var t = useTranslationContext('Channel').t;
5458
+ var _g = React.useState(channel.getConfig()), channelConfig = _g[0], setChannelConfig = _g[1];
5459
+ var _h = React.useState([]), notifications = _h[0], setNotifications = _h[1];
5460
+ var _j = React.useState(), quotedMessage = _j[0], setQuotedMessage = _j[1];
5215
5461
  var notificationTimeouts = [];
5216
- var _h = React.useReducer(channelReducer, initialState), state = _h[0], dispatch = _h[1];
5462
+ var _k = React.useReducer(channelReducer, initialState), state = _k[0], dispatch = _k[1];
5217
5463
  var isMounted = useIsMounted();
5218
5464
  var originalTitle = React.useRef('');
5219
5465
  var lastRead = React.useRef(new Date());
5220
5466
  var online = React.useRef(true);
5221
- var channelConfig = channel.getConfig();
5467
+ var channelCapabilitiesArray = (_a = channel.data) === null || _a === void 0 ? void 0 : _a.own_capabilities;
5222
5468
  var emojiConfig = {
5223
5469
  commonEmoji: commonEmoji,
5224
5470
  defaultMinimalEmojis: defaultMinimalEmojis,
5225
5471
  emojiData: emojiData,
5226
5472
  emojiSetDef: emojiSetDef,
5227
5473
  };
5228
- var throttledCopyStateFromChannel = React.useCallback(throttle__default['default'](function () {
5229
- if (!channel)
5230
- return;
5231
- dispatch({ channel: channel, type: 'copyStateFromChannelOnEvent' });
5232
- }, 500, { leading: true, trailing: true }), [channel]);
5233
- var markRead = React.useCallback(function () {
5234
- var _a;
5235
- if (!channel || channel.disconnected || !((_a = channel.getConfig()) === null || _a === void 0 ? void 0 : _a.read_events)) {
5474
+ var throttledCopyStateFromChannel = throttle__default['default'](function () { return dispatch({ channel: channel, type: 'copyStateFromChannelOnEvent' }); }, 500, {
5475
+ leading: true,
5476
+ trailing: true,
5477
+ });
5478
+ var markRead = function () {
5479
+ if (channel.disconnected || !(channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.read_events)) {
5236
5480
  return;
5237
5481
  }
5238
5482
  lastRead.current = new Date();
@@ -5242,13 +5486,16 @@ var ChannelInner = function (props) {
5242
5486
  else {
5243
5487
  streamChat.logChatPromiseExecution(channel.markRead(), 'mark read');
5244
5488
  }
5245
- if (originalTitle.current) {
5489
+ if (activeUnreadHandler) {
5490
+ activeUnreadHandler(0, originalTitle.current);
5491
+ }
5492
+ else if (originalTitle.current) {
5246
5493
  document.title = originalTitle.current;
5247
5494
  }
5248
- }, [channel, doMarkReadRequest]);
5249
- var markReadThrottled = React.useCallback(throttle__default['default'](markRead, 500, { leading: true, trailing: true }), [markRead]);
5250
- var handleEvent = React.useCallback(function (event) {
5251
- var _a, _b, _c, _d, _e;
5495
+ };
5496
+ var markReadThrottled = throttle__default['default'](markRead, 500, { leading: true, trailing: true });
5497
+ var handleEvent = function (event) {
5498
+ var _a, _b, _c, _d;
5252
5499
  if (event.message) {
5253
5500
  dispatch({
5254
5501
  channel: channel,
@@ -5256,12 +5503,10 @@ var ChannelInner = function (props) {
5256
5503
  type: 'updateThreadOnEvent',
5257
5504
  });
5258
5505
  }
5259
- if (event.type === 'typing.start' || event.type === 'typing.stop') {
5260
- dispatch({
5261
- channel: channel,
5262
- type: 'setTyping',
5263
- });
5506
+ if (event.type === 'user.watching.start' || event.type === 'user.watching.stop')
5264
5507
  return;
5508
+ if (event.type === 'typing.start' || event.type === 'typing.stop') {
5509
+ return dispatch({ channel: channel, type: 'setTyping' });
5265
5510
  }
5266
5511
  if (event.type === 'connection.changed' && typeof event.online === 'boolean') {
5267
5512
  online.current = event.online;
@@ -5275,7 +5520,7 @@ var ChannelInner = function (props) {
5275
5520
  if (!document.hidden) {
5276
5521
  markReadThrottled();
5277
5522
  }
5278
- else if (((_e = channel.getConfig()) === null || _e === void 0 ? void 0 : _e.read_events) && !channel.muteStatus().muted) {
5523
+ else if ((channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.read_events) && !channel.muteStatus().muted) {
5279
5524
  var unread = channel.countUnread(lastRead.current);
5280
5525
  if (activeUnreadHandler) {
5281
5526
  activeUnreadHandler(unread, originalTitle.current);
@@ -5287,28 +5532,29 @@ var ChannelInner = function (props) {
5287
5532
  }
5288
5533
  }
5289
5534
  throttledCopyStateFromChannel();
5290
- }, [channel, client.userID, markReadThrottled, throttledCopyStateFromChannel]);
5535
+ };
5291
5536
  // useLayoutEffect here to prevent spinner. Use Suspense when it is available in stable release
5292
5537
  React.useLayoutEffect(function () {
5293
5538
  var errored = false;
5294
5539
  var done = false;
5295
5540
  var onVisibilityChange = function () {
5296
- if (!document.hidden) {
5541
+ if (!document.hidden)
5297
5542
  markRead();
5298
- }
5299
5543
  };
5300
5544
  (function () { return __awaiter(void 0, void 0, void 0, function () {
5301
- var e_1;
5545
+ var config, e_1;
5302
5546
  return __generator(this, function (_a) {
5303
5547
  switch (_a.label) {
5304
5548
  case 0:
5305
- if (!(channel && !channel.initialized)) return [3 /*break*/, 4];
5549
+ if (!!channel.initialized) return [3 /*break*/, 4];
5306
5550
  _a.label = 1;
5307
5551
  case 1:
5308
5552
  _a.trys.push([1, 3, , 4]);
5309
5553
  return [4 /*yield*/, channel.watch()];
5310
5554
  case 2:
5311
5555
  _a.sent();
5556
+ config = channel.getConfig();
5557
+ setChannelConfig(config);
5312
5558
  return [3 /*break*/, 4];
5313
5559
  case 3:
5314
5560
  e_1 = _a.sent();
@@ -5318,7 +5564,7 @@ var ChannelInner = function (props) {
5318
5564
  case 4:
5319
5565
  done = true;
5320
5566
  originalTitle.current = document.title;
5321
- if (channel && !errored) {
5567
+ if (!errored) {
5322
5568
  dispatch({ channel: channel, type: 'initStateFromChannel' });
5323
5569
  if (channel.countUnread() > 0)
5324
5570
  markRead();
@@ -5338,15 +5584,14 @@ var ChannelInner = function (props) {
5338
5584
  if (errored || !done)
5339
5585
  return;
5340
5586
  document.removeEventListener('visibilitychange', onVisibilityChange);
5341
- if (channel)
5342
- channel.off(handleEvent);
5587
+ channel === null || channel === void 0 ? void 0 : channel.off(handleEvent);
5343
5588
  client.off('connection.changed', handleEvent);
5344
5589
  client.off('connection.recovered', handleEvent);
5345
5590
  client.off('user.updated', handleEvent);
5346
5591
  client.off('user.deleted', handleEvent);
5347
5592
  notificationTimeouts.forEach(clearTimeout);
5348
5593
  };
5349
- }, [channel, client, handleEvent, markRead]);
5594
+ }, [channel.cid]);
5350
5595
  React.useEffect(function () {
5351
5596
  var _a;
5352
5597
  if (state.thread && ((_a = state.messages) === null || _a === void 0 ? void 0 : _a.length)) {
@@ -5373,17 +5618,15 @@ var ChannelInner = function (props) {
5373
5618
  }, 5000);
5374
5619
  notificationTimeouts.push(timeout);
5375
5620
  };
5376
- var loadMoreFinished = React.useCallback(debounce__default['default'](function (hasMore, messages) {
5621
+ var loadMoreFinished = debounce__default['default'](function (hasMore, messages) {
5377
5622
  if (!isMounted.current)
5378
5623
  return;
5379
5624
  dispatch({ hasMore: hasMore, messages: messages, type: 'loadMoreFinished' });
5380
5625
  }, 2000, {
5381
5626
  leading: true,
5382
5627
  trailing: true,
5383
- }), []);
5384
- var loadMore = React.useCallback(
5385
- // eslint-disable-next-line @typescript-eslint/no-inferrable-types
5386
- function (limit) {
5628
+ });
5629
+ var loadMore = function (limit) {
5387
5630
  if (limit === void 0) { limit = 100; }
5388
5631
  return __awaiter(void 0, void 0, void 0, function () {
5389
5632
  var oldestMessage, oldestID, perPage, queryResponse, e_2, hasMoreMessages;
@@ -5391,7 +5634,7 @@ var ChannelInner = function (props) {
5391
5634
  return __generator(this, function (_b) {
5392
5635
  switch (_b.label) {
5393
5636
  case 0:
5394
- if (!online.current || !window.navigator.onLine || !channel)
5637
+ if (!online.current || !window.navigator.onLine)
5395
5638
  return [2 /*return*/, 0];
5396
5639
  oldestMessage = (_a = state === null || state === void 0 ? void 0 : state.messages) === null || _a === void 0 ? void 0 : _a[0];
5397
5640
  if (state.loadingMore || (oldestMessage === null || oldestMessage === void 0 ? void 0 : oldestMessage.status) !== 'received')
@@ -5426,27 +5669,22 @@ var ChannelInner = function (props) {
5426
5669
  }
5427
5670
  });
5428
5671
  });
5429
- }, [channel, loadMoreFinished, online, state.loadingMore, state.messages]);
5430
- var updateMessage = React.useCallback(function (updatedMessage) {
5431
- if (!channel)
5432
- return;
5433
- // adds the message to the local channel state..
5434
- // this adds to both the main channel state as well as any reply threads
5672
+ };
5673
+ var updateMessage = function (updatedMessage) {
5674
+ // add the message to the local channel state
5435
5675
  channel.state.addMessageSorted(updatedMessage, true);
5436
5676
  dispatch({
5437
5677
  channel: channel,
5438
5678
  parentId: state.thread && updatedMessage.parent_id,
5439
5679
  type: 'copyMessagesFromChannel',
5440
5680
  });
5441
- }, [channel, state.thread]);
5681
+ };
5442
5682
  var isUserResponseArray = function (output) { var _a; return ((_a = output[0]) === null || _a === void 0 ? void 0 : _a.id) != null; };
5443
- var doSendMessage = React.useCallback(function (message, customMessageData) { return __awaiter(void 0, void 0, void 0, function () {
5683
+ var doSendMessage = function (message, customMessageData) { return __awaiter(void 0, void 0, void 0, function () {
5444
5684
  var attachments, id, _a, mentioned_users, parent_id, text, mentions, messageData, messageResponse, error_1, stringError, parsedError;
5445
5685
  return __generator(this, function (_b) {
5446
5686
  switch (_b.label) {
5447
5687
  case 0:
5448
- if (!channel)
5449
- return [2 /*return*/];
5450
5688
  attachments = message.attachments, id = message.id, _a = message.mentioned_users, mentioned_users = _a === void 0 ? [] : _a, parent_id = message.parent_id, text = message.text;
5451
5689
  mentions = isUserResponseArray(mentioned_users)
5452
5690
  ? mentioned_users.map(function (_a) {
@@ -5470,7 +5708,7 @@ var ChannelInner = function (props) {
5470
5708
  _b.label = 5;
5471
5709
  case 5:
5472
5710
  // replace it after send is completed
5473
- if (messageResponse && messageResponse.message) {
5711
+ if (messageResponse === null || messageResponse === void 0 ? void 0 : messageResponse.message) {
5474
5712
  updateMessage(__assign(__assign({}, messageResponse.message), { status: 'received' }));
5475
5713
  }
5476
5714
  if (quotedMessage)
@@ -5485,25 +5723,20 @@ var ChannelInner = function (props) {
5485
5723
  case 7: return [2 /*return*/];
5486
5724
  }
5487
5725
  });
5488
- }); }, [channel, doSendMessageRequest, quotedMessage, updateMessage]);
5489
- var createMessagePreview = React.useCallback(function (text, attachments, parent, mentioned_users) {
5490
- // create a preview of the message
5726
+ }); };
5727
+ var createMessagePreview = function (text, attachments, parent, mentioned_users) {
5491
5728
  var clientSideID = client.userID + "-" + uuid.v4();
5492
5729
  return __assign({ __html: text, attachments: attachments, created_at: new Date(), html: text, id: clientSideID, mentioned_users: mentioned_users, reactions: [], status: 'sending', text: text, type: 'regular', user: client.user }, ((parent === null || parent === void 0 ? void 0 : parent.id) ? { parent_id: parent.id } : null));
5493
- }, [client.user, client.userID]);
5494
- var sendMessage = React.useCallback(function (_a, customMessageData) {
5730
+ };
5731
+ var sendMessage = function (_a, customMessageData) {
5495
5732
  var _b = _a.attachments, attachments = _b === void 0 ? [] : _b, _c = _a.mentioned_users, mentioned_users = _c === void 0 ? [] : _c, _d = _a.parent, parent = _d === void 0 ? undefined : _d, _e = _a.text, text = _e === void 0 ? '' : _e;
5496
5733
  return __awaiter(void 0, void 0, void 0, function () {
5497
5734
  var messagePreview;
5498
5735
  return __generator(this, function (_f) {
5499
5736
  switch (_f.label) {
5500
5737
  case 0:
5501
- if (!channel)
5502
- return [2 /*return*/];
5503
- // remove error messages upon submit
5504
5738
  channel.state.filterErrorMessages();
5505
5739
  messagePreview = createMessagePreview(text, attachments, parent, mentioned_users);
5506
- // first we add the message to the UI
5507
5740
  updateMessage(messagePreview);
5508
5741
  return [4 /*yield*/, doSendMessage(messagePreview, customMessageData)];
5509
5742
  case 1:
@@ -5512,62 +5745,55 @@ var ChannelInner = function (props) {
5512
5745
  }
5513
5746
  });
5514
5747
  });
5515
- }, [channel === null || channel === void 0 ? void 0 : channel.state, createMessagePreview, doSendMessage, updateMessage]);
5516
- var retrySendMessage = React.useCallback(function (message) { return __awaiter(void 0, void 0, void 0, function () {
5748
+ };
5749
+ var retrySendMessage = function (message) { return __awaiter(void 0, void 0, void 0, function () {
5517
5750
  return __generator(this, function (_a) {
5518
5751
  switch (_a.label) {
5519
5752
  case 0:
5520
- // set the message status to sending
5521
5753
  updateMessage(__assign(__assign({}, message), { errorStatusCode: undefined, status: 'sending' }));
5522
- // actually try to send the message...
5523
5754
  return [4 /*yield*/, doSendMessage(message)];
5524
5755
  case 1:
5525
- // actually try to send the message...
5526
5756
  _a.sent();
5527
5757
  return [2 /*return*/];
5528
5758
  }
5529
5759
  });
5530
- }); }, [doSendMessage, updateMessage]);
5531
- var removeMessage = React.useCallback(function (message) {
5532
- if (!channel)
5533
- return;
5760
+ }); };
5761
+ var removeMessage = function (message) {
5534
5762
  channel.state.removeMessage(message);
5535
5763
  dispatch({
5536
5764
  channel: channel,
5537
5765
  parentId: state.thread && message.parent_id,
5538
5766
  type: 'copyMessagesFromChannel',
5539
5767
  });
5540
- }, [channel, state.thread]);
5768
+ };
5541
5769
  /** THREAD */
5542
- var openThread = React.useCallback(function (message, event) {
5543
- if (!channel)
5544
- return;
5545
- if (event && event.preventDefault) {
5546
- event.preventDefault();
5547
- }
5770
+ var openThread = function (message, event) {
5771
+ event.preventDefault();
5548
5772
  dispatch({ channel: channel, message: message, type: 'openThread' });
5549
- }, [channel]);
5550
- var loadMoreThreadFinished = React.useCallback(debounce__default['default'](function (threadHasMore, threadMessages) {
5773
+ };
5774
+ var closeThread = function (event) {
5775
+ event.preventDefault();
5776
+ dispatch({ type: 'closeThread' });
5777
+ };
5778
+ var loadMoreThreadFinished = debounce__default['default'](function (threadHasMore, threadMessages) {
5551
5779
  dispatch({
5552
5780
  threadHasMore: threadHasMore,
5553
5781
  threadMessages: threadMessages,
5554
5782
  type: 'loadMoreThreadFinished',
5555
5783
  });
5556
- }, 2000, { leading: true, trailing: true }), []);
5557
- var loadMoreThread = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
5784
+ }, 2000, { leading: true, trailing: true });
5785
+ var loadMoreThread = function () { return __awaiter(void 0, void 0, void 0, function () {
5558
5786
  var parentID, oldMessages, oldestMessageID, limit, queryResponse, threadHasMoreMessages, newThreadMessages;
5559
5787
  var _a;
5560
5788
  return __generator(this, function (_b) {
5561
5789
  switch (_b.label) {
5562
5790
  case 0:
5563
- // prevent duplicate loading events...
5564
- if (!channel || state.threadLoadingMore || !state.thread)
5791
+ if (state.threadLoadingMore || !state.thread)
5565
5792
  return [2 /*return*/];
5566
5793
  dispatch({ type: 'startLoadingThread' });
5567
5794
  parentID = state.thread.id;
5568
5795
  if (!parentID) {
5569
- dispatch({ type: 'closeThread' });
5570
- return [2 /*return*/];
5796
+ return [2 /*return*/, dispatch({ type: 'closeThread' })];
5571
5797
  }
5572
5798
  oldMessages = channel.state.threads[parentID] || [];
5573
5799
  oldestMessageID = (_a = oldMessages[0]) === null || _a === void 0 ? void 0 : _a.id;
@@ -5583,7 +5809,7 @@ var ChannelInner = function (props) {
5583
5809
  queryResponse = _b.sent();
5584
5810
  threadHasMoreMessages = queryResponse.messages.length === limit;
5585
5811
  newThreadMessages = channel.state.threads[parentID] || [];
5586
- // next set loadingMore to false so we can start asking for more data...
5812
+ // next set loadingMore to false so we can start asking for more data
5587
5813
  loadMoreThreadFinished(threadHasMoreMessages, newThreadMessages);
5588
5814
  return [3 /*break*/, 4];
5589
5815
  case 3:
@@ -5593,18 +5819,12 @@ var ChannelInner = function (props) {
5593
5819
  case 4: return [2 /*return*/];
5594
5820
  }
5595
5821
  });
5596
- }); }, [channel, loadMoreThreadFinished, state.thread, state.threadLoadingMore]);
5597
- var closeThread = React.useCallback(function (event) {
5598
- if (event && event.preventDefault) {
5599
- event.preventDefault();
5600
- }
5601
- dispatch({ type: 'closeThread' });
5602
- }, []);
5822
+ }); };
5603
5823
  var onMentionsHoverOrClick = useMentionsHandlers(onMentionsHover, onMentionsClick);
5604
5824
  var editMessage = useEditMessageHandler(doUpdateMessageRequest);
5605
5825
  var typing = state.typing, restState = __rest(state, ["typing"]);
5606
- var channelStateContextValue = __assign(__assign({}, restState), { acceptedFiles: acceptedFiles, channel: channel, channelConfig: channelConfig, maxNumberOfFiles: maxNumberOfFiles, multipleUploads: multipleUploads, mutes: mutes, notifications: notifications, quotedMessage: quotedMessage, watcher_count: state.watcherCount });
5607
- var channelActionContextValue = {
5826
+ var channelStateContextValue = useCreateChannelStateContext(__assign(__assign({}, restState), { acceptedFiles: acceptedFiles, channel: channel, channelCapabilitiesArray: channelCapabilitiesArray, channelConfig: channelConfig, maxNumberOfFiles: maxNumberOfFiles, multipleUploads: multipleUploads, mutes: mutes, notifications: notifications, quotedMessage: quotedMessage, watcher_count: state.watcherCount }));
5827
+ var channelActionContextValue = React.useMemo(function () { return ({
5608
5828
  addNotification: addNotification,
5609
5829
  closeThread: closeThread,
5610
5830
  dispatch: dispatch,
@@ -5618,8 +5838,9 @@ var ChannelInner = function (props) {
5618
5838
  retrySendMessage: retrySendMessage,
5619
5839
  sendMessage: sendMessage,
5620
5840
  setQuotedMessage: setQuotedMessage,
5841
+ skipMessageDataMemoization: skipMessageDataMemoization,
5621
5842
  updateMessage: updateMessage,
5622
- };
5843
+ }); }, [channel.cid, loadMore, quotedMessage]);
5623
5844
  var componentContextValue = React.useMemo(function () { return ({
5624
5845
  Attachment: props.Attachment || Attachment,
5625
5846
  AutocompleteSuggestionHeader: props.AutocompleteSuggestionHeader,
@@ -5663,10 +5884,11 @@ var ChannelInner = function (props) {
5663
5884
  EmojiIndex: props.EmojiIndex,
5664
5885
  EmojiPicker: props.EmojiPicker,
5665
5886
  }); }, []);
5666
- var typingContextValue = {
5887
+ var typingContextValue = useCreateTypingContext({
5667
5888
  typing: typing,
5668
- };
5889
+ });
5669
5890
  var chatClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.chat) || 'str-chat';
5891
+ var chatContainerClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.chatContainer) || 'str-chat__container';
5670
5892
  var channelClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.channel) || 'str-chat-channel';
5671
5893
  var windowsEmojiClass = useImageFlagEmojisOnWindows && navigator.userAgent.match(/Win/)
5672
5894
  ? 'str-chat--windows-flags'
@@ -5679,7 +5901,7 @@ var ChannelInner = function (props) {
5679
5901
  return (React__default['default'].createElement("div", { className: chatClass + " " + channelClass + " " + theme },
5680
5902
  React__default['default'].createElement(LoadingIndicator$1, { size: 25 })));
5681
5903
  }
5682
- if (!(channel === null || channel === void 0 ? void 0 : channel.watch)) {
5904
+ if (!channel.watch) {
5683
5905
  return (React__default['default'].createElement("div", { className: chatClass + " " + channelClass + " " + theme },
5684
5906
  React__default['default'].createElement("div", null, t('Channel Missing'))));
5685
5907
  }
@@ -5689,7 +5911,7 @@ var ChannelInner = function (props) {
5689
5911
  React__default['default'].createElement(ComponentProvider, { value: componentContextValue },
5690
5912
  React__default['default'].createElement(EmojiProvider, { value: emojiContextValue },
5691
5913
  React__default['default'].createElement(TypingProvider, { value: typingContextValue },
5692
- React__default['default'].createElement("div", { className: 'str-chat__container' }, children))))))));
5914
+ React__default['default'].createElement("div", { className: "" + chatContainerClass }, children))))))));
5693
5915
  };
5694
5916
  /**
5695
5917
  * A wrapper component that provides channel data and renders children.
@@ -5704,9 +5926,9 @@ var Channel = React__default['default'].memo(UnMemoizedChannel);
5704
5926
 
5705
5927
  var UnMemoizedChannelHeader = function (props) {
5706
5928
  var _a = props.Avatar, Avatar$1 = _a === void 0 ? Avatar : _a, propImage = props.image, live = props.live, title = props.title;
5707
- var _b = useChannelStateContext(), channel = _b.channel, watcher_count = _b.watcher_count;
5708
- var openMobileNav = useChatContext().openMobileNav;
5709
- var t = useTranslationContext().t;
5929
+ var _b = useChannelStateContext('ChannelHeader'), channel = _b.channel, watcher_count = _b.watcher_count;
5930
+ var openMobileNav = useChatContext('ChannelHeader').openMobileNav;
5931
+ var t = useTranslationContext('ChannelHeader').t;
5710
5932
  var _c = (channel === null || channel === void 0 ? void 0 : channel.data) || {}, channelImage = _c.image, member_count = _c.member_count, name = _c.name, subtitle = _c.subtitle;
5711
5933
  var image = propImage || channelImage;
5712
5934
  return (React__default['default'].createElement("div", { className: 'str-chat__header-livestream' },
@@ -5739,7 +5961,7 @@ var img = "data:image/svg+xml,%3c%3fxml version='1.0' encoding='UTF-8'%3f%3e%3cs
5739
5961
 
5740
5962
  var UnMemoizedChatDown = function (props) {
5741
5963
  var image = props.image, text = props.text, _a = props.type, type = _a === void 0 ? 'Error' : _a;
5742
- var t = useTranslationContext().t;
5964
+ var t = useTranslationContext('ChatDown').t;
5743
5965
  return (React__default['default'].createElement("div", { className: 'str-chat__down' },
5744
5966
  React__default['default'].createElement(LoadingChannels, null),
5745
5967
  React__default['default'].createElement("div", { className: 'str-chat__down-main' },
@@ -5768,7 +5990,7 @@ var ChannelListMessenger = function (props) {
5768
5990
  };
5769
5991
 
5770
5992
  var useChannelDeletedListener = function (setChannels, customHandler) {
5771
- var client = useChatContext().client;
5993
+ var client = useChatContext('useChannelDeletedListener').client;
5772
5994
  React.useEffect(function () {
5773
5995
  var handleEvent = function (event) {
5774
5996
  if (customHandler && typeof customHandler === 'function') {
@@ -5793,7 +6015,7 @@ var useChannelDeletedListener = function (setChannels, customHandler) {
5793
6015
  };
5794
6016
 
5795
6017
  var useChannelHiddenListener = function (setChannels, customHandler) {
5796
- var client = useChatContext().client;
6018
+ var client = useChatContext('useChannelHiddenListener').client;
5797
6019
  React.useEffect(function () {
5798
6020
  var handleEvent = function (event) {
5799
6021
  if (customHandler && typeof customHandler === 'function') {
@@ -5818,7 +6040,7 @@ var useChannelHiddenListener = function (setChannels, customHandler) {
5818
6040
  };
5819
6041
 
5820
6042
  var useChannelTruncatedListener = function (setChannels, customHandler, forceUpdate) {
5821
- var client = useChatContext().client;
6043
+ var client = useChatContext('useChannelTruncatedListener').client;
5822
6044
  React.useEffect(function () {
5823
6045
  var handleEvent = function (event) {
5824
6046
  setChannels(function (channels) { return __spreadArray([], channels); });
@@ -5837,7 +6059,7 @@ var useChannelTruncatedListener = function (setChannels, customHandler, forceUpd
5837
6059
  };
5838
6060
 
5839
6061
  var useChannelUpdatedListener = function (setChannels, customHandler, forceUpdate) {
5840
- var client = useChatContext().client;
6062
+ var client = useChatContext('useChannelUpdatedListener').client;
5841
6063
  React.useEffect(function () {
5842
6064
  var handleEvent = function (event) {
5843
6065
  setChannels(function (channels) {
@@ -5889,7 +6111,7 @@ var moveChannelUp = function (_a) {
5889
6111
  };
5890
6112
 
5891
6113
  var useChannelVisibleListener = function (setChannels, customHandler) {
5892
- var client = useChatContext().client;
6114
+ var client = useChatContext('useChannelVisibleListener').client;
5893
6115
  React.useEffect(function () {
5894
6116
  var handleEvent = function (event) { return __awaiter(void 0, void 0, void 0, function () {
5895
6117
  var channel_1;
@@ -5918,7 +6140,7 @@ var useChannelVisibleListener = function (setChannels, customHandler) {
5918
6140
  };
5919
6141
 
5920
6142
  var useConnectionRecoveredListener = function (forceUpdate) {
5921
- var client = useChatContext().client;
6143
+ var client = useChatContext('useConnectionRecoveredListener').client;
5922
6144
  React.useEffect(function () {
5923
6145
  var handleEvent = function () {
5924
6146
  if (forceUpdate) {
@@ -5935,7 +6157,7 @@ var useConnectionRecoveredListener = function (forceUpdate) {
5935
6157
  var useMessageNewListener = function (setChannels, lockChannelOrder, allowNewMessagesFromUnfilteredChannels) {
5936
6158
  if (lockChannelOrder === void 0) { lockChannelOrder = false; }
5937
6159
  if (allowNewMessagesFromUnfilteredChannels === void 0) { allowNewMessagesFromUnfilteredChannels = true; }
5938
- var client = useChatContext().client;
6160
+ var client = useChatContext('useMessageNewListener').client;
5939
6161
  React.useEffect(function () {
5940
6162
  var handleEvent = function (event) {
5941
6163
  setChannels(function (channels) {
@@ -5975,7 +6197,7 @@ var useMobileNavigation = function (channelListRef, navOpen, closeMobileNav) {
5975
6197
 
5976
6198
  var useNotificationAddedToChannelListener = function (setChannels, customHandler, allowNewMessagesFromUnfilteredChannels) {
5977
6199
  if (allowNewMessagesFromUnfilteredChannels === void 0) { allowNewMessagesFromUnfilteredChannels = true; }
5978
- var client = useChatContext().client;
6200
+ var client = useChatContext('useNotificationAddedToChannelListener').client;
5979
6201
  React.useEffect(function () {
5980
6202
  var handleEvent = function (event) { return __awaiter(void 0, void 0, void 0, function () {
5981
6203
  var channel_1;
@@ -6004,9 +6226,9 @@ var useNotificationAddedToChannelListener = function (setChannels, customHandler
6004
6226
  }, [customHandler]);
6005
6227
  };
6006
6228
 
6007
- var useNotificationMessageNewListener = function (setChannels, customHandler, setOffset, allowNewMessagesFromUnfilteredChannels) {
6229
+ var useNotificationMessageNewListener = function (setChannels, customHandler, allowNewMessagesFromUnfilteredChannels) {
6008
6230
  if (allowNewMessagesFromUnfilteredChannels === void 0) { allowNewMessagesFromUnfilteredChannels = true; }
6009
- var client = useChatContext().client;
6231
+ var client = useChatContext('useNotificationMessageNewListener').client;
6010
6232
  React.useEffect(function () {
6011
6233
  var handleEvent = function (event) { return __awaiter(void 0, void 0, void 0, function () {
6012
6234
  var channel_1;
@@ -6024,9 +6246,7 @@ var useNotificationMessageNewListener = function (setChannels, customHandler, se
6024
6246
  channel_1 = _b.sent();
6025
6247
  setChannels(function (channels) { return uniqBy__default['default'](__spreadArray([channel_1], channels), 'cid'); });
6026
6248
  _b.label = 3;
6027
- case 3:
6028
- setOffset === null || setOffset === void 0 ? void 0 : setOffset(function (prevOffset) { return prevOffset + 1; });
6029
- return [2 /*return*/];
6249
+ case 3: return [2 /*return*/];
6030
6250
  }
6031
6251
  });
6032
6252
  }); };
@@ -6038,7 +6258,7 @@ var useNotificationMessageNewListener = function (setChannels, customHandler, se
6038
6258
  };
6039
6259
 
6040
6260
  var useNotificationRemovedFromChannelListener = function (setChannels, customHandler) {
6041
- var client = useChatContext().client;
6261
+ var client = useChatContext('useNotificationRemovedFromChannelListener').client;
6042
6262
  React.useEffect(function () {
6043
6263
  var handleEvent = function (event) {
6044
6264
  if (customHandler && typeof customHandler === 'function') {
@@ -6060,12 +6280,11 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
6060
6280
  var _b = React.useState(false), error = _b[0], setError = _b[1];
6061
6281
  var _c = React.useState(true), hasNextPage = _c[0], setHasNextPage = _c[1];
6062
6282
  var _d = React.useState(true), loadingChannels = _d[0], setLoadingChannels = _d[1];
6063
- var _e = React.useState(0), offset = _e[0], setOffset = _e[1];
6064
- var _f = React.useState(true), refreshing = _f[0], setRefreshing = _f[1];
6283
+ var _e = React.useState(true), refreshing = _e[0], setRefreshing = _e[1];
6065
6284
  var filterString = React.useMemo(function () { return JSON.stringify(filters); }, [filters]);
6066
6285
  var sortString = React.useMemo(function () { return JSON.stringify(sort); }, [sort]);
6067
6286
  var queryChannels = function (queryType) { return __awaiter(void 0, void 0, void 0, function () {
6068
- var newOptions, channelQueryResponse, newChannels, err_1;
6287
+ var offset, newOptions, channelQueryResponse, newChannels, err_1;
6069
6288
  var _a;
6070
6289
  return __generator(this, function (_b) {
6071
6290
  switch (_b.label) {
@@ -6075,27 +6294,21 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
6075
6294
  setLoadingChannels(true);
6076
6295
  }
6077
6296
  setRefreshing(true);
6078
- newOptions = __assign({ limit: (_a = options === null || options === void 0 ? void 0 : options.limit) !== null && _a !== void 0 ? _a : MAX_QUERY_CHANNELS_LIMIT, offset: queryType === 'reload' ? 0 : offset }, options);
6297
+ offset = queryType === 'reload' ? 0 : channels.length;
6298
+ newOptions = __assign({ limit: (_a = options === null || options === void 0 ? void 0 : options.limit) !== null && _a !== void 0 ? _a : MAX_QUERY_CHANNELS_LIMIT, offset: offset }, options);
6079
6299
  _b.label = 1;
6080
6300
  case 1:
6081
6301
  _b.trys.push([1, 3, , 4]);
6082
6302
  return [4 /*yield*/, client.queryChannels(filters, sort || {}, newOptions)];
6083
6303
  case 2:
6084
6304
  channelQueryResponse = _b.sent();
6085
- newChannels = void 0;
6086
- if (queryType === 'reload') {
6087
- newChannels = channelQueryResponse;
6088
- }
6089
- else {
6090
- newChannels = __spreadArray(__spreadArray([], channels), channelQueryResponse);
6091
- }
6305
+ newChannels = queryType === 'reload' ? channelQueryResponse : __spreadArray(__spreadArray([], channels), channelQueryResponse);
6092
6306
  setChannels(newChannels);
6093
6307
  setHasNextPage(channelQueryResponse.length >= newOptions.limit);
6094
- // Set active channel only after first page.
6095
- if (offset === 0 && activeChannelHandler) {
6308
+ // Set active channel only on load of first page
6309
+ if (!offset && activeChannelHandler) {
6096
6310
  activeChannelHandler(newChannels, setChannels);
6097
6311
  }
6098
- setOffset(newChannels.length);
6099
6312
  return [3 /*break*/, 4];
6100
6313
  case 3:
6101
6314
  err_1 = _b.sent();
@@ -6120,7 +6333,6 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
6120
6333
  hasNextPage: hasNextPage,
6121
6334
  loadNextPage: loadNextPage,
6122
6335
  setChannels: setChannels,
6123
- setOffset: setOffset,
6124
6336
  status: {
6125
6337
  error: error,
6126
6338
  loadingChannels: loadingChannels,
@@ -6130,7 +6342,7 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
6130
6342
  };
6131
6343
 
6132
6344
  var useUserPresenceChangedListener = function (setChannels) {
6133
- var client = useChatContext().client;
6345
+ var client = useChatContext('useUserPresenceChangedListener').client;
6134
6346
  React.useEffect(function () {
6135
6347
  var handleEvent = function (event) {
6136
6348
  setChannels(function (channels) {
@@ -6183,7 +6395,7 @@ var UnMemoizedChannelPreviewMessenger = function (props) {
6183
6395
  var ChannelPreviewMessenger = React__default['default'].memo(UnMemoizedChannelPreviewMessenger);
6184
6396
 
6185
6397
  var useIsChannelMuted = function (channel) {
6186
- var client = useChatContext().client;
6398
+ var client = useChatContext('useIsChannelMuted').client;
6187
6399
  var _a = React.useState(channel.muteStatus()), muted = _a[0], setMuted = _a[1];
6188
6400
  React.useEffect(function () {
6189
6401
  var handleEvent = function () { return setMuted(channel.muteStatus()); };
@@ -6245,8 +6457,8 @@ var getDisplayImage = function (channel, currentUser) {
6245
6457
 
6246
6458
  var ChannelPreview = function (props) {
6247
6459
  var channel = props.channel, _a = props.Preview, Preview = _a === void 0 ? ChannelPreviewMessenger : _a;
6248
- var _b = useChatContext(), activeChannel = _b.channel, client = _b.client, setActiveChannel = _b.setActiveChannel;
6249
- var _c = useTranslationContext(), t = _c.t, userLanguage = _c.userLanguage;
6460
+ var _b = useChatContext('ChannelPreview'), activeChannel = _b.channel, client = _b.client, setActiveChannel = _b.setActiveChannel;
6461
+ var _c = useTranslationContext('ChannelPreview'), t = _c.t, userLanguage = _c.userLanguage;
6250
6462
  var _d = React.useState(channel.state.messages[channel.state.messages.length - 1]), lastMessage = _d[0], setLastMessage = _d[1];
6251
6463
  var _e = React.useState(0), unread = _e[0], setUnread = _e[1];
6252
6464
  var isActive = (activeChannel === null || activeChannel === void 0 ? void 0 : activeChannel.cid) === channel.cid;
@@ -6299,7 +6511,7 @@ var ChannelPreview = function (props) {
6299
6511
 
6300
6512
  var SearchInput = function (props) {
6301
6513
  var channelSearchParams = props.channelSearchParams, inputRef = props.inputRef, onSearch = props.onSearch, query = props.query, searchFunction = props.searchFunction;
6302
- var t = useTranslationContext().t;
6514
+ var t = useTranslationContext('SearchInput').t;
6303
6515
  return (React__default['default'].createElement("input", { className: 'str-chat__channel-search-input', onChange: function (event) {
6304
6516
  return searchFunction ? searchFunction(channelSearchParams, event) : onSearch(event);
6305
6517
  }, placeholder: t('Search'), ref: inputRef, type: 'text', value: query }));
@@ -6331,7 +6543,7 @@ var DefaultSearchResultItem = function (props) {
6331
6543
  };
6332
6544
  var SearchResults = function (props) {
6333
6545
  var _a = props.DropdownContainer, DropdownContainer = _a === void 0 ? DefaultDropdownContainer : _a, popupResults = props.popupResults, results = props.results, searching = props.searching, SearchEmpty = props.SearchEmpty, SearchResultsHeader = props.SearchResultsHeader, SearchLoading = props.SearchLoading, _b = props.SearchResultItem, SearchResultItem = _b === void 0 ? DefaultSearchResultItem : _b, selectResult = props.selectResult;
6334
- var t = useTranslationContext().t;
6546
+ var t = useTranslationContext('SearchResults').t;
6335
6547
  var _c = React.useState(), focusedUser = _c[0], setFocusedUser = _c[1];
6336
6548
  var device = useBreakpoint().device;
6337
6549
  var containerStyle = popupResults && device === 'full' ? 'popup' : 'inline';
@@ -6379,7 +6591,7 @@ var SearchResults = function (props) {
6379
6591
 
6380
6592
  var UnMemoizedChannelSearch = function (props) {
6381
6593
  var _a = props.channelType, channelType = _a === void 0 ? 'messaging' : _a, DropdownContainer = props.DropdownContainer, onSelectResult = props.onSelectResult, _b = props.popupResults, popupResults = _b === void 0 ? false : _b, SearchEmpty = props.SearchEmpty, _c = props.searchForChannels, searchForChannels = _c === void 0 ? false : _c, searchFunction = props.searchFunction, _d = props.SearchInput, SearchInput$1 = _d === void 0 ? SearchInput : _d, SearchLoading = props.SearchLoading, searchQueryParams = props.searchQueryParams, SearchResultItem = props.SearchResultItem, SearchResultsHeader = props.SearchResultsHeader;
6382
- var _e = useChatContext(), client = _e.client, setActiveChannel = _e.setActiveChannel;
6594
+ var _e = useChatContext('ChannelSearch'), client = _e.client, setActiveChannel = _e.setActiveChannel;
6383
6595
  var _f = React.useState(''), query = _f[0], setQuery = _f[1];
6384
6596
  var _g = React.useState([]), results = _g[0], setResults = _g[1];
6385
6597
  var _h = React.useState(false), resultsOpen = _h[0], setResultsOpen = _h[1];
@@ -6493,7 +6705,7 @@ var ChannelSearch = React__default['default'].memo(UnMemoizedChannelSearch);
6493
6705
 
6494
6706
  var UnMemoizedEmptyStateIndicator = function (props) {
6495
6707
  var listType = props.listType;
6496
- var t = useTranslationContext().t;
6708
+ var t = useTranslationContext('EmptyStateIndicator').t;
6497
6709
  if (listType === 'channel')
6498
6710
  return React__default['default'].createElement("p", null, t('You have no channels currently'));
6499
6711
  if (listType === 'message')
@@ -6523,7 +6735,7 @@ var DEFAULT_OPTIONS = {};
6523
6735
  var DEFAULT_SORT = {};
6524
6736
  var UnMemoizedChannelList = function (props) {
6525
6737
  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, _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;
6526
- var _o = useChatContext(), channel = _o.channel, 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;
6738
+ var _o = useChatContext('ChannelList'), channel = _o.channel, 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;
6527
6739
  var channelListRef = React.useRef(null);
6528
6740
  var _q = React.useState(0), channelUpdateCount = _q[0], setChannelUpdateCount = _q[1];
6529
6741
  /**
@@ -6570,11 +6782,11 @@ var UnMemoizedChannelList = function (props) {
6570
6782
  * force a re-render. Incrementing this dummy variable ensures the channel previews update.
6571
6783
  */
6572
6784
  var forceUpdate = function () { return setChannelUpdateCount(function (count) { return count + 1; }); };
6573
- var _r = usePaginatedChannels(client, filters || DEFAULT_FILTERS, sort || DEFAULT_SORT, options || DEFAULT_OPTIONS, activeChannelHandler), channels = _r.channels, hasNextPage = _r.hasNextPage, loadNextPage = _r.loadNextPage, setChannels = _r.setChannels, setOffset = _r.setOffset, status = _r.status;
6785
+ var _r = usePaginatedChannels(client, filters || DEFAULT_FILTERS, sort || DEFAULT_SORT, options || DEFAULT_OPTIONS, activeChannelHandler), channels = _r.channels, hasNextPage = _r.hasNextPage, loadNextPage = _r.loadNextPage, setChannels = _r.setChannels, status = _r.status;
6574
6786
  var loadedChannels = channelRenderFilterFn ? channelRenderFilterFn(channels) : channels;
6575
6787
  useMobileNavigation(channelListRef, navOpen, closeMobileNav);
6576
6788
  useMessageNewListener(setChannels, lockChannelOrder, allowNewMessagesFromUnfilteredChannels);
6577
- useNotificationMessageNewListener(setChannels, onMessageNew, setOffset, allowNewMessagesFromUnfilteredChannels);
6789
+ useNotificationMessageNewListener(setChannels, onMessageNew, allowNewMessagesFromUnfilteredChannels);
6578
6790
  useNotificationAddedToChannelListener(setChannels, onAddedToChannel, allowNewMessagesFromUnfilteredChannels);
6579
6791
  useNotificationRemovedFromChannelListener(setChannels, onRemovedFromChannel);
6580
6792
  useChannelDeletedListener(setChannels, onChannelDeleted);
@@ -6629,7 +6841,7 @@ var UnMemoizedChannelList = function (props) {
6629
6841
  */
6630
6842
  var ChannelList = React__default['default'].memo(UnMemoizedChannelList);
6631
6843
 
6632
- var Cancel$b="Stornieren";var Close$b="Schließen";var Delete$b="Löschen";var Delivered$b="Geliefert";var Flag$b="Flagge";var Mute$b="Stumm";var New$b="Neu";var Pin$b="Stift";var Reply$b="Antworten";var Search$b="Suche";var Send$b="Senden";var Thread$c="Faden";var Unmute$b="Stummschaltung aufheben";var Unpin$b="Lösen Sie den Stift";var live$b="wohnen";var deTranslations = {"1 reply":"1 Antwort","Attach files":"Dateien anhängen",Cancel:Cancel$b,"Channel Missing":"Kanal fehlt",Close:Close$b,"Close emoji picker":"Emoji-Picker schließen","Commands matching":"Übereinstimmende Befehle","Connection failure, reconnecting now...":"Verbindungsfehler, jetzt wieder verbinden...",Delete:Delete$b,Delivered:Delivered$b,"Edit Message":"Nachricht bearbeiten","Edit message request failed":"Anfrage zum Bearbeiten der Nachricht fehlgeschlagen","Emoji matching":"Emoji passend","Empty message...":"Leere Nachricht...","Error adding flag":"Fehler beim Hinzufügen des Flags","Error connecting to chat, refresh the page to try again.":"Fehler beim Herstellen einer Verbindung zum Chat. Aktualisieren Sie die Seite, um es erneut zu versuchen.","Error deleting message":"Fehler beim Löschen der Nachricht","Error muting a user ...":"Fehler beim Stummschalten eines Benutzers...","Error pinning message":"Fehler beim Fixieren der Nachricht","Error removing message pin":"Fehler beim Entfernen des Nachrichten-Pins","Error unmuting a user ...":"Fehler beim Stummschalten eines Benutzers...","Error uploading file":"Fehler beim Hochladen der Datei","Error uploading image":"Fehler beim hochladen des Bildes","Error · Unsent":"Fehler nicht gesendet","Error: {{ errorMessage }}":"Fehler: {{ errorMessage }}",Flag:Flag$b,"Message Failed · Click to try again":"Nachricht fehlgeschlagen · Klicken Sie hier, um es erneut zu versuchen","Message Failed · Unauthorized":"Nachricht fehlgeschlagen · Nicht autorisiert","Message deleted":"Nachricht gelöscht","Message has been successfully flagged":"Nachricht wurde erfolgreich markiert","Message pinned":"Nachricht angeheftet",Mute:Mute$b,New:New$b,"New Messages!":"Neue Nachrichten!","No results found":"keine Ergebnisse gefunden","Nothing yet...":"Noch nichts...","Only visible to you":"Nur für Sie sichtbar","Open emoji picker":"Öffnen Sie den Emoji-Picker","People matching":"Passende Personen","Pick your emoji":"Wähle dein Emoji",Pin:Pin$b,"Pinned by":"Gepinnt von",Reply:Reply$b,"Reply to Message":"Auf Nachricht antworten",Search:Search$b,"Searching...":"Suchen...",Send:Send$b,"Send message request failed":"Nachrichtenanfrage senden fehlgeschlagen","Sending...":"Senden...","Slow Mode ON":"Langsamer Modus EIN","Start of a new thread":"Start eines neuen Faden","This message was deleted...":"Diese Nachricht wurde gelöscht...",Thread:Thread$c,"Type your message":"Geben Sie Ihre Nachricht ein",Unmute:Unmute$b,Unpin:Unpin$b,"Wait until all attachments have uploaded":"Warten Sie, bis alle Anhänge hochgeladen wurden","You have no channels currently":"Sie haben derzeit keine Kanäle","You've reached the maximum number of files":"Sie haben die maximale Anzahl von Dateien erreicht",live:live$b,"this content could not be displayed":"Dieser Inhalt konnte nicht angezeigt werden","{{ commaSeparatedUsers }} and {{ moreCount }} more":"{{ commaSeparatedUsers }} und {{moreCount}} Mehr","{{ commaSeparatedUsers }}, and {{ lastUser }}":"{{ commaSeparatedUsers }} und {{ lastUser }}","{{ firstUser }} and {{ secondUser }}":"{{ firstUser }} und {{ secondUser }}","{{ imageCount }} more":"{{ imageCount }} Mehr","{{ memberCount }} members":"{{ memberCount }} Mitglieder","{{ replyCount }} replies":"{{ replyCount }} antwortet","{{ user }} has been muted":"{{ user }} wurde stummgeschaltet","{{ user }} has been unmuted":"{{ user }} wurde nicht stummgeschaltet","{{ watcherCount }} online":"{{ watcherCount }} online","🏙 Attachment...":"🏙 Anhang..."};
6844
+ var Cancel$b="Stornieren";var Close$b="Schließen";var Delete$b="Löschen";var Delivered$b="Geliefert";var Flag$b="Flagge";var Mute$b="Stumm";var New$b="Neu";var Pin$b="Stift";var Reply$b="Antworten";var Search$b="Suche";var Send$b="Senden";var Thread$c="Thread";var Unmute$b="Stummschaltung aufheben";var Unpin$b="Lösen Sie den Stift";var live$b="live";var deTranslations = {"1 reply":"1 Antwort","Attach files":"Dateien anhängen",Cancel:Cancel$b,"Channel Missing":"Kanal fehlt",Close:Close$b,"Close emoji picker":"Emoji-Picker schließen","Commands matching":"Übereinstimmende Befehle","Connection failure, reconnecting now...":"Verbindungsfehler, jetzt wieder verbinden...",Delete:Delete$b,Delivered:Delivered$b,"Edit Message":"Nachricht bearbeiten","Edit message request failed":"Anfrage zum Bearbeiten der Nachricht fehlgeschlagen","Emoji matching":"Emoji passend","Empty message...":"Leere Nachricht...","Error adding flag":"Fehler beim Hinzufügen des Flags","Error connecting to chat, refresh the page to try again.":"Fehler beim Herstellen einer Verbindung zum Chat. Aktualisieren Sie die Seite, um es erneut zu versuchen.","Error deleting message":"Fehler beim Löschen der Nachricht","Error muting a user ...":"Fehler beim Stummschalten eines Benutzers...","Error pinning message":"Fehler beim Fixieren der Nachricht","Error removing message pin":"Fehler beim Entfernen des Nachrichten-Pins","Error unmuting a user ...":"Fehler beim Stummschalten eines Benutzers...","Error uploading file":"Fehler beim Hochladen der Datei","Error uploading image":"Fehler beim hochladen des Bildes","Error · Unsent":"Fehler nicht gesendet","Error: {{ errorMessage }}":"Fehler: {{ errorMessage }}",Flag:Flag$b,"Message Failed · Click to try again":"Nachricht fehlgeschlagen · Klicken Sie hier, um es erneut zu versuchen","Message Failed · Unauthorized":"Nachricht fehlgeschlagen · Nicht autorisiert","Message deleted":"Nachricht gelöscht","Message has been successfully flagged":"Nachricht wurde erfolgreich markiert","Message pinned":"Nachricht angeheftet",Mute:Mute$b,New:New$b,"New Messages!":"Neue Nachrichten!","No results found":"keine Ergebnisse gefunden","Nothing yet...":"Noch nichts...","Only visible to you":"Nur für Sie sichtbar","Open emoji picker":"Öffnen Sie den Emoji-Picker","People matching":"Passende Personen","Pick your emoji":"Wähle dein Emoji",Pin:Pin$b,"Pinned by":"Gepinnt von",Reply:Reply$b,"Reply to Message":"Auf Nachricht antworten",Search:Search$b,"Searching...":"Suchen...",Send:Send$b,"Send message request failed":"Nachrichtenanfrage senden fehlgeschlagen","Sending...":"Senden...","Slow Mode ON":"Langsamer Modus EIN","Start of a new thread":"Start eines neuen Threads","This message was deleted...":"Diese Nachricht wurde gelöscht...",Thread:Thread$c,"Type your message":"Geben Sie Ihre Nachricht ein",Unmute:Unmute$b,Unpin:Unpin$b,"Wait until all attachments have uploaded":"Warten Sie, bis alle Anhänge hochgeladen wurden","You have no channels currently":"Sie haben derzeit keine Kanäle","You've reached the maximum number of files":"Sie haben die maximale Anzahl von Dateien erreicht",live:live$b,"this content could not be displayed":"Dieser Inhalt konnte nicht angezeigt werden","{{ commaSeparatedUsers }} and {{ moreCount }} more":"{{ commaSeparatedUsers }} und {{moreCount}} Mehr","{{ commaSeparatedUsers }}, and {{ lastUser }}":"{{ commaSeparatedUsers }} und {{ lastUser }}","{{ firstUser }} and {{ secondUser }}":"{{ firstUser }} und {{ secondUser }}","{{ imageCount }} more":"{{ imageCount }} Mehr","{{ memberCount }} members":"{{ memberCount }} Mitglieder","{{ replyCount }} replies":"{{ replyCount }} antworten","{{ user }} has been muted":"{{ user }} wurde stummgeschaltet","{{ user }} has been unmuted":"{{ user }} wurde nicht stummgeschaltet","{{ watcherCount }} online":"{{ watcherCount }} online","🏙 Attachment...":"🏙 Anhang..."};
6633
6845
 
6634
6846
  var Cancel$a="Cancel";var Close$a="Close";var Delete$a="Delete";var Delivered$a="Delivered";var Flag$a="Flag";var Mute$a="Mute";var New$a="New";var Pin$a="Pin";var Reply$a="Reply";var Search$a="Search";var Send$a="Send";var Thread$b="Thread";var Unmute$a="Unmute";var Unpin$a="Unpin";var live$a="live";var enTranslations = {"1 reply":"1 reply","Attach files":"Attach files",Cancel:Cancel$a,"Channel Missing":"Channel Missing",Close:Close$a,"Close emoji picker":"Close emoji picker","Commands matching":"Commands matching","Connection failure, reconnecting now...":"Connection failure, reconnecting now...",Delete:Delete$a,Delivered:Delivered$a,"Edit Message":"Edit Message","Edit message request failed":"Edit message request failed","Emoji matching":"Emoji matching","Empty message...":"Empty message...","Error adding flag":"Error adding flag","Error connecting to chat, refresh the page to try again.":"Error connecting to chat, refresh the page to try again.","Error deleting message":"Error deleting message","Error muting a user ...":"Error muting a user ...","Error pinning message":"Error pinning message","Error removing message pin":"Error removing message pin","Error unmuting a user ...":"Error unmuting a user ...","Error uploading file":"Error uploading file","Error uploading image":"Error uploading image","Error · Unsent":"Error · Unsent","Error: {{ errorMessage }}":"Error: {{ errorMessage }}",Flag:Flag$a,"Message Failed · Click to try again":"Message Failed · Click to try again","Message Failed · Unauthorized":"Message Failed · Unauthorized","Message deleted":"Message deleted","Message has been successfully flagged":"Message has been successfully flagged","Message pinned":"Message pinned",Mute:Mute$a,New:New$a,"New Messages!":"New Messages!","No results found":"No results found","Nothing yet...":"Nothing yet...","Only visible to you":"Only visible to you","Open emoji picker":"Open emoji picker","People matching":"People matching","Pick your emoji":"Pick your emoji",Pin:Pin$a,"Pinned by":"Pinned by",Reply:Reply$a,"Reply to Message":"Reply to Message",Search:Search$a,"Searching...":"Searching...",Send:Send$a,"Send message request failed":"Send message request failed","Sending...":"Sending...","Slow Mode ON":"Slow Mode ON","Start of a new thread":"Start of a new thread","This message was deleted...":"This message was deleted...",Thread:Thread$b,"Type your message":"Type your message",Unmute:Unmute$a,Unpin:Unpin$a,"Wait until all attachments have uploaded":"Wait until all attachments have uploaded","You have no channels currently":"You have no channels currently","You've reached the maximum number of files":"You've reached the maximum number of files",live:live$a,"this content could not be displayed":"this content could not be displayed","{{ commaSeparatedUsers }} and {{ moreCount }} more":"{{ commaSeparatedUsers }} and {{ moreCount }} more","{{ commaSeparatedUsers }}, and {{ lastUser }}":"{{ commaSeparatedUsers }}, and {{ lastUser }}","{{ firstUser }} and {{ secondUser }}":"{{ firstUser }} and {{ secondUser }}","{{ imageCount }} more":"{{ imageCount }} more","{{ memberCount }} members":"{{ memberCount }} members","{{ replyCount }} replies":"{{ replyCount }} replies","{{ user }} has been muted":"{{ user }} has been muted","{{ user }} has been unmuted":"{{ user }} has been unmuted","{{ watcherCount }} online":"{{ watcherCount }} online","🏙 Attachment...":"🏙 Attachment..."};
6635
6847
 
@@ -6659,9 +6871,9 @@ Dayjs__default['default'].extend(updateLocale__default['default']);
6659
6871
  Dayjs__default['default'].updateLocale('de', {
6660
6872
  calendar: {
6661
6873
  lastDay: '[gestern um] LT',
6662
- lastWeek: '[vergangenheit] dddd [beim] LT',
6874
+ lastWeek: '[letzten] dddd [bei] LT',
6663
6875
  nextDay: '[morgen zu] LT',
6664
- nextWeek: 'dddd [beim] LT',
6876
+ nextWeek: 'dddd [bei] LT',
6665
6877
  sameDay: '[heute um] LT',
6666
6878
  sameElse: 'L',
6667
6879
  },
@@ -7252,7 +7464,7 @@ var Streami18n = /** @class */ (function () {
7252
7464
  return Streami18n;
7253
7465
  }());
7254
7466
 
7255
- var version = '6.8.0';
7467
+ var version = '6.11.0';
7256
7468
 
7257
7469
  var useChat = function (_a) {
7258
7470
  var _b;
@@ -7265,7 +7477,7 @@ var useChat = function (_a) {
7265
7477
  var _e = React.useState(), channel = _e[0], setChannel = _e[1];
7266
7478
  var _f = React.useState([]), mutes = _f[0], setMutes = _f[1];
7267
7479
  var _g = React.useState(initialNavOpen), navOpen = _g[0], setNavOpen = _g[1];
7268
- var clientMutes = (_b = client === null || client === void 0 ? void 0 : client.user) === null || _b === void 0 ? void 0 : _b.mutes;
7480
+ var clientMutes = (_b = client.user) === null || _b === void 0 ? void 0 : _b.mutes;
7269
7481
  var closeMobileNav = function () { return setNavOpen(false); };
7270
7482
  var openMobileNav = function () { return setTimeout(function () { return setNavOpen(true); }, 100); };
7271
7483
  React.useEffect(function () {
@@ -7335,6 +7547,27 @@ var useChat = function (_a) {
7335
7547
  };
7336
7548
  };
7337
7549
 
7550
+ var useCreateChatContext = function (value) {
7551
+ var _a;
7552
+ var channel = value.channel, client = value.client, closeMobileNav = value.closeMobileNav, customClasses = value.customClasses, mutes = value.mutes, navOpen = value.navOpen, openMobileNav = value.openMobileNav, setActiveChannel = value.setActiveChannel, theme = value.theme, useImageFlagEmojisOnWindows = value.useImageFlagEmojisOnWindows;
7553
+ var channelCid = channel === null || channel === void 0 ? void 0 : channel.cid;
7554
+ var clientValues = "" + client.clientID + Object.keys(client.activeChannels).length + Object.keys(client.listeners).length + client.mutedChannels.length + "\n " + ((_a = client.user) === null || _a === void 0 ? void 0 : _a.id);
7555
+ var mutedUsersLength = mutes.length;
7556
+ var chatContext = React.useMemo(function () { return ({
7557
+ channel: channel,
7558
+ client: client,
7559
+ closeMobileNav: closeMobileNav,
7560
+ customClasses: customClasses,
7561
+ mutes: mutes,
7562
+ navOpen: navOpen,
7563
+ openMobileNav: openMobileNav,
7564
+ setActiveChannel: setActiveChannel,
7565
+ theme: theme,
7566
+ useImageFlagEmojisOnWindows: useImageFlagEmojisOnWindows,
7567
+ }); }, [channelCid, clientValues, mutedUsersLength, navOpen]);
7568
+ return chatContext;
7569
+ };
7570
+
7338
7571
  var darkModeTheme = {
7339
7572
  '--bg-gradient-end': '#101214',
7340
7573
  '--bg-gradient-start': '#070a0d',
@@ -7373,26 +7606,27 @@ var Chat = function (props) {
7373
7606
  var children = props.children, client = props.client, customClasses = props.customClasses, customStyles = props.customStyles, _a = props.darkMode, darkMode = _a === void 0 ? false : _a, defaultLanguage = props.defaultLanguage, i18nInstance = props.i18nInstance, _b = props.initialNavOpen, initialNavOpen = _b === void 0 ? true : _b, _c = props.theme, theme = _c === void 0 ? 'messaging light' : _c, _d = props.useImageFlagEmojisOnWindows, useImageFlagEmojisOnWindows = _d === void 0 ? false : _d;
7374
7607
  var _e = useChat({ client: client, defaultLanguage: defaultLanguage, i18nInstance: i18nInstance, initialNavOpen: initialNavOpen }), channel = _e.channel, closeMobileNav = _e.closeMobileNav, mutes = _e.mutes, navOpen = _e.navOpen, openMobileNav = _e.openMobileNav, setActiveChannel = _e.setActiveChannel, translators = _e.translators;
7375
7608
  useCustomStyles(darkMode ? darkModeTheme : customStyles);
7609
+ var chatContextValue = useCreateChatContext({
7610
+ channel: channel,
7611
+ client: client,
7612
+ closeMobileNav: closeMobileNav,
7613
+ customClasses: customClasses,
7614
+ mutes: mutes,
7615
+ navOpen: navOpen,
7616
+ openMobileNav: openMobileNav,
7617
+ setActiveChannel: setActiveChannel,
7618
+ theme: theme,
7619
+ useImageFlagEmojisOnWindows: useImageFlagEmojisOnWindows,
7620
+ });
7376
7621
  if (!translators.t)
7377
7622
  return null;
7378
- return (React__default['default'].createElement(ChatProvider, { value: {
7379
- channel: channel,
7380
- client: client,
7381
- closeMobileNav: closeMobileNav,
7382
- customClasses: customClasses,
7383
- mutes: mutes,
7384
- navOpen: navOpen,
7385
- openMobileNav: openMobileNav,
7386
- setActiveChannel: setActiveChannel,
7387
- theme: theme,
7388
- useImageFlagEmojisOnWindows: useImageFlagEmojisOnWindows,
7389
- } },
7623
+ return (React__default['default'].createElement(ChatProvider, { value: chatContextValue },
7390
7624
  React__default['default'].createElement(TranslationProvider, { value: translators }, children)));
7391
7625
  };
7392
7626
 
7393
7627
  var UnMemoizedDateSeparator = function (props) {
7394
7628
  var date = props.date, formatDate = props.formatDate, _a = props.position, position = _a === void 0 ? 'right' : _a, unread = props.unread;
7395
- var _b = useTranslationContext(), t = _b.t, tDateTimeParser = _b.tDateTimeParser;
7629
+ var _b = useTranslationContext('DateSeparator'), t = _b.t, tDateTimeParser = _b.tDateTimeParser;
7396
7630
  if (typeof date === 'string')
7397
7631
  return null;
7398
7632
  var parsedDate = tDateTimeParser(date.toISOString());
@@ -7417,7 +7651,7 @@ var DateSeparator = React__default['default'].memo(UnMemoizedDateSeparator);
7417
7651
  var UnMemoizedEventComponent = function (props) {
7418
7652
  var _a, _b, _c;
7419
7653
  var _d = props.Avatar, Avatar$1 = _d === void 0 ? Avatar : _d, message = props.message;
7420
- var tDateTimeParser = useTranslationContext().tDateTimeParser;
7654
+ var tDateTimeParser = useTranslationContext('EventComponent').tDateTimeParser;
7421
7655
  var _e = message.created_at, created_at = _e === void 0 ? '' : _e, event = message.event, text = message.text, type = message.type;
7422
7656
  var dateFormatter = function (date, format) {
7423
7657
  var parsedDate = tDateTimeParser(date);
@@ -7572,10 +7806,10 @@ var getUserColor = function (theme, userId) {
7572
7806
  var UnMemoizedFixedHeightMessage = function (props) {
7573
7807
  var _a, _b, _c, _d;
7574
7808
  var propGroupedByUser = props.groupedByUser, propMessage = props.message;
7575
- var theme = useChatContext().theme;
7576
- var _e = useMessageContext(), contextGroupedByUser = _e.groupedByUser, contextMessage = _e.message;
7577
- var _f = useComponentContext().MessageDeleted, MessageDeleted$1 = _f === void 0 ? MessageDeleted : _f;
7578
- var userLanguage = useTranslationContext().userLanguage;
7809
+ var theme = useChatContext('FixedHeightMessage').theme;
7810
+ var _e = useMessageContext('FixedHeightMessage'), contextGroupedByUser = _e.groupedByUser, contextMessage = _e.message;
7811
+ var _f = useComponentContext('FixedHeightMessage').MessageDeleted, MessageDeleted$1 = _f === void 0 ? MessageDeleted : _f;
7812
+ var userLanguage = useTranslationContext('FixedHeightMessage').userLanguage;
7579
7813
  var groupedByUser = propGroupedByUser !== undefined ? propGroupedByUser : contextGroupedByUser;
7580
7814
  var message = propMessage || contextMessage;
7581
7815
  var handleAction = useActionHandler(message);
@@ -7619,7 +7853,7 @@ var FixedHeightMessage = React__default['default'].memo(UnMemoizedFixedHeightMes
7619
7853
 
7620
7854
  var MessageWithContext = function (props) {
7621
7855
  var canPin = props.canPin, groupedByUser = props.groupedByUser, propMessage = props.Message, message = props.message, _a = props.messageActions, messageActions = _a === void 0 ? Object.keys(MESSAGE_ACTIONS) : _a, propOnUserClick = props.onUserClick, propOnUserHover = props.onUserHover, userRoles = props.userRoles;
7622
- var contextMessage = useComponentContext().Message;
7856
+ var contextMessage = useComponentContext('Message').Message;
7623
7857
  var actionsEnabled = message.type === 'regular' && message.status === 'received';
7624
7858
  var MessageUIComponent = propMessage || contextMessage;
7625
7859
  var _b = useEditHandler(), clearEdit = _b.clearEdit, editing = _b.editing, setEdit = _b.setEdit;
@@ -7629,9 +7863,6 @@ var MessageWithContext = function (props) {
7629
7863
  }), onUserClick = _c.onUserClick, onUserHover = _c.onUserHover;
7630
7864
  var canDelete = userRoles.canDelete, canEdit = userRoles.canEdit, canFlag = userRoles.canFlag, canMute = userRoles.canMute, canQuote = userRoles.canQuote, canReact = userRoles.canReact, canReply = userRoles.canReply, isMyMessage = userRoles.isMyMessage;
7631
7865
  var messageActionsHandler = React.useCallback(function () {
7632
- if (!message || !messageActions) {
7633
- return [];
7634
- }
7635
7866
  return getMessageActions(messageActions, {
7636
7867
  canDelete: canDelete,
7637
7868
  canEdit: canEdit,
@@ -7661,8 +7892,8 @@ var MemoizedMessage = React__default['default'].memo(MessageWithContext, areMess
7661
7892
  */
7662
7893
  var Message = function (props) {
7663
7894
  var closeReactionSelectorOnClick = props.closeReactionSelectorOnClick, disableQuotedMessages = props.disableQuotedMessages, getDeleteMessageErrorNotification = props.getDeleteMessageErrorNotification, getFlagMessageErrorNotification = props.getFlagMessageErrorNotification, getFlagMessageSuccessNotification = props.getFlagMessageSuccessNotification, getMuteUserErrorNotification = props.getMuteUserErrorNotification, getMuteUserSuccessNotification = props.getMuteUserSuccessNotification, getPinMessageErrorNotification = props.getPinMessageErrorNotification, message = props.message, _a = props.onlySenderCanEdit, onlySenderCanEdit = _a === void 0 ? false : _a, propOnMentionsClick = props.onMentionsClick, propOnMentionsHover = props.onMentionsHover, propOpenThread = props.openThread, pinPermissions = props.pinPermissions, propRetrySendMessage = props.retrySendMessage;
7664
- var addNotification = useChannelActionContext().addNotification;
7665
- var mutes = useChannelStateContext().mutes;
7895
+ var addNotification = useChannelActionContext('Message').addNotification;
7896
+ var mutes = useChannelStateContext('Message').mutes;
7666
7897
  var reactionSelectorRef = React.useRef(null);
7667
7898
  var handleAction = useActionHandler(message);
7668
7899
  var handleOpenThread = useOpenThreadHandler(message, propOpenThread);
@@ -7698,7 +7929,7 @@ var Message = function (props) {
7698
7929
  var MessageCommerceWithContext = function (props) {
7699
7930
  var _a, _b, _c, _d, _e, _f;
7700
7931
  var groupStyles = props.groupStyles, handleAction = props.handleAction, handleOpenThread = props.handleOpenThread, isMyMessage = props.isMyMessage, isReactionEnabled = props.isReactionEnabled, message = props.message, onUserClick = props.onUserClick, onUserHover = props.onUserHover, reactionSelectorRef = props.reactionSelectorRef, showDetailedReactions = props.showDetailedReactions, threadList = props.threadList;
7701
- var _g = useComponentContext(), Attachment = _g.Attachment, _h = _g.Avatar, Avatar$1 = _h === void 0 ? Avatar : _h, _j = _g.MessageDeleted, MessageDeleted$1 = _j === void 0 ? MessageDeleted : _j, _k = _g.MessageRepliesCountButton, MessageRepliesCountButton$1 = _k === void 0 ? MessageRepliesCountButton : _k, _l = _g.MessageOptions, MessageOptions$1 = _l === void 0 ? MessageOptions : _l, _m = _g.MessageTimestamp, MessageTimestamp$1 = _m === void 0 ? MessageTimestamp : _m, _o = _g.ReactionSelector, ReactionSelector$1 = _o === void 0 ? ReactionSelector : _o, _p = _g.ReactionsList, ReactionsList$1 = _p === void 0 ? ReactionsList : _p;
7932
+ var _g = useComponentContext('MessageCommerce'), Attachment = _g.Attachment, _h = _g.Avatar, Avatar$1 = _h === void 0 ? Avatar : _h, _j = _g.MessageDeleted, MessageDeleted$1 = _j === void 0 ? MessageDeleted : _j, _k = _g.MessageRepliesCountButton, MessageRepliesCountButton$1 = _k === void 0 ? MessageRepliesCountButton : _k, _l = _g.MessageOptions, MessageOptions$1 = _l === void 0 ? MessageOptions : _l, _m = _g.MessageTimestamp, MessageTimestamp$1 = _m === void 0 ? MessageTimestamp : _m, _o = _g.ReactionSelector, ReactionSelector$1 = _o === void 0 ? ReactionSelector : _o, _p = _g.ReactionsList, ReactionsList$1 = _p === void 0 ? ReactionsList : _p;
7702
7933
  var hasAttachment = messageHasAttachments(message);
7703
7934
  var hasReactions = messageHasReactions(message);
7704
7935
  var firstGroupStyle = groupStyles ? groupStyles[0] : 'single';
@@ -7732,16 +7963,15 @@ var MemoizedMessageCommerce = React__default['default'].memo(MessageCommerceWith
7732
7963
  * UI component that renders a message and receives functionality from the Message/MessageList components
7733
7964
  */
7734
7965
  var MessageCommerce = function (props) {
7735
- var messageContext = useMessageContext();
7966
+ var messageContext = useMessageContext('MessageCommerce');
7736
7967
  return React__default['default'].createElement(MemoizedMessageCommerce, __assign({}, messageContext, props));
7737
7968
  };
7738
7969
 
7739
7970
  var MessageLivestreamWithContext = function (props) {
7740
7971
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
7741
7972
  var clearEditingState = props.clearEditingState, editing = props.editing, groupStyles = props.groupStyles, handleAction = props.handleAction, handleOpenThread = props.handleOpenThread, handleRetry = props.handleRetry, initialMessage = props.initialMessage, isReactionEnabled = props.isReactionEnabled, message = props.message, messageWrapperRef = props.messageWrapperRef, onMentionsClickMessage = props.onMentionsClickMessage, onMentionsHoverMessage = props.onMentionsHoverMessage, onReactionListClick = props.onReactionListClick, onUserClick = props.onUserClick, onUserHover = props.onUserHover, reactionSelectorRef = props.reactionSelectorRef, _l = props.renderText, renderText$1 = _l === void 0 ? renderText : _l, showDetailedReactions = props.showDetailedReactions, unsafeHTML = props.unsafeHTML;
7742
- var _m = useComponentContext().QuotedMessage, QuotedMessage$1 = _m === void 0 ? QuotedMessage : _m;
7743
- var _o = useComponentContext(), Attachment = _o.Attachment, _p = _o.Avatar, Avatar$1 = _p === void 0 ? Avatar : _p, _q = _o.EditMessageInput, EditMessageInput = _q === void 0 ? EditMessageForm : _q, _r = _o.MessageDeleted, MessageDeleted$1 = _r === void 0 ? MessageDeleted : _r, _s = _o.MessageRepliesCountButton, MessageRepliesCountButton$1 = _s === void 0 ? MessageRepliesCountButton : _s, _t = _o.PinIndicator, PinIndicator$1 = _t === void 0 ? PinIndicator : _t, _u = _o.ReactionsList, ReactionsList = _u === void 0 ? SimpleReactionsList : _u, _v = _o.ReactionSelector, ReactionSelector$1 = _v === void 0 ? ReactionSelector : _v;
7744
- var _w = useTranslationContext(), t = _w.t, userLanguage = _w.userLanguage;
7973
+ var _m = useComponentContext('MessageLivestream'), Attachment = _m.Attachment, _o = _m.Avatar, Avatar$1 = _o === void 0 ? Avatar : _o, _p = _m.EditMessageInput, EditMessageInput = _p === void 0 ? EditMessageForm : _p, _q = _m.MessageDeleted, MessageDeleted$1 = _q === void 0 ? MessageDeleted : _q, _r = _m.MessageRepliesCountButton, MessageRepliesCountButton$1 = _r === void 0 ? MessageRepliesCountButton : _r, _s = _m.PinIndicator, PinIndicator$1 = _s === void 0 ? PinIndicator : _s, _t = _m.QuotedMessage, QuotedMessage$1 = _t === void 0 ? QuotedMessage : _t, _u = _m.ReactionsList, ReactionsList = _u === void 0 ? SimpleReactionsList : _u, _v = _m.ReactionSelector, ReactionSelector$1 = _v === void 0 ? ReactionSelector : _v;
7974
+ var _w = useTranslationContext('MessageLivestream'), t = _w.t, userLanguage = _w.userLanguage;
7745
7975
  var messageTextToRender = ((_a = message.i18n) === null || _a === void 0 ? void 0 : _a[userLanguage + "_text"]) || message.text;
7746
7976
  var messageText = React.useMemo(function () { return renderText$1(messageTextToRender, message.mentioned_users); }, [
7747
7977
  message.mentioned_users,
@@ -7804,8 +8034,8 @@ var MessageLivestreamWithContext = function (props) {
7804
8034
  };
7805
8035
  var MessageLivestreamActions = function (props) {
7806
8036
  var messageWrapperRef = props.messageWrapperRef, onReactionListClick = props.onReactionListClick;
7807
- var _a = useComponentContext().MessageTimestamp, MessageTimestamp$1 = _a === void 0 ? MessageTimestamp : _a;
7808
- var _b = useMessageContext(), getMessageActions = _b.getMessageActions, handleOpenThread = _b.handleOpenThread, initialMessage = _b.initialMessage, message = _b.message, threadList = _b.threadList;
8037
+ var _a = useComponentContext('MessageLivestream').MessageTimestamp, MessageTimestamp$1 = _a === void 0 ? MessageTimestamp : _a;
8038
+ var _b = useMessageContext('MessageLivestream'), getMessageActions = _b.getMessageActions, handleOpenThread = _b.handleOpenThread, initialMessage = _b.initialMessage, message = _b.message, threadList = _b.threadList;
7809
8039
  var _c = React.useState(false), actionsBoxOpen = _c[0], setActionsBoxOpen = _c[1];
7810
8040
  var hideOptions = React.useCallback(function () { return setActionsBoxOpen(false); }, []);
7811
8041
  var messageDeletedAt = !!message.deleted_at;
@@ -7866,7 +8096,7 @@ var MemoizedMessageLivestream = React__default['default'].memo(MessageLivestream
7866
8096
  * Implements the look and feel for a livestream use case.
7867
8097
  */
7868
8098
  var MessageLivestream = function (props) {
7869
- var messageContext = useMessageContext();
8099
+ var messageContext = useMessageContext('MessageLivestream');
7870
8100
  var messageWrapperRef = React.useRef(null);
7871
8101
  var reactionSelectorRef = React.useRef(null);
7872
8102
  var message = props.message || messageContext.message;
@@ -7877,8 +8107,8 @@ var MessageLivestream = function (props) {
7877
8107
  var MessageTeamWithContext = function (props) {
7878
8108
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
7879
8109
  var clearEditingState = props.clearEditingState, editing = props.editing, getMessageActions = props.getMessageActions, groupStyles = props.groupStyles, handleAction = props.handleAction, handleOpenThread = props.handleOpenThread, handleRetry = props.handleRetry, initialMessage = props.initialMessage, isReactionEnabled = props.isReactionEnabled, message = props.message, messageWrapperRef = props.messageWrapperRef, onMentionsClickMessage = props.onMentionsClickMessage, onMentionsHoverMessage = props.onMentionsHoverMessage, onReactionListClick = props.onReactionListClick, onUserClick = props.onUserClick, onUserHover = props.onUserHover, reactionSelectorRef = props.reactionSelectorRef, _o = props.renderText, renderText$1 = _o === void 0 ? renderText : _o, showDetailedReactions = props.showDetailedReactions, threadList = props.threadList, unsafeHTML = props.unsafeHTML;
7880
- var _p = useComponentContext(), Attachment = _p.Attachment, _q = _p.Avatar, Avatar$1 = _q === void 0 ? Avatar : _q, _r = _p.EditMessageInput, EditMessageInput = _r === void 0 ? EditMessageForm : _r, _s = _p.MessageDeleted, MessageDeleted$1 = _s === void 0 ? MessageDeleted : _s, _t = _p.MessageRepliesCountButton, MessageRepliesCountButton$1 = _t === void 0 ? MessageRepliesCountButton : _t, _u = _p.MessageTimestamp, MessageTimestamp$1 = _u === void 0 ? MessageTimestamp : _u, _v = _p.PinIndicator, PinIndicator$1 = _v === void 0 ? PinIndicator : _v, _w = _p.QuotedMessage, QuotedMessage$1 = _w === void 0 ? QuotedMessage : _w, _x = _p.ReactionsList, ReactionsList = _x === void 0 ? SimpleReactionsList : _x, _y = _p.ReactionSelector, ReactionSelector$1 = _y === void 0 ? ReactionSelector : _y;
7881
- var _z = useTranslationContext(), t = _z.t, userLanguage = _z.userLanguage;
8110
+ var _p = useComponentContext('MessageTeam'), Attachment = _p.Attachment, _q = _p.Avatar, Avatar$1 = _q === void 0 ? Avatar : _q, _r = _p.EditMessageInput, EditMessageInput = _r === void 0 ? EditMessageForm : _r, _s = _p.MessageDeleted, MessageDeleted$1 = _s === void 0 ? MessageDeleted : _s, _t = _p.MessageRepliesCountButton, MessageRepliesCountButton$1 = _t === void 0 ? MessageRepliesCountButton : _t, _u = _p.MessageTimestamp, MessageTimestamp$1 = _u === void 0 ? MessageTimestamp : _u, _v = _p.PinIndicator, PinIndicator$1 = _v === void 0 ? PinIndicator : _v, _w = _p.QuotedMessage, QuotedMessage$1 = _w === void 0 ? QuotedMessage : _w, _x = _p.ReactionsList, ReactionsList = _x === void 0 ? SimpleReactionsList : _x, _y = _p.ReactionSelector, ReactionSelector$1 = _y === void 0 ? ReactionSelector : _y;
8111
+ var _z = useTranslationContext('MessageTeam'), t = _z.t, userLanguage = _z.userLanguage;
7882
8112
  var messageActions = getMessageActions();
7883
8113
  var showActionsBox = showMessageActionsBox(messageActions);
7884
8114
  var shouldShowReplies = messageActions.indexOf(MESSAGE_ACTIONS.reply) > -1 && !threadList;
@@ -7948,7 +8178,7 @@ var MemoizedMessageTeam = React__default['default'].memo(MessageTeamWithContext,
7948
8178
  * Implements the look and feel for a team style collaboration environment.
7949
8179
  */
7950
8180
  var MessageTeam = function (props) {
7951
- var messageContext = useMessageContext();
8181
+ var messageContext = useMessageContext('MessageTeam');
7952
8182
  var reactionSelectorRef = React.useRef(null);
7953
8183
  var messageWrapperRef = React.useRef(null);
7954
8184
  var message = props.message || messageContext.message;
@@ -7965,8 +8195,8 @@ var UnMemoizedCustomNotification = function (props) {
7965
8195
  var CustomNotification = React__default['default'].memo(UnMemoizedCustomNotification);
7966
8196
 
7967
8197
  var UnMemoizedConnectionStatus = function () {
7968
- var client = useChatContext().client;
7969
- var t = useTranslationContext().t;
8198
+ var client = useChatContext('ConnectionStatus').client;
8199
+ var t = useTranslationContext('ConnectionStatus').t;
7970
8200
  var _a = React.useState(true), online = _a[0], setOnline = _a[1];
7971
8201
  React.useEffect(function () {
7972
8202
  var connectionChanged = function (_a) {
@@ -8187,8 +8417,8 @@ var getGroupStyles = function (message, previousMessage, nextMessage, noGroupByU
8187
8417
 
8188
8418
  var useEnrichedMessages = function (args) {
8189
8419
  var channel = args.channel, disableDateSeparator = args.disableDateSeparator, headerPosition = args.headerPosition, hideDeletedMessages = args.hideDeletedMessages, hideNewMessageSeparator = args.hideNewMessageSeparator, messages = args.messages, noGroupByUser = args.noGroupByUser, threadList = args.threadList;
8190
- var client = useChatContext().client;
8191
- var HeaderComponent = useComponentContext().HeaderComponent;
8420
+ var client = useChatContext('useEnrichedMessages').client;
8421
+ var HeaderComponent = useComponentContext('useEnrichedMessages').HeaderComponent;
8192
8422
  var lastRead = React.useMemo(function () { var _a; return (_a = channel.lastRead) === null || _a === void 0 ? void 0 : _a.call(channel); }, [channel]);
8193
8423
  var messagesWithDates = disableDateSeparator && !hideDeletedMessages && hideNewMessageSeparator
8194
8424
  ? messages
@@ -8227,8 +8457,8 @@ var useLastReadData = function (props) {
8227
8457
 
8228
8458
  var useMessageListElements = function (props) {
8229
8459
  var enrichedMessages = props.enrichedMessages, internalMessageProps = props.internalMessageProps, messageGroupStyles = props.messageGroupStyles, onMessageLoadCaptured = props.onMessageLoadCaptured, read = props.read, returnAllReadData = props.returnAllReadData, threadList = props.threadList;
8230
- var _a = useChatContext(), client = _a.client, customClasses = _a.customClasses;
8231
- var _b = useComponentContext(), _c = _b.DateSeparator, DateSeparator$1 = _c === void 0 ? DateSeparator : _c, HeaderComponent = _b.HeaderComponent, _d = _b.MessageSystem, MessageSystem = _d === void 0 ? EventComponent : _d;
8460
+ var _a = useChatContext('useMessageListElements'), client = _a.client, customClasses = _a.customClasses;
8461
+ var _b = useComponentContext('useMessageListElements'), _c = _b.DateSeparator, DateSeparator$1 = _c === void 0 ? DateSeparator : _c, HeaderComponent = _b.HeaderComponent, _d = _b.MessageSystem, MessageSystem = _d === void 0 ? EventComponent : _d;
8232
8462
  // get the readData, but only for messages submitted by the user themselves
8233
8463
  var readData = useLastReadData({
8234
8464
  messages: enrichedMessages,
@@ -8272,7 +8502,7 @@ var useMessageListElements = function (props) {
8272
8502
 
8273
8503
  function useMessageListScrollManager(params) {
8274
8504
  var onScrollBy = params.onScrollBy, scrollContainerMeasures = params.scrollContainerMeasures, scrolledUpThreshold = params.scrolledUpThreshold, scrollToBottom = params.scrollToBottom, showNewMessages = params.showNewMessages;
8275
- var client = useChatContext().client;
8505
+ var client = useChatContext('useMessageListScrollManager').client;
8276
8506
  var measures = React.useRef({
8277
8507
  offsetHeight: 0,
8278
8508
  scrollHeight: 0,
@@ -8415,14 +8645,23 @@ var UnMemoizedMessageNotification = function (props) {
8415
8645
  };
8416
8646
  var MessageNotification = React__default['default'].memo(UnMemoizedMessageNotification);
8417
8647
 
8648
+ var MessageListNotifications = function (props) {
8649
+ var hasNewMessages = props.hasNewMessages, MessageNotification = props.MessageNotification, notifications = props.notifications, scrollToBottom = props.scrollToBottom;
8650
+ var t = useTranslationContext('MessageListNotifications').t;
8651
+ return (React__default['default'].createElement("div", { className: 'str-chat__list-notifications' },
8652
+ notifications.map(function (notification) { return (React__default['default'].createElement(CustomNotification, { active: true, key: notification.id, type: notification.type }, notification.text)); }),
8653
+ React__default['default'].createElement(ConnectionStatus, null),
8654
+ React__default['default'].createElement(MessageNotification, { onClick: scrollToBottom, showNotification: hasNewMessages }, t('New Messages!'))));
8655
+ };
8656
+
8418
8657
  /**
8419
8658
  * TypingIndicator lists users currently typing, it needs to be a child of Channel component
8420
8659
  */
8421
8660
  var UnMemoizedTypingIndicator = function (props) {
8422
8661
  var _a = props.Avatar, Avatar$1 = _a === void 0 ? Avatar : _a, _b = props.avatarSize, avatarSize = _b === void 0 ? 32 : _b, threadList = props.threadList;
8423
- var _c = useChannelStateContext(), channelConfig = _c.channelConfig, thread = _c.thread;
8424
- var client = useChatContext().client;
8425
- var _d = useTypingContext().typing, typing = _d === void 0 ? {} : _d;
8662
+ var _c = useChannelStateContext('TypingIndicator'), channelConfig = _c.channelConfig, thread = _c.thread;
8663
+ var client = useChatContext('TypingIndicator').client;
8664
+ var _d = useTypingContext('TypingIndicator').typing, typing = _d === void 0 ? {} : _d;
8426
8665
  if ((channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.typing_events) === false) {
8427
8666
  return null;
8428
8667
  }
@@ -8454,23 +8693,17 @@ var UnMemoizedTypingIndicator = function (props) {
8454
8693
  };
8455
8694
  var TypingIndicator = React__default['default'].memo(UnMemoizedTypingIndicator);
8456
8695
 
8457
- var DefaultMessageListNotifications = function (props) {
8458
- var hasNewMessages = props.hasNewMessages, MessageNotification = props.MessageNotification, notifications = props.notifications, scrollToBottom = props.scrollToBottom;
8459
- var t = useTranslationContext().t;
8460
- return (React__default['default'].createElement("div", { className: 'str-chat__list-notifications' },
8461
- notifications.map(function (notification) { return (React__default['default'].createElement(CustomNotification, { active: true, key: notification.id, type: notification.type }, notification.text)); }),
8462
- React__default['default'].createElement(ConnectionStatus, null),
8463
- React__default['default'].createElement(MessageNotification, { onClick: scrollToBottom, showNotification: hasNewMessages }, t('New Messages!'))));
8464
- };
8465
8696
  var useInternalInfiniteScrollProps = function (props) {
8466
- var _a = useComponentContext().LoadingIndicator, LoadingIndicator$1 = _a === void 0 ? LoadingIndicator : _a;
8697
+ var _a = useComponentContext('useInternalInfiniteScrollProps').LoadingIndicator, LoadingIndicator$1 = _a === void 0 ? LoadingIndicator : _a;
8467
8698
  return __assign({ hasMore: props.hasMore, isLoading: props.loadingMore, loader: (React__default['default'].createElement(Center, { key: 'loadingindicator' },
8468
8699
  React__default['default'].createElement(LoadingIndicator$1, { size: 20 }))), loadMore: useCallLoadMore(props.loadMore, props.messageLimit || 100) }, props.internalInfiniteScrollProps);
8469
8700
  };
8470
8701
  var MessageListWithContext = function (props) {
8471
- var channel = props.channel, _a = props.disableDateSeparator, disableDateSeparator = _a === void 0 ? false : _a, _b = props.hideDeletedMessages, hideDeletedMessages = _b === void 0 ? false : _b, _c = props.hideNewMessageSeparator, hideNewMessageSeparator = _c === void 0 ? false : _c, _d = props.messageActions, messageActions = _d === void 0 ? Object.keys(MESSAGE_ACTIONS) : _d, _e = props.messages, messages = _e === void 0 ? [] : _e, notifications = props.notifications, _f = props.noGroupByUser, noGroupByUser = _f === void 0 ? false : _f, _g = props.pinPermissions, pinPermissions = _g === void 0 ? defaultPinPermissions : _g, _h = props.returnAllReadData, returnAllReadData = _h === void 0 ? false : _h, _j = props.threadList, threadList = _j === void 0 ? false : _j, _k = props.unsafeHTML, unsafeHTML = _k === void 0 ? false : _k, headerPosition = props.headerPosition, read = props.read;
8472
- var customClasses = useChatContext().customClasses;
8473
- var _l = useComponentContext(), _m = _l.EmptyStateIndicator, EmptyStateIndicator$1 = _m === void 0 ? EmptyStateIndicator : _m, _o = _l.MessageListNotifications, MessageListNotifications = _o === void 0 ? DefaultMessageListNotifications : _o, _p = _l.MessageNotification, MessageNotification$1 = _p === void 0 ? MessageNotification : _p, _q = _l.TypingIndicator, TypingIndicator$1 = _q === void 0 ? TypingIndicator : _q;
8702
+ var channel = props.channel, _a = props.disableDateSeparator, disableDateSeparator = _a === void 0 ? false : _a, _b = props.hideDeletedMessages, hideDeletedMessages = _b === void 0 ? false : _b, _c = props.hideNewMessageSeparator, hideNewMessageSeparator = _c === void 0 ? false : _c, _d = props.messageActions, messageActions = _d === void 0 ? Object.keys(MESSAGE_ACTIONS) : _d, _e = props.messages, messages = _e === void 0 ? [] : _e, notifications = props.notifications, _f = props.noGroupByUser, noGroupByUser = _f === void 0 ? false : _f, _g = props.pinPermissions, pinPermissions = _g === void 0 ? defaultPinPermissions : _g, // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release
8703
+ _h = props.returnAllReadData, // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release
8704
+ returnAllReadData = _h === void 0 ? false : _h, _j = props.threadList, threadList = _j === void 0 ? false : _j, _k = props.unsafeHTML, unsafeHTML = _k === void 0 ? false : _k, headerPosition = props.headerPosition, read = props.read;
8705
+ var customClasses = useChatContext('MessageList').customClasses;
8706
+ var _l = useComponentContext('MessageList'), _m = _l.EmptyStateIndicator, EmptyStateIndicator$1 = _m === void 0 ? EmptyStateIndicator : _m, _o = _l.MessageListNotifications, MessageListNotifications$1 = _o === void 0 ? MessageListNotifications : _o, _p = _l.MessageNotification, MessageNotification$1 = _p === void 0 ? MessageNotification : _p, _q = _l.TypingIndicator, TypingIndicator$1 = _q === void 0 ? TypingIndicator : _q;
8474
8707
  var _r = useScrollLocationLogic({
8475
8708
  messages: messages,
8476
8709
  scrolledUpThreshold: props.scrolledUpThreshold,
@@ -8527,7 +8760,7 @@ var MessageListWithContext = function (props) {
8527
8760
  React__default['default'].createElement("ul", { className: 'str-chat__ul' }, elements),
8528
8761
  React__default['default'].createElement(TypingIndicator$1, { threadList: threadList }),
8529
8762
  React__default['default'].createElement("div", { key: 'bottom' })))),
8530
- React__default['default'].createElement(MessageListNotifications, { hasNewMessages: hasNewMessages, MessageNotification: MessageNotification$1, notifications: notifications, scrollToBottom: scrollToBottom })));
8763
+ React__default['default'].createElement(MessageListNotifications$1, { hasNewMessages: hasNewMessages, MessageNotification: MessageNotification$1, notifications: notifications, scrollToBottom: scrollToBottom })));
8531
8764
  };
8532
8765
  /**
8533
8766
  * The MessageList component renders a list of Messages.
@@ -8538,8 +8771,8 @@ var MessageListWithContext = function (props) {
8538
8771
  * - [TypingContext](https://getstream.io/chat/docs/sdk/react/contexts/typing_context/)
8539
8772
  */
8540
8773
  var MessageList = function (props) {
8541
- var loadMore = useChannelActionContext().loadMore;
8542
- var _a = useChannelStateContext(); _a.members; // eslint-disable-line @typescript-eslint/no-unused-vars
8774
+ var loadMore = useChannelActionContext('MessageList').loadMore;
8775
+ var _a = useChannelStateContext('MessageList'); _a.members; // eslint-disable-line @typescript-eslint/no-unused-vars
8543
8776
  _a.mutes; // eslint-disable-line @typescript-eslint/no-unused-vars
8544
8777
  _a.watchers; // eslint-disable-line @typescript-eslint/no-unused-vars
8545
8778
  var restChannelStateContext = __rest(_a, ["members", "mutes", "watchers"]);
@@ -8548,7 +8781,7 @@ var MessageList = function (props) {
8548
8781
 
8549
8782
  var useGiphyPreview = function (separateGiphyPreview) {
8550
8783
  var _a = React.useState(), giphyPreviewMessage = _a[0], setGiphyPreviewMessage = _a[1];
8551
- var client = useChatContext().client;
8784
+ var client = useChatContext('useGiphyPreview').client;
8552
8785
  React.useEffect(function () {
8553
8786
  var handleEvent = function (event) {
8554
8787
  var message = event.message, user = event.user;
@@ -8654,15 +8887,14 @@ function useShouldForceScrollToBottom(messages, currentUserId) {
8654
8887
 
8655
8888
  var PREPEND_OFFSET = Math.pow(10, 7);
8656
8889
  var VirtualizedMessageListWithContext = function (props) {
8657
- var channel = props.channel, closeReactionSelectorOnClick = props.closeReactionSelectorOnClick, customMessageRenderer = props.customMessageRenderer, defaultItemHeight = props.defaultItemHeight, _a = props.disableDateSeparator, disableDateSeparator = _a === void 0 ? true : _a, hasMore = props.hasMore, _b = props.hideDeletedMessages, hideDeletedMessages = _b === void 0 ? false : _b, _c = props.hideNewMessageSeparator, hideNewMessageSeparator = _c === void 0 ? false : _c, loadingMore = props.loadingMore, loadMore = props.loadMore, propMessage = props.Message, _d = props.messageLimit, messageLimit = _d === void 0 ? 100 : _d, messages = props.messages, _e = props.overscan, overscan = _e === void 0 ? 0 : _e,
8890
+ var additionalVirtuosoProps = props.additionalVirtuosoProps, channel = props.channel, closeReactionSelectorOnClick = props.closeReactionSelectorOnClick, customMessageRenderer = props.customMessageRenderer, defaultItemHeight = props.defaultItemHeight, _a = props.disableDateSeparator, disableDateSeparator = _a === void 0 ? true : _a, hasMore = props.hasMore, _b = props.hideDeletedMessages, hideDeletedMessages = _b === void 0 ? false : _b, _c = props.hideNewMessageSeparator, hideNewMessageSeparator = _c === void 0 ? false : _c, loadingMore = props.loadingMore, loadMore = props.loadMore, propMessage = props.Message, _d = props.messageLimit, messageLimit = _d === void 0 ? 100 : _d, messages = props.messages, notifications = props.notifications, _e = props.overscan, overscan = _e === void 0 ? 0 : _e,
8658
8891
  // TODO: refactor to scrollSeekPlaceHolderConfiguration and components.ScrollSeekPlaceholder, like the Virtuoso Component
8659
8892
  scrollSeekPlaceHolder = props.scrollSeekPlaceHolder, _f = props.scrollToLatestMessageOnFocus, scrollToLatestMessageOnFocus = _f === void 0 ? false : _f, _g = props.separateGiphyPreview, separateGiphyPreview = _g === void 0 ? false : _g, _h = props.shouldGroupByUser, shouldGroupByUser = _h === void 0 ? false : _h, _j = props.stickToBottomScrollBehavior, stickToBottomScrollBehavior = _j === void 0 ? 'smooth' : _j;
8660
- var _k = useComponentContext(), _l = _k.DateSeparator, DateSeparator$1 = _l === void 0 ? DateSeparator : _l, _m = _k.EmptyStateIndicator, EmptyStateIndicator$1 = _m === void 0 ? EmptyStateIndicator : _m, _o = _k.GiphyPreviewMessage, GiphyPreviewMessage$1 = _o === void 0 ? GiphyPreviewMessage : _o, _p = _k.LoadingIndicator, LoadingIndicator$1 = _p === void 0 ? LoadingIndicator : _p, _q = _k.MessageNotification, MessageNotification$1 = _q === void 0 ? MessageNotification : _q, _r = _k.MessageSystem, MessageSystem = _r === void 0 ? EventComponent : _r, _s = _k.TypingIndicator, TypingIndicator = _s === void 0 ? null : _s, _t = _k.VirtualMessage, contextMessage = _t === void 0 ? MessageSimple : _t;
8661
- var _u = useChatContext(), client = _u.client, customClasses = _u.customClasses;
8662
- var t = useTranslationContext().t;
8893
+ var _k = useComponentContext('VirtualizedMessageList'), _l = _k.DateSeparator, DateSeparator$1 = _l === void 0 ? DateSeparator : _l, _m = _k.EmptyStateIndicator, EmptyStateIndicator$1 = _m === void 0 ? EmptyStateIndicator : _m, _o = _k.GiphyPreviewMessage, GiphyPreviewMessage$1 = _o === void 0 ? GiphyPreviewMessage : _o, _p = _k.LoadingIndicator, LoadingIndicator$1 = _p === void 0 ? LoadingIndicator : _p, _q = _k.MessageListNotifications, MessageListNotifications$1 = _q === void 0 ? MessageListNotifications : _q, _r = _k.MessageNotification, MessageNotification$1 = _r === void 0 ? MessageNotification : _r, _s = _k.MessageSystem, MessageSystem = _s === void 0 ? EventComponent : _s, _t = _k.TypingIndicator, TypingIndicator = _t === void 0 ? null : _t, _u = _k.VirtualMessage, contextMessage = _u === void 0 ? MessageSimple : _u;
8894
+ var _v = useChatContext('VirtualizedMessageList'), client = _v.client, customClasses = _v.customClasses;
8663
8895
  var lastRead = React.useMemo(function () { var _a; return (_a = channel.lastRead) === null || _a === void 0 ? void 0 : _a.call(channel); }, [channel]);
8664
8896
  var MessageUIComponent = propMessage || contextMessage;
8665
- var _v = useGiphyPreview(separateGiphyPreview), giphyPreviewMessage = _v.giphyPreviewMessage, setGiphyPreviewMessage = _v.setGiphyPreviewMessage;
8897
+ var _w = useGiphyPreview(separateGiphyPreview), giphyPreviewMessage = _w.giphyPreviewMessage, setGiphyPreviewMessage = _w.setGiphyPreviewMessage;
8666
8898
  var processedMessages = React.useMemo(function () {
8667
8899
  if (typeof messages === 'undefined') {
8668
8900
  return [];
@@ -8693,7 +8925,7 @@ var VirtualizedMessageListWithContext = function (props) {
8693
8925
  client.userID,
8694
8926
  ]);
8695
8927
  var virtuoso = React.useRef(null);
8696
- var _w = useNewMessageNotification(processedMessages, client.userID), atBottom = _w.atBottom, newMessagesNotification = _w.newMessagesNotification, setNewMessagesNotification = _w.setNewMessagesNotification;
8928
+ var _x = useNewMessageNotification(processedMessages, client.userID), atBottom = _x.atBottom, newMessagesNotification = _x.newMessagesNotification, setNewMessagesNotification = _x.setNewMessagesNotification;
8697
8929
  var scrollToBottom = React.useCallback(function () {
8698
8930
  if (virtuoso.current) {
8699
8931
  virtuoso.current.scrollToIndex(processedMessages.length - 1);
@@ -8782,9 +9014,8 @@ var VirtualizedMessageListWithContext = function (props) {
8782
9014
  var virtualizedMessageListClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.virtualizedMessageList) || 'str-chat__virtual-list';
8783
9015
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
8784
9016
  React__default['default'].createElement("div", { className: virtualizedMessageListClass },
8785
- React__default['default'].createElement(reactVirtuoso.Virtuoso, __assign({ atBottomStateChange: atBottomStateChange, components: virtuosoComponents, firstItemIndex: PREPEND_OFFSET - numItemsPrepended, followOutput: followOutput, initialTopMostItemIndex: processedMessages.length ? processedMessages.length - 1 : 0, itemContent: function (i) { return messageRenderer(processedMessages, i); }, overscan: overscan, ref: virtuoso, startReached: startReached, style: { overflowX: 'hidden' }, totalCount: processedMessages.length }, (scrollSeekPlaceHolder ? { scrollSeek: scrollSeekPlaceHolder } : {}), (defaultItemHeight ? { defaultItemHeight: defaultItemHeight } : {}))),
8786
- React__default['default'].createElement("div", { className: 'str-chat__list-notifications' },
8787
- React__default['default'].createElement(MessageNotification$1, { onClick: scrollToBottom, showNotification: newMessagesNotification }, t('New Messages!')))),
9017
+ React__default['default'].createElement(reactVirtuoso.Virtuoso, __assign({ atBottomStateChange: atBottomStateChange, components: virtuosoComponents, firstItemIndex: PREPEND_OFFSET - numItemsPrepended, followOutput: followOutput, initialTopMostItemIndex: processedMessages.length ? processedMessages.length - 1 : 0, itemContent: function (i) { return messageRenderer(processedMessages, i); }, overscan: overscan, ref: virtuoso, startReached: startReached, style: { overflowX: 'hidden' }, totalCount: processedMessages.length }, additionalVirtuosoProps, (scrollSeekPlaceHolder ? { scrollSeek: scrollSeekPlaceHolder } : {}), (defaultItemHeight ? { defaultItemHeight: defaultItemHeight } : {})))),
9018
+ React__default['default'].createElement(MessageListNotifications$1, { hasNewMessages: newMessagesNotification, MessageNotification: MessageNotification$1, notifications: notifications, scrollToBottom: scrollToBottom }),
8788
9019
  giphyPreviewMessage && React__default['default'].createElement(GiphyPreviewMessage$1, { message: giphyPreviewMessage })));
8789
9020
  };
8790
9021
  /**
@@ -8794,26 +9025,25 @@ var VirtualizedMessageListWithContext = function (props) {
8794
9025
  * **Note**: It works well when there are thousands of messages in a channel, it has a shortcoming though - the message UI should have a fixed height.
8795
9026
  */
8796
9027
  function VirtualizedMessageList(props) {
8797
- var loadMore = useChannelActionContext().loadMore;
8798
- var _a = useChannelStateContext(), channel = _a.channel, hasMore = _a.hasMore, loadingMore = _a.loadingMore, contextMessages = _a.messages;
9028
+ var loadMore = useChannelActionContext('VirtualizedMessageList').loadMore;
9029
+ var _a = useChannelStateContext('VirtualizedMessageList'), channel = _a.channel, hasMore = _a.hasMore, loadingMore = _a.loadingMore, contextMessages = _a.messages, notifications = _a.notifications;
8799
9030
  var messages = props.messages || contextMessages;
8800
- return (React__default['default'].createElement(VirtualizedMessageListWithContext, __assign({ channel: channel, hasMore: !!hasMore, loadingMore: !!loadingMore, loadMore: loadMore, messages: messages }, props)));
9031
+ return (React__default['default'].createElement(VirtualizedMessageListWithContext, __assign({ channel: channel, hasMore: !!hasMore, loadingMore: !!loadingMore, loadMore: loadMore, messages: messages, notifications: notifications }, props)));
8801
9032
  }
8802
9033
 
8803
9034
  /**
8804
9035
  * The Thread component renders a parent Message with a list of replies
8805
9036
  */
8806
9037
  var Thread = function (props) {
8807
- var _a, _b;
8808
- var _c = useChannelStateContext(), channel = _c.channel, thread = _c.thread;
8809
- if (!thread || ((_b = (_a = channel === null || channel === void 0 ? void 0 : channel.getConfig) === null || _a === void 0 ? void 0 : _a.call(channel)) === null || _b === void 0 ? void 0 : _b.replies) === false)
9038
+ var _a = useChannelStateContext('Thread'), channel = _a.channel, channelConfig = _a.channelConfig, thread = _a.thread;
9039
+ if (!thread || (channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.replies) === false)
8810
9040
  return null;
8811
9041
  // The wrapper ensures a key variable is set and the component recreates on thread switch
8812
9042
  return React__default['default'].createElement(ThreadInner, __assign({}, props, { key: "thread-" + thread.id + "-" + (channel === null || channel === void 0 ? void 0 : channel.cid) }));
8813
9043
  };
8814
9044
  var DefaultThreadHeader = function (props) {
8815
9045
  var closeThread = props.closeThread, thread = props.thread;
8816
- var t = useTranslationContext().t;
9046
+ var t = useTranslationContext('Thread').t;
8817
9047
  var getReplyCount = function () {
8818
9048
  if (!thread.reply_count)
8819
9049
  return '';
@@ -8832,15 +9062,15 @@ var DefaultThreadHeader = function (props) {
8832
9062
  React__default['default'].createElement("path", { d: 'M9.916 1.027L8.973.084 5 4.058 1.027.084l-.943.943L4.058 5 .084 8.973l.943.943L5 5.942l3.973 3.974.943-.943L5.942 5z', fillRule: 'evenodd' })))));
8833
9063
  };
8834
9064
  var DefaultThreadStart = function () {
8835
- var t = useTranslationContext().t;
9065
+ var t = useTranslationContext('Thread').t;
8836
9066
  return React__default['default'].createElement("div", { className: 'str-chat__thread-start' }, t('Start of a new thread'));
8837
9067
  };
8838
9068
  var ThreadInner = function (props) {
8839
9069
  var additionalMessageInputProps = props.additionalMessageInputProps, additionalMessageListProps = props.additionalMessageListProps, additionalParentMessageProps = props.additionalParentMessageProps, additionalVirtualizedMessageListProps = props.additionalVirtualizedMessageListProps, _a = props.autoFocus, autoFocus = _a === void 0 ? true : _a, _b = props.fullWidth, fullWidth = _b === void 0 ? false : _b, PropInput = props.Input, PropMessage = props.Message, virtualized = props.virtualized;
8840
- var _c = useChannelStateContext(), thread = _c.thread, threadHasMore = _c.threadHasMore, threadLoadingMore = _c.threadLoadingMore, threadMessages = _c.threadMessages;
8841
- var _d = useChannelActionContext(), closeThread = _d.closeThread, loadMoreThread = _d.loadMoreThread;
8842
- var customClasses = useChatContext().customClasses;
8843
- var _e = useComponentContext(), ContextInput = _e.ThreadInput, ContextMessage = _e.Message, _f = _e.ThreadHeader, ThreadHeader = _f === void 0 ? DefaultThreadHeader : _f, _g = _e.ThreadStart, ThreadStart = _g === void 0 ? DefaultThreadStart : _g, _h = _e.VirtualMessage, VirtualMessage = _h === void 0 ? FixedHeightMessage : _h;
9070
+ var _c = useChannelStateContext('Thread'), thread = _c.thread, threadHasMore = _c.threadHasMore, threadLoadingMore = _c.threadLoadingMore, threadMessages = _c.threadMessages;
9071
+ var _d = useChannelActionContext('Thread'), closeThread = _d.closeThread, loadMoreThread = _d.loadMoreThread;
9072
+ var customClasses = useChatContext('Thread').customClasses;
9073
+ var _e = useComponentContext('Thread'), ContextInput = _e.ThreadInput, ContextMessage = _e.Message, _f = _e.ThreadHeader, ThreadHeader = _f === void 0 ? DefaultThreadHeader : _f, _g = _e.ThreadStart, ThreadStart = _g === void 0 ? DefaultThreadStart : _g, _h = _e.VirtualMessage, VirtualMessage = _h === void 0 ? FixedHeightMessage : _h;
8844
9074
  var messageList = React.useRef(null);
8845
9075
  var ThreadInput = PropInput || (additionalMessageInputProps === null || additionalMessageInputProps === void 0 ? void 0 : additionalMessageInputProps.Input) || ContextInput || MessageInputSmall;
8846
9076
  var ThreadMessage = PropMessage || (additionalMessageListProps === null || additionalMessageListProps === void 0 ? void 0 : additionalMessageListProps.Message);
@@ -8874,7 +9104,7 @@ var ThreadInner = function (props) {
8874
9104
 
8875
9105
  var UnMemoizedWindow = function (props) {
8876
9106
  var children = props.children, _a = props.hideOnThread, hideOnThread = _a === void 0 ? false : _a;
8877
- var thread = useChannelStateContext().thread;
9107
+ var thread = useChannelStateContext('Window').thread;
8878
9108
  // If thread is active and window should hide on thread. Return null
8879
9109
  if (thread && hideOnThread)
8880
9110
  return null;
@@ -9006,6 +9236,7 @@ exports.deTranslations = deTranslations;
9006
9236
  exports.defaultPinPermissions = defaultPinPermissions;
9007
9237
  exports.defaultScrollToItem = defaultScrollToItem;
9008
9238
  exports.defaultTimestampFormat = defaultTimestampFormat;
9239
+ exports.emojiMarkdownPlugin = emojiMarkdownPlugin;
9009
9240
  exports.enTranslations = enTranslations;
9010
9241
  exports.esTranslations = esTranslations;
9011
9242
  exports.escapeRegExp = escapeRegExp;
@@ -9019,6 +9250,7 @@ exports.getLatestMessagePreview = getLatestMessagePreview;
9019
9250
  exports.getMessageActions = getMessageActions;
9020
9251
  exports.getNonImageAttachments = getNonImageAttachments;
9021
9252
  exports.getReadByTooltipText = getReadByTooltipText;
9253
+ exports.getWholeChar = getWholeChar;
9022
9254
  exports.handleActionWarning = handleActionWarning;
9023
9255
  exports.hiTranslations = hiTranslations;
9024
9256
  exports.isAudioAttachment = isAudioAttachment;
@@ -9037,6 +9269,10 @@ exports.itTranslations = itTranslations;
9037
9269
  exports.jaTranslations = jaTranslations;
9038
9270
  exports.koTranslations = koTranslations;
9039
9271
  exports.listener = Listeners;
9272
+ exports.markDownRenderers = markDownRenderers;
9273
+ exports.matchMarkdownLinks = matchMarkdownLinks;
9274
+ exports.mentionsMarkdownPlugin = mentionsMarkdownPlugin;
9275
+ exports.messageCodeBlocks = messageCodeBlocks;
9040
9276
  exports.messageHasAttachments = messageHasAttachments;
9041
9277
  exports.messageHasReactions = messageHasReactions;
9042
9278
  exports.missingUseFlagHandlerParameterWarning = missingUseFlagHandlerParameterWarning;
@@ -9059,7 +9295,6 @@ exports.renderPreviewText = renderPreviewText;
9059
9295
  exports.renderText = renderText;
9060
9296
  exports.ruTranslations = ruTranslations;
9061
9297
  exports.showMessageActionsBox = showMessageActionsBox;
9062
- exports.smartRender = smartRender;
9063
9298
  exports.trTranslations = trTranslations;
9064
9299
  exports.useActionHandler = useActionHandler;
9065
9300
  exports.useBreakpoint = useBreakpoint;