stream-chat-react 11.12.1 → 11.12.2

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 (30) hide show
  1. package/dist/{Window-40a618cb.js → Window-44a85f63.js} +230 -94
  2. package/dist/browser.full-bundle.js +309 -138
  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/Channel/Channel.d.ts.map +1 -1
  7. package/dist/components/Channel/Channel.js +122 -47
  8. package/dist/components/Channel/utils.d.ts +27 -0
  9. package/dist/components/Channel/utils.d.ts.map +1 -1
  10. package/dist/components/Channel/utils.js +56 -0
  11. package/dist/components/Emojis/index.cjs.js +1 -1
  12. package/dist/components/MessageList/VirtualizedMessageList.d.ts +1 -0
  13. package/dist/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
  14. package/dist/components/MessageList/VirtualizedMessageList.js +1 -0
  15. package/dist/components/MessageList/VirtualizedMessageListComponents.d.ts.map +1 -1
  16. package/dist/components/MessageList/VirtualizedMessageListComponents.js +20 -7
  17. package/dist/components/MessageList/hooks/useMarkRead.js +2 -3
  18. package/dist/components/MessageList/renderMessages.d.ts +5 -5
  19. package/dist/components/MessageList/renderMessages.d.ts.map +1 -1
  20. package/dist/components/MessageList/renderMessages.js +44 -22
  21. package/dist/components/MessageList/utils.d.ts +10 -1
  22. package/dist/components/MessageList/utils.d.ts.map +1 -1
  23. package/dist/components/MessageList/utils.js +3 -0
  24. package/dist/constants/limits.d.ts +1 -0
  25. package/dist/constants/limits.d.ts.map +1 -1
  26. package/dist/constants/limits.js +1 -0
  27. package/dist/index.cjs.js +67 -31
  28. package/dist/version.d.ts +1 -1
  29. package/dist/version.js +1 -1
  30. package/package.json +1 -1
@@ -54264,6 +54264,7 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
54264
54264
 
54265
54265
  window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};var DEFAULT_INITIAL_CHANNEL_PAGE_SIZE = 25;
54266
54266
  var DEFAULT_NEXT_CHANNEL_PAGE_SIZE = 100;
54267
+ var DEFAULT_JUMP_TO_PAGE_SIZE = 100;
54267
54268
  var DEFAULT_THREAD_PAGE_SIZE = 50;
54268
54269
  var DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD = 250;
54269
54270
 
@@ -54631,6 +54632,9 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
54631
54632
  var hasNotMoreMessages = function (returnedCountMessages, limit) {
54632
54633
  return returnedCountMessages < limit;
54633
54634
  };
54635
+ function isDateSeparatorMessage(message) {
54636
+ return message.customType === CUSTOM_MESSAGE_TYPE.date && !!message.date && isDate(message.date);
54637
+ }
54634
54638
 
54635
54639
  window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};var useEnrichedMessages = function (args) {
54636
54640
  var channel = args.channel, disableDateSeparator = args.disableDateSeparator, groupStyles = args.groupStyles, headerPosition = args.headerPosition, hideDeletedMessages = args.hideDeletedMessages, hideNewMessageSeparator = args.hideNewMessageSeparator, messages = args.messages, noGroupByUser = args.noGroupByUser;
@@ -54951,7 +54955,7 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
54951
54955
  unreadMessages > 0;
54952
54956
  };
54953
54957
  var onVisibilityChange = function () {
54954
- if (shouldMarkRead(unreadCount))
54958
+ if (shouldMarkRead(channel.countUnread()))
54955
54959
  markRead();
54956
54960
  };
54957
54961
  var handleMessageNew = function (event) {
@@ -54973,7 +54977,6 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
54973
54977
  }
54974
54978
  else if (newMessageToCurrentChannel &&
54975
54979
  mainChannelUpdated &&
54976
- !isOwnMessage &&
54977
54980
  shouldMarkRead(channel.countUnread())) {
54978
54981
  markRead();
54979
54982
  }
@@ -54982,7 +54985,7 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
54982
54985
  document.addEventListener('visibilitychange', onVisibilityChange);
54983
54986
  var hasScrolledToBottom = previousRenderMessageListScrolledToBottom.current !== isMessageListScrolledToBottom &&
54984
54987
  isMessageListScrolledToBottom;
54985
- if (shouldMarkRead(hasScrolledToBottom ? channel.countUnread() : unreadCount))
54988
+ if (hasScrolledToBottom && shouldMarkRead(channel.countUnread()))
54986
54989
  markRead();
54987
54990
  previousRenderMessageListScrolledToBottom.current = isMessageListScrolledToBottom;
54988
54991
  return function () {
@@ -55264,35 +55267,123 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
55264
55267
 
55265
55268
  window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};
55266
55269
 
