stream-chat-react 12.8.0 → 12.8.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.
@@ -20327,6 +20327,7 @@ __export(src_exports, {
20327
20327
  getGroupChannelDisplayInfo: () => getGroupChannelDisplayInfo,
20328
20328
  getGroupStyles: () => getGroupStyles,
20329
20329
  getImages: () => getImages,
20330
+ getIsFirstUnreadMessage: () => getIsFirstUnreadMessage,
20330
20331
  getLastReceived: () => getLastReceived,
20331
20332
  getLatestMessagePreview: () => getLatestMessagePreview,
20332
20333
  getMessageActions: () => getMessageActions,
@@ -20673,6 +20674,7 @@ var DialogManager = class {
20673
20674
  open: () => {
20674
20675
  this.open({ id });
20675
20676
  },
20677
+ removalTimeout: void 0,
20676
20678
  remove: () => {
20677
20679
  this.remove(id);
20678
20680
  },
@@ -20685,6 +20687,21 @@ var DialogManager = class {
20685
20687
  ...{ dialogsById: { ...current.dialogsById, [id]: dialog } }
20686
20688
  }));
20687
20689
  }
20690
+ if (dialog.removalTimeout) {
20691
+ clearTimeout(dialog.removalTimeout);
20692
+ this.state.next((current) => ({
20693
+ ...current,
20694
+ ...{
20695
+ dialogsById: {
20696
+ ...current.dialogsById,
20697
+ [id]: {
20698
+ ...dialog,
20699
+ removalTimeout: void 0
20700
+ }
20701
+ }
20702
+ }
20703
+ }));
20704
+ }
20688
20705
  return dialog;
20689
20706
  }
20690
20707
  open(params, closeRest) {
@@ -20720,6 +20737,9 @@ var DialogManager = class {
20720
20737
  const state = this.state.getLatestValue();
20721
20738
  const dialog = state.dialogsById[id];
20722
20739
  if (!dialog) return;
20740
+ if (dialog.removalTimeout) {
20741
+ clearTimeout(dialog.removalTimeout);
20742
+ }
20723
20743
  this.state.next((current) => {
20724
20744
  const newDialogs = { ...current.dialogsById };
20725
20745
  delete newDialogs[id];
@@ -20729,6 +20749,29 @@ var DialogManager = class {
20729
20749
  };
20730
20750
  });
20731
20751
  }
20752
+ /**
20753
+ * Marks the dialog state as unused. If the dialog id is referenced again quickly,
20754
+ * the state will not be removed. Otherwise, the state will be removed after
20755
+ * a short timeout.
20756
+ */
20757
+ markForRemoval(id) {
20758
+ const dialog = this.state.getLatestValue().dialogsById[id];
20759
+ if (!dialog) {
20760
+ return;
20761
+ }
20762
+ this.state.next((current) => ({
20763
+ ...current,
20764
+ dialogsById: {
20765
+ ...current.dialogsById,
20766
+ [id]: {
20767
+ ...dialog,
20768
+ removalTimeout: setTimeout(() => {
20769
+ this.remove(id);
20770
+ }, 16)
20771
+ }
20772
+ }
20773
+ }));
20774
+ }
20732
20775
  };
20733
20776
 
20734
20777
  // src/components/Dialog/DialogPortal.tsx
