stream-chat-react 10.11.0 → 10.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/browser.full-bundle.js +180 -101
  2. package/dist/browser.full-bundle.js.map +1 -1
  3. package/dist/browser.full-bundle.min.js +3 -3
  4. package/dist/browser.full-bundle.min.js.map +1 -1
  5. package/dist/components/Channel/Channel.d.ts +8 -1
  6. package/dist/components/Channel/Channel.d.ts.map +1 -1
  7. package/dist/components/Channel/Channel.js +9 -9
  8. package/dist/components/ChannelList/hooks/usePaginatedChannels.d.ts.map +1 -1
  9. package/dist/components/ChannelList/hooks/usePaginatedChannels.js +4 -1
  10. package/dist/components/ChannelPreview/ChannelPreview.d.ts +3 -0
  11. package/dist/components/ChannelPreview/ChannelPreview.d.ts.map +1 -1
  12. package/dist/components/ChannelPreview/ChannelPreview.js +6 -1
  13. package/dist/components/ChannelPreview/hooks/index.d.ts +1 -0
  14. package/dist/components/ChannelPreview/hooks/index.d.ts.map +1 -1
  15. package/dist/components/ChannelPreview/hooks/index.js +1 -0
  16. package/dist/components/ChannelPreview/hooks/useMessageDeliveryStatus.d.ts +17 -0
  17. package/dist/components/ChannelPreview/hooks/useMessageDeliveryStatus.d.ts.map +1 -0
  18. package/dist/components/ChannelPreview/hooks/useMessageDeliveryStatus.js +58 -0
  19. package/dist/components/ChannelSearch/hooks/useChannelSearch.d.ts +4 -3
  20. package/dist/components/ChannelSearch/hooks/useChannelSearch.d.ts.map +1 -1
  21. package/dist/components/ChannelSearch/hooks/useChannelSearch.js +52 -31
  22. package/dist/components/Message/MessageSimple.d.ts.map +1 -1
  23. package/dist/components/Message/MessageSimple.js +1 -1
  24. package/dist/components/MessageInput/MessageInput.d.ts +2 -0
  25. package/dist/components/MessageInput/MessageInput.d.ts.map +1 -1
  26. package/dist/components/MessageInput/MessageInputFlat.js +4 -4
  27. package/dist/components/MessageInput/MessageInputSmall.d.ts.map +1 -1
  28. package/dist/components/MessageInput/MessageInputSmall.js +2 -2
  29. package/dist/components/MessageInput/hooks/useCreateMessageInputContext.d.ts.map +1 -1
  30. package/dist/components/MessageInput/hooks/useCreateMessageInputContext.js +3 -1
  31. package/dist/index.cjs.js +136 -50
  32. package/dist/index.cjs.js.map +1 -1
  33. package/dist/version.d.ts +1 -1
  34. package/dist/version.js +1 -1
  35. package/package.json +2 -2
package/dist/index.cjs.js CHANGED
@@ -31006,7 +31006,7 @@ var MessageInputFlat = function () {
31006
31006
  var MessageInputV1 = function () {
31007
31007
  var _a = useChannelStateContext('MessageInputFlat'), acceptedFiles = _a.acceptedFiles, multipleUploads = _a.multipleUploads, quotedMessage = _a.quotedMessage;
31008
31008
  var t = useTranslationContext('MessageInputFlat').t;
31009
- var _b = useMessageInputContext('MessageInputFlat'), closeEmojiPicker = _b.closeEmojiPicker, cooldownRemaining = _b.cooldownRemaining, emojiPickerIsOpen = _b.emojiPickerIsOpen, handleSubmit = _b.handleSubmit, isUploadEnabled = _b.isUploadEnabled, maxFilesLeft = _b.maxFilesLeft, numberOfUploads = _b.numberOfUploads, openEmojiPicker = _b.openEmojiPicker, setCooldownRemaining = _b.setCooldownRemaining, uploadNewFiles = _b.uploadNewFiles;
31009
+ var _b = useMessageInputContext('MessageInputFlat'), closeEmojiPicker = _b.closeEmojiPicker, cooldownRemaining = _b.cooldownRemaining, emojiPickerIsOpen = _b.emojiPickerIsOpen, handleSubmit = _b.handleSubmit, hideSendButton = _b.hideSendButton, isUploadEnabled = _b.isUploadEnabled, maxFilesLeft = _b.maxFilesLeft, numberOfUploads = _b.numberOfUploads, openEmojiPicker = _b.openEmojiPicker, setCooldownRemaining = _b.setCooldownRemaining, uploadNewFiles = _b.uploadNewFiles;
31010
31010
  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, _j = _c.AttachmentPreviewList, AttachmentPreviewList = _j === void 0 ? UploadsPreview : _j;
31011
31011
  return (React__default["default"].createElement("div", { className: clsx('str-chat__input-flat', 'str-chat__message-input', {
31012
31012
  'str-chat__input-flat--send-button-active': !!SendButton$1,
@@ -31033,12 +31033,12 @@ var MessageInputV1 = function () {
31033
31033
  React__default["default"].createElement(FileUploadButton, { accepts: acceptedFiles, disabled: maxFilesLeft === 0, handleFiles: uploadNewFiles, multiple: multipleUploads },
31034
31034
  React__default["default"].createElement("span", { className: 'str-chat__input-flat-fileupload' },
31035
31035
  React__default["default"].createElement(FileUploadIcon, null)))))),
31036
- !cooldownRemaining && React__default["default"].createElement(SendButton$1, { sendMessage: handleSubmit })))));
31036
+ !(cooldownRemaining || hideSendButton) && React__default["default"].createElement(SendButton$1, { sendMessage: handleSubmit })))));
31037
31037
  };
