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.
@@ -17630,6 +17630,7 @@ __export(src_exports, {
17630
17630
  getGroupChannelDisplayInfo: () => getGroupChannelDisplayInfo,
17631
17631
  getGroupStyles: () => getGroupStyles,
17632
17632
  getImages: () => getImages,
17633
+ getIsFirstUnreadMessage: () => getIsFirstUnreadMessage,
17633
17634
  getLastReceived: () => getLastReceived,
17634
17635
  getLatestMessagePreview: () => getLatestMessagePreview,
17635
17636
  getMessageActions: () => getMessageActions,
@@ -17976,6 +17977,7 @@ var DialogManager = class {
17976
17977
  open: () => {
17977
17978
  this.open({ id });
17978
17979
  },
17980
+ removalTimeout: void 0,
17979
17981
  remove: () => {
17980
17982
  this.remove(id);
17981
17983
  },
@@ -17988,6 +17990,21 @@ var DialogManager = class {
17988
17990
  ...{ dialogsById: { ...current.dialogsById, [id]: dialog } }
17989
17991
  }));
17990
17992
  }
17993
+ if (dialog.removalTimeout) {
17994
+ clearTimeout(dialog.removalTimeout);
17995
+ this.state.next((current) => ({
17996
+ ...current,
17997
+ ...{
17998
+ dialogsById: {
17999
+ ...current.dialogsById,
18000
+ [id]: {
18001
+ ...dialog,
18002
+ removalTimeout: void 0
18003
+ }
18004
+ }
18005
+ }
18006
+ }));
18007
+ }
17991
18008
  return dialog;
17992
18009
  }
17993
18010
  open(params, closeRest) {
@@ -18023,6 +18040,9 @@ var DialogManager = class {
18023
18040
  const state = this.state.getLatestValue();
18024
18041
  const dialog = state.dialogsById[id];
18025
18042
  if (!dialog) return;
18043
+ if (dialog.removalTimeout) {
18044
+ clearTimeout(dialog.removalTimeout);
18045
+ }
18026
18046
  this.state.next((current) => {
18027
18047
  const newDialogs = { ...current.dialogsById };
18028
18048
  delete newDialogs[id];
@@ -18032,6 +18052,29 @@ var DialogManager = class {
18032
18052
  };
18033
18053
  });
18034
18054
  }
18055
+ /**
18056
+ * Marks the dialog state as unused. If the dialog id is referenced again quickly,
18057
+ * the state will not be removed. Otherwise, the state will be removed after
18058
+ * a short timeout.
18059
+ */
18060
+ markForRemoval(id) {
18061
+ const dialog = this.state.getLatestValue().dialogsById[id];
18062
+ if (!dialog) {
18063
+ return;
18064
+ }
18065
+ this.state.next((current) => ({
18066
+ ...current,
18067
+ dialogsById: {
18068
+ ...current.dialogsById,
18069
+ [id]: {
18070
+ ...dialog,
18071
+ removalTimeout: setTimeout(() => {
18072
+ this.remove(id);
18073
+ }, 16)
18074
+ }
18075
+ }
18076
+ }));
18077
+ }
18035
18078
  };
18036
18079
 
18037
18080
  // src/components/Dialog/DialogPortal.tsx