55270
+ window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};var selectColor = function (number, dark) {
55271
+ var hue = number * 137.508; // use golden angle approximation
55272
+ return "hsl(".concat(hue, ",").concat(dark ? '50%' : '85%', ", ").concat(dark ? '75%' : '55%', ")");
55273
+ };
55274
+ var hashUserId = function (userId) {
55275
+ var hash = userId.split('').reduce(function (acc, c) {
55276
+ acc = (acc << 5) - acc + c.charCodeAt(0); // eslint-disable-line
55277
+ return acc & acc; // eslint-disable-line no-bitwise
55278
+ }, 0);
55279
+ return Math.abs(hash) / Math.pow(10, Math.ceil(Math.log10(Math.abs(hash) + 1)));
55280
+ };
55281
+ var getUserColor = function (theme, userId) {
55282
+ return selectColor(hashUserId(userId), theme.includes('dark'));
55283
+ };
55284
+ var UnMemoizedFixedHeightMessage = function (props) {
55285
+ var _a, _b, _c, _d;
55286
+ var propGroupedByUser = props.groupedByUser, propMessage = props.message;
55287
+ var theme = useChatContext('FixedHeightMessage').theme;
55288
+ var _e = useMessageContext('FixedHeightMessage'), contextGroupedByUser = _e.groupedByUser, contextMessage = _e.message;
55289
+ var _f = useComponentContext('FixedHeightMessage').MessageDeleted, MessageDeleted$1 = _f === void 0 ? MessageDeleted : _f;
55290
+ var userLanguage = useTranslationContext('FixedHeightMessage').userLanguage;
55291
+ var groupedByUser = propGroupedByUser !== undefined ? propGroupedByUser : contextGroupedByUser;
55292
+ var message = propMessage || contextMessage;
55293
+ var handleAction = useActionHandler(message);
55294
+ var handleDelete = useDeleteHandler(message);
55295
+ var role = useUserRole(message);
55296
+ var messageTextToRender = ((_a = message === null || message === void 0 ? void 0 : message.i18n) === null || _a === void 0 ? void 0 : _a["".concat(userLanguage, "_text")]) || (message === null || message === void 0 ? void 0 : message.text);
55297
+ var renderedText = React$2.useMemo(function () { return renderText(messageTextToRender, message.mentioned_users); }, [
55298
+ message.mentioned_users,
55299
+ messageTextToRender,
55300
+ ]);
55301
+ var userId = ((_b = message.user) === null || _b === void 0 ? void 0 : _b.id) || '';
55302
+ var userColor = React$2.useMemo(function () { return getUserColor(theme, userId); }, [userId, theme]);
55303
+ var messageActionsHandler = React$2.useCallback(function () { return getMessageActions(['delete'], { canDelete: role.canDelete }); }, [role]);
55304
+ var images = (_c = message === null || message === void 0 ? void 0 : message.attachments) === null || _c === void 0 ? void 0 : _c.filter(function (_a) {
55305
+ var type = _a.type;
55306
+ return type === 'image';
55307
+ });
55308
+ return (React__default["default"].createElement("div", { className: "str-chat__virtual-message__wrapper ".concat(role.isMyMessage ? 'str-chat__virtual-message__wrapper--me' : '', " ").concat(groupedByUser ? 'str-chat__virtual-message__wrapper--group' : ''), key: message.id },
55309
+ message.user && (React__default["default"].createElement(Avatar, { image: message.user.image, name: message.user.name || message.user.id, shape: 'rounded', size: 38, user: message.user })),
55310
+ React__default["default"].createElement("div", { className: 'str-chat__virtual-message__content' },
55311
+ React__default["default"].createElement("div", { className: 'str-chat__virtual-message__meta' },
55312
+ React__default["default"].createElement("div", { className: 'str-chat__virtual-message__author', style: { color: userColor } },
55313
+ React__default["default"].createElement("strong", null, ((_d = message.user) === null || _d === void 0 ? void 0 : _d.name) || 'unknown'))),
55314
+ message.deleted_at || message.type === 'deleted' ? (React__default["default"].createElement(MessageDeleted$1, { message: message })) : (React__default["default"].createElement(React__default["default"].Fragment, null,
55315
+ images && React__default["default"].createElement(Gallery, { images: images }),
55316
+ React__default["default"].createElement("div", { className: 'str-chat__virtual-message__text', "data-testid": 'msg-text' },
55317
+ renderedText,
55318
+ message.mml && (React__default["default"].createElement(MML$1, { actionHandler: handleAction, align: 'left', source: message.mml })),
55319
+ React__default["default"].createElement("div", { className: 'str-chat__virtual-message__data' },
55320
+ React__default["default"].createElement(MessageActions, { customWrapperClass: 'str-chat__virtual-message__actions', getMessageActions: messageActionsHandler, handleDelete: handleDelete, message: message, mine: function () { return role.isMyMessage; } }),
55321
+ React__default["default"].createElement("span", { className: 'str-chat__virtual-message__date' },
55322
+ React__default["default"].createElement(MessageTimestamp, { customClass: 'str-chat__message-simple-timestamp', message: message })))))))));
55323
+ };
55324
+ /**
55325
+ * @deprecated - This UI component will be removed in the next major release.
55326
+ *
55327
+ * FixedHeightMessage - This component renders a single message.
55328
+ * It uses fixed height elements to make sure it works well in VirtualizedMessageList
55329
+ */
55330
+ var FixedHeightMessage = React__default["default"].memo(UnMemoizedFixedHeightMessage);
55331
+
55332
+ window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};
55333
+
55334
+ window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};
55335
+
55267
55336
  window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};function defaultRenderMessages(_a) {
55268
55337
  var channelUnreadUiState = _a.channelUnreadUiState, components = _a.components, customClasses = _a.customClasses, lastReceivedId = _a.lastReceivedMessageId, messageGroupStyles = _a.messageGroupStyles, messages = _a.messages, readData = _a.readData, messageProps = _a.sharedMessageProps;
55269
55338
  var DateSeparator = components.DateSeparator, HeaderComponent = components.HeaderComponent, MessageSystem = components.MessageSystem, UnreadMessagesSeparator = components.UnreadMessagesSeparator;
55270
- return messages.map(function (message, index) {
55271
- if (message.customType === CUSTOM_MESSAGE_TYPE.date && message.date && isDate(message.date)) {
55272
- return (React__default["default"].createElement("li", { key: "".concat(message.date.toISOString(), "-i") },
55339
+ var renderedMessages = [];
55340
+ var firstMessage;
55341
+ for (var index = 0; index < messages.length; index++) {
55342
+ var message = messages[index];
55343
+ if (isDateSeparatorMessage(message)) {
55344
+ renderedMessages.push(React__default["default"].createElement("li", { key: "".concat(message.date.toISOString(), "-i") },
55273
55345
  React__default["default"].createElement(DateSeparator, { date: message.date, formatDate: messageProps.formatDate, unread: message.unread })));
55274
55346
  }
55275
- if (message.customType === CUSTOM_MESSAGE_TYPE.intro && HeaderComponent) {
55276
- return (React__default["default"].createElement("li", { key: 'intro' },
55347
+ else if (message.customType === CUSTOM_MESSAGE_TYPE.intro && HeaderComponent) {
55348
+ renderedMessages.push(React__default["default"].createElement("li", { key: 'intro' },
55277
55349
  React__default["default"].createElement(HeaderComponent, null)));
55278
55350
  }
55279
- if (message.type === 'system') {
55280
- return (React__default["default"].createElement("li", { key: message.id || message.created_at },
55351
+ else if (message.type === 'system') {
55352
+ renderedMessages.push(React__default["default"].createElement("li", { key: message.id || message.created_at },
55281
55353
  React__default["default"].createElement(MessageSystem, { message: message })));
55282
55354
  }
55283
- var groupStyles = messageGroupStyles[message.id] || '';
55284
- var messageClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.message) || "str-chat__li str-chat__li--".concat(groupStyles);
55285
- var isNewestMessage = index === messages.length - 1;
55286
- var isLastReadMessage = (channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read_message_id) === message.id;
55287
- var showUnreadSeparator = isLastReadMessage &&
55288
- !isNewestMessage &&
55289
- ((channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.first_unread_message_id) || (channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages) > 0); // unread count can be 0 if the user marks unread only own messages
55290
- return (React__default["default"].createElement(React$2.Fragment, { key: message.id || message.created_at },
55291
- React__default["default"].createElement("li", { className: messageClass, "data-message-id": message.id, "data-testid": messageClass },
55292
- React__default["default"].createElement(Message, __assign({ groupStyles: [groupStyles], lastReceivedId: lastReceivedId, message: message, readBy: readData[message.id] || [] }, messageProps))),
55293
- showUnreadSeparator && UnreadMessagesSeparator && (React__default["default"].createElement("li", { className: 'str-chat__li str-chat__unread-messages-separator-wrapper' },
55294
- React__default["default"].createElement(UnreadMessagesSeparator, { unreadCount: channelUnreadUiState.unread_messages })))));
55295
- });
55355
+ else {
55356
+ if (!firstMessage) {
55357
+ firstMessage = message;
55358
+ }
55359
+ var groupStyles = messageGroupStyles[message.id] || '';
55360
+ var messageClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.message) || "str-chat__li str-chat__li--".concat(groupStyles);
55361
+ var createdAtTimestamp = message.created_at && new Date(message.created_at).getTime();
55362
+ var lastReadTimestamp = channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read.getTime();
55363
+ var isFirstMessage = (firstMessage === null || firstMessage === void 0 ? void 0 : firstMessage.id) && firstMessage.id === message.id;
55364
+ var isNewestMessage = index === messages.length - 1;
55365
+ var isLastReadMessage = (channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read_message_id) === message.id ||
55366
+ (!(channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages) && createdAtTimestamp === lastReadTimestamp);
55367
+ var isFirstUnreadMessage = (channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.first_unread_message_id) === message.id ||
55368
+ (!!(channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages) &&
55369
+ !!createdAtTimestamp &&
55370
+ !!lastReadTimestamp &&
55371
+ createdAtTimestamp > lastReadTimestamp &&
55372
+ isFirstMessage);
55373
+ var showUnreadSeparatorAbove = !(channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read_message_id) && isFirstUnreadMessage;
55374
+ var showUnreadSeparatorBelow = isLastReadMessage &&
55375
+ !isNewestMessage &&
55376
+ ((channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.first_unread_message_id) || !!(channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages)); // this part has to be here as we do not mark channel read when sending a message
55377
+ renderedMessages.push(React__default["default"].createElement(React$2.Fragment, { key: message.id || message.created_at },
55378
+ showUnreadSeparatorAbove && UnreadMessagesSeparator && (React__default["default"].createElement("li", { className: 'str-chat__li str-chat__unread-messages-separator-wrapper' },
55379
+ React__default["default"].createElement(UnreadMessagesSeparator, { unreadCount: channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages }))),
55380
+ React__default["default"].createElement("li", { className: messageClass, "data-message-id": message.id, "data-testid": messageClass },
55381
+ React__default["default"].createElement(Message, __assign({ groupStyles: [groupStyles], lastReceivedId: lastReceivedId, message: message, readBy: readData[message.id] || [] }, messageProps))),
55382
+ showUnreadSeparatorBelow && UnreadMessagesSeparator && (React__default["default"].createElement("li", { className: 'str-chat__li str-chat__unread-messages-separator-wrapper' },
55383
+ React__default["default"].createElement(UnreadMessagesSeparator, { unreadCount: channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages })))));
55384
+ }
55385
+ }
55386
+ return renderedMessages;
55296
55387
  }
55297
55388
 
55298
55389
  window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};var MessageListWithContext = function (props) {
@@ -56915,72 +57006,6 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
56915
57006
 
56916
57007
  window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};
56917
57008
 
56918
- window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};var selectColor = function (number, dark) {
56919
- var hue = number * 137.508; // use golden angle approximation
56920
- return "hsl(".concat(hue, ",").concat(dark ? '50%' : '85%', ", ").concat(dark ? '75%' : '55%', ")");
56921
- };
56922
- var hashUserId = function (userId) {
56923
- var hash = userId.split('').reduce(function (acc, c) {
56924
- acc = (acc << 5) - acc + c.charCodeAt(0); // eslint-disable-line
56925
- return acc & acc; // eslint-disable-line no-bitwise
56926
- }, 0);
56927
- return Math.abs(hash) / Math.pow(10, Math.ceil(Math.log10(Math.abs(hash) + 1)));
56928
- };
56929
- var getUserColor = function (theme, userId) {
56930
- return selectColor(hashUserId(userId), theme.includes('dark'));
56931
- };
56932
- var UnMemoizedFixedHeightMessage = function (props) {
56933
- var _a, _b, _c, _d;
56934
- var propGroupedByUser = props.groupedByUser, propMessage = props.message;
56935
- var theme = useChatContext('FixedHeightMessage').theme;
56936
- var _e = useMessageContext('FixedHeightMessage'), contextGroupedByUser = _e.groupedByUser, contextMessage = _e.message;
56937
- var _f = useComponentContext('FixedHeightMessage').MessageDeleted, MessageDeleted$1 = _f === void 0 ? MessageDeleted : _f;
56938
- var userLanguage = useTranslationContext('FixedHeightMessage').userLanguage;
56939
- var groupedByUser = propGroupedByUser !== undefined ? propGroupedByUser : contextGroupedByUser;
56940
- var message = propMessage || contextMessage;
56941
- var handleAction = useActionHandler(message);
56942
- var handleDelete = useDeleteHandler(message);
56943
- var role = useUserRole(message);
56944
- var messageTextToRender = ((_a = message === null || message === void 0 ? void 0 : message.i18n) === null || _a === void 0 ? void 0 : _a["".concat(userLanguage, "_text")]) || (message === null || message === void 0 ? void 0 : message.text);
56945
- var renderedText = React$2.useMemo(function () { return renderText(messageTextToRender, message.mentioned_users); }, [
56946
- message.mentioned_users,
56947
- messageTextToRender,
56948
- ]);
56949
- var userId = ((_b = message.user) === null || _b === void 0 ? void 0 : _b.id) || '';
56950
- var userColor = React$2.useMemo(function () { return getUserColor(theme, userId); }, [userId, theme]);
56951
- var messageActionsHandler = React$2.useCallback(function () { return getMessageActions(['delete'], { canDelete: role.canDelete }); }, [role]);
56952
- var images = (_c = message === null || message === void 0 ? void 0 : message.attachments) === null || _c === void 0 ? void 0 : _c.filter(function (_a) {
56953
- var type = _a.type;
56954
- return type === 'image';
56955
- });
56956
- return (React__default["default"].createElement("div", { className: "str-chat__virtual-message__wrapper ".concat(role.isMyMessage ? 'str-chat__virtual-message__wrapper--me' : '', " ").concat(groupedByUser ? 'str-chat__virtual-message__wrapper--group' : ''), key: message.id },
56957
- message.user && (React__default["default"].createElement(Avatar, { image: message.user.image, name: message.user.name || message.user.id, shape: 'rounded', size: 38, user: message.user })),
56958
- React__default["default"].createElement("div", { className: 'str-chat__virtual-message__content' },
56959
- React__default["default"].createElement("div", { className: 'str-chat__virtual-message__meta' },
56960
- React__default["default"].createElement("div", { className: 'str-chat__virtual-message__author', style: { color: userColor } },
56961
- React__default["default"].createElement("strong", null, ((_d = message.user) === null || _d === void 0 ? void 0 : _d.name) || 'unknown'))),
56962
- message.deleted_at || message.type === 'deleted' ? (React__default["default"].createElement(MessageDeleted$1, { message: message })) : (React__default["default"].createElement(React__default["default"].Fragment, null,
56963
- images && React__default["default"].createElement(Gallery, { images: images }),
56964
- React__default["default"].createElement("div", { className: 'str-chat__virtual-message__text', "data-testid": 'msg-text' },
56965
- renderedText,
56966
- message.mml && (React__default["default"].createElement(MML$1, { actionHandler: handleAction, align: 'left', source: message.mml })),
56967
- React__default["default"].createElement("div", { className: 'str-chat__virtual-message__data' },
56968
- React__default["default"].createElement(MessageActions, { customWrapperClass: 'str-chat__virtual-message__actions', getMessageActions: messageActionsHandler, handleDelete: handleDelete, message: message, mine: function () { return role.isMyMessage; } }),
56969
- React__default["default"].createElement("span", { className: 'str-chat__virtual-message__date' },
56970
- React__default["default"].createElement(MessageTimestamp, { customClass: 'str-chat__message-simple-timestamp', message: message })))))))));
56971
- };
56972
- /**
56973
- * @deprecated - This UI component will be removed in the next major release.
56974
- *
56975
- * FixedHeightMessage - This component renders a single message.
56976
- * It uses fixed height elements to make sure it works well in VirtualizedMessageList
56977
- */
56978
- var FixedHeightMessage = React__default["default"].memo(UnMemoizedFixedHeightMessage);
56979
-
56980
- window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};
56981
-
56982
- window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};
56983
-
56984
57009
  window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};var PREPEND_OFFSET = Math.pow(10, 7);
56985
57010
  function calculateItemIndex(virtuosoIndex, numItemsPrepended) {
56986
57011
  return virtuosoIndex + numItemsPrepended - PREPEND_OFFSET;
@@ -57036,7 +57061,7 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
57036
57061
  };
57037
57062
  var messageRenderer = function (virtuosoIndex, _data, virtuosoContext) {
57038
57063
  var _a, _b, _c, _d, _e, _f, _g;
57039
- var additionalMessageInputProps = virtuosoContext.additionalMessageInputProps, closeReactionSelectorOnClick = virtuosoContext.closeReactionSelectorOnClick, customMessageActions = virtuosoContext.customMessageActions, customMessageRenderer = virtuosoContext.customMessageRenderer, DateSeparator = virtuosoContext.DateSeparator, firstUnreadMessageId = virtuosoContext.firstUnreadMessageId, lastReadMessageId = virtuosoContext.lastReadMessageId, lastReceivedMessageId = virtuosoContext.lastReceivedMessageId, MessageUIComponent = virtuosoContext.Message, messageActions = virtuosoContext.messageActions, MessageSystem = virtuosoContext.MessageSystem, numItemsPrepended = virtuosoContext.numItemsPrepended, ownMessagesReadByOthers = virtuosoContext.ownMessagesReadByOthers, messageList = virtuosoContext.processedMessages, shouldGroupByUser = virtuosoContext.shouldGroupByUser, sortReactionDetails = virtuosoContext.sortReactionDetails, sortReactions = virtuosoContext.sortReactions, _h = virtuosoContext.unreadMessageCount, unreadMessageCount = _h === void 0 ? 0 : _h, UnreadMessagesSeparator = virtuosoContext.UnreadMessagesSeparator, virtuosoRef = virtuosoContext.virtuosoRef;
57064
+ var additionalMessageInputProps = virtuosoContext.additionalMessageInputProps, closeReactionSelectorOnClick = virtuosoContext.closeReactionSelectorOnClick, customMessageActions = virtuosoContext.customMessageActions, customMessageRenderer = virtuosoContext.customMessageRenderer, DateSeparator = virtuosoContext.DateSeparator, firstUnreadMessageId = virtuosoContext.firstUnreadMessageId, lastReadDate = virtuosoContext.lastReadDate, lastReadMessageId = virtuosoContext.lastReadMessageId, lastReceivedMessageId = virtuosoContext.lastReceivedMessageId, MessageUIComponent = virtuosoContext.Message, messageActions = virtuosoContext.messageActions, MessageSystem = virtuosoContext.MessageSystem, numItemsPrepended = virtuosoContext.numItemsPrepended, ownMessagesReadByOthers = virtuosoContext.ownMessagesReadByOthers, messageList = virtuosoContext.processedMessages, shouldGroupByUser = virtuosoContext.shouldGroupByUser, sortReactionDetails = virtuosoContext.sortReactionDetails, sortReactions = virtuosoContext.sortReactions, _h = virtuosoContext.unreadMessageCount, unreadMessageCount = _h === void 0 ? 0 : _h, UnreadMessagesSeparator = virtuosoContext.UnreadMessagesSeparator, virtuosoRef = virtuosoContext.virtuosoRef;
57040
57065
  var streamMessageIndex = calculateItemIndex(virtuosoIndex, numItemsPrepended);
57041
57066
  if (customMessageRenderer) {
57042
57067
  return customMessageRenderer(messageList, streamMessageIndex);
@@ -57044,7 +57069,7 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
57044
57069
  var message = messageList[streamMessageIndex];
57045
57070
  if (!message)
57046
57071
  return React__default["default"].createElement("div", { style: { height: '1px' } }); // returning null or zero height breaks the virtuoso
57047
- if (message.customType === CUSTOM_MESSAGE_TYPE.date && message.date && isDate(message.date)) {
57072
+ if (isDateSeparatorMessage(message)) {
57048
57073
  return DateSeparator ? React__default["default"].createElement(DateSeparator, { date: message.date, unread: message.unread }) : null;
57049
57074
  }
57050
57075
  if (message.type === 'system') {
@@ -57060,12 +57085,25 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
57060
57085
  (maybePrevMessage && isMessageEdited(maybePrevMessage)));
57061
57086
  var endOfGroup = shouldGroupByUser &&
57062
57087
  (((_e = message.user) === null || _e === void 0 ? void 0 : _e.id) !== ((_f = maybeNextMessage === null || maybeNextMessage === void 0 ? void 0 : maybeNextMessage.user) === null || _f === void 0 ? void 0 : _f.id) || isMessageEdited(message));
57088
+ var createdAtTimestamp = message.created_at && new Date(message.created_at).getTime();
57089
+ var lastReadTimestamp = lastReadDate === null || lastReadDate === void 0 ? void 0 : lastReadDate.getTime();
57090
+ var isFirstMessage = streamMessageIndex === 0;
57063
57091
  var isNewestMessage = lastReadMessageId === lastReceivedMessageId;
57064
- var isLastReadMessage = message.id === lastReadMessageId;
57065
- var showUnreadSeparator = isLastReadMessage && !isNewestMessage && (firstUnreadMessageId || unreadMessageCount > 0); // unread count can be 0 if the user marks unread only own messages
57092
+ var isLastReadMessage = message.id === lastReadMessageId ||
57093
+ (!unreadMessageCount && createdAtTimestamp === lastReadTimestamp);
57094
+ var isFirstUnreadMessage = firstUnreadMessageId === message.id ||
57095
+ (!!unreadMessageCount &&
57096
+ createdAtTimestamp &&
57097
+ lastReadTimestamp &&
57098
+ createdAtTimestamp > lastReadTimestamp &&
57099
+ isFirstMessage);
57100
+ var showUnreadSeparatorAbove = !lastReadMessageId && isFirstUnreadMessage;
57101
+ var showUnreadSeparatorBelow = isLastReadMessage && !isNewestMessage && (firstUnreadMessageId || !!unreadMessageCount);
57066
57102
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
57103
+ showUnreadSeparatorAbove && (React__default["default"].createElement("div", { className: 'str-chat__unread-messages-separator-wrapper' },
57104
+ React__default["default"].createElement(UnreadMessagesSeparator, { unreadCount: unreadMessageCount }))),
57067
57105
  React__default["default"].createElement(Message, { additionalMessageInputProps: additionalMessageInputProps, autoscrollToBottom: (_g = virtuosoRef.current) === null || _g === void 0 ? void 0 : _g.autoscrollToBottom, closeReactionSelectorOnClick: closeReactionSelectorOnClick, customMessageActions: customMessageActions, endOfGroup: endOfGroup, firstOfGroup: firstOfGroup, groupedByUser: groupedByUser, lastReceivedId: lastReceivedMessageId, message: message, Message: MessageUIComponent, messageActions: messageActions, readBy: ownMessagesReadByOthers[message.id] || [], sortReactionDetails: sortReactionDetails, sortReactions: sortReactions }),
57068
- showUnreadSeparator && (React__default["default"].createElement("div", { className: 'str-chat__unread-messages-separator-wrapper' },
57106
+ showUnreadSeparatorBelow && (React__default["default"].createElement("div", { className: 'str-chat__unread-messages-separator-wrapper' },
57069
57107
  React__default["default"].createElement(UnreadMessagesSeparator, { unreadCount: unreadMessageCount })))));
57070
57108
  };
57071
57109
 
@@ -57266,6 +57304,7 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
57266
57304
  DateSeparator: DateSeparator,
57267
57305
  firstUnreadMessageId: channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.first_unread_message_id,
57268
57306
  head: head,
57307
+ lastReadDate: channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read,
57269
57308
  lastReadMessageId: channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read_message_id,
57270
57309
  lastReceivedMessageId: lastReceivedMessageId,
57271
57310
  loadingMore: loadingMore,
@@ -57327,6 +57366,62 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
57327
57366
  }, 5000);
57328
57367
  notificationTimeouts.push(timeout);
57329
57368
  }; };