31038
31038
  var MessageInputV2 = function () {
31039
31039
  var _a = useChannelStateContext('MessageInputV2'), _b = _a.acceptedFiles, acceptedFiles = _b === void 0 ? [] : _b, multipleUploads = _a.multipleUploads, quotedMessage = _a.quotedMessage;
31040
31040
  var t = useTranslationContext('MessageInputV2').t;
31041
- var _c = useMessageInputContext('MessageInputV2'), closeEmojiPicker = _c.closeEmojiPicker, cooldownRemaining = _c.cooldownRemaining, emojiPickerIsOpen = _c.emojiPickerIsOpen, findAndEnqueueURLsToEnrich = _c.findAndEnqueueURLsToEnrich, handleSubmit = _c.handleSubmit, isUploadEnabled = _c.isUploadEnabled, linkPreviews = _c.linkPreviews, maxFilesLeft = _c.maxFilesLeft, message = _c.message, numberOfUploads = _c.numberOfUploads, openEmojiPicker = _c.openEmojiPicker, setCooldownRemaining = _c.setCooldownRemaining, text = _c.text, uploadNewFiles = _c.uploadNewFiles;
31041
+ var _c = useMessageInputContext('MessageInputV2'), closeEmojiPicker = _c.closeEmojiPicker, cooldownRemaining = _c.cooldownRemaining, emojiPickerIsOpen = _c.emojiPickerIsOpen, findAndEnqueueURLsToEnrich = _c.findAndEnqueueURLsToEnrich, handleSubmit = _c.handleSubmit, hideSendButton = _c.hideSendButton, isUploadEnabled = _c.isUploadEnabled, linkPreviews = _c.linkPreviews, maxFilesLeft = _c.maxFilesLeft, message = _c.message, numberOfUploads = _c.numberOfUploads, openEmojiPicker = _c.openEmojiPicker, setCooldownRemaining = _c.setCooldownRemaining, text = _c.text, uploadNewFiles = _c.uploadNewFiles;
31042
31042
  var _d = useComponentContext('MessageInputV2'), _e = _d.AttachmentPreviewList, AttachmentPreviewList$1 = _e === void 0 ? AttachmentPreviewList : _e, _f = _d.CooldownTimer, CooldownTimer$1 = _f === void 0 ? CooldownTimer : _f, _g = _d.EmojiIcon, EmojiIcon = _g === void 0 ? EmojiPickerIcon : _g, _h = _d.FileUploadIcon, FileUploadIcon = _h === void 0 ? UploadIcon : _h, _j = _d.LinkPreviewList, LinkPreviewList$1 = _j === void 0 ? LinkPreviewList : _j, _k = _d.QuotedMessagePreview, QuotedMessagePreview$1 = _k === void 0 ? QuotedMessagePreview : _k, _l = _d.SendButton, SendButton$1 = _l === void 0 ? SendButton : _l;
31043
31043
  var _m = React.useState(null), referenceElement = _m[0], setReferenceElement = _m[1];
31044
31044
  var _o = React.useState(null), popperElement = _o[0], setPopperElement = _o[1];
@@ -31087,7 +31087,7 @@ var MessageInputV2 = function () {
31087
31087
  React__default["default"].createElement(EmojiPicker, null))),
31088
31088
  React__default["default"].createElement("button", { "aria-label": 'Emoji picker', className: 'str-chat__emoji-picker-button', onClick: emojiPickerIsOpen ? closeEmojiPicker : openEmojiPicker, ref: setReferenceElement, type: 'button' },
31089
31089
  React__default["default"].createElement(EmojiIcon, null))))),
31090
- !message && (React__default["default"].createElement(React__default["default"].Fragment, null, cooldownRemaining ? (React__default["default"].createElement(CooldownTimer$1, { cooldownInterval: cooldownRemaining, setCooldownRemaining: setCooldownRemaining })) : (React__default["default"].createElement(SendButton$1, { disabled: !numberOfUploads && !text.length, sendMessage: handleSubmit }))))))));
31090
+ !hideSendButton && (React__default["default"].createElement(React__default["default"].Fragment, null, cooldownRemaining ? (React__default["default"].createElement(CooldownTimer$1, { cooldownInterval: cooldownRemaining, setCooldownRemaining: setCooldownRemaining })) : (React__default["default"].createElement(SendButton$1, { disabled: !numberOfUploads && !text.length, sendMessage: handleSubmit }))))))));
31091
31091
  };
31092
31092
 