@@ -20757,7 +20800,7 @@ var useDialog = ({ id }) => {
20757
20800
  const { dialogManager } = useDialogManager();
20758
20801
  (0, import_react7.useEffect)(
20759
20802
  () => () => {
20760
- dialogManager.remove(id);
20803
+ dialogManager.markForRemoval(id);
20761
20804
  },
20762
20805
  [dialogManager, id]
20763
20806
  );
@@ -52344,6 +52387,21 @@ var hasNotMoreMessages = (returnedCountMessages, limit) => returnedCountMessages
52344
52387
  function isDateSeparatorMessage(message) {
52345
52388
  return message.customType === CUSTOM_MESSAGE_TYPE.date && !!message.date && isDate(message.date);
52346
52389
  }
52390
+ var getIsFirstUnreadMessage = ({
52391
+ firstUnreadMessageId,
52392
+ isFirstMessage,
52393
+ lastReadDate,
52394
+ lastReadMessageId,
52395
+ message,
52396
+ previousMessage,
52397
+ unreadMessageCount = 0
52398
+ }) => {
52399
+ const createdAtTimestamp = message.created_at && new Date(message.created_at).getTime();
52400
+ const lastReadTimestamp = lastReadDate?.getTime();
52401
+ const messageIsUnread = !!createdAtTimestamp && !!lastReadTimestamp && createdAtTimestamp > lastReadTimestamp;
52402
+ const previousMessageIsLastRead = !!lastReadMessageId && lastReadMessageId === previousMessage?.id;
52403
+ return firstUnreadMessageId === message.id || !!unreadMessageCount && messageIsUnread && (isFirstMessage || previousMessageIsLastRead);
52404
+ };
52347
52405
 
52348
52406
  // src/components/MessageList/hooks/MessageList/useEnrichedMessages.ts
52349
52407
  var useEnrichedMessages = (args) => {
@@ -52700,7 +52758,6 @@ var useMarkRead = ({
52700
52758
  if (shouldMarkRead(channel.countUnread())) markRead();
52701
52759
  };
52702
52760
  const handleMessageNew = (event) => {
52703
- const newMessageToCurrentChannel = event.cid === channel.cid;
52704
52761
  const isOwnMessage = event.user?.id && event.user.id === client.user?.id;
52705
52762
  const mainChannelUpdated = !event.message?.parent_id || event.message?.show_in_channel;
52706
52763
  if (isOwnMessage) return;
@@ -52718,17 +52775,17 @@ var useMarkRead = ({
52718
52775
  unread_messages: previousUnreadCount + 1
52719
52776
  };
52720
52777
  });
52721
- } else if (newMessageToCurrentChannel && mainChannelUpdated && shouldMarkRead(channel.countUnread())) {
52778
+ } else if (mainChannelUpdated && shouldMarkRead(channel.countUnread())) {
52722
52779
  markRead();
52723
52780
  }
52724
52781
  };
52725
- client.on("message.new", handleMessageNew);
52782
+ channel.on("message.new", handleMessageNew);
52726
52783
  document.addEventListener("visibilitychange", onVisibilityChange);
52727
52784
  const hasScrolledToBottom = previousRenderMessageListScrolledToBottom.current !== isMessageListScrolledToBottom && isMessageListScrolledToBottom;
52728
52785
  if (hasScrolledToBottom && shouldMarkRead(channel.countUnread())) markRead();
52729
52786
  previousRenderMessageListScrolledToBottom.current = isMessageListScrolledToBottom;
52730
52787
  return () => {
52731
- client.off("message.new", handleMessageNew);
52788
+ channel.off("message.new", handleMessageNew);
52732
52789
  document.removeEventListener("visibilitychange", onVisibilityChange);
52733
52790
  };
52734
52791
  }, [
@@ -53163,6 +53220,7 @@ function defaultRenderMessages({
53163
53220
  } = components;
53164
53221
  const renderedMessages = [];
53165
53222
  let firstMessage;
53223
+ let previousMessage = void 0;
53166
53224
  for (let index3 = 0; index3 < messages.length; index3++) {
53167
53225
  const message = messages[index3];
53168
53226
  if (isDateSeparatorMessage(message)) {
@@ -53190,16 +53248,17 @@ function defaultRenderMessages({
53190
53248
  }
53191
53249
  const groupStyles = messageGroupStyles[message.id] || "";
53192
53250
  const messageClass = customClasses?.message || `str-chat__li str-chat__li--${groupStyles}`;
53193
- const createdAtTimestamp = message.created_at && new Date(message.created_at).getTime();
53194
- const lastReadTimestamp = channelUnreadUiState?.last_read.getTime();
53195
- const isFirstMessage = firstMessage?.id && firstMessage.id === message.id;
53196
- const isNewestMessage = index3 === messages.length - 1;
53197
- const isLastReadMessage = channelUnreadUiState?.last_read_message_id === message.id || !channelUnreadUiState?.unread_messages && createdAtTimestamp === lastReadTimestamp;
53198
- const isFirstUnreadMessage = channelUnreadUiState?.first_unread_message_id === message.id || !!channelUnreadUiState?.unread_messages && !!createdAtTimestamp && !!lastReadTimestamp && createdAtTimestamp > lastReadTimestamp && isFirstMessage;
53199
- const showUnreadSeparatorAbove = !channelUnreadUiState?.last_read_message_id && isFirstUnreadMessage;
53200
- const showUnreadSeparatorBelow = isLastReadMessage && !isNewestMessage && (channelUnreadUiState?.first_unread_message_id || !!channelUnreadUiState?.unread_messages);
53251
+ const isFirstUnreadMessage = getIsFirstUnreadMessage({
53252
+ firstUnreadMessageId: channelUnreadUiState?.first_unread_message_id,
53253
+ isFirstMessage: !!firstMessage?.id && firstMessage.id === message.id,
53254
+ lastReadDate: channelUnreadUiState?.last_read,
53255
+ lastReadMessageId: channelUnreadUiState?.last_read_message_id,
53256
+ message,
53257
+ previousMessage,
53258
+ unreadMessageCount: channelUnreadUiState?.unread_messages
53259
+ });
53201
53260
  renderedMessages.push(
53202
- /* @__PURE__ */ import_react245.default.createElement(import_react245.Fragment, { key: message.id || message.created_at }, showUnreadSeparatorAbove && UnreadMessagesSeparator2 && /* @__PURE__ */ import_react245.default.createElement("li", { className: "str-chat__li str-chat__unread-messages-separator-wrapper" }, /* @__PURE__ */ import_react245.default.createElement(UnreadMessagesSeparator2, { unreadCount: channelUnreadUiState?.unread_messages })), /* @__PURE__ */ import_react245.default.createElement("li", { className: messageClass, "data-message-id": message.id, "data-testid": messageClass }, /* @__PURE__ */ import_react245.default.createElement(
53261
+ /* @__PURE__ */ import_react245.default.createElement(import_react245.Fragment, { key: message.id || message.created_at }, isFirstUnreadMessage && UnreadMessagesSeparator2 && /* @__PURE__ */ import_react245.default.createElement("li", { className: "str-chat__li str-chat__unread-messages-separator-wrapper" }, /* @__PURE__ */ import_react245.default.createElement(UnreadMessagesSeparator2, { unreadCount: channelUnreadUiState?.unread_messages })), /* @__PURE__ */ import_react245.default.createElement("li", { className: messageClass, "data-message-id": message.id, "data-testid": messageClass }, /* @__PURE__ */ import_react245.default.createElement(
53203
53262
  Message,
53204
53263
  {
53205
53264
  groupStyles: [groupStyles],
@@ -53208,8 +53267,9 @@ function defaultRenderMessages({
53208
53267
  readBy: readData[message.id] || [],
53209
53268
  ...messageProps
53210
53269
  }
53211
- )), showUnreadSeparatorBelow && UnreadMessagesSeparator2 && /* @__PURE__ */ import_react245.default.createElement("li", { className: "str-chat__li str-chat__unread-messages-separator-wrapper" }, /* @__PURE__ */ import_react245.default.createElement(UnreadMessagesSeparator2, { unreadCount: channelUnreadUiState?.unread_messages })))
53270
+ )))
53212
53271
  );
53272
+ previousMessage = message;
53213
53273
  }
53214
53274
  }
53215
53275
  return renderedMessages;
@@ -53809,15 +53869,16 @@ var messageRenderer = (virtuosoIndex, _data, virtuosoContext) => {
53809
53869
  const maybeNextMessage = messageList[streamMessageIndex + 1];
53810
53870
  const firstOfGroup = shouldGroupByUser && (message.user?.id !== maybePrevMessage?.user?.id || maybePrevMessage && isMessageEdited(maybePrevMessage));
53811
53871
  const endOfGroup = shouldGroupByUser && (message.user?.id !== maybeNextMessage?.user?.id || isMessageEdited(message));
53812
- const createdAtTimestamp = message.created_at && new Date(message.created_at).getTime();
53813
- const lastReadTimestamp = lastReadDate?.getTime();
53814
- const isFirstMessage = streamMessageIndex === 0;
53815
- const isNewestMessage = lastReadMessageId === lastReceivedMessageId;
53816
- const isLastReadMessage = message.id === lastReadMessageId || !unreadMessageCount && createdAtTimestamp === lastReadTimestamp;
53817
- const isFirstUnreadMessage = firstUnreadMessageId === message.id || !!unreadMessageCount && createdAtTimestamp && lastReadTimestamp && createdAtTimestamp > lastReadTimestamp && isFirstMessage;
53818
- const showUnreadSeparatorAbove = !lastReadMessageId && isFirstUnreadMessage;
53819
- const showUnreadSeparatorBelow = isLastReadMessage && !isNewestMessage && (firstUnreadMessageId || !!unreadMessageCount);
53820
- return /* @__PURE__ */ import_react255.default.createElement(import_react255.default.Fragment, null, showUnreadSeparatorAbove && /* @__PURE__ */ import_react255.default.createElement("div", { className: "str-chat__unread-messages-separator-wrapper" }, /* @__PURE__ */ import_react255.default.createElement(UnreadMessagesSeparator2, { unreadCount: unreadMessageCount })), /* @__PURE__ */ import_react255.default.createElement(
53872
+ const isFirstUnreadMessage = getIsFirstUnreadMessage({
53873
+ firstUnreadMessageId,
53874
+ isFirstMessage: streamMessageIndex === 0,
53875
+ lastReadDate,
53876
+ lastReadMessageId,
53877
+ message,
53878
+ previousMessage: streamMessageIndex ? messageList[streamMessageIndex - 1] : void 0,
53879
+ unreadMessageCount
53880
+ });
53881
+ return /* @__PURE__ */ import_react255.default.createElement(import_react255.default.Fragment, null, isFirstUnreadMessage && /* @__PURE__ */ import_react255.default.createElement("div", { className: "str-chat__unread-messages-separator-wrapper" }, /* @__PURE__ */ import_react255.default.createElement(UnreadMessagesSeparator2, { unreadCount: unreadMessageCount })), /* @__PURE__ */ import_react255.default.createElement(
53821
53882
  Message,
53822
53883
  {
53823
53884
  additionalMessageInputProps,
@@ -53840,7 +53901,7 @@ var messageRenderer = (virtuosoIndex, _data, virtuosoContext) => {
53840
53901
  sortReactions,
53841
53902
  threadList
53842
53903
  }
53843
- ), showUnreadSeparatorBelow && /* @__PURE__ */ import_react255.default.createElement("div", { className: "str-chat__unread-messages-separator-wrapper" }, /* @__PURE__ */ import_react255.default.createElement(UnreadMessagesSeparator2, { unreadCount: unreadMessageCount })));
53904
+ ));
53844
53905
  };
53845
53906
 
53846
53907
  // src/components/MessageList/VirtualizedMessageList.tsx
@@ -55317,7 +55378,7 @@ var useChat = ({
55317
55378
  if (!client) return;
55318
55379
  const userAgent = client.getUserAgent();
55319
55380
  if (!userAgent.includes("stream-chat-react")) {
55320
- client.setUserAgent(`stream-chat-react-12.8.0-${userAgent}`);
55381
+ client.setUserAgent(`stream-chat-react-12.8.2-${userAgent}`);
55321
55382
  }
55322
55383
  client.threads.registerSubscriptions();
55323
55384
  client.polls.registerSubscriptions();
@@ -55954,6 +56015,7 @@ var Window = import_react270.default.memo(UnMemoizedWindow);
55954
56015
  getGroupChannelDisplayInfo,
55955
56016
  getGroupStyles,
55956
56017
  getImages,
56018
+ getIsFirstUnreadMessage,
55957
56019
  getLastReceived,
55958
56020
  getLatestMessagePreview,
55959
56021
  getMessageActions,