57369
+ /**
57370
+ * Utility function for jumpToFirstUnreadMessage
57371
+ * @param targetId
57372
+ * @param msgSet
57373
+ */
57374
+ var findInMsgSetById = function (targetId, msgSet) {
57375
+ for (var i = msgSet.length - 1; i >= 0; i--) {
57376
+ var item = msgSet[i];
57377
+ if (item.id === targetId) {
57378
+ return {
57379
+ index: i,
57380
+ target: item,
57381
+ };
57382
+ }
57383
+ }
57384
+ return {
57385
+ index: -1,
57386
+ };
57387
+ };
57388
+ /**
57389
+ * Utility function for jumpToFirstUnreadMessage
57390
+ * @param targetDate
57391
+ * @param msgSet
57392
+ * @param exact
57393
+ */
57394
+ var findInMsgSetByDate = function (targetDate, msgSet, exact) {
57395
+ var _a, _b;
57396
+ if (exact === void 0) { exact = false; }
57397
+ var targetTimestamp = targetDate.getTime();
57398
+ var left = 0;
57399
+ var middle = 0;
57400
+ var right = msgSet.length - 1;
57401
+ while (left <= right) {
57402
+ middle = Math.floor((right + left) / 2);
57403
+ var middleTimestamp = new Date(msgSet[middle].created_at).getTime();
57404
+ var middleLeftTimestamp = ((_a = msgSet[middle - 1]) === null || _a === void 0 ? void 0 : _a.created_at) &&
57405
+ new Date(msgSet[middle - 1].created_at).getTime();
57406
+ var middleRightTimestamp = ((_b = msgSet[middle + 1]) === null || _b === void 0 ? void 0 : _b.created_at) &&
57407
+ new Date(msgSet[middle + 1].created_at).getTime();
57408
+ if (middleTimestamp === targetTimestamp ||
57409
+ (middleLeftTimestamp &&
57410
+ middleRightTimestamp &&
57411
+ middleLeftTimestamp < targetTimestamp &&
57412
+ targetTimestamp < middleRightTimestamp)) {
57413
+ return { index: middle, target: msgSet[middle] };
57414
+ }
57415
+ if (middleTimestamp < targetTimestamp)
57416
+ left = middle + 1;
57417
+ else
57418
+ right = middle - 1;
57419
+ }
57420
+ if (!exact || new Date(msgSet[left].created_at).getTime() === targetTimestamp) {
57421
+ return { index: left, target: msgSet[left] };
57422
+ }
57423
+ return { index: -1 };
57424
+ };
57330
57425
 
57331
57426
  window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};/**
57332
57427
  * @deprecated will be removed in the next major release
@@ -57705,6 +57800,9 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
57705
57800
  unread_messages: (_a = event.unread_messages) !== null && _a !== void 0 ? _a : 0,
57706
57801
  };
57707
57802
  });
57803
+ if (event.type === 'channel.truncated' && event.cid === channel.cid) {
57804
+ _setChannelUnreadUiState(undefined);
57805
+ }
57708
57806
  throttledCopyStateFromChannel();
57709
57807
  return [2 /*return*/];
57710
57808
  }
@@ -57864,7 +57962,7 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
57864
57962
  });
57865
57963
  };
57866
57964
  var loadMoreNewer = function (limit) {
57867
- if (limit === void 0) { limit = 100; }
57965
+ if (limit === void 0) { limit = DEFAULT_NEXT_CHANNEL_PAGE_SIZE; }
57868
57966
  return __awaiter(void 0, void 0, void 0, function () {
57869
57967
  var newestMessage, newestId, perPage, queryResponse, e_4, hasMoreNewerMessages;
57870
57968
  var _a, _b;
@@ -57908,7 +58006,7 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
57908
58006
  };
57909
58007
  var clearHighlightedMessageTimeoutId = React$2.useRef(null);
57910
58008
  var jumpToMessage = function (messageId, messageLimit) {
57911
- if (messageLimit === void 0) { messageLimit = 100; }
58009
+ if (messageLimit === void 0) { messageLimit = DEFAULT_JUMP_TO_PAGE_SIZE; }
57912
58010
  return __awaiter(void 0, void 0, void 0, function () {
57913
58011
  var indexOfMessage, hasMoreMessages;
57914
58012
  return __generator(this, function (_a) {
@@ -57955,57 +58053,113 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
57955
58053
  });
57956
58054
  }); };
57957
58055
  var jumpToFirstUnreadMessage = React$2.useCallback(function (queryMessageLimit) {
57958
- if (queryMessageLimit === void 0) { queryMessageLimit = 100; }
58056
+ if (queryMessageLimit === void 0) { queryMessageLimit = DEFAULT_JUMP_TO_PAGE_SIZE; }
57959
58057
  return __awaiter(void 0, void 0, void 0, function () {
57960
- var indexOfLastReadMessage, currentMessageSet, i, id, hasMoreMessages, firstUnreadMessage, jumpToMessageId;
57961
- var _a;
57962
- return __generator(this, function (_b) {
57963
- switch (_b.label) {
58058
+ var lastReadMessageId, firstUnreadMessageId, isInCurrentMessageSet, hasMoreMessages, result, result, lastReadTimestamp, _a, lastReadMessageIndex, lastReadMessage, messages, firstMessageWithCreationDate, firstMessageTimestamp, result, targetId_1, indexOfTarget;
58059
+ var _b, _c, _d, _e;
58060
+ return __generator(this, function (_f) {
58061
+ switch (_f.label) {
57964
58062
  case 0:
57965
- if (!(client.user && (channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages)))
58063
+ if (!(channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages))
57966
58064
  return [2 /*return*/];
57967
- if (!(channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read_message_id)) {
57968
- addNotification(t('Failed to jump to the first unread message'), 'error');
57969
- return [2 /*return*/];
57970
- }
57971
- currentMessageSet = channel.state.messages;
57972
- for (i = currentMessageSet.length - 1; i >= 0; i--) {
57973
- id = currentMessageSet[i].id;
57974
- if (id === channelUnreadUiState.last_read_message_id) {
57975
- indexOfLastReadMessage = i;
57976
- break;
57977
- }
57978
- }
57979
- if (!(typeof indexOfLastReadMessage === 'undefined')) return [3 /*break*/, 5];
57980
- dispatch({ loadingMore: true, type: 'setLoadingMore' });
58065
+ lastReadMessageId = channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read_message_id;
58066
+ firstUnreadMessageId = channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.first_unread_message_id;
58067
+ isInCurrentMessageSet = false;
57981
58068
  hasMoreMessages = true;
57982
- _b.label = 1;
58069
+ if (!firstUnreadMessageId) return [3 /*break*/, 1];
58070
+ result = findInMsgSetById(firstUnreadMessageId, channel.state.messages);
58071
+ isInCurrentMessageSet = result.index !== -1;
58072
+ return [3 /*break*/, 8];
57983
58073
  case 1:
57984
- _b.trys.push([1, 3, , 4]);
57985
- return [4 /*yield*/, channel.state.loadMessageIntoState(channelUnreadUiState.last_read_message_id, undefined, queryMessageLimit)];
58074
+ if (!lastReadMessageId) return [3 /*break*/, 2];
58075
+ result = findInMsgSetById(lastReadMessageId, channel.state.messages);
58076
+ isInCurrentMessageSet = !!result.target;
58077
+ firstUnreadMessageId =
58078
+ result.index > -1 ? (_b = channel.state.messages[result.index + 1]) === null || _b === void 0 ? void 0 : _b.id : undefined;
58079
+ return [3 /*break*/, 8];
57986
58080
  case 2:
57987
- _b.sent();
57988
- /**
57989
- * if the index of the last read message on the page is beyond the half of the page,
57990
- * we have arrived to the oldest page of the channel
57991
- */
57992
- indexOfLastReadMessage = channel.state.messages.findIndex(function (message) { return message.id === channelUnreadUiState.last_read_message_id; });
57993
- hasMoreMessages = indexOfLastReadMessage >= Math.floor(queryMessageLimit / 2);
57994
- return [3 /*break*/, 4];
58081
+ lastReadTimestamp = channelUnreadUiState.last_read.getTime();
58082
+ _a = findInMsgSetByDate(channelUnreadUiState.last_read, channel.state.messages, true), lastReadMessageIndex = _a.index, lastReadMessage = _a.target;
58083
+ if (!lastReadMessage) return [3 /*break*/, 3];
58084
+ firstUnreadMessageId = (_c = channel.state.messages[lastReadMessageIndex + 1]) === null || _c === void 0 ? void 0 : _c.id;
58085
+ isInCurrentMessageSet = !!firstUnreadMessageId;
58086
+ lastReadMessageId = lastReadMessage.id;
58087
+ return [3 /*break*/, 8];
57995
58088
  case 3:
57996
- _b.sent();
58089
+ dispatch({ loadingMore: true, type: 'setLoadingMore' });
58090
+ messages = void 0;
58091
+ _f.label = 4;
58092
+ case 4:
58093
+ _f.trys.push([4, 6, , 7]);
58094
+ return [4 /*yield*/, channel.query({
58095
+ messages: {
58096
+ created_at_around: channelUnreadUiState.last_read.toISOString(),
58097
+ limit: queryMessageLimit,
58098
+ },
58099
+ }, 'new')];
58100
+ case 5:
58101
+ messages = (_f.sent()).messages;
58102
+ return [3 /*break*/, 7];
58103
+ case 6:
58104
+ _f.sent();
57997
58105
  addNotification(t('Failed to jump to the first unread message'), 'error');
57998
58106
  loadMoreFinished(hasMoreMessages, channel.state.messages);
57999
58107
  return [2 /*return*/];
58000
- case 4:
58108
+ case 7:
58109
+ firstMessageWithCreationDate = messages.find(function (msg) { return msg.created_at; });
58110
+ if (!firstMessageWithCreationDate) {
58111
+ addNotification(t('Failed to jump to the first unread message'), 'error');
58112
+ loadMoreFinished(hasMoreMessages, channel.state.messages);
58113
+ return [2 /*return*/];
58114
+ }
58115
+ firstMessageTimestamp = new Date(firstMessageWithCreationDate.created_at).getTime();
58116
+ if (lastReadTimestamp < firstMessageTimestamp) {
58117
+ // whole channel is unread
58118
+ firstUnreadMessageId = firstMessageWithCreationDate.id;
58119
+ hasMoreMessages = false;
58120
+ }
58121
+ else {
58122
+ result = findInMsgSetByDate(channelUnreadUiState.last_read, messages);
58123
+ lastReadMessageId = (_d = result.target) === null || _d === void 0 ? void 0 : _d.id;
58124
+ hasMoreMessages = result.index >= Math.floor(queryMessageLimit / 2);
58125
+ }
58001
58126
  loadMoreFinished(hasMoreMessages, channel.state.messages);
58002
- _b.label = 5;
58003
- case 5:
58004
- firstUnreadMessage = channel.state.messages[indexOfLastReadMessage + 1];
58005
- jumpToMessageId = (_a = firstUnreadMessage === null || firstUnreadMessage === void 0 ? void 0 : firstUnreadMessage.id) !== null && _a !== void 0 ? _a : channelUnreadUiState.last_read_message_id;
58127
+ _f.label = 8;
58128
+ case 8:
58129
+ if (!firstUnreadMessageId && !lastReadMessageId) {
58130
+ addNotification(t('Failed to jump to the first unread message'), 'error');
58131
+ return [2 /*return*/];
58132
+ }
58133
+ if (!!isInCurrentMessageSet) return [3 /*break*/, 12];
58134
+ dispatch({ loadingMore: true, type: 'setLoadingMore' });
58135
+ _f.label = 9;
58136
+ case 9:
58137
+ _f.trys.push([9, 11, , 12]);
58138
+ targetId_1 = (firstUnreadMessageId !== null && firstUnreadMessageId !== void 0 ? firstUnreadMessageId : lastReadMessageId);
58139
+ return [4 /*yield*/, channel.state.loadMessageIntoState(targetId_1, undefined, queryMessageLimit)];
58140
+ case 10:
58141
+ _f.sent();
58142
+ indexOfTarget = channel.state.messages.findIndex(function (message) { return message.id === targetId_1; });
58143
+ hasMoreMessages = indexOfTarget >= Math.floor(queryMessageLimit / 2);
58144
+ loadMoreFinished(hasMoreMessages, channel.state.messages);
58145
+ firstUnreadMessageId =
58146
+ firstUnreadMessageId !== null && firstUnreadMessageId !== void 0 ? firstUnreadMessageId : (_e = channel.state.messages[indexOfTarget + 1]) === null || _e === void 0 ? void 0 : _e.id;
58147
+ return [3 /*break*/, 12];
58148
+ case 11:
58149
+ _f.sent();
58150
+ addNotification(t('Failed to jump to the first unread message'), 'error');
58151
+ loadMoreFinished(hasMoreMessages, channel.state.messages);
58152
+ return [2 /*return*/];
58153
+ case 12:
58154
+ if (!firstUnreadMessageId) {
58155
+ addNotification(t('Failed to jump to the first unread message'), 'error');
58156
+ return [2 /*return*/];
58157
+ }
58158
+ if (!channelUnreadUiState.first_unread_message_id)
58159
+ _setChannelUnreadUiState(__assign(__assign({}, channelUnreadUiState), { first_unread_message_id: firstUnreadMessageId, last_read_message_id: lastReadMessageId }));
58006
58160
  dispatch({
58007
58161
  hasMoreNewer: channel.state.messages !== channel.state.latestMessages,
58008
- highlightedMessageId: jumpToMessageId,
58162
+ highlightedMessageId: firstUnreadMessageId,
58009
58163
  type: 'jumpToMessageFinished',
58010
58164
  });
58011
58165
  if (clearHighlightedMessageTimeoutId.current) {
@@ -58019,7 +58173,7 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
58019
58173
  }
58020
58174
  });
58021
58175
  });
58022
- }, [addNotification, channel, client, loadMoreFinished, t, channelUnreadUiState]);
58176
+ }, [addNotification, channel, loadMoreFinished, t, channelUnreadUiState]);
58023
58177
  var deleteMessage = React$2.useCallback(function (message) { return __awaiter(void 0, void 0, void 0, function () {
58024
58178
  var deletedMessage, result;
58025
58179
  return __generator(this, function (_a) {
@@ -58103,8 +58257,24 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
58103
58257
  case 6:
58104
58258
  error_1 = _d.sent();
58105
58259
  stringError = JSON.stringify(error_1);
58106
- parsedError = stringError ? JSON.parse(stringError) : {};
58107
- updateMessage(__assign(__assign({}, message), { error: parsedError, errorStatusCode: parsedError.status || undefined, status: 'failed' }));
58260
+ parsedError = (stringError
58261
+ ? JSON.parse(stringError)
58262
+ : {});
58263
+ // Handle the case where the message already exists
58264
+ // (typically, when retrying to send a message).
58265
+ // If the message already exists, we can assume it was sent successfully,
58266
+ // so we update the message status to "received".
58267
+ // Right now, the only way to check this error is by checking
58268
+ // the combination of the error code and the error description,
58269
+ // since there is no special error code for duplicate messages.
58270
+ if (parsedError.code === 4 &&
58271
+ error_1 instanceof Error &&
58272
+ error_1.message.includes('already exists')) {
58273
+ updateMessage(__assign(__assign({}, message), { status: 'received' }));
58274
+ }
58275
+ else {
58276
+ updateMessage(__assign(__assign({}, message), { error: parsedError, errorStatusCode: parsedError.status || undefined, status: 'failed' }));
58277
+ }
58108
58278
  return [3 /*break*/, 7];
58109
58279
  case 7: return [2 /*return*/];
58110
58280
  }
@@ -59680,7 +59850,7 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
59680
59850
 
59681
59851
  window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};
59682
59852
 
59683
- window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};var version$1 = '11.12.1';
59853
+ window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};var version$1 = '11.12.2';
59684
59854
 
59685
59855
  window.StreamChat.StreamChat=StreamChat;window.StreamChat.logChatPromiseExecution=logChatPromiseExecution;window.StreamChat.Channel=Channel;window.ICAL=window.ICAL||{};var useChat = function (_a) {
59686
59856
  var _b, _c;
@@ -84353,6 +84523,7 @@ var StreamChatReact = (function (exports, React$2, jsxRuntime, ReactDOM, streamC
84353
84523
  exports.isAudioAttachment = isAudioAttachment;
84354
84524
  exports.isChannel = isChannel;
84355
84525
  exports.isDate = isDate;
84526
+ exports.isDateSeparatorMessage = isDateSeparatorMessage;
84356
84527
  exports.isDayOrMoment = isDayOrMoment;
84357
84528
  exports.isFileAttachment = isFileAttachment;
84358
84529
  exports.isGalleryAttachmentType = isGalleryAttachmentType;