31093
31093
  var EditMessageForm = function () {
@@ -32099,7 +32099,7 @@ var useMessageInputState = function (props) {
32099
32099
  };
32100
32100
 
32101
32101
  var useCreateMessageInputContext = function (value) {
32102
- var additionalTextareaProps = value.additionalTextareaProps, attachments = value.attachments, autocompleteTriggers = value.autocompleteTriggers, cancelURLEnrichment = value.cancelURLEnrichment, clearEditingState = value.clearEditingState, closeCommandsList = value.closeCommandsList, closeEmojiPicker = value.closeEmojiPicker, closeMentionsList = value.closeMentionsList, cooldownInterval = value.cooldownInterval, cooldownRemaining = value.cooldownRemaining, disabled = value.disabled, disableMentions = value.disableMentions, dismissLinkPreview = value.dismissLinkPreview, doFileUploadRequest = value.doFileUploadRequest, doImageUploadRequest = value.doImageUploadRequest, emojiIndex = value.emojiIndex, emojiPickerIsOpen = value.emojiPickerIsOpen, emojiPickerRef = value.emojiPickerRef, errorHandler = value.errorHandler, fileOrder = value.fileOrder, fileUploads = value.fileUploads, findAndEnqueueURLsToEnrich = value.findAndEnqueueURLsToEnrich, 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, linkPreviews = value.linkPreviews, 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, openMentionsList = value.openMentionsList, overrideSubmitHandler = value.overrideSubmitHandler, parent = value.parent, publishTypingEvent = value.publishTypingEvent, removeFile = value.removeFile, removeImage = value.removeImage, setCooldownRemaining = value.setCooldownRemaining, setText = value.setText, shouldSubmit = value.shouldSubmit, showCommandsList = value.showCommandsList, showMentionsList = value.showMentionsList, text = value.text, textareaRef = value.textareaRef, uploadFile = value.uploadFile, uploadImage = value.uploadImage, uploadNewFiles = value.uploadNewFiles, useMentionsTransliteration = value.useMentionsTransliteration;
32102
+ var additionalTextareaProps = value.additionalTextareaProps, attachments = value.attachments, autocompleteTriggers = value.autocompleteTriggers, cancelURLEnrichment = value.cancelURLEnrichment, clearEditingState = value.clearEditingState, closeCommandsList = value.closeCommandsList, closeEmojiPicker = value.closeEmojiPicker, closeMentionsList = value.closeMentionsList, cooldownInterval = value.cooldownInterval, cooldownRemaining = value.cooldownRemaining, disabled = value.disabled, disableMentions = value.disableMentions, dismissLinkPreview = value.dismissLinkPreview, doFileUploadRequest = value.doFileUploadRequest, doImageUploadRequest = value.doImageUploadRequest, emojiIndex = value.emojiIndex, emojiPickerIsOpen = value.emojiPickerIsOpen, emojiPickerRef = value.emojiPickerRef, errorHandler = value.errorHandler, fileOrder = value.fileOrder, fileUploads = value.fileUploads, findAndEnqueueURLsToEnrich = value.findAndEnqueueURLsToEnrich, focus = value.focus, grow = value.grow, handleChange = value.handleChange, handleEmojiKeyDown = value.handleEmojiKeyDown, handleSubmit = value.handleSubmit, hideSendButton = value.hideSendButton, imageOrder = value.imageOrder, imageUploads = value.imageUploads, insertText = value.insertText, isUploadEnabled = value.isUploadEnabled, linkPreviews = value.linkPreviews, 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, openMentionsList = value.openMentionsList, overrideSubmitHandler = value.overrideSubmitHandler, parent = value.parent, publishTypingEvent = value.publishTypingEvent, removeFile = value.removeFile, removeImage = value.removeImage, setCooldownRemaining = value.setCooldownRemaining, setText = value.setText, shouldSubmit = value.shouldSubmit, showCommandsList = value.showCommandsList, showMentionsList = value.showMentionsList, text = value.text, textareaRef = value.textareaRef, uploadFile = value.uploadFile, uploadImage = value.uploadImage, uploadNewFiles = value.uploadNewFiles, useMentionsTransliteration = value.useMentionsTransliteration;
32103
32103
  var editing = message === null || message === void 0 ? void 0 : message.editing;
32104
32104
  var fileUploadsValue = Object.entries(fileUploads)
32105
32105
  // eslint-disable-next-line
@@ -32146,6 +32146,7 @@ var useCreateMessageInputContext = function (value) {
32146
32146
  handleChange: handleChange,
32147
32147
  handleEmojiKeyDown: handleEmojiKeyDown,
32148
32148
  handleSubmit: handleSubmit,
32149
+ hideSendButton: hideSendButton,
32149
32150
  imageOrder: imageOrder,
32150
32151
  imageUploads: imageUploads,
32151
32152
  insertText: insertText,
@@ -32190,6 +32191,7 @@ var useCreateMessageInputContext = function (value) {
32190
32191
  emojiPickerIsOpen,
32191
32192
  fileUploadsValue,
32192
32193
  findAndEnqueueURLsToEnrich,
32194
+ hideSendButton,
32193
32195
  imageUploadsValue,
32194
32196
  isUploadEnabled,
32195
32197
  linkPreviewsValue,
@@ -32242,7 +32244,7 @@ var MessageInputSmall = function () {
32242
32244
  var setQuotedMessage = useChannelActionContext('MessageInputSmall').setQuotedMessage;
32243
32245
  var t = useTranslationContext('MessageInputSmall').t;
32244
32246
  var channel = useChatContext('MessageInputSmall').channel;
32245
- var _b = useMessageInputContext('MessageInputSmall'), closeEmojiPicker = _b.closeEmojiPicker, cooldownRemaining = _b.cooldownRemaining, emojiPickerIsOpen = _b.emojiPickerIsOpen, handleSubmit = _b.handleSubmit, isUploadEnabled = _b.isUploadEnabled, maxFilesLeft = _b.maxFilesLeft, numberOfUploads = _b.numberOfUploads, openEmojiPicker = _b.openEmojiPicker, setCooldownRemaining = _b.setCooldownRemaining, uploadNewFiles = _b.uploadNewFiles;
32247
+ var _b = useMessageInputContext('MessageInputSmall'), closeEmojiPicker = _b.closeEmojiPicker, cooldownRemaining = _b.cooldownRemaining, emojiPickerIsOpen = _b.emojiPickerIsOpen, handleSubmit = _b.handleSubmit, hideSendButton = _b.hideSendButton, isUploadEnabled = _b.isUploadEnabled, maxFilesLeft = _b.maxFilesLeft, numberOfUploads = _b.numberOfUploads, openEmojiPicker = _b.openEmojiPicker, setCooldownRemaining = _b.setCooldownRemaining, uploadNewFiles = _b.uploadNewFiles;
32246
32248
  var _c = useComponentContext('MessageInputSmall'), _d = _c.CooldownTimer, CooldownTimer$1 = _d === void 0 ? CooldownTimer : _d, _e = _c.EmojiIcon, EmojiIcon = _e === void 0 ? EmojiIconSmall : _e, _f = _c.FileUploadIcon, FileUploadIcon = _f === void 0 ? FileUploadIconFlat : _f, _g = _c.SendButton, SendButton$1 = _g === void 0 ? SendButton : _g, _h = _c.QuotedMessagePreview, QuotedMessagePreview$1 = _h === void 0 ? QuotedMessagePreview : _h;
32247
32249
  React.useEffect(function () {
32248
32250
  var handleQuotedMessageUpdate = function (e) {
@@ -32285,7 +32287,7 @@ var MessageInputSmall = function () {
32285
32287
  React__default["default"].createElement("button", { "aria-label": 'Emoji picker', className: 'str-chat__small-message-input-emojiselect', onClick: emojiPickerIsOpen ? closeEmojiPicker : openEmojiPicker },
32286
32288
  React__default["default"].createElement(EmojiIcon, null))))),
32287
32289
  React__default["default"].createElement(EmojiPicker, { small: true })),
32288
- !cooldownRemaining && React__default["default"].createElement(SendButton$1, { sendMessage: handleSubmit })))));
32290
+ !(cooldownRemaining || hideSendButton) && React__default["default"].createElement(SendButton$1, { sendMessage: handleSubmit })))));
32289
32291
  };