@@ -18060,7 +18103,7 @@ var useDialog = ({ id }) => {
18060
18103
  const { dialogManager } = useDialogManager();
18061
18104
  (0, import_react7.useEffect)(
18062
18105
  () => () => {
18063
- dialogManager.remove(id);
18106
+ dialogManager.markForRemoval(id);
18064
18107
  },
18065
18108
  [dialogManager, id]
18066
18109
  );
@@ -47777,6 +47820,21 @@ var hasNotMoreMessages = (returnedCountMessages, limit) => returnedCountMessages
47777
47820
  function isDateSeparatorMessage(message) {
47778
47821
  return message.customType === CUSTOM_MESSAGE_TYPE.date && !!message.date && isDate(message.date);
47779
47822
  }
47823
+ var getIsFirstUnreadMessage = ({
47824
+ firstUnreadMessageId,
47825
+ isFirstMessage,
47826
+ lastReadDate,
47827
+ lastReadMessageId,
47828
+ message,
47829
+ previousMessage,
47830
+ unreadMessageCount = 0
47831
+ }) => {
47832
+ const createdAtTimestamp = message.created_at && new Date(message.created_at).getTime();
47833
+ const lastReadTimestamp = lastReadDate?.getTime();
47834
+ const messageIsUnread = !!createdAtTimestamp && !!lastReadTimestamp && createdAtTimestamp > lastReadTimestamp;
47835
+ const previousMessageIsLastRead = !!lastReadMessageId && lastReadMessageId === previousMessage?.id;
47836
+ return firstUnreadMessageId === message.id || !!unreadMessageCount && messageIsUnread && (isFirstMessage || previousMessageIsLastRead);
47837
+ };
47780
47838
 
47781
47839
  // src/components/MessageList/hooks/MessageList/useEnrichedMessages.ts
47782
47840
  var useEnrichedMessages = (args) => {
@@ -48133,7 +48191,6 @@ var useMarkRead = ({
48133
48191
  if (shouldMarkRead(channel.countUnread())) markRead();
48134
48192
  };
48135
48193
  const handleMessageNew = (event) => {
48136
- const newMessageToCurrentChannel = event.cid === channel.cid;
48137
48194
  const isOwnMessage = event.user?.id && event.user.id === client.user?.id;
48138
48195
  const mainChannelUpdated = !event.message?.parent_id || event.message?.show_in_channel;
48139
48196
  if (isOwnMessage) return;
@@ -48151,17 +48208,17 @@ var useMarkRead = ({
48151
48208
  unread_messages: previousUnreadCount + 1
48152
48209
  };
48153
48210
  });
48154
- } else if (newMessageToCurrentChannel && mainChannelUpdated && shouldMarkRead(channel.countUnread())) {
48211
+ } else if (mainChannelUpdated && shouldMarkRead(channel.countUnread())) {
48155
48212
  markRead();
48156
48213
  }
48157
48214
  };
48158
- client.on("message.new", handleMessageNew);
48215
+ channel.on("message.new", handleMessageNew);
48159
48216
  document.addEventListener("visibilitychange", onVisibilityChange);
48160
48217
  const hasScrolledToBottom = previousRenderMessageListScrolledToBottom.current !== isMessageListScrolledToBottom && isMessageListScrolledToBottom;
48161
48218
  if (hasScrolledToBottom && shouldMarkRead(channel.countUnread())) markRead();
48162
48219
  previousRenderMessageListScrolledToBottom.current = isMessageListScrolledToBottom;
48163
48220
  return () => {
48164
- client.off("message.new", handleMessageNew);
48221
+ channel.off("message.new", handleMessageNew);
48165
48222
  document.removeEventListener("visibilitychange", onVisibilityChange);
48166
48223
  };
48167
48224
  }, [
@@ -48596,6 +48653,7 @@ function defaultRenderMessages({
48596
48653
  } = components;
48597
48654
  const renderedMessages = [];
48598
48655
  let firstMessage;
48656
+ let previousMessage = void 0;
48599
48657
  for (let index3 = 0; index3 < messages.length; index3++) {
48600
48658
  const message = messages[index3];
48601
48659
  if (isDateSeparatorMessage(message)) {
@@ -48623,16 +48681,17 @@ function defaultRenderMessages({
48623
48681
  }
48624
48682
  const groupStyles = messageGroupStyles[message.id] || "";
48625
48683
  const messageClass = customClasses?.message || `str-chat__li str-chat__li--${groupStyles}`;
48626
- const createdAtTimestamp = message.created_at && new Date(message.created_at).getTime();
48627
- const lastReadTimestamp = channelUnreadUiState?.last_read.getTime();
48628
- const isFirstMessage = firstMessage?.id && firstMessage.id === message.id;
48629
- const isNewestMessage = index3 === messages.length - 1;
48630
- const isLastReadMessage = channelUnreadUiState?.last_read_message_id === message.id || !channelUnreadUiState?.unread_messages && createdAtTimestamp === lastReadTimestamp;
48631
- const isFirstUnreadMessage = channelUnreadUiState?.first_unread_message_id === message.id || !!channelUnreadUiState?.unread_messages && !!createdAtTimestamp && !!lastReadTimestamp && createdAtTimestamp > lastReadTimestamp && isFirstMessage;
48632
- const showUnreadSeparatorAbove = !channelUnreadUiState?.last_read_message_id && isFirstUnreadMessage;
48633
- const showUnreadSeparatorBelow = isLastReadMessage && !isNewestMessage && (channelUnreadUiState?.first_unread_message_id || !!channelUnreadUiState?.unread_messages);
48684
+ const isFirstUnreadMessage = getIsFirstUnreadMessage({
48685
+ firstUnreadMessageId: channelUnreadUiState?.first_unread_message_id,
48686
+ isFirstMessage: !!firstMessage?.id && firstMessage.id === message.id,
48687
+ lastReadDate: channelUnreadUiState?.last_read,
48688
+ lastReadMessageId: channelUnreadUiState?.last_read_message_id,
48689
+ message,
48690
+ previousMessage,
48691
+ unreadMessageCount: channelUnreadUiState?.unread_messages
48692
+ });
48634
48693
  renderedMessages.push(
48635
- /* @__PURE__ */ import_react246.default.createElement(import_react246.Fragment, { key: message.id || message.created_at }, showUnreadSeparatorAbove && UnreadMessagesSeparator2 && /* @__PURE__ */ import_react246.default.createElement("li", { className: "str-chat__li str-chat__unread-messages-separator-wrapper" }, /* @__PURE__ */ import_react246.default.createElement(UnreadMessagesSeparator2, { unreadCount: channelUnreadUiState?.unread_messages })), /* @__PURE__ */ import_react246.default.createElement("li", { className: messageClass, "data-message-id": message.id, "data-testid": messageClass }, /* @__PURE__ */ import_react246.default.createElement(
48694
+ /* @__PURE__ */ import_react246.default.createElement(import_react246.Fragment, { key: message.id || message.created_at }, isFirstUnreadMessage && UnreadMessagesSeparator2 && /* @__PURE__ */ import_react246.default.createElement("li", { className: "str-chat__li str-chat__unread-messages-separator-wrapper" }, /* @__PURE__ */ import_react246.default.createElement(UnreadMessagesSeparator2, { unreadCount: channelUnreadUiState?.unread_messages })), /* @__PURE__ */ import_react246.default.createElement("li", { className: messageClass, "data-message-id": message.id, "data-testid": messageClass }, /* @__PURE__ */ import_react246.default.createElement(
48636
48695
  Message,
48637
48696
  {
48638
48697
  groupStyles: [groupStyles],
@@ -48641,8 +48700,9 @@ function defaultRenderMessages({
48641
48700
  readBy: readData[message.id] || [],
48642
48701
  ...messageProps
48643
48702
  }
48644
- )), showUnreadSeparatorBelow && UnreadMessagesSeparator2 && /* @__PURE__ */ import_react246.default.createElement("li", { className: "str-chat__li str-chat__unread-messages-separator-wrapper" }, /* @__PURE__ */ import_react246.default.createElement(UnreadMessagesSeparator2, { unreadCount: channelUnreadUiState?.unread_messages })))
48703
+ )))
48645
48704
  );
48705
+ previousMessage = message;
48646
48706
  }
48647
48707
  }
48648
48708
  return renderedMessages;
@@ -49242,15 +49302,16 @@ var messageRenderer = (virtuosoIndex, _data, virtuosoContext) => {
49242
49302
  const maybeNextMessage = messageList[streamMessageIndex + 1];
49243
49303
  const firstOfGroup = shouldGroupByUser && (message.user?.id !== maybePrevMessage?.user?.id || maybePrevMessage && isMessageEdited(maybePrevMessage));
49244
49304
  const endOfGroup = shouldGroupByUser && (message.user?.id !== maybeNextMessage?.user?.id || isMessageEdited(message));
49245
- const createdAtTimestamp = message.created_at && new Date(message.created_at).getTime();
49246
- const lastReadTimestamp = lastReadDate?.getTime();
49247
- const isFirstMessage = streamMessageIndex === 0;
49248
- const isNewestMessage = lastReadMessageId === lastReceivedMessageId;
49249
- const isLastReadMessage = message.id === lastReadMessageId || !unreadMessageCount && createdAtTimestamp === lastReadTimestamp;
49250
- const isFirstUnreadMessage = firstUnreadMessageId === message.id || !!unreadMessageCount && createdAtTimestamp && lastReadTimestamp && createdAtTimestamp > lastReadTimestamp && isFirstMessage;
49251
- const showUnreadSeparatorAbove = !lastReadMessageId && isFirstUnreadMessage;
49252
- const showUnreadSeparatorBelow = isLastReadMessage && !isNewestMessage && (firstUnreadMessageId || !!unreadMessageCount);
49253
- return /* @__PURE__ */ import_react256.default.createElement(import_react256.default.Fragment, null, showUnreadSeparatorAbove && /* @__PURE__ */ import_react256.default.createElement("div", { className: "str-chat__unread-messages-separator-wrapper" }, /* @__PURE__ */ import_react256.default.createElement(UnreadMessagesSeparator2, { unreadCount: unreadMessageCount })), /* @__PURE__ */ import_react256.default.createElement(
49305
+ const isFirstUnreadMessage = getIsFirstUnreadMessage({
49306
+ firstUnreadMessageId,
49307
+ isFirstMessage: streamMessageIndex === 0,
49308
+ lastReadDate,
49309
+ lastReadMessageId,
49310
+ message,
49311
+ previousMessage: streamMessageIndex ? messageList[streamMessageIndex - 1] : void 0,
49312
+ unreadMessageCount
49313
+ });
49314
+ return /* @__PURE__ */ import_react256.default.createElement(import_react256.default.Fragment, null, isFirstUnreadMessage && /* @__PURE__ */ import_react256.default.createElement("div", { className: "str-chat__unread-messages-separator-wrapper" }, /* @__PURE__ */ import_react256.default.createElement(UnreadMessagesSeparator2, { unreadCount: unreadMessageCount })), /* @__PURE__ */ import_react256.default.createElement(
49254
49315
  Message,
49255
49316
  {
49256
49317
  additionalMessageInputProps,
@@ -49273,7 +49334,7 @@ var messageRenderer = (virtuosoIndex, _data, virtuosoContext) => {
49273
49334
  sortReactions,
49274
49335
  threadList
49275
49336
  }
49276
- ), showUnreadSeparatorBelow && /* @__PURE__ */ import_react256.default.createElement("div", { className: "str-chat__unread-messages-separator-wrapper" }, /* @__PURE__ */ import_react256.default.createElement(UnreadMessagesSeparator2, { unreadCount: unreadMessageCount })));
49337
+ ));
49277
49338
  };
49278
49339
 
49279
49340
  // src/components/MessageList/VirtualizedMessageList.tsx
@@ -50750,7 +50811,7 @@ var useChat = ({
50750
50811
  if (!client) return;
50751
50812
  const userAgent = client.getUserAgent();
50752
50813
  if (!userAgent.includes("stream-chat-react")) {
50753
- client.setUserAgent(`stream-chat-react-12.8.0-${userAgent}`);
50814
+ client.setUserAgent(`stream-chat-react-12.8.2-${userAgent}`);
50754
50815
  }
50755
50816
  client.threads.registerSubscriptions();
50756
50817
  client.polls.registerSubscriptions();