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
@@ -42034,6 +42034,7 @@ var DropzoneProvider = function (props) {
42034
42034
 
42035
42035
  var DEFAULT_INITIAL_CHANNEL_PAGE_SIZE = 25;
42036
42036
  var DEFAULT_NEXT_CHANNEL_PAGE_SIZE = 100;
42037
+ var DEFAULT_JUMP_TO_PAGE_SIZE = 100;
42037
42038
  var DEFAULT_THREAD_PAGE_SIZE = 50;
42038
42039
  var DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD = 250;
42039
42040
 
@@ -42395,6 +42396,9 @@ var hasMoreMessagesProbably = function (returnedCountMessages, limit) {
42395
42396
  var hasNotMoreMessages = function (returnedCountMessages, limit) {
42396
42397
  return returnedCountMessages < limit;
42397
42398
  };
42399
+ function isDateSeparatorMessage(message) {
42400
+ return message.customType === CUSTOM_MESSAGE_TYPE.date && !!message.date && isDate(message.date);
42401
+ }
42398
42402
 
42399
42403
  var UNREAD_MESSAGE_SEPARATOR_CLASS = 'str-chat__unread-messages-separator';
42400
42404
  var UnreadMessagesSeparator = function (_a) {
@@ -42542,57 +42546,6 @@ var UnMemoizedTypingIndicator = function (props) {
42542
42546
  };
42543
42547
  var TypingIndicator = React__default["default"].memo(UnMemoizedTypingIndicator);
42544
42548
 
42545
- var UnMemoizedScrollToBottomButton = function (props) {
42546
- var isMessageListScrolledToBottom = props.isMessageListScrolledToBottom, onClick = props.onClick, threadList = props.threadList;
42547
- var _a = useChatContext(), activeChannel = _a.channel, client = _a.client;
42548
- var thread = useChannelStateContext().thread;
42549
- var _b = React.useState((activeChannel === null || activeChannel === void 0 ? void 0 : activeChannel.countUnread()) || 0), countUnread = _b[0], setCountUnread = _b[1];
42550
- var _c = React.useState((thread === null || thread === void 0 ? void 0 : thread.reply_count) || 0), replyCount = _c[0], setReplyCount = _c[1];
42551
- var observedEvent = threadList ? 'message.updated' : 'message.new';
42552
- React.useEffect(function () {
42553
- var handleEvent = function (event) {
42554
- var _a, _b, _c, _d, _e;
42555
- var newMessageInAnotherChannel = event.cid !== (activeChannel === null || activeChannel === void 0 ? void 0 : activeChannel.cid);
42556
- var newMessageIsMine = ((_a = event.user) === null || _a === void 0 ? void 0 : _a.id) === ((_b = client.user) === null || _b === void 0 ? void 0 : _b.id);
42557
- var isThreadOpen = !!thread;
42558
- var newMessageIsReply = !!((_c = event.message) === null || _c === void 0 ? void 0 : _c.parent_id);
42559
- var dontIncreaseMainListCounterOnNewReply = isThreadOpen && !threadList && newMessageIsReply;
42560
- if (isMessageListScrolledToBottom ||
42561
- newMessageInAnotherChannel ||
42562
- newMessageIsMine ||
42563
- dontIncreaseMainListCounterOnNewReply) {
42564
- return;
42565
- }
42566
- if (event.type === 'message.new') {
42567
- // cannot rely on channel.countUnread because active channel is automatically marked read
42568
- setCountUnread(function (prev) { return prev + 1; });
42569
- }
42570
- else if (((_d = event.message) === null || _d === void 0 ? void 0 : _d.id) === (thread === null || thread === void 0 ? void 0 : thread.id)) {
42571
- var newReplyCount_1 = ((_e = event.message) === null || _e === void 0 ? void 0 : _e.reply_count) || 0;
42572
- setCountUnread(function () { return newReplyCount_1 - replyCount; });
42573
- }
42574
- };
42575
- client.on(observedEvent, handleEvent);
42576
- return function () {
42577
- client.off(observedEvent, handleEvent);
42578
- };
42579
- // eslint-disable-next-line react-hooks/exhaustive-deps
42580
- }, [activeChannel, isMessageListScrolledToBottom, observedEvent, replyCount, thread]);
42581
- React.useEffect(function () {
42582
- if (isMessageListScrolledToBottom) {
42583
- setCountUnread(0);
42584
- setReplyCount((thread === null || thread === void 0 ? void 0 : thread.reply_count) || 0);
42585
- }
42586
- }, [isMessageListScrolledToBottom, thread]);
42587
- if (isMessageListScrolledToBottom)
42588
- return null;
42589
- return (React__default["default"].createElement("div", { className: 'str-chat__jump-to-latest-message' },
42590
- React__default["default"].createElement("button", { "aria-live": 'polite', className: "\n str-chat__message-notification-right\n str-chat__message-notification-scroll-to-latest\n str-chat__circle-fab\n ", "data-testid": 'message-notification', onClick: onClick },
42591
- React__default["default"].createElement(ArrowDown, null),
42592
- countUnread > 0 && (React__default["default"].createElement("div", { className: clsx('str-chat__message-notification', 'str-chat__message-notification-scroll-to-latest-unread-count', 'str-chat__jump-to-latest-unread-count'), "data-testid": 'unread-message-notification-counter' }, countUnread)))));
42593
- };
42594
- var ScrollToBottomButton = React__default["default"].memo(UnMemoizedScrollToBottomButton);
42595
-
42596
42549
  var selectColor = function (number, dark) {
42597
42550
  var hue = number * 137.508; // use golden angle approximation
42598
42551
  return "hsl(".concat(hue, ",").concat(dark ? '50%' : '85%', ", ").concat(dark ? '75%' : '55%', ")");
@@ -42655,6 +42608,57 @@ var UnMemoizedFixedHeightMessage = function (props) {
42655
42608
  */
42656
42609
  var FixedHeightMessage = React__default["default"].memo(UnMemoizedFixedHeightMessage);
42657
42610
 
42611
+ var UnMemoizedScrollToBottomButton = function (props) {
42612
+ var isMessageListScrolledToBottom = props.isMessageListScrolledToBottom, onClick = props.onClick, threadList = props.threadList;
42613
+ var _a = useChatContext(), activeChannel = _a.channel, client = _a.client;
42614
+ var thread = useChannelStateContext().thread;
42615
+ var _b = React.useState((activeChannel === null || activeChannel === void 0 ? void 0 : activeChannel.countUnread()) || 0), countUnread = _b[0], setCountUnread = _b[1];
42616
+ var _c = React.useState((thread === null || thread === void 0 ? void 0 : thread.reply_count) || 0), replyCount = _c[0], setReplyCount = _c[1];
42617
+ var observedEvent = threadList ? 'message.updated' : 'message.new';
42618
+ React.useEffect(function () {
42619
+ var handleEvent = function (event) {
42620
+ var _a, _b, _c, _d, _e;
42621
+ var newMessageInAnotherChannel = event.cid !== (activeChannel === null || activeChannel === void 0 ? void 0 : activeChannel.cid);
42622
+ var newMessageIsMine = ((_a = event.user) === null || _a === void 0 ? void 0 : _a.id) === ((_b = client.user) === null || _b === void 0 ? void 0 : _b.id);
42623
+ var isThreadOpen = !!thread;
42624
+ var newMessageIsReply = !!((_c = event.message) === null || _c === void 0 ? void 0 : _c.parent_id);
42625
+ var dontIncreaseMainListCounterOnNewReply = isThreadOpen && !threadList && newMessageIsReply;
42626
+ if (isMessageListScrolledToBottom ||
42627
+ newMessageInAnotherChannel ||
42628
+ newMessageIsMine ||
42629
+ dontIncreaseMainListCounterOnNewReply) {
42630
+ return;
42631
+ }
42632
+ if (event.type === 'message.new') {
42633
+ // cannot rely on channel.countUnread because active channel is automatically marked read
42634
+ setCountUnread(function (prev) { return prev + 1; });
42635
+ }
42636
+ else if (((_d = event.message) === null || _d === void 0 ? void 0 : _d.id) === (thread === null || thread === void 0 ? void 0 : thread.id)) {
42637
+ var newReplyCount_1 = ((_e = event.message) === null || _e === void 0 ? void 0 : _e.reply_count) || 0;
42638
+ setCountUnread(function () { return newReplyCount_1 - replyCount; });
42639
+ }
42640
+ };
42641
+ client.on(observedEvent, handleEvent);
42642
+ return function () {
42643
+ client.off(observedEvent, handleEvent);
42644
+ };
42645
+ // eslint-disable-next-line react-hooks/exhaustive-deps
42646
+ }, [activeChannel, isMessageListScrolledToBottom, observedEvent, replyCount, thread]);
42647
+ React.useEffect(function () {
42648
+ if (isMessageListScrolledToBottom) {
42649
+ setCountUnread(0);
42650
+ setReplyCount((thread === null || thread === void 0 ? void 0 : thread.reply_count) || 0);
42651
+ }
42652
+ }, [isMessageListScrolledToBottom, thread]);
42653
+ if (isMessageListScrolledToBottom)
42654
+ return null;
42655
+ return (React__default["default"].createElement("div", { className: 'str-chat__jump-to-latest-message' },
42656
+ React__default["default"].createElement("button", { "aria-live": 'polite', className: "\n str-chat__message-notification-right\n str-chat__message-notification-scroll-to-latest\n str-chat__circle-fab\n ", "data-testid": 'message-notification', onClick: onClick },
42657
+ React__default["default"].createElement(ArrowDown, null),
42658
+ countUnread > 0 && (React__default["default"].createElement("div", { className: clsx('str-chat__message-notification', 'str-chat__message-notification-scroll-to-latest-unread-count', 'str-chat__jump-to-latest-unread-count'), "data-testid": 'unread-message-notification-counter' }, countUnread)))));
42659
+ };
42660
+ var ScrollToBottomButton = React__default["default"].memo(UnMemoizedScrollToBottomButton);
42661
+
42658
42662
  var useChannelContainerClasses = function (_a) {
42659
42663
  var _b, _c, _d;
42660
42664
  var customClasses = _a.customClasses;
@@ -42682,6 +42686,62 @@ var makeAddNotifications = function (setNotifications, notificationTimeouts) { r
42682
42686
  }, 5000);
42683
42687
  notificationTimeouts.push(timeout);
42684
42688
  }; };
42689
+ /**
42690
+ * Utility function for jumpToFirstUnreadMessage
42691
+ * @param targetId
42692
+ * @param msgSet
42693
+ */
42694
+ var findInMsgSetById = function (targetId, msgSet) {
42695
+ for (var i = msgSet.length - 1; i >= 0; i--) {
42696
+ var item = msgSet[i];
42697
+ if (item.id === targetId) {
42698
+ return {
42699
+ index: i,
42700
+ target: item,
42701
+ };
42702
+ }
42703
+ }
42704
+ return {
42705
+ index: -1,
42706
+ };
42707
+ };
42708
+ /**
42709
+ * Utility function for jumpToFirstUnreadMessage
42710
+ * @param targetDate
42711
+ * @param msgSet
42712
+ * @param exact
42713
+ */
42714
+ var findInMsgSetByDate = function (targetDate, msgSet, exact) {
42715
+ var _a, _b;
42716
+ if (exact === void 0) { exact = false; }
42717
+ var targetTimestamp = targetDate.getTime();
42718
+ var left = 0;
42719
+ var middle = 0;
42720
+ var right = msgSet.length - 1;
42721
+ while (left <= right) {
42722
+ middle = Math.floor((right + left) / 2);
42723
+ var middleTimestamp = new Date(msgSet[middle].created_at).getTime();
42724
+ var middleLeftTimestamp = ((_a = msgSet[middle - 1]) === null || _a === void 0 ? void 0 : _a.created_at) &&
42725
+ new Date(msgSet[middle - 1].created_at).getTime();
42726
+ var middleRightTimestamp = ((_b = msgSet[middle + 1]) === null || _b === void 0 ? void 0 : _b.created_at) &&
42727
+ new Date(msgSet[middle + 1].created_at).getTime();
42728
+ if (middleTimestamp === targetTimestamp ||
42729
+ (middleLeftTimestamp &&
42730
+ middleRightTimestamp &&
42731
+ middleLeftTimestamp < targetTimestamp &&
42732
+ targetTimestamp < middleRightTimestamp)) {
42733
+ return { index: middle, target: msgSet[middle] };
42734
+ }
42735
+ if (middleTimestamp < targetTimestamp)
42736
+ left = middle + 1;
42737
+ else
42738
+ right = middle - 1;
42739
+ }
42740
+ if (!exact || new Date(msgSet[left].created_at).getTime() === targetTimestamp) {
42741
+ return { index: left, target: msgSet[left] };
42742
+ }
42743
+ return { index: -1 };
42744
+ };
42685
42745
 
42686
42746
  /**
42687
42747
  * @deprecated will be removed in the next major release
@@ -43054,6 +43114,9 @@ var ChannelInner = function (props) {
43054
43114
  unread_messages: (_a = event.unread_messages) !== null && _a !== void 0 ? _a : 0,
43055
43115
  };
43056
43116
  });
43117
+ if (event.type === 'channel.truncated' && event.cid === channel.cid) {
43118
+ _setChannelUnreadUiState(undefined);
43119
+ }
43057
43120
  throttledCopyStateFromChannel();
43058
43121
  return [2 /*return*/];
43059
43122
  }
@@ -43213,7 +43276,7 @@ var ChannelInner = function (props) {
43213
43276
  });
43214
43277
  };
43215
43278
  var loadMoreNewer = function (limit) {
43216
- if (limit === void 0) { limit = 100; }
43279
+ if (limit === void 0) { limit = DEFAULT_NEXT_CHANNEL_PAGE_SIZE; }
43217
43280
  return __awaiter(void 0, void 0, void 0, function () {
43218
43281
  var newestMessage, newestId, perPage, queryResponse, e_4, hasMoreNewerMessages;
43219
43282
  var _a, _b;
@@ -43257,7 +43320,7 @@ var ChannelInner = function (props) {
43257
43320
  };
43258
43321
  var clearHighlightedMessageTimeoutId = React.useRef(null);
43259
43322
  var jumpToMessage = function (messageId, messageLimit) {
43260
- if (messageLimit === void 0) { messageLimit = 100; }
43323
+ if (messageLimit === void 0) { messageLimit = DEFAULT_JUMP_TO_PAGE_SIZE; }
43261
43324
  return __awaiter(void 0, void 0, void 0, function () {
43262
43325
  var indexOfMessage, hasMoreMessages;
43263
43326
  return __generator(this, function (_a) {
@@ -43304,57 +43367,113 @@ var ChannelInner = function (props) {
43304
43367
  });
43305
43368
  }); };
43306
43369
  var jumpToFirstUnreadMessage = React.useCallback(function (queryMessageLimit) {
43307
- if (queryMessageLimit === void 0) { queryMessageLimit = 100; }
43370
+ if (queryMessageLimit === void 0) { queryMessageLimit = DEFAULT_JUMP_TO_PAGE_SIZE; }
43308
43371
  return __awaiter(void 0, void 0, void 0, function () {
43309
- var indexOfLastReadMessage, currentMessageSet, i, id, hasMoreMessages, firstUnreadMessage, jumpToMessageId;
43310
- var _a;
43311
- return __generator(this, function (_b) {
43312
- switch (_b.label) {
43372
+ var lastReadMessageId, firstUnreadMessageId, isInCurrentMessageSet, hasMoreMessages, result, result, lastReadTimestamp, _a, lastReadMessageIndex, lastReadMessage, messages, firstMessageWithCreationDate, firstMessageTimestamp, result, targetId_1, indexOfTarget;
43373
+ var _b, _c, _d, _e;
43374
+ return __generator(this, function (_f) {
43375
+ switch (_f.label) {
43313
43376
  case 0:
43314
- if (!(client.user && (channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages)))
43377
+ if (!(channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages))
43315
43378
  return [2 /*return*/];
43316
- if (!(channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read_message_id)) {
43317
- addNotification(t('Failed to jump to the first unread message'), 'error');
43318
- return [2 /*return*/];
43319
- }
43320
- currentMessageSet = channel.state.messages;
43321
- for (i = currentMessageSet.length - 1; i >= 0; i--) {
43322
- id = currentMessageSet[i].id;
43323
- if (id === channelUnreadUiState.last_read_message_id) {
43324
- indexOfLastReadMessage = i;
43325
- break;
43326
- }
43327
- }
43328
- if (!(typeof indexOfLastReadMessage === 'undefined')) return [3 /*break*/, 5];
43329
- dispatch({ loadingMore: true, type: 'setLoadingMore' });
43379
+ lastReadMessageId = channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read_message_id;
43380
+ firstUnreadMessageId = channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.first_unread_message_id;
43381
+ isInCurrentMessageSet = false;
43330
43382
  hasMoreMessages = true;
43331
- _b.label = 1;
43383
+ if (!firstUnreadMessageId) return [3 /*break*/, 1];
43384
+ result = findInMsgSetById(firstUnreadMessageId, channel.state.messages);
43385
+ isInCurrentMessageSet = result.index !== -1;
43386
+ return [3 /*break*/, 8];
43332
43387
  case 1:
43333
- _b.trys.push([1, 3, , 4]);
43334
- return [4 /*yield*/, channel.state.loadMessageIntoState(channelUnreadUiState.last_read_message_id, undefined, queryMessageLimit)];
43388
+ if (!lastReadMessageId) return [3 /*break*/, 2];
43389
+ result = findInMsgSetById(lastReadMessageId, channel.state.messages);
43390
+ isInCurrentMessageSet = !!result.target;
43391
+ firstUnreadMessageId =
43392
+ result.index > -1 ? (_b = channel.state.messages[result.index + 1]) === null || _b === void 0 ? void 0 : _b.id : undefined;
43393
+ return [3 /*break*/, 8];
43335
43394
  case 2:
43336
- _b.sent();
43337
- /**
43338
- * if the index of the last read message on the page is beyond the half of the page,
43339
- * we have arrived to the oldest page of the channel
43340
- */
43341
- indexOfLastReadMessage = channel.state.messages.findIndex(function (message) { return message.id === channelUnreadUiState.last_read_message_id; });
43342
- hasMoreMessages = indexOfLastReadMessage >= Math.floor(queryMessageLimit / 2);
43343
- return [3 /*break*/, 4];
43395
+ lastReadTimestamp = channelUnreadUiState.last_read.getTime();
43396
+ _a = findInMsgSetByDate(channelUnreadUiState.last_read, channel.state.messages, true), lastReadMessageIndex = _a.index, lastReadMessage = _a.target;
43397
+ if (!lastReadMessage) return [3 /*break*/, 3];
43398
+ firstUnreadMessageId = (_c = channel.state.messages[lastReadMessageIndex + 1]) === null || _c === void 0 ? void 0 : _c.id;
43399
+ isInCurrentMessageSet = !!firstUnreadMessageId;
43400
+ lastReadMessageId = lastReadMessage.id;
43401
+ return [3 /*break*/, 8];
43344
43402
  case 3:
43345
- _b.sent();
43403
+ dispatch({ loadingMore: true, type: 'setLoadingMore' });
43404
+ messages = void 0;
43405
+ _f.label = 4;
43406
+ case 4:
43407
+ _f.trys.push([4, 6, , 7]);
43408
+ return [4 /*yield*/, channel.query({
43409
+ messages: {
43410
+ created_at_around: channelUnreadUiState.last_read.toISOString(),
43411
+ limit: queryMessageLimit,
43412
+ },
43413
+ }, 'new')];
43414
+ case 5:
43415
+ messages = (_f.sent()).messages;
43416
+ return [3 /*break*/, 7];
43417
+ case 6:
43418
+ _f.sent();
43346
43419
  addNotification(t('Failed to jump to the first unread message'), 'error');
43347
43420
  loadMoreFinished(hasMoreMessages, channel.state.messages);
43348
43421
  return [2 /*return*/];
43349
- case 4:
43422
+ case 7:
43423
+ firstMessageWithCreationDate = messages.find(function (msg) { return msg.created_at; });
43424
+ if (!firstMessageWithCreationDate) {
43425
+ addNotification(t('Failed to jump to the first unread message'), 'error');
43426
+ loadMoreFinished(hasMoreMessages, channel.state.messages);
43427
+ return [2 /*return*/];
43428
+ }
43429
+ firstMessageTimestamp = new Date(firstMessageWithCreationDate.created_at).getTime();
43430
+ if (lastReadTimestamp < firstMessageTimestamp) {
43431
+ // whole channel is unread
43432
+ firstUnreadMessageId = firstMessageWithCreationDate.id;
43433
+ hasMoreMessages = false;
43434
+ }
43435
+ else {
43436
+ result = findInMsgSetByDate(channelUnreadUiState.last_read, messages);
43437
+ lastReadMessageId = (_d = result.target) === null || _d === void 0 ? void 0 : _d.id;
43438
+ hasMoreMessages = result.index >= Math.floor(queryMessageLimit / 2);
43439
+ }
43350
43440
  loadMoreFinished(hasMoreMessages, channel.state.messages);
43351
- _b.label = 5;
43352
- case 5:
43353
- firstUnreadMessage = channel.state.messages[indexOfLastReadMessage + 1];
43354
- jumpToMessageId = (_a = firstUnreadMessage === null || firstUnreadMessage === void 0 ? void 0 : firstUnreadMessage.id) !== null && _a !== void 0 ? _a : channelUnreadUiState.last_read_message_id;
43441
+ _f.label = 8;
43442
+ case 8:
43443
+ if (!firstUnreadMessageId && !lastReadMessageId) {
43444
+ addNotification(t('Failed to jump to the first unread message'), 'error');
43445
+ return [2 /*return*/];
43446
+ }
43447
+ if (!!isInCurrentMessageSet) return [3 /*break*/, 12];
43448
+ dispatch({ loadingMore: true, type: 'setLoadingMore' });
43449
+ _f.label = 9;
43450
+ case 9:
43451
+ _f.trys.push([9, 11, , 12]);
43452
+ targetId_1 = (firstUnreadMessageId !== null && firstUnreadMessageId !== void 0 ? firstUnreadMessageId : lastReadMessageId);
43453
+ return [4 /*yield*/, channel.state.loadMessageIntoState(targetId_1, undefined, queryMessageLimit)];
43454
+ case 10:
43455
+ _f.sent();
43456
+ indexOfTarget = channel.state.messages.findIndex(function (message) { return message.id === targetId_1; });
43457
+ hasMoreMessages = indexOfTarget >= Math.floor(queryMessageLimit / 2);
43458
+ loadMoreFinished(hasMoreMessages, channel.state.messages);
43459
+ firstUnreadMessageId =
43460
+ firstUnreadMessageId !== null && firstUnreadMessageId !== void 0 ? firstUnreadMessageId : (_e = channel.state.messages[indexOfTarget + 1]) === null || _e === void 0 ? void 0 : _e.id;
43461
+ return [3 /*break*/, 12];
43462
+ case 11:
43463
+ _f.sent();
43464
+ addNotification(t('Failed to jump to the first unread message'), 'error');
43465
+ loadMoreFinished(hasMoreMessages, channel.state.messages);
43466
+ return [2 /*return*/];
43467
+ case 12:
43468
+ if (!firstUnreadMessageId) {
43469
+ addNotification(t('Failed to jump to the first unread message'), 'error');
43470
+ return [2 /*return*/];
43471
+ }
43472
+ if (!channelUnreadUiState.first_unread_message_id)
43473
+ _setChannelUnreadUiState(exports.__assign(exports.__assign({}, channelUnreadUiState), { first_unread_message_id: firstUnreadMessageId, last_read_message_id: lastReadMessageId }));
43355
43474
  dispatch({
43356
43475
  hasMoreNewer: channel.state.messages !== channel.state.latestMessages,
43357
- highlightedMessageId: jumpToMessageId,
43476
+ highlightedMessageId: firstUnreadMessageId,
43358
43477
  type: 'jumpToMessageFinished',
43359
43478
  });
43360
43479
  if (clearHighlightedMessageTimeoutId.current) {
@@ -43368,7 +43487,7 @@ var ChannelInner = function (props) {
43368
43487
  }
43369
43488
  });
43370
43489
  });
43371
- }, [addNotification, channel, client, loadMoreFinished, t, channelUnreadUiState]);
43490
+ }, [addNotification, channel, loadMoreFinished, t, channelUnreadUiState]);
43372
43491
  var deleteMessage = React.useCallback(function (message) { return __awaiter(void 0, void 0, void 0, function () {
43373
43492
  var deletedMessage, result;
43374
43493
  return __generator(this, function (_a) {
@@ -43452,8 +43571,24 @@ var ChannelInner = function (props) {
43452
43571
  case 6:
43453
43572
  error_1 = _d.sent();
43454
43573
  stringError = JSON.stringify(error_1);
43455
- parsedError = stringError ? JSON.parse(stringError) : {};
43456
- updateMessage(exports.__assign(exports.__assign({}, message), { error: parsedError, errorStatusCode: parsedError.status || undefined, status: 'failed' }));
43574
+ parsedError = (stringError
43575
+ ? JSON.parse(stringError)
43576
+ : {});
43577
+ // Handle the case where the message already exists
43578
+ // (typically, when retrying to send a message).
43579
+ // If the message already exists, we can assume it was sent successfully,
43580
+ // so we update the message status to "received".
43581
+ // Right now, the only way to check this error is by checking
43582
+ // the combination of the error code and the error description,
43583
+ // since there is no special error code for duplicate messages.
43584
+ if (parsedError.code === 4 &&
43585
+ error_1 instanceof Error &&
43586
+ error_1.message.includes('already exists')) {
43587
+ updateMessage(exports.__assign(exports.__assign({}, message), { status: 'received' }));
43588
+ }
43589
+ else {
43590
+ updateMessage(exports.__assign(exports.__assign({}, message), { error: parsedError, errorStatusCode: parsedError.status || undefined, status: 'failed' }));
43591
+ }
43457
43592
  return [3 /*break*/, 7];
43458
43593
  case 7: return [2 /*return*/];
43459
43594
  }
@@ -45229,6 +45364,7 @@ exports.insertIntro = insertIntro;
45229
45364
  exports.isAudioAttachment = isAudioAttachment;
45230
45365
  exports.isChannel = isChannel;
45231
45366
  exports.isDate = isDate;
45367
+ exports.isDateSeparatorMessage = isDateSeparatorMessage;
45232
45368
  exports.isDayOrMoment = isDayOrMoment;
45233
45369
  exports.isFileAttachment = isFileAttachment;
45234
45370
  exports.isGalleryAttachmentType = isGalleryAttachmentType;