32290
32292
 
32291
32293
  var MMLReact = React__default["default"].lazy(function () { return __awaiter(void 0, void 0, void 0, function () {
@@ -32611,7 +32613,7 @@ var MessageSimpleWithContext = function (props) {
32611
32613
  });
32612
32614
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
32613
32615
  editing && (React__default["default"].createElement(Modal, { onClose: clearEditingState, open: editing },
32614
- React__default["default"].createElement(MessageInput, __assign({ clearEditingState: clearEditingState, grow: true, Input: EditMessageInput, message: message }, additionalMessageInputProps)))),
32616
+ React__default["default"].createElement(MessageInput, __assign({ clearEditingState: clearEditingState, grow: true, hideSendButton: true, Input: EditMessageInput, message: message }, additionalMessageInputProps)))),
32615
32617
  React__default["default"].createElement("div", { className: rootClassName, key: message.id },
32616
32618
  themeVersion === '1' && React__default["default"].createElement(MessageStatus$1, null),
32617
32619
  message.user && (React__default["default"].createElement(Avatar$1, { image: message.user.image, name: message.user.name || message.user.id, onClick: onUserClick, onMouseOver: onUserHover, user: message.user })),
@@ -33078,15 +33080,15 @@ var UnMemoizedChannel = function (props) {
33078
33080
  };
33079
33081
  var ChannelInner = function (props) {
33080
33082
  var _a;
33081
- var acceptedFiles = props.acceptedFiles, activeUnreadHandler = props.activeUnreadHandler, channel = props.channel, children = props.children, doMarkReadRequest = props.doMarkReadRequest, doSendMessageRequest = props.doSendMessageRequest, doUpdateMessageRequest = props.doUpdateMessageRequest, _b = props.dragAndDropWindow, dragAndDropWindow = _b === void 0 ? false : _b, _c = props.emojiData, emojiData = _c === void 0 ? defaultEmojiData : _c, enrichURLForPreviewConfig = props.enrichURLForPreviewConfig, _d = props.LoadingErrorIndicator, LoadingErrorIndicator$1 = _d === void 0 ? LoadingErrorIndicator : _d, _e = props.LoadingIndicator, LoadingIndicator = _e === void 0 ? LoadingChannel : _e, maxNumberOfFiles = props.maxNumberOfFiles, _f = props.multipleUploads, multipleUploads = _f === void 0 ? true : _f, onMentionsClick = props.onMentionsClick, onMentionsHover = props.onMentionsHover, _g = props.optionalMessageInputProps, optionalMessageInputProps = _g === void 0 ? {} : _g, skipMessageDataMemoization = props.skipMessageDataMemoization;
33082
- var _h = useChatContext('Channel'), client = _h.client, customClasses = _h.customClasses, latestMessageDatesByChannels = _h.latestMessageDatesByChannels, mutes = _h.mutes, theme = _h.theme;
33083
+ var acceptedFiles = props.acceptedFiles, activeUnreadHandler = props.activeUnreadHandler, channel = props.channel, children = props.children, doMarkReadRequest = props.doMarkReadRequest, doSendMessageRequest = props.doSendMessageRequest, doUpdateMessageRequest = props.doUpdateMessageRequest, _b = props.dragAndDropWindow, dragAndDropWindow = _b === void 0 ? false : _b, _c = props.emojiData, emojiData = _c === void 0 ? defaultEmojiData : _c, enrichURLForPreviewConfig = props.enrichURLForPreviewConfig, _d = props.initializeOnMount, initializeOnMount = _d === void 0 ? true : _d, _e = props.LoadingErrorIndicator, LoadingErrorIndicator$1 = _e === void 0 ? LoadingErrorIndicator : _e, _f = props.LoadingIndicator, LoadingIndicator = _f === void 0 ? LoadingChannel : _f, maxNumberOfFiles = props.maxNumberOfFiles, _g = props.multipleUploads, multipleUploads = _g === void 0 ? true : _g, onMentionsClick = props.onMentionsClick, onMentionsHover = props.onMentionsHover, _h = props.optionalMessageInputProps, optionalMessageInputProps = _h === void 0 ? {} : _h, skipMessageDataMemoization = props.skipMessageDataMemoization;
33084
+ var _j = useChatContext('Channel'), client = _j.client, customClasses = _j.customClasses, latestMessageDatesByChannels = _j.latestMessageDatesByChannels, mutes = _j.mutes, theme = _j.theme;
33083
33085
  var t = useTranslationContext('Channel').t;
33084
- var _j = useChannelContainerClasses({ customClasses: customClasses }), channelClass = _j.channelClass, chatClass = _j.chatClass, chatContainerClass = _j.chatContainerClass, windowsEmojiClass = _j.windowsEmojiClass;
33085
- var _k = React.useState(channel.getConfig()), channelConfig = _k[0], setChannelConfig = _k[1];
33086
- var _l = React.useState([]), notifications = _l[0], setNotifications = _l[1];
33087
- var _m = React.useState(), quotedMessage = _m[0], setQuotedMessage = _m[1];
33086
+ var _k = useChannelContainerClasses({ customClasses: customClasses }), channelClass = _k.channelClass, chatClass = _k.chatClass, chatContainerClass = _k.chatContainerClass, windowsEmojiClass = _k.windowsEmojiClass;
33087
+ var _l = React.useState(channel.getConfig()), channelConfig = _l[0], setChannelConfig = _l[1];
33088
+ var _m = React.useState([]), notifications = _m[0], setNotifications = _m[1];
33089
+ var _o = React.useState(), quotedMessage = _o[0], setQuotedMessage = _o[1];
33088
33090
  var notificationTimeouts = [];
33089
- var _o = React.useReducer(channelReducer, __assign(__assign({}, initialState), { loading: !channel.initialized })), state = _o[0], dispatch = _o[1];
33091
+ var _p = React.useReducer(channelReducer, __assign(__assign({}, initialState), { loading: !channel.initialized })), state = _p[0], dispatch = _p[1];
33090
33092
  var isMounted = useIsMounted();
33091
33093
  var originalTitle = React.useRef('');
33092
33094
  var lastRead = React.useRef(new Date());
@@ -33207,7 +33209,7 @@ var ChannelInner = function (props) {
33207
33209
  return __generator(this, function (_d) {
33208
33210
  switch (_d.label) {
33209
33211
  case 0:
33210
- if (!!channel.initialized) return [3 /*break*/, 4];
33212
+ if (!(!channel.initialized && initializeOnMount)) return [3 /*break*/, 4];
33211
33213
  _d.label = 1;
33212
33214
  case 1:
33213
33215
  _d.trys.push([1, 3, , 4]);
@@ -33269,7 +33271,7 @@ var ChannelInner = function (props) {
33269
33271
  client.off('user.deleted', handleEvent);
33270
33272
  notificationTimeouts.forEach(clearTimeout);
33271
33273
  };
33272
- }, [channel.cid, doMarkReadRequest, channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.read_events]);
33274
+ }, [channel.cid, doMarkReadRequest, channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.read_events, initializeOnMount]);
33273
33275
  React.useEffect(function () {
33274
33276
  var _a;
33275
33277
  if (!state.thread)
@@ -34193,7 +34195,9 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
34193
34195
  return [4 /*yield*/, client.queryChannels(filters, sort || {}, newOptions)];
34194
34196
  case 2:
34195
34197
  channelQueryResponse = _b.sent();
34196
- newChannels = queryType === 'reload' ? channelQueryResponse : __spreadArray(__spreadArray([], channels, true), channelQueryResponse, true);
34198
+ newChannels = queryType === 'reload'
34199
+ ? channelQueryResponse
34200
+ : uniqBy__default["default"](__spreadArray(__spreadArray([], channels, true), channelQueryResponse, true), 'cid');
34197
34201
  setChannels(newChannels);
34198
34202
  setHasNextPage(channelQueryResponse.length >= newOptions.limit);
34199
34203
  // Set active channel only on load of first page
@@ -34293,6 +34297,63 @@ var useIsChannelMuted = function (channel) {
34293
34297
  return muted;
34294
34298
  };
34295
34299
 
34300
+ exports.MessageDeliveryStatus = void 0;
34301
+ (function (MessageDeliveryStatus) {
34302
+ MessageDeliveryStatus["DELIVERED"] = "delivered";
34303
+ MessageDeliveryStatus["READ"] = "read";
34304
+ })(exports.MessageDeliveryStatus || (exports.MessageDeliveryStatus = {}));
34305
+ var useMessageDeliveryStatus = function (_a) {
34306
+ var channel = _a.channel, lastMessage = _a.lastMessage;
34307
+ var client = useChatContext().client;
34308
+ var _b = React.useState(), messageDeliveryStatus = _b[0], setMessageDeliveryStatus = _b[1];
34309
+ var isOwnMessage = React.useCallback(function (message) { var _a; return client.user && ((_a = message === null || message === void 0 ? void 0 : message.user) === null || _a === void 0 ? void 0 : _a.id) === client.user.id; }, [client]);
34310
+ React.useEffect(function () {
34311
+ var lastMessageIsOwn = isOwnMessage(lastMessage);
34312
+ if (!(lastMessage === null || lastMessage === void 0 ? void 0 : lastMessage.created_at) || !lastMessageIsOwn)
34313
+ return;
34314
+ var lastMessageCreatedAtDate = typeof lastMessage.created_at === 'string'
34315
+ ? new Date(lastMessage.created_at)
34316
+ : lastMessage.created_at;
34317
+ var channelReadByOthersAfterLastMessageUpdate = Object.values(channel.state.read).some(function (_a) {
34318
+ var channelLastMarkedReadDate = _a.last_read, user = _a.user;
34319
+ var ignoreOwnReadStatus = client.user && user.id !== client.user.id;
34320
+ return ignoreOwnReadStatus && lastMessageCreatedAtDate < channelLastMarkedReadDate;
34321
+ });
34322
+ setMessageDeliveryStatus(channelReadByOthersAfterLastMessageUpdate
34323
+ ? exports.MessageDeliveryStatus.READ
34324
+ : exports.MessageDeliveryStatus.DELIVERED);
34325
+ }, [channel.state.read, client, isOwnMessage, lastMessage]);
34326
+ React.useEffect(function () {
34327
+ var handleMessageNew = function (event) {
34328
+ // the last message is not mine, so do not show the delivery status
34329
+ if (!isOwnMessage(event.message)) {
34330
+ return setMessageDeliveryStatus(undefined);
34331
+ }
34332
+ return setMessageDeliveryStatus(exports.MessageDeliveryStatus.DELIVERED);
34333
+ };
34334
+ channel.on('message.new', handleMessageNew);
34335
+ return function () {
34336
+ channel.off('message.new', handleMessageNew);
34337
+ };
34338
+ }, [channel, client, isOwnMessage]);
34339
+ React.useEffect(function () {
34340
+ if (!isOwnMessage(lastMessage))
34341
+ return;
34342
+ var handleMarkRead = function (event) {
34343
+ var _a, _b;
34344
+ if (((_a = event.user) === null || _a === void 0 ? void 0 : _a.id) !== ((_b = client.user) === null || _b === void 0 ? void 0 : _b.id))
34345
+ setMessageDeliveryStatus(exports.MessageDeliveryStatus.READ);
34346
+ };
34347
+ channel.on('message.read', handleMarkRead);
34348
+ return function () {
34349
+ channel.off('message.read', handleMarkRead);
34350
+ };
34351
+ }, [channel, client, lastMessage, isOwnMessage]);
34352
+ return {
34353
+ messageDeliveryStatus: messageDeliveryStatus,
34354
+ };
34355
+ };
34356
+
34296
34357
  var ChannelPreview = function (props) {
34297
34358
  var channel = props.channel, _a = props.Preview, Preview = _a === void 0 ? ChannelPreviewMessenger : _a, channelUpdateCount = props.channelUpdateCount;
34298
34359
  var _b = useChatContext('ChannelPreview'), activeChannel = _b.channel, client = _b.client, setActiveChannel = _b.setActiveChannel;
@@ -34300,6 +34361,10 @@ var ChannelPreview = function (props) {
34300
34361
  var _d = useChannelPreviewInfo({ channel: channel }), displayImage = _d.displayImage, displayTitle = _d.displayTitle;
34301
34362
  var _e = React.useState(channel.state.messages[channel.state.messages.length - 1]), lastMessage = _e[0], setLastMessage = _e[1];
34302
34363
  var _f = React.useState(0), unread = _f[0], setUnread = _f[1];
34364
+ var messageDeliveryStatus = useMessageDeliveryStatus({
34365
+ channel: channel,
34366
+ lastMessage: lastMessage,
34367
+ }).messageDeliveryStatus;
34303
34368
  var isActive = (activeChannel === null || activeChannel === void 0 ? void 0 : activeChannel.cid) === channel.cid;
34304
34369
  var muted = useIsChannelMuted(channel).muted;
34305
34370
  React.useEffect(function () {
@@ -34339,24 +34404,29 @@ var ChannelPreview = function (props) {
34339
34404
  if (!Preview)
34340
34405
  return null;
34341
34406
  var latestMessage = getLatestMessagePreview(channel, t, userLanguage);
34342
- return (React__default["default"].createElement(Preview, __assign({}, props, { active: isActive, displayImage: displayImage, displayTitle: displayTitle, lastMessage: lastMessage, latestMessage: latestMessage, setActiveChannel: setActiveChannel, unread: unread })));
34407
+ return (React__default["default"].createElement(Preview, __assign({}, props, { active: isActive, displayImage: displayImage, displayTitle: displayTitle, lastMessage: lastMessage, latestMessage: latestMessage, messageDeliveryStatus: messageDeliveryStatus, setActiveChannel: setActiveChannel, unread: unread })));
34343
34408
  };
34344
34409
 
34345
34410
  var isChannel = function (output) { return output.cid != null; };
34346
34411
 
34347
34412
  var useChannelSearch = function (_a) {
34348
- var _b = _a.channelType, channelType = _b === void 0 ? 'messaging' : _b, _c = _a.clearSearchOnClickOutside, clearSearchOnClickOutside = _c === void 0 ? true : _c, _d = _a.disabled, disabled = _d === void 0 ? false : _d, onSearchCallback = _a.onSearch, onSearchExit = _a.onSearchExit, onSelectResult = _a.onSelectResult, _e = _a.searchForChannels, searchForChannels = _e === void 0 ? false : _e, searchFunction = _a.searchFunction, searchQueryParams = _a.searchQueryParams, setChannels = _a.setChannels;
34349
- var _f = useChatContext('useChannelSearch'), client = _f.client, setActiveChannel = _f.setActiveChannel, themeVersion = _f.themeVersion;
34350
- var _g = React.useState(false), inputIsFocused = _g[0], setInputIsFocused = _g[1];
34351
- var _h = React.useState(''), query = _h[0], setQuery = _h[1];
34352
- var _j = React.useState([]), results = _j[0], setResults = _j[1];
34353
- var _k = React.useState(false), searching = _k[0], setSearching = _k[1];
34413
+ var _b = _a.channelType, channelType = _b === void 0 ? 'messaging' : _b, _c = _a.clearSearchOnClickOutside, clearSearchOnClickOutside = _c === void 0 ? true : _c, _d = _a.disabled, disabled = _d === void 0 ? false : _d, onSearchCallback = _a.onSearch, onSearchExit = _a.onSearchExit, onSelectResult = _a.onSelectResult, _e = _a.searchDebounceIntervalMs, searchDebounceIntervalMs = _e === void 0 ? 300 : _e, _f = _a.searchForChannels, searchForChannels = _f === void 0 ? false : _f, searchFunction = _a.searchFunction, searchQueryParams = _a.searchQueryParams, setChannels = _a.setChannels;
34414
+ var _g = useChatContext('useChannelSearch'), client = _g.client, setActiveChannel = _g.setActiveChannel, themeVersion = _g.themeVersion;
34415
+ var _h = React.useState(false), inputIsFocused = _h[0], setInputIsFocused = _h[1];
34416
+ var _j = React.useState(''), query = _j[0], setQuery = _j[1];
34417
+ var _k = React.useState([]), results = _k[0], setResults = _k[1];
34418
+ var _l = React.useState(false), searching = _l[0], setSearching = _l[1];
34419
+ var searchQueryPromiseInProgress = React.useRef();
34420
+ var shouldIgnoreQueryResults = React.useRef(false);
34354
34421
  var inputRef = React.useRef(null);
34355
34422
  var searchBarRef = React.useRef(null);
34356
34423
  var clearState = React.useCallback(function () {
34357
34424
  setQuery('');
34358
34425
  setResults([]);
34359
34426
  setSearching(false);
34427
+ if (searchQueryPromiseInProgress.current) {
34428
+ shouldIgnoreQueryResults.current = true;
34429
+ }
34360
34430
  }, []);
34361
34431
  var activateSearch = React.useCallback(function () {
34362
34432
  setInputIsFocused(true);
@@ -34439,45 +34509,56 @@ var useChannelSearch = function (_a) {
34439
34509
  });
34440
34510
  }); }, [clearSearchOnClickOutside, client, exitSearch, onSelectResult, setActiveChannel, setChannels]);
34441
34511
  var getChannels = React.useCallback(function (text) { return __awaiter(void 0, void 0, void 0, function () {
34442
- var userResponse, channelResponse, _a, channels, users_1, users, error_1;
34512
+ var results, userQueryPromise, users, channelQueryPromise, _a, channels, users, error_1;
34443
34513
  var _b, _c, _d, _e, _f, _g;
34444
34514
  return __generator(this, function (_h) {
34445
34515
  switch (_h.label) {
34446
34516
  case 0:
34447
- if (!text || searching)
34448
- return [2 /*return*/];
34449
- setSearching(true);
34517
+ results = [];
34450
34518
  _h.label = 1;
34451
34519
  case 1:
34452
34520
  _h.trys.push([1, 6, , 7]);
34453
- return [4 /*yield*/, client.queryUsers(__assign({ $or: [{ id: { $autocomplete: text } }, { name: { $autocomplete: text } }], id: { $ne: client.userID } }, (_b = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.userFilters) === null || _b === void 0 ? void 0 : _b.filters), __assign({ id: 1 }, (_c = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.userFilters) === null || _c === void 0 ? void 0 : _c.sort), __assign({ limit: 8 }, (_d = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.userFilters) === null || _d === void 0 ? void 0 : _d.options))];
34521
+ userQueryPromise = client.queryUsers(__assign({ $or: [{ id: { $autocomplete: text } }, { name: { $autocomplete: text } }], id: { $ne: client.userID } }, (_b = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.userFilters) === null || _b === void 0 ? void 0 : _b.filters), __assign({ id: 1 }, (_c = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.userFilters) === null || _c === void 0 ? void 0 : _c.sort), __assign({ limit: 8 }, (_d = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.userFilters) === null || _d === void 0 ? void 0 : _d.options));
34522
+ if (!!searchForChannels) return [3 /*break*/, 3];
34523
+ searchQueryPromiseInProgress.current = userQueryPromise;
34524
+ return [4 /*yield*/, searchQueryPromiseInProgress.current];
34454
34525
  case 2:
34455
- userResponse = _h.sent();
34456
- if (!searchForChannels) return [3 /*break*/, 4];
34457
- channelResponse = client.queryChannels(__assign({ name: { $autocomplete: text } }, (_e = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.channelFilters) === null || _e === void 0 ? void 0 : _e.filters), ((_f = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.channelFilters) === null || _f === void 0 ? void 0 : _f.sort) || {}, __assign({ limit: 5 }, (_g = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.channelFilters) === null || _g === void 0 ? void 0 : _g.options));
34458
- return [4 /*yield*/, Promise.all([channelResponse, userResponse])];
34459
- case 3:
34460
- _a = _h.sent(), channels = _a[0], users_1 = _a[1].users;
34461
- setResults(__spreadArray(__spreadArray([], channels, true), users_1, true));
34462
- setSearching(false);
34463
- return [2 /*return*/];
34464
- case 4: return [4 /*yield*/, Promise.resolve(userResponse)];
34465
- case 5:
34466
34526
  users = (_h.sent()).users;
34467
- setResults(users);
34468
- return [3 /*break*/, 7];
34527
+ results = users;
34528
+ return [3 /*break*/, 5];
34529
+ case 3:
34530
+ channelQueryPromise = client.queryChannels(__assign({ name: { $autocomplete: text } }, (_e = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.channelFilters) === null || _e === void 0 ? void 0 : _e.filters), ((_f = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.channelFilters) === null || _f === void 0 ? void 0 : _f.sort) || {}, __assign({ limit: 5 }, (_g = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.channelFilters) === null || _g === void 0 ? void 0 : _g.options));
34531
+ searchQueryPromiseInProgress.current = Promise.all([
34532
+ channelQueryPromise,
34533
+ userQueryPromise,
34534
+ ]);
34535
+ return [4 /*yield*/, searchQueryPromiseInProgress.current];
34536
+ case 4:
34537
+ _a = _h.sent(), channels = _a[0], users = _a[1].users;
34538
+ results = __spreadArray(__spreadArray([], channels, true), users, true);
34539
+ _h.label = 5;
34540
+ case 5: return [3 /*break*/, 7];
34469
34541
  case 6:
34470
34542
  error_1 = _h.sent();
34471
- clearState();
34472
34543
  console.error(error_1);
34473
34544
  return [3 /*break*/, 7];
34474
34545
  case 7:
34475
34546
  setSearching(false);
34547
+ if (!shouldIgnoreQueryResults.current) {
34548
+ setResults(results);
34549
+ }
34550
+ else {
34551
+ shouldIgnoreQueryResults.current = false;
34552
+ }
34553
+ searchQueryPromiseInProgress.current = undefined;
34476
34554
  return [2 /*return*/];
34477
34555
  }
34478
34556
  });
34479
- }); }, [client, searching, searchForChannels]);
34480
- var getChannelsThrottled = throttle__default["default"](getChannels, 200);
34557
+ }); }, [client, searchForChannels, searchQueryParams]);
34558
+ var scheduleGetChannels = React.useCallback(debounce__default["default"](getChannels, searchDebounceIntervalMs), [
34559
+ getChannels,
34560
+ searchDebounceIntervalMs,
34561
+ ]);
34481
34562
  var onSearch = React.useCallback(function (event) {
34482
34563
  event.preventDefault();
34483
34564
  if (disabled)
@@ -34489,12 +34570,17 @@ var useChannelSearch = function (_a) {
34489
34570
  setSearching: setSearching,
34490
34571
  }, event);
34491
34572
  }
34492
- else {
34573
+ else if (event.target.value) {
34574
+ setSearching(true);
34493
34575
  setQuery(event.target.value);
34494
- getChannelsThrottled(event.target.value);
34576
+ scheduleGetChannels(event.target.value);
34577
+ }
34578
+ else if (!event.target.value) {
34579
+ clearState();
34580
+ scheduleGetChannels.cancel();
34495
34581
  }
34496
34582
  onSearchCallback === null || onSearchCallback === void 0 ? void 0 : onSearchCallback(event);
34497
- }, [disabled, getChannelsThrottled, onSearchCallback, searchFunction]);
34583
+ }, [clearState, disabled, scheduleGetChannels, onSearchCallback, searchFunction]);
34498
34584
  return {
34499
34585
  activateSearch: activateSearch,
34500
34586
  clearState: clearState,
@@ -34887,7 +34973,7 @@ var UnMemoizedChannelList = function (props) {
34887
34973
  */
34888
34974
  var ChannelList = React__default["default"].memo(UnMemoizedChannelList);
34889
34975
 
34890
- var version = '10.11.0';
34976
+ var version = '10.13.0';
34891
34977
 
34892
34978
  var useChat = function (_a) {
34893
34979
  var _b, _c;