stream-chat-react 11.4.0 → 11.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/dist/browser.full-bundle.js +6138 -5630
  2. package/dist/browser.full-bundle.js.map +1 -1
  3. package/dist/browser.full-bundle.min.js +4 -4
  4. package/dist/browser.full-bundle.min.js.map +1 -1
  5. package/dist/components/Channel/Channel.d.ts +9 -2
  6. package/dist/components/Channel/Channel.d.ts.map +1 -1
  7. package/dist/components/Channel/Channel.js +86 -22
  8. package/dist/components/ChannelPreview/ChannelPreview.d.ts +16 -0
  9. package/dist/components/ChannelPreview/ChannelPreview.d.ts.map +1 -1
  10. package/dist/components/ChannelPreview/ChannelPreview.js +16 -2
  11. package/dist/components/ChannelPreview/ChannelPreviewMessenger.d.ts +5 -0
  12. package/dist/components/ChannelPreview/ChannelPreviewMessenger.d.ts.map +1 -1
  13. package/dist/components/ChannelPreview/ChannelPreviewMessenger.js +62 -2
  14. package/dist/components/Emojis/index.cjs.js +1 -1
  15. package/dist/components/Message/Message.d.ts.map +1 -1
  16. package/dist/components/Message/Message.js +40 -8
  17. package/dist/components/Message/hooks/index.d.ts +2 -0
  18. package/dist/components/Message/hooks/index.d.ts.map +1 -1
  19. package/dist/components/Message/hooks/index.js +2 -0
  20. package/dist/components/Message/hooks/useMarkUnreadHandler.d.ts +10 -0
  21. package/dist/components/Message/hooks/useMarkUnreadHandler.d.ts.map +1 -0
  22. package/dist/components/Message/hooks/useMarkUnreadHandler.js +45 -0
  23. package/dist/components/Message/hooks/useReactionsFetcher.d.ts +11 -0
  24. package/dist/components/Message/hooks/useReactionsFetcher.d.ts.map +1 -0
  25. package/dist/components/Message/hooks/useReactionsFetcher.js +58 -0
  26. package/dist/components/Message/hooks/useUserRole.d.ts +1 -0
  27. package/dist/components/Message/hooks/useUserRole.d.ts.map +1 -1
  28. package/dist/components/Message/hooks/useUserRole.js +2 -0
  29. package/dist/components/Message/types.d.ts +7 -1
  30. package/dist/components/Message/types.d.ts.map +1 -1
  31. package/dist/components/Message/utils.d.ts +4 -1
  32. package/dist/components/Message/utils.d.ts.map +1 -1
  33. package/dist/components/Message/utils.js +12 -3
  34. package/dist/components/MessageActions/MessageActions.d.ts +1 -1
  35. package/dist/components/MessageActions/MessageActions.d.ts.map +1 -1
  36. package/dist/components/MessageActions/MessageActions.js +4 -3
  37. package/dist/components/MessageActions/MessageActionsBox.d.ts +1 -1
  38. package/dist/components/MessageActions/MessageActionsBox.d.ts.map +1 -1
  39. package/dist/components/MessageActions/MessageActionsBox.js +3 -4
  40. package/dist/components/MessageList/MessageList.d.ts +3 -1
  41. package/dist/components/MessageList/MessageList.d.ts.map +1 -1
  42. package/dist/components/MessageList/MessageList.js +29 -13
  43. package/dist/components/MessageList/MessageListMainPanel.d.ts +1 -0
  44. package/dist/components/MessageList/MessageListMainPanel.d.ts.map +1 -1
  45. package/dist/components/MessageList/MessageListMainPanel.js +2 -1
  46. package/dist/components/MessageList/MessageListNotifications.d.ts +1 -0
  47. package/dist/components/MessageList/MessageListNotifications.d.ts.map +1 -1
  48. package/dist/components/MessageList/MessageListNotifications.js +2 -2
  49. package/dist/components/MessageList/MessageNotification.d.ts +2 -0
  50. package/dist/components/MessageList/MessageNotification.d.ts.map +1 -1
  51. package/dist/components/MessageList/ScrollToBottomButton.d.ts +1 -1
  52. package/dist/components/MessageList/ScrollToBottomButton.d.ts.map +1 -1
  53. package/dist/components/MessageList/ScrollToBottomButton.js +3 -44
  54. package/dist/components/MessageList/UnreadMessagesNotification.d.ts +6 -0
  55. package/dist/components/MessageList/UnreadMessagesNotification.d.ts.map +1 -0
  56. package/dist/components/MessageList/UnreadMessagesNotification.js +12 -0
  57. package/dist/components/MessageList/UnreadMessagesSeparator.d.ts +6 -0
  58. package/dist/components/MessageList/UnreadMessagesSeparator.d.ts.map +1 -0
  59. package/dist/components/MessageList/UnreadMessagesSeparator.js +10 -0
  60. package/dist/components/MessageList/VirtualizedMessageList.d.ts +12 -1
  61. package/dist/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
  62. package/dist/components/MessageList/VirtualizedMessageList.js +42 -19
  63. package/dist/components/MessageList/VirtualizedMessageListComponents.d.ts +5 -3
  64. package/dist/components/MessageList/VirtualizedMessageListComponents.d.ts.map +1 -1
  65. package/dist/components/MessageList/VirtualizedMessageListComponents.js +27 -6
  66. package/dist/components/MessageList/hooks/MessageList/index.d.ts +1 -0
  67. package/dist/components/MessageList/hooks/MessageList/index.d.ts.map +1 -1
  68. package/dist/components/MessageList/hooks/MessageList/index.js +1 -0
  69. package/dist/components/MessageList/hooks/MessageList/useMessageListElements.d.ts +2 -5
  70. package/dist/components/MessageList/hooks/MessageList/useMessageListElements.d.ts.map +1 -1
  71. package/dist/components/MessageList/hooks/MessageList/useMessageListElements.js +3 -1
  72. package/dist/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.d.ts +7 -0
  73. package/dist/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.d.ts.map +1 -0
  74. package/dist/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.js +42 -0
  75. package/dist/components/MessageList/hooks/VirtualizedMessageList/index.d.ts +1 -0
  76. package/dist/components/MessageList/hooks/VirtualizedMessageList/index.d.ts.map +1 -1
  77. package/dist/components/MessageList/hooks/VirtualizedMessageList/index.js +1 -0
  78. package/dist/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.d.ts +22 -0
  79. package/dist/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.d.ts.map +1 -0
  80. package/dist/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.js +29 -0
  81. package/dist/components/MessageList/hooks/useMarkRead.d.ts +19 -0
  82. package/dist/components/MessageList/hooks/useMarkRead.d.ts.map +1 -0
  83. package/dist/components/MessageList/hooks/useMarkRead.js +38 -0
  84. package/dist/components/MessageList/icons.d.ts +1 -0
  85. package/dist/components/MessageList/icons.d.ts.map +1 -1
  86. package/dist/components/MessageList/icons.js +2 -0
  87. package/dist/components/MessageList/index.d.ts +2 -0
  88. package/dist/components/MessageList/index.d.ts.map +1 -1
  89. package/dist/components/MessageList/index.js +2 -0
  90. package/dist/components/MessageList/renderMessages.d.ts +13 -2
  91. package/dist/components/MessageList/renderMessages.d.ts.map +1 -1
  92. package/dist/components/MessageList/renderMessages.js +16 -11
  93. package/dist/components/Reactions/ReactionsList.d.ts +2 -1
  94. package/dist/components/Reactions/ReactionsList.d.ts.map +1 -1
  95. package/dist/components/Reactions/ReactionsList.js +32 -41
  96. package/dist/components/Reactions/ReactionsListModal.d.ts +13 -0
  97. package/dist/components/Reactions/ReactionsListModal.d.ts.map +1 -0
  98. package/dist/components/Reactions/ReactionsListModal.js +46 -0
  99. package/dist/components/Reactions/SimpleReactionsList.d.ts +2 -4
  100. package/dist/components/Reactions/SimpleReactionsList.d.ts.map +1 -1
  101. package/dist/components/Reactions/SimpleReactionsList.js +7 -24
  102. package/dist/components/Reactions/hooks/useFetchReactions.d.ts +12 -0
  103. package/dist/components/Reactions/hooks/useFetchReactions.d.ts.map +1 -0
  104. package/dist/components/Reactions/hooks/useFetchReactions.js +50 -0
  105. package/dist/components/Reactions/hooks/useProcessReactions.d.ts +3 -13
  106. package/dist/components/Reactions/hooks/useProcessReactions.d.ts.map +1 -1
  107. package/dist/components/Reactions/hooks/useProcessReactions.js +51 -46
  108. package/dist/components/Reactions/types.d.ts +9 -0
  109. package/dist/components/Reactions/types.d.ts.map +1 -0
  110. package/dist/components/Reactions/types.js +1 -0
  111. package/dist/context/ChannelActionContext.d.ts +2 -0
  112. package/dist/context/ChannelActionContext.d.ts.map +1 -1
  113. package/dist/context/ComponentContext.d.ts +6 -2
  114. package/dist/context/ComponentContext.d.ts.map +1 -1
  115. package/dist/context/MessageContext.d.ts +8 -2
  116. package/dist/context/MessageContext.d.ts.map +1 -1
  117. package/dist/css/v2/index.css +1 -1
  118. package/dist/css/v2/index.layout.css +1 -1
  119. package/dist/i18n/Streami18n.d.ts +10 -0
  120. package/dist/i18n/Streami18n.d.ts.map +1 -1
  121. package/dist/i18n/de.json +10 -0
  122. package/dist/i18n/en.json +10 -0
  123. package/dist/i18n/es.json +12 -0
  124. package/dist/i18n/fr.json +12 -0
  125. package/dist/i18n/hi.json +11 -0
  126. package/dist/i18n/it.json +12 -0
  127. package/dist/i18n/ja.json +8 -0
  128. package/dist/i18n/ko.json +8 -0
  129. package/dist/i18n/nl.json +10 -0
  130. package/dist/i18n/pt.json +12 -0
  131. package/dist/i18n/ru.json +14 -0
  132. package/dist/i18n/tr.json +10 -0
  133. package/dist/{icons-b84cd102.js → icons-7ead3d97.js} +12 -12
  134. package/dist/index.cjs.js +4880 -4372
  135. package/dist/scss/v2/AttachmentPreviewList/AttachmentPreviewList-layout.scss +1 -0
  136. package/dist/scss/v2/Message/Message-layout.scss +68 -10
  137. package/dist/scss/v2/Message/Message-theme.scss +34 -2
  138. package/dist/scss/v2/MessageActionsBox/MessageActionsBox-layout.scss +0 -11
  139. package/dist/scss/v2/MessageBounceOptions/MessageBounceOptions-layout.scss +18 -0
  140. package/dist/scss/v2/MessageBounceOptions/MessageBounceOptions-theme.scss +51 -0
  141. package/dist/scss/v2/MessageReactions/MessageReactions-layout.scss +74 -0
  142. package/dist/scss/v2/MessageReactions/MessageReactions-theme.scss +17 -0
  143. package/dist/scss/v2/_base.scss +3 -20
  144. package/dist/scss/v2/_global-theme-variables.scss +3 -0
  145. package/dist/scss/v2/index.layout.scss +1 -0
  146. package/dist/scss/v2/index.scss +1 -1
  147. package/dist/version.d.ts +1 -1
  148. package/dist/version.js +1 -1
  149. package/package.json +3 -3
@@ -3,10 +3,10 @@ import { ConnectionStatus } from './ConnectionStatus';
3
3
  import { CustomNotification } from './CustomNotification';
4
4
  import { useTranslationContext } from '../../context/TranslationContext';
5
5
  export var MessageListNotifications = function (props) {
6
- var hasNewMessages = props.hasNewMessages, isMessageListScrolledToBottom = props.isMessageListScrolledToBottom, isNotAtLatestMessageSet = props.isNotAtLatestMessageSet, MessageNotification = props.MessageNotification, notifications = props.notifications, scrollToBottom = props.scrollToBottom, threadList = props.threadList;
6
+ var hasNewMessages = props.hasNewMessages, isMessageListScrolledToBottom = props.isMessageListScrolledToBottom, isNotAtLatestMessageSet = props.isNotAtLatestMessageSet, MessageNotification = props.MessageNotification, notifications = props.notifications, scrollToBottom = props.scrollToBottom, threadList = props.threadList, unreadCount = props.unreadCount;
7
7
  var t = useTranslationContext('MessageListNotifications').t;
8
8
  return (React.createElement("div", { className: 'str-chat__list-notifications' },
9
9
  notifications.map(function (notification) { return (React.createElement(CustomNotification, { active: true, key: notification.id, type: notification.type }, notification.text)); }),
10
10
  React.createElement(ConnectionStatus, null),
11
- React.createElement(MessageNotification, { isMessageListScrolledToBottom: isMessageListScrolledToBottom, onClick: scrollToBottom, showNotification: hasNewMessages || isNotAtLatestMessageSet, threadList: threadList }, isNotAtLatestMessageSet ? t('Latest Messages') : t('New Messages!'))));
11
+ React.createElement(MessageNotification, { isMessageListScrolledToBottom: isMessageListScrolledToBottom, onClick: scrollToBottom, showNotification: hasNewMessages || isNotAtLatestMessageSet, threadList: threadList, unreadCount: unreadCount }, isNotAtLatestMessageSet ? t('Latest Messages') : t('New Messages!'))));
12
12
  };
@@ -8,6 +8,8 @@ export type MessageNotificationProps = PropsWithChildren<{
8
8
  showNotification?: boolean;
9
9
  /** informs the component whether it is rendered inside a thread message list */
10
10
  threadList?: boolean;
11
+ /** */
12
+ unreadCount?: number;
11
13
  }>;
12
14
  export declare const MessageNotification: (props: MessageNotificationProps) => JSX.Element | null;
13
15
  //# sourceMappingURL=MessageNotification.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageNotification.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/MessageNotification.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAEjD,MAAM,MAAM,wBAAwB,GAAG,iBAAiB,CAAC;IACvD,iCAAiC;IACjC,OAAO,EAAE,KAAK,CAAC,iBAAiB,CAAC;IACjC,gQAAgQ;IAChQ,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,mMAAmM;IACnM,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gFAAgF;IAChF,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC,CAAC;AAmBH,eAAO,MAAM,mBAAmB,UAjBc,wBAAwB,uBAmB7B,CAAC"}
1
+ {"version":3,"file":"MessageNotification.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/MessageNotification.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAEjD,MAAM,MAAM,wBAAwB,GAAG,iBAAiB,CAAC;IACvD,iCAAiC;IACjC,OAAO,EAAE,KAAK,CAAC,iBAAiB,CAAC;IACjC,gQAAgQ;IAChQ,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,mMAAmM;IACnM,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gFAAgF;IAChF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM;IACN,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC,CAAC;AAmBH,eAAO,MAAM,mBAAmB,UAjBc,wBAAwB,uBAmB7B,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import type { MessageNotificationProps } from './MessageNotification';
2
- export declare const ScrollToBottomButton: (props: Pick<MessageNotificationProps, 'isMessageListScrolledToBottom' | 'onClick' | 'threadList'>) => JSX.Element | null;
2
+ export declare const ScrollToBottomButton: (props: Pick<MessageNotificationProps, 'isMessageListScrolledToBottom' | 'onClick' | 'threadList' | 'unreadCount'>) => JSX.Element | null;
3
3
  //# sourceMappingURL=ScrollToBottomButton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollToBottomButton.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/ScrollToBottomButton.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAuFtE,eAAO,MAAM,oBAAoB,UApFxB,KAAK,wBAAwB,EAAE,+BAA+B,GAAG,SAAS,GAAG,YAAY,CAAC,uBAsFzD,CAAC"}
1
+ {"version":3,"file":"ScrollToBottomButton.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/ScrollToBottomButton.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AA0CtE,eAAO,MAAM,oBAAoB,UAvCxB,KACL,wBAAwB,EACxB,+BAA+B,GAAG,SAAS,GAAG,YAAY,GAAG,aAAa,CAC3E,uBAsCuC,CAAC"}
@@ -1,54 +1,13 @@
1
- import React, { useEffect, useState } from 'react';
1
+ import React from 'react';
2
2
  import clsx from 'clsx';
3
3
  import { ArrowDown } from './icons';
4
- import { useChannelStateContext, useChatContext } from '../../context';
5
4
  var UnMemoizedScrollToBottomButton = function (props) {
6
- var isMessageListScrolledToBottom = props.isMessageListScrolledToBottom, onClick = props.onClick, threadList = props.threadList;
7
- var _a = useChatContext(), activeChannel = _a.channel, client = _a.client;
8
- var thread = useChannelStateContext().thread;
9
- var _b = useState((activeChannel === null || activeChannel === void 0 ? void 0 : activeChannel.countUnread()) || 0), countUnread = _b[0], setCountUnread = _b[1];
10
- var _c = useState((thread === null || thread === void 0 ? void 0 : thread.reply_count) || 0), replyCount = _c[0], setReplyCount = _c[1];
11
- var observedEvent = threadList ? 'message.updated' : 'message.new';
12
- useEffect(function () {
13
- var handleEvent = function (event) {
14
- var _a, _b, _c, _d, _e;
15
- var newMessageInAnotherChannel = event.cid !== (activeChannel === null || activeChannel === void 0 ? void 0 : activeChannel.cid);
16
- var newMessageIsMine = ((_a = event.user) === null || _a === void 0 ? void 0 : _a.id) === ((_b = client.user) === null || _b === void 0 ? void 0 : _b.id);
17
- var isThreadOpen = !!thread;
18
- var newMessageIsReply = !!((_c = event.message) === null || _c === void 0 ? void 0 : _c.parent_id);
19
- var dontIncreaseMainListCounterOnNewReply = isThreadOpen && !threadList && newMessageIsReply;
20
- if (isMessageListScrolledToBottom ||
21
- newMessageInAnotherChannel ||
22
- newMessageIsMine ||
23
- dontIncreaseMainListCounterOnNewReply) {
24
- return;
25
- }
26
- if (event.type === 'message.new') {
27
- // cannot rely on channel.countUnread because active channel is automatically marked read
28
- setCountUnread(function (prev) { return prev + 1; });
29
- }
30
- else if (((_d = event.message) === null || _d === void 0 ? void 0 : _d.id) === (thread === null || thread === void 0 ? void 0 : thread.id)) {
31
- var newReplyCount_1 = ((_e = event.message) === null || _e === void 0 ? void 0 : _e.reply_count) || 0;
32
- setCountUnread(function () { return newReplyCount_1 - replyCount; });
33
- }
34
- };
35
- client.on(observedEvent, handleEvent);
36
- return function () {
37
- client.off(observedEvent, handleEvent);
38
- };
39
- // eslint-disable-next-line react-hooks/exhaustive-deps
40
- }, [activeChannel, isMessageListScrolledToBottom, observedEvent, replyCount, thread]);
41
- useEffect(function () {
42
- if (isMessageListScrolledToBottom) {
43
- setCountUnread(0);
44
- setReplyCount((thread === null || thread === void 0 ? void 0 : thread.reply_count) || 0);
45
- }
46
- }, [isMessageListScrolledToBottom, thread]);
5
+ var isMessageListScrolledToBottom = props.isMessageListScrolledToBottom, onClick = props.onClick, _a = props.unreadCount, unreadCount = _a === void 0 ? 0 : _a;
47
6
  if (isMessageListScrolledToBottom)
48
7
  return null;
49
8
  return (React.createElement("div", { className: 'str-chat__jump-to-latest-message' },
50
9
  React.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 },
51
10
  React.createElement(ArrowDown, null),
52
- countUnread > 0 && (React.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)))));
11
+ unreadCount > 0 && (React.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' }, unreadCount)))));
53
12
  };
54
13
  export var ScrollToBottomButton = React.memo(UnMemoizedScrollToBottomButton);
@@ -0,0 +1,6 @@
1
+ export type UnreadMessagesNotificationProps = {
2
+ queryMessageLimit?: number;
3
+ unreadCount?: number;
4
+ };
5
+ export declare const UnreadMessagesNotification: ({ queryMessageLimit, unreadCount, }: UnreadMessagesNotificationProps) => JSX.Element;
6
+ //# sourceMappingURL=UnreadMessagesNotification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnreadMessagesNotification.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/UnreadMessagesNotification.tsx"],"names":[],"mappings":"AAIA,MAAM,MAAM,+BAA+B,GAAG;IAC5C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,0BAA0B,wCAGpC,+BAA+B,gBAgBjC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { CloseIcon } from './icons';
3
+ import { useChannelActionContext, useTranslationContext } from '../../context';
4
+ export var UnreadMessagesNotification = function (_a) {
5
+ var queryMessageLimit = _a.queryMessageLimit, unreadCount = _a.unreadCount;
6
+ var _b = useChannelActionContext('UnreadMessagesNotification'), jumpToFirstUnreadMessage = _b.jumpToFirstUnreadMessage, markRead = _b.markRead;
7
+ var t = useTranslationContext('UnreadMessagesNotification').t;
8
+ return (React.createElement("div", { className: 'str-chat__unread-messages-notification' },
9
+ React.createElement("button", { onClick: function () { return jumpToFirstUnreadMessage(queryMessageLimit); } }, t('{{count}} unread', { count: unreadCount !== null && unreadCount !== void 0 ? unreadCount : 0 })),
10
+ React.createElement("button", { onClick: markRead },
11
+ React.createElement(CloseIcon, null))));
12
+ };
@@ -0,0 +1,6 @@
1
+ export declare const UNREAD_MESSAGE_SEPARATOR_CLASS = "str-chat__unread-messages-separator";
2
+ export type UnreadMessagesSeparatorProps = {
3
+ unreadCount?: number;
4
+ };
5
+ export declare const UnreadMessagesSeparator: ({ unreadCount }: UnreadMessagesSeparatorProps) => JSX.Element;
6
+ //# sourceMappingURL=UnreadMessagesSeparator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnreadMessagesSeparator.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/UnreadMessagesSeparator.tsx"],"names":[],"mappings":"AAGA,eAAO,MAAM,8BAA8B,wCAAwC,CAAC;AAEpF,MAAM,MAAM,4BAA4B,GAAG;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,uBAAuB,oBAAqB,4BAA4B,gBASpF,CAAC"}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { useTranslationContext } from '../../context';
3
+ export var UNREAD_MESSAGE_SEPARATOR_CLASS = 'str-chat__unread-messages-separator';
4
+ export var UnreadMessagesSeparator = function (_a) {
5
+ var unreadCount = _a.unreadCount;
6
+ var t = useTranslationContext('UnreadMessagesSeparator').t;
7
+ return (React.createElement("div", { className: UNREAD_MESSAGE_SEPARATOR_CLASS }, unreadCount
8
+ ? t('unreadMessagesSeparatorText', { count: unreadCount })
9
+ : t('Unread messages')));
10
+ };
@@ -12,7 +12,7 @@ type VirtualizedMessageListPropsForContext = 'additionalMessageInputProps' | 'cl
12
12
  /**
13
13
  * Context object provided to some Virtuoso props that are functions (components rendered by Virtuoso and other functions)
14
14
  */
15
- export type VirtuosoContext<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> = Required<Pick<ComponentContextValue<StreamChatGenerics>, 'DateSeparator' | 'MessageSystem'>> & Pick<VirtualizedMessageListProps<StreamChatGenerics>, VirtualizedMessageListPropsForContext> & Pick<ChatContextValue<StreamChatGenerics>, 'customClasses'> & {
15
+ export type VirtuosoContext<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> = Required<Pick<ComponentContextValue<StreamChatGenerics>, 'DateSeparator' | 'MessageSystem' | 'UnreadMessagesSeparator'>> & Pick<VirtualizedMessageListProps<StreamChatGenerics>, VirtualizedMessageListPropsForContext> & Pick<ChatContextValue<StreamChatGenerics>, 'customClasses'> & {
16
16
  /** Latest received message id in the current channel */
17
17
  lastReceivedMessageId: string | null | undefined;
18
18
  /** Object mapping between the message ID and a string representing the position in the group of a sequence of messages posted by the same user. */
@@ -25,6 +25,15 @@ export type VirtuosoContext<StreamChatGenerics extends DefaultStreamChatGenerics
25
25
  processedMessages: StreamMessage<StreamChatGenerics>[];
26
26
  /** Instance of VirtuosoHandle object providing the API to navigate in the virtualized list by various scroll actions. */
27
27
  virtuosoRef: RefObject<VirtuosoHandle>;
28
+ /** Message id which was marked as unread. ALl the messages following this message are considered unrea. */
29
+ firstUnreadMessageId?: string;
30
+ /**
31
+ * The ID of the last message considered read by the current user in the current channel.
32
+ * All the messages following this message are considered unread.
33
+ */
34
+ lastReadMessageId?: string;
35
+ /** The number of unread messages in the current channel. */
36
+ unreadMessageCount?: number;
28
37
  };
29
38
  type PropsDrilledToMessage = 'additionalMessageInputProps' | 'customMessageActions' | 'messageActions';
30
39
  export type VirtualizedMessageListProps<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> = Partial<Pick<MessageProps<StreamChatGenerics>, PropsDrilledToMessage>> & {
@@ -65,6 +74,8 @@ export type VirtualizedMessageListProps<StreamChatGenerics extends DefaultStream
65
74
  loadMore?: ChannelActionContextValue['loadMore'] | (() => Promise<void>);
66
75
  /** Function called when new messages are to be loaded, defaults to function stored in [ChannelActionContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_action_context/) */
67
76
  loadMoreNewer?: ChannelActionContextValue['loadMore'] | (() => Promise<void>);
77
+ /** When enabled, the channel will be marked read when a user scrolls to the bottom. Ignored when scrolled to the bottom of a thread message list. */
78
+ markReadOnScrolledToBottom?: boolean;
68
79
  /** Custom UI component to display a message, defaults to and accepts same props as [MessageSimple](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageSimple.tsx) */
69
80
  Message?: React.ComponentType<MessageUIComponentProps<StreamChatGenerics>>;
70
81
  /** The limit to use when paginating messages */
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualizedMessageList.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/VirtualizedMessageList.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VirtualizedMessageList.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/VirtualizedMessageList.tsx"],"names":[],"mappings":"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"}
@@ -3,15 +3,15 @@ import React, { useCallback, useEffect, useMemo, useRef } from 'react';
3
3
  import { Virtuoso, } from 'react-virtuoso';
4
4
  import { GiphyPreviewMessage as DefaultGiphyPreviewMessage } from './GiphyPreviewMessage';
5
5
  import { useLastReadData } from './hooks';
6
- import { useGiphyPreview, useMessageSetKey, useNewMessageNotification, usePrependedMessagesCount, useScrollToBottomOnNewMessage, useShouldForceScrollToBottom, } from './hooks/VirtualizedMessageList';
6
+ import { useGiphyPreview, useMessageSetKey, useNewMessageNotification, usePrependedMessagesCount, useScrollToBottomOnNewMessage, useShouldForceScrollToBottom, useUnreadMessagesNotificationVirtualized, } from './hooks/VirtualizedMessageList';
7
+ import { useMarkRead } from './hooks/useMarkRead';
7
8
  import { MessageNotification as DefaultMessageNotification } from './MessageNotification';
8
9
  import { MessageListNotifications as DefaultMessageListNotifications } from './MessageListNotifications';
9
10
  import { MessageListMainPanel } from './MessageListMainPanel';
10
11
  import { getGroupStyles, getLastReceived, processMessages } from './utils';
11
12
  import { MessageSimple } from '../Message';
12
- import { DateSeparator as DefaultDateSeparator } from '../DateSeparator';
13
- import { EventComponent } from '../EventComponent';
14
- import { calculateFirstItemIndex, calculateItemIndex, EmptyPlaceholder, Footer, Header, Item, messageRenderer, } from './VirtualizedMessageListComponents';
13
+ import { UnreadMessagesNotification as DefaultUnreadMessagesNotification } from './UnreadMessagesNotification';
14
+ import { calculateFirstItemIndex, calculateItemIndex, EmptyPlaceholder, Footer, Header, Item, makeItemsRenderedHandler, messageRenderer, } from './VirtualizedMessageListComponents';
15
15
  import { useChannelActionContext, } from '../../context/ChannelActionContext';
16
16
  import { useChannelStateContext, } from '../../context/ChannelStateContext';
17
17
  import { useChatContext } from '../../context/ChatContext';
@@ -46,21 +46,27 @@ function calculateInitialTopMostItemIndex(messages, highlightedMessageId) {
46
46
  return messages.length - 1;
47
47
  }
48
48
  var VirtualizedMessageListWithContext = function (props) {
49
- var additionalMessageInputProps = props.additionalMessageInputProps, _a = props.additionalVirtuosoProps, additionalVirtuosoProps = _a === void 0 ? {} : _a, channel = props.channel, closeReactionSelectorOnClick = props.closeReactionSelectorOnClick, customMessageActions = props.customMessageActions, customMessageRenderer = props.customMessageRenderer, defaultItemHeight = props.defaultItemHeight, _b = props.disableDateSeparator, disableDateSeparator = _b === void 0 ? true : _b, groupStyles = props.groupStyles, hasMoreNewer = props.hasMoreNewer, head = props.head, _c = props.hideDeletedMessages, hideDeletedMessages = _c === void 0 ? false : _c, _d = props.hideNewMessageSeparator, hideNewMessageSeparator = _d === void 0 ? false : _d, highlightedMessageId = props.highlightedMessageId, jumpToLatestMessage = props.jumpToLatestMessage, loadingMore = props.loadingMore, loadMore = props.loadMore, loadMoreNewer = props.loadMoreNewer, MessageUIComponentFromProps = props.Message, messageActions = props.messageActions, _e = props.messageLimit, messageLimit = _e === void 0 ? 100 : _e, messages = props.messages, notifications = props.notifications,
49
+ var _a, _b;
50
+ var additionalMessageInputProps = props.additionalMessageInputProps, _c = props.additionalVirtuosoProps, additionalVirtuosoProps = _c === void 0 ? {} : _c, channel = props.channel, closeReactionSelectorOnClick = props.closeReactionSelectorOnClick, customMessageActions = props.customMessageActions, customMessageRenderer = props.customMessageRenderer, defaultItemHeight = props.defaultItemHeight, _d = props.disableDateSeparator, disableDateSeparator = _d === void 0 ? true : _d, groupStyles = props.groupStyles, hasMoreNewer = props.hasMoreNewer, head = props.head, _e = props.hideDeletedMessages, hideDeletedMessages = _e === void 0 ? false : _e, _f = props.hideNewMessageSeparator, hideNewMessageSeparator = _f === void 0 ? false : _f, highlightedMessageId = props.highlightedMessageId, jumpToLatestMessage = props.jumpToLatestMessage, loadingMore = props.loadingMore, loadMore = props.loadMore, loadMoreNewer = props.loadMoreNewer, markReadOnScrolledToBottom = props.markReadOnScrolledToBottom, MessageUIComponentFromProps = props.Message, messageActions = props.messageActions, _g = props.messageLimit, messageLimit = _g === void 0 ? 100 : _g, messages = props.messages, notifications = props.notifications,
50
51
  // TODO: refactor to scrollSeekPlaceHolderConfiguration and components.ScrollSeekPlaceholder, like the Virtuoso Component
51
- _f = props.overscan,
52
+ _h = props.overscan,
52
53
  // TODO: refactor to scrollSeekPlaceHolderConfiguration and components.ScrollSeekPlaceholder, like the Virtuoso Component
53
- overscan = _f === void 0 ? 0 : _f, read = props.read, _g = props.returnAllReadData, returnAllReadData = _g === void 0 ? false : _g, scrollSeekPlaceHolder = props.scrollSeekPlaceHolder, _h = props.scrollToLatestMessageOnFocus, scrollToLatestMessageOnFocus = _h === void 0 ? false : _h, _j = props.separateGiphyPreview, separateGiphyPreview = _j === void 0 ? false : _j, _k = props.shouldGroupByUser, shouldGroupByUser = _k === void 0 ? false : _k, _l = props.stickToBottomScrollBehavior, stickToBottomScrollBehavior = _l === void 0 ? 'smooth' : _l, suppressAutoscroll = props.suppressAutoscroll, threadList = props.threadList;
54
+ overscan = _h === void 0 ? 0 : _h, read = props.read, _j = props.returnAllReadData, returnAllReadData = _j === void 0 ? false : _j, scrollSeekPlaceHolder = props.scrollSeekPlaceHolder, _k = props.scrollToLatestMessageOnFocus, scrollToLatestMessageOnFocus = _k === void 0 ? false : _k, _l = props.separateGiphyPreview, separateGiphyPreview = _l === void 0 ? false : _l, _m = props.shouldGroupByUser, shouldGroupByUser = _m === void 0 ? false : _m, _o = props.stickToBottomScrollBehavior, stickToBottomScrollBehavior = _o === void 0 ? 'smooth' : _o, suppressAutoscroll = props.suppressAutoscroll, threadList = props.threadList;
54
55
  var virtuosoComponentsFromProps = additionalVirtuosoProps.components, overridingVirtuosoProps = __rest(additionalVirtuosoProps, ["components"]);
55
56
  // Stops errors generated from react-virtuoso to bubble up
56
57
  // to Sentry or other tracking tools.
57
58
  useCaptureResizeObserverExceededError();
58
- var _m = useComponentContext('VirtualizedMessageList'), _o = _m.DateSeparator, DateSeparator = _o === void 0 ? DefaultDateSeparator : _o, _p = _m.GiphyPreviewMessage, GiphyPreviewMessage = _p === void 0 ? DefaultGiphyPreviewMessage : _p, _q = _m.MessageListNotifications, MessageListNotifications = _q === void 0 ? DefaultMessageListNotifications : _q, _r = _m.MessageNotification, MessageNotification = _r === void 0 ? DefaultMessageNotification : _r, _s = _m.MessageSystem, MessageSystem = _s === void 0 ? EventComponent : _s, _t = _m.VirtualMessage, MessageUIComponentFromContext = _t === void 0 ? MessageSimple : _t;
59
+ var _p = useComponentContext('VirtualizedMessageList'), DateSeparator = _p.DateSeparator, _q = _p.GiphyPreviewMessage, GiphyPreviewMessage = _q === void 0 ? DefaultGiphyPreviewMessage : _q, _r = _p.MessageListNotifications, MessageListNotifications = _r === void 0 ? DefaultMessageListNotifications : _r, _s = _p.MessageNotification, MessageNotification = _s === void 0 ? DefaultMessageNotification : _s, MessageSystem = _p.MessageSystem, _t = _p.UnreadMessagesNotification, UnreadMessagesNotification = _t === void 0 ? DefaultUnreadMessagesNotification : _t, UnreadMessagesSeparator = _p.UnreadMessagesSeparator, _u = _p.VirtualMessage, MessageUIComponentFromContext = _u === void 0 ? MessageSimple : _u;
59
60
  var MessageUIComponent = MessageUIComponentFromProps || MessageUIComponentFromContext;
60
- var _u = useChatContext('VirtualizedMessageList'), client = _u.client, customClasses = _u.customClasses;
61
+ var _v = useChatContext('VirtualizedMessageList'), client = _v.client, customClasses = _v.customClasses;
61
62
  var virtuoso = useRef(null);
62
63
  var lastRead = useMemo(function () { var _a; return (_a = channel.lastRead) === null || _a === void 0 ? void 0 : _a.call(channel); }, [channel]);
63
- var _v = useGiphyPreview(separateGiphyPreview), giphyPreviewMessage = _v.giphyPreviewMessage, setGiphyPreviewMessage = _v.setGiphyPreviewMessage;
64
+ var currentUserChannelReadState = client.user && (read === null || read === void 0 ? void 0 : read[client.user.id]);
65
+ var _w = useUnreadMessagesNotificationVirtualized({
66
+ lastRead: currentUserChannelReadState === null || currentUserChannelReadState === void 0 ? void 0 : currentUserChannelReadState.last_read,
67
+ unreadCount: (_a = currentUserChannelReadState === null || currentUserChannelReadState === void 0 ? void 0 : currentUserChannelReadState.unread_messages) !== null && _a !== void 0 ? _a : 0,
68
+ }), showUnreadMessagesNotification = _w.show, toggleShowUnreadMessagesNotification = _w.toggleShowUnreadMessagesNotification;
69
+ var _x = useGiphyPreview(separateGiphyPreview), giphyPreviewMessage = _x.giphyPreviewMessage, setGiphyPreviewMessage = _x.setGiphyPreviewMessage;
64
70
  var processedMessages = useMemo(function () {
65
71
  if (typeof messages === 'undefined') {
66
72
  return [];
@@ -112,7 +118,13 @@ var VirtualizedMessageListWithContext = function (props) {
112
118
  // processedMessages were incorrectly rebuilt with a new object identity at some point, hence the .length usage
113
119
  // eslint-disable-next-line react-hooks/exhaustive-deps
114
120
  [processedMessages.length, shouldGroupByUser, groupStylesFn]);
115
- var _w = useNewMessageNotification(processedMessages, client.userID, hasMoreNewer), atBottom = _w.atBottom, isMessageListScrolledToBottom = _w.isMessageListScrolledToBottom, newMessagesNotification = _w.newMessagesNotification, setIsMessageListScrolledToBottom = _w.setIsMessageListScrolledToBottom, setNewMessagesNotification = _w.setNewMessagesNotification;
121
+ var _y = useNewMessageNotification(processedMessages, client.userID, hasMoreNewer), atBottom = _y.atBottom, isMessageListScrolledToBottom = _y.isMessageListScrolledToBottom, newMessagesNotification = _y.newMessagesNotification, setIsMessageListScrolledToBottom = _y.setIsMessageListScrolledToBottom, setNewMessagesNotification = _y.setNewMessagesNotification;
122
+ useMarkRead({
123
+ isMessageListScrolledToBottom: isMessageListScrolledToBottom,
124
+ markReadOnScrolledToBottom: markReadOnScrolledToBottom,
125
+ messageListIsThread: !!threadList,
126
+ unreadCount: (_b = currentUserChannelReadState === null || currentUserChannelReadState === void 0 ? void 0 : currentUserChannelReadState.unread_messages) !== null && _b !== void 0 ? _b : 0,
127
+ });
116
128
  var scrollToBottom = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
117
129
  return __generator(this, function (_a) {
118
130
  switch (_a.label) {
@@ -143,6 +155,7 @@ var VirtualizedMessageListWithContext = function (props) {
143
155
  var numItemsPrepended = usePrependedMessagesCount(processedMessages, !disableDateSeparator);
144
156
  var messageSetKey = useMessageSetKey({ messages: messages }).messageSetKey;
145
157
  var shouldForceScrollToBottom = useShouldForceScrollToBottom(processedMessages, client.userID);
158
+ var handleItemsRendered = useMemo(function () { return makeItemsRenderedHandler([toggleShowUnreadMessagesNotification], processedMessages); }, [processedMessages, toggleShowUnreadMessagesNotification]);
146
159
  var followOutput = function (isAtBottom) {
147
160
  if (hasMoreNewer || suppressAutoscroll) {
148
161
  return false;
@@ -170,19 +183,25 @@ var VirtualizedMessageListWithContext = function (props) {
170
183
  loadMore === null || loadMore === void 0 ? void 0 : loadMore(messageLimit);
171
184
  };
172
185
  useEffect(function () {
173
- var _a;
186
+ var scrollTimeout;
174
187
  if (highlightedMessageId) {
175
- var index = findMessageIndex(processedMessages, highlightedMessageId);
176
- if (index !== -1) {
177
- (_a = virtuoso.current) === null || _a === void 0 ? void 0 : _a.scrollToIndex({ align: 'center', index: index });
188
+ var index_1 = findMessageIndex(processedMessages, highlightedMessageId);
189
+ if (index_1 !== -1) {
190
+ scrollTimeout = setTimeout(function () {
191
+ var _a;
192
+ (_a = virtuoso.current) === null || _a === void 0 ? void 0 : _a.scrollToIndex({ align: 'center', index: index_1 });
193
+ }, 0);
178
194
  }
179
195
  }
180
- // eslint-disable-next-line react-hooks/exhaustive-deps
181
- }, [highlightedMessageId]);
196
+ return function () {
197
+ clearTimeout(scrollTimeout);
198
+ };
199
+ }, [highlightedMessageId, processedMessages]);
182
200
  if (!processedMessages)
183
201
  return null;
184
202
  return (React.createElement(React.Fragment, null,
185
203
  React.createElement(MessageListMainPanel, null,
204
+ !threadList && showUnreadMessagesNotification && (React.createElement(UnreadMessagesNotification, { unreadCount: currentUserChannelReadState === null || currentUserChannelReadState === void 0 ? void 0 : currentUserChannelReadState.unread_messages })),
186
205
  React.createElement("div", { className: (customClasses === null || customClasses === void 0 ? void 0 : customClasses.virtualizedMessageList) || 'str-chat__virtual-list' },
187
206
  React.createElement(Virtuoso, __assign({ atBottomStateChange: atBottomStateChange, atBottomThreshold: 100, atTopStateChange: atTopStateChange, atTopThreshold: 100, className: 'str-chat__message-list-scroll', components: __assign({ EmptyPlaceholder: EmptyPlaceholder, Footer: Footer, Header: Header, Item: Item }, virtuosoComponentsFromProps), computeItemKey: computeItemKey, context: {
188
207
  additionalMessageInputProps: additionalMessageInputProps,
@@ -191,7 +210,9 @@ var VirtualizedMessageListWithContext = function (props) {
191
210
  customMessageActions: customMessageActions,
192
211
  customMessageRenderer: customMessageRenderer,
193
212
  DateSeparator: DateSeparator,
213
+ firstUnreadMessageId: currentUserChannelReadState === null || currentUserChannelReadState === void 0 ? void 0 : currentUserChannelReadState.first_unread_message_id,
194
214
  head: head,
215
+ lastReadMessageId: currentUserChannelReadState === null || currentUserChannelReadState === void 0 ? void 0 : currentUserChannelReadState.last_read_message_id,
195
216
  lastReceivedMessageId: lastReceivedMessageId,
196
217
  loadingMore: loadingMore,
197
218
  Message: MessageUIComponent,
@@ -203,9 +224,11 @@ var VirtualizedMessageListWithContext = function (props) {
203
224
  processedMessages: processedMessages,
204
225
  shouldGroupByUser: shouldGroupByUser,
205
226
  threadList: threadList,
227
+ unreadMessageCount: currentUserChannelReadState === null || currentUserChannelReadState === void 0 ? void 0 : currentUserChannelReadState.unread_messages,
228
+ UnreadMessagesSeparator: UnreadMessagesSeparator,
206
229
  virtuosoRef: virtuoso,
207
- }, firstItemIndex: calculateFirstItemIndex(numItemsPrepended), followOutput: followOutput, increaseViewportBy: { bottom: 200, top: 0 }, initialTopMostItemIndex: calculateInitialTopMostItemIndex(processedMessages, highlightedMessageId), itemContent: messageRenderer, itemSize: fractionalItemSize, key: messageSetKey, overscan: overscan, ref: virtuoso, style: { overflowX: 'hidden' }, totalCount: processedMessages.length }, overridingVirtuosoProps, (scrollSeekPlaceHolder ? { scrollSeek: scrollSeekPlaceHolder } : {}), (defaultItemHeight ? { defaultItemHeight: defaultItemHeight } : {}))))),
208
- React.createElement(MessageListNotifications, { hasNewMessages: newMessagesNotification, isMessageListScrolledToBottom: isMessageListScrolledToBottom, isNotAtLatestMessageSet: hasMoreNewer, MessageNotification: MessageNotification, notifications: notifications, scrollToBottom: scrollToBottom, threadList: threadList }),
230
+ }, firstItemIndex: calculateFirstItemIndex(numItemsPrepended), followOutput: followOutput, increaseViewportBy: { bottom: 200, top: 0 }, initialTopMostItemIndex: calculateInitialTopMostItemIndex(processedMessages, highlightedMessageId), itemContent: messageRenderer, itemSize: fractionalItemSize, itemsRendered: handleItemsRendered, key: messageSetKey, overscan: overscan, ref: virtuoso, style: { overflowX: 'hidden' }, totalCount: processedMessages.length }, overridingVirtuosoProps, (scrollSeekPlaceHolder ? { scrollSeek: scrollSeekPlaceHolder } : {}), (defaultItemHeight ? { defaultItemHeight: defaultItemHeight } : {}))))),
231
+ React.createElement(MessageListNotifications, { hasNewMessages: newMessagesNotification, isMessageListScrolledToBottom: isMessageListScrolledToBottom, isNotAtLatestMessageSet: hasMoreNewer, MessageNotification: MessageNotification, notifications: notifications, scrollToBottom: scrollToBottom, threadList: threadList, unreadCount: threadList ? undefined : currentUserChannelReadState === null || currentUserChannelReadState === void 0 ? void 0 : currentUserChannelReadState.unread_messages }),
209
232
  giphyPreviewMessage && React.createElement(GiphyPreviewMessage, { message: giphyPreviewMessage })));
210
233
  };
211
234
  /**
@@ -1,9 +1,11 @@
1
- import { DefaultStreamChatGenerics, UnknownType } from '../../types/types';
2
1
  import React from 'react';
3
- import { ItemProps } from 'react-virtuoso';
4
- import { VirtuosoContext } from './VirtualizedMessageList';
2
+ import { ItemProps, ListItem } from 'react-virtuoso';
3
+ import { StreamMessage } from '../../context';
4
+ import type { VirtuosoContext } from './VirtualizedMessageList';
5
+ import type { DefaultStreamChatGenerics, UnknownType } from '../../types/types';
5
6
  export declare function calculateItemIndex(virtuosoIndex: number, numItemsPrepended: number): number;
6
7
  export declare function calculateFirstItemIndex(numItemsPrepended: number): number;
8
+ export declare const makeItemsRenderedHandler: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>(renderedItemsActions: ((msg: StreamMessage<StreamChatGenerics>[]) => void)[], processedMessages: StreamMessage<StreamChatGenerics>[]) => import("lodash").DebouncedFunc<(items: ListItem<UnknownType>[]) => void>;
7
9
  type CommonVirtuosoComponentProps<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> = {
8
10
  context?: VirtuosoContext<StreamChatGenerics>;
9
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualizedMessageListComponents.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/VirtualizedMessageListComponents.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG3E,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAI3D,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,UAElF;AAED,wBAAgB,uBAAuB,CAAC,iBAAiB,EAAE,MAAM,UAEhE;AAED,KAAK,4BAA4B,CAC/B,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E;IACF,OAAO,CAAC,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;CAC/C,CAAC;AAGF,eAAO,MAAM,IAAI;;;;;;;oEAyBhB,CAAC;AACF,eAAO,MAAM,MAAM,0KAgBlB,CAAC;AACF,eAAO,MAAM,gBAAgB,mKAe5B,CAAC;AACF,eAAO,MAAM,MAAM,4GAKlB,CAAC;AACF,eAAO,MAAM,eAAe,oGAGX,MAAM,SACd,WAAW,6EAgEnB,CAAC"}
1
+ {"version":3,"file":"VirtualizedMessageListComponents.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/VirtualizedMessageListComponents.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAMrD,OAAO,EAAU,aAAa,EAAuB,MAAM,eAAe,CAAC;AAI3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIhF,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,UAElF;AAED,wBAAgB,uBAAuB,CAAC,iBAAiB,EAAE,MAAM,UAEhE;AAED,eAAO,MAAM,wBAAwB,0JAGuC,IAAI,uGAG7D,SAAS,WAAW,CAAC,EAAE,UAUjC,CAAC;AAEV,KAAK,4BAA4B,CAC/B,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E;IACF,OAAO,CAAC,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;CAC/C,CAAC;AAGF,eAAO,MAAM,IAAI;;;;;;;oEAyBhB,CAAC;AACF,eAAO,MAAM,MAAM,0KAgBlB,CAAC;AACF,eAAO,MAAM,gBAAgB,mKAe5B,CAAC;AACF,eAAO,MAAM,MAAM,4GAKlB,CAAC;AACF,eAAO,MAAM,eAAe,oGAGX,MAAM,SACd,WAAW,6EA+EnB,CAAC"}
@@ -1,11 +1,12 @@
1
1
  import { __assign, __rest } from "tslib";
2
- import { EmptyStateIndicator as DefaultEmptyStateIndicator } from '../EmptyStateIndicator';
3
- import { isDate, useComponentContext } from '../../context';
2
+ import clsx from 'clsx';
3
+ import throttle from 'lodash.throttle';
4
4
  import React from 'react';
5
+ import { EmptyStateIndicator as DefaultEmptyStateIndicator } from '../EmptyStateIndicator';
5
6
  import { LoadingIndicator as DefaultLoadingIndicator } from '../Loading';
6
- import { CUSTOM_MESSAGE_TYPE } from '../../constants/messageTypes';
7
7
  import { Message } from '../Message';
8
- import clsx from 'clsx';
8
+ import { isDate, useComponentContext } from '../../context';
9
+ import { CUSTOM_MESSAGE_TYPE } from '../../constants/messageTypes';
9
10
  var PREPEND_OFFSET = Math.pow(10, 7);
10
11
  export function calculateItemIndex(virtuosoIndex, numItemsPrepended) {
11
12
  return virtuosoIndex + numItemsPrepended - PREPEND_OFFSET;
@@ -13,6 +14,20 @@ export function calculateItemIndex(virtuosoIndex, numItemsPrepended) {
13
14
  export function calculateFirstItemIndex(numItemsPrepended) {
14
15
  return PREPEND_OFFSET - numItemsPrepended;
15
16
  }
17
+ export var makeItemsRenderedHandler = function (renderedItemsActions, processedMessages) {
18
+ return throttle(function (items) {
19
+ var renderedMessages = items
20
+ .map(function (item) {
21
+ if (!item.originalIndex)
22
+ return undefined;
23
+ return processedMessages[calculateItemIndex(item.originalIndex, PREPEND_OFFSET)];
24
+ })
25
+ .filter(function (msg) { return !!msg; });
26
+ renderedItemsActions.forEach(function (action) {
27
+ return action(renderedMessages);
28
+ });
29
+ }, 200);
30
+ };
16
31
  // using 'display: inline-block'
17
32
  // traps CSS margins of the item elements, preventing incorrect item measurements
18
33
  export var Item = function (_a) {
@@ -47,7 +62,7 @@ export var Footer = function () {
47
62
  };
48
63
  export var messageRenderer = function (virtuosoIndex, _data, virtuosoContext) {
49
64
  var _a, _b, _c, _d, _e, _f, _g, _h, _j;
50
- var additionalMessageInputProps = virtuosoContext.additionalMessageInputProps, closeReactionSelectorOnClick = virtuosoContext.closeReactionSelectorOnClick, customMessageActions = virtuosoContext.customMessageActions, customMessageRenderer = virtuosoContext.customMessageRenderer, DateSeparator = virtuosoContext.DateSeparator, lastReceivedMessageId = virtuosoContext.lastReceivedMessageId, MessageUIComponent = virtuosoContext.Message, messageActions = virtuosoContext.messageActions, MessageSystem = virtuosoContext.MessageSystem, numItemsPrepended = virtuosoContext.numItemsPrepended, ownMessagesReadByOthers = virtuosoContext.ownMessagesReadByOthers, messageList = virtuosoContext.processedMessages, shouldGroupByUser = virtuosoContext.shouldGroupByUser, virtuosoRef = virtuosoContext.virtuosoRef;
65
+ 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, _k = virtuosoContext.unreadMessageCount, unreadMessageCount = _k === void 0 ? 0 : _k, UnreadMessagesSeparator = virtuosoContext.UnreadMessagesSeparator, virtuosoRef = virtuosoContext.virtuosoRef;
51
66
  var streamMessageIndex = calculateItemIndex(virtuosoIndex, numItemsPrepended);
52
67
  if (customMessageRenderer) {
53
68
  return customMessageRenderer(messageList, streamMessageIndex);
@@ -66,5 +81,11 @@ export var messageRenderer = function (virtuosoIndex, _data, virtuosoContext) {
66
81
  ((_a = message.user) === null || _a === void 0 ? void 0 : _a.id) === ((_b = messageList[streamMessageIndex - 1].user) === null || _b === void 0 ? void 0 : _b.id);
67
82
  var firstOfGroup = shouldGroupByUser && ((_c = message.user) === null || _c === void 0 ? void 0 : _c.id) !== ((_e = (_d = messageList[streamMessageIndex - 1]) === null || _d === void 0 ? void 0 : _d.user) === null || _e === void 0 ? void 0 : _e.id);
68
83
  var endOfGroup = shouldGroupByUser && ((_f = message.user) === null || _f === void 0 ? void 0 : _f.id) !== ((_h = (_g = messageList[streamMessageIndex + 1]) === null || _g === void 0 ? void 0 : _g.user) === null || _h === void 0 ? void 0 : _h.id);
69
- return (React.createElement(Message, { additionalMessageInputProps: additionalMessageInputProps, autoscrollToBottom: (_j = virtuosoRef.current) === null || _j === void 0 ? void 0 : _j.autoscrollToBottom, closeReactionSelectorOnClick: closeReactionSelectorOnClick, customMessageActions: customMessageActions, endOfGroup: endOfGroup, firstOfGroup: firstOfGroup, groupedByUser: groupedByUser, lastReceivedId: lastReceivedMessageId, message: message, Message: MessageUIComponent, messageActions: messageActions, readBy: ownMessagesReadByOthers[message.id] || [] }));
84
+ var isNewestMessage = lastReadMessageId === lastReceivedMessageId;
85
+ var isLastReadMessage = message.id === lastReadMessageId;
86
+ var showUnreadSeparator = isLastReadMessage && !isNewestMessage && (firstUnreadMessageId || unreadMessageCount > 0); // unread count can be 0 if the user marks unread only own messages
87
+ return (React.createElement(React.Fragment, null,
88
+ React.createElement(Message, { additionalMessageInputProps: additionalMessageInputProps, autoscrollToBottom: (_j = virtuosoRef.current) === null || _j === void 0 ? void 0 : _j.autoscrollToBottom, closeReactionSelectorOnClick: closeReactionSelectorOnClick, customMessageActions: customMessageActions, endOfGroup: endOfGroup, firstOfGroup: firstOfGroup, groupedByUser: groupedByUser, lastReceivedId: lastReceivedMessageId, message: message, Message: MessageUIComponent, messageActions: messageActions, readBy: ownMessagesReadByOthers[message.id] || [] }),
89
+ showUnreadSeparator && (React.createElement("div", { className: 'str-chat__unread-messages-separator-wrapper' },
90
+ React.createElement(UnreadMessagesSeparator, { unreadCount: unreadMessageCount })))));
70
91
  };
@@ -2,4 +2,5 @@ export * from './useEnrichedMessages';
2
2
  export * from './useMessageListElements';
3
3
  export * from './useMessageListScrollManager';
4
4
  export * from './useScrollLocationLogic';
5
+ export * from './useUnreadMessagesNotification';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/MessageList/hooks/MessageList/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/MessageList/hooks/MessageList/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC"}
@@ -2,3 +2,4 @@ export * from './useEnrichedMessages';
2
2
  export * from './useMessageListElements';
3
3
  export * from './useMessageListScrollManager';
4
4
  export * from './useScrollLocationLogic';
5
+ export * from './useUnreadMessagesNotification';
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { GroupStyle } from '../../utils';
3
- import type { UserResponse } from 'stream-chat';
3
+ import type { ChannelState as StreamChannelState } from 'stream-chat';
4
4
  import type { StreamMessage } from '../../../../context/ChannelStateContext';
5
5
  import type { DefaultStreamChatGenerics } from '../../../../types/types';
6
6
  import { MessageRenderer, SharedMessageProps } from '../../renderMessages';
@@ -11,10 +11,7 @@ type UseMessageListElementsProps<StreamChatGenerics extends DefaultStreamChatGen
11
11
  renderMessages: MessageRenderer<StreamChatGenerics>;
12
12
  returnAllReadData: boolean;
13
13
  threadList: boolean;
14
- read?: Record<string, {
15
- last_read: Date;
16
- user: UserResponse<StreamChatGenerics>;
17
- }>;
14
+ read?: StreamChannelState<StreamChatGenerics>['read'];
18
15
  };
19
16
  export declare const useMessageListElements: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>(props: UseMessageListElementsProps<StreamChatGenerics>) => React.ReactNode[];
20
17
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"useMessageListElements.d.ts","sourceRoot":"","sources":["../../../../../src/components/MessageList/hooks/MessageList/useMessageListElements.tsx"],"names":[],"mappings":"AACA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAGvC,OAAO,EAAmB,UAAU,EAAE,MAAM,aAAa,CAAC;AAK1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAE7E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE3E,KAAK,2BAA2B,CAC9B,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E;IACF,gBAAgB,EAAE,aAAa,CAAC,kBAAkB,CAAC,EAAE,CAAC;IACtD,oBAAoB,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;IAC7D,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/C,cAAc,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;IACpD,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAA;KAAE,CAAC,CAAC;CACpF,CAAC;AAEF,eAAO,MAAM,sBAAsB,iKAsDlC,CAAC"}
1
+ {"version":3,"file":"useMessageListElements.d.ts","sourceRoot":"","sources":["../../../../../src/components/MessageList/hooks/MessageList/useMessageListElements.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAGvC,OAAO,EAAmB,UAAU,EAAE,MAAM,aAAa,CAAC;AAK1D,OAAO,KAAK,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAE7E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE3E,KAAK,2BAA2B,CAC9B,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E;IACF,gBAAgB,EAAE,aAAa,CAAC,kBAAkB,CAAC,EAAE,CAAC;IACtD,oBAAoB,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;IAC7D,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/C,cAAc,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;IACpD,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;CACvD,CAAC;AAEF,eAAO,MAAM,sBAAsB,iKA0DlC,CAAC"}
@@ -1,5 +1,4 @@
1
1
  import { __assign } from "tslib";
2
- /* eslint-disable no-continue */
3
2
  import { useMemo } from 'react';
4
3
  import { useLastReadData } from '../useLastReadData';
5
4
  import { getLastReceived } from '../../utils';
@@ -19,6 +18,7 @@ export var useMessageListElements = function (props) {
19
18
  var lastReceivedMessageId = useMemo(function () { return getLastReceived(enrichedMessages); }, [
20
19
  enrichedMessages,
21
20
  ]);
21
+ var ownReadState = client.user && (read === null || read === void 0 ? void 0 : read[client.user.id]) ? read[client.user.id] : undefined;
22
22
  var elements = useMemo(function () {
23
23
  return renderMessages({
24
24
  components: components,
@@ -26,6 +26,7 @@ export var useMessageListElements = function (props) {
26
26
  lastReceivedMessageId: lastReceivedMessageId,
27
27
  messageGroupStyles: messageGroupStyles,
28
28
  messages: enrichedMessages,
29
+ ownReadState: ownReadState,
29
30
  readData: readData,
30
31
  sharedMessageProps: __assign(__assign({}, internalMessageProps), { threadList: threadList }),
31
32
  });
@@ -36,6 +37,7 @@ export var useMessageListElements = function (props) {
36
37
  internalMessageProps,
37
38
  lastReceivedMessageId,
38
39
  messageGroupStyles,
40
+ ownReadState,
39
41
  readData,
40
42
  renderMessages,
41
43
  threadList,
@@ -0,0 +1,7 @@
1
+ export type UseUnreadMessagesNotificationParams = {
2
+ unreadCount?: number;
3
+ };
4
+ export declare const useUnreadMessagesNotification: ({ unreadCount, }: UseUnreadMessagesNotificationParams) => {
5
+ show: boolean;
6
+ };
7
+ //# sourceMappingURL=useUnreadMessagesNotification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUnreadMessagesNotification.d.ts","sourceRoot":"","sources":["../../../../../src/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,mCAAmC,GAAG;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,6BAA6B,qBAEvC,mCAAmC;;CAwCrC,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { useChannelStateContext } from '../../../../context';
2
+ import { useEffect, useState } from 'react';
3
+ import { MESSAGE_LIST_MAIN_PANEL_CLASS } from '../../MessageListMainPanel';
4
+ import { UNREAD_MESSAGE_SEPARATOR_CLASS } from '../../UnreadMessagesSeparator';
5
+ var targetIsVisibleInContainer = function (element, container) {
6
+ var msgListHeight = container.getBoundingClientRect().height;
7
+ var targetMessageY = element.getBoundingClientRect().y;
8
+ return 0 <= targetMessageY && targetMessageY <= msgListHeight;
9
+ };
10
+ export var useUnreadMessagesNotification = function (_a) {
11
+ var unreadCount = _a.unreadCount;
12
+ var messages = useChannelStateContext('UnreadMessagesNotification').messages;
13
+ var _b = useState(false), show = _b[0], setShow = _b[1];
14
+ var intersectionObserverIsSupported = typeof IntersectionObserver !== 'undefined';
15
+ useEffect(function () {
16
+ if (!(unreadCount && intersectionObserverIsSupported)) {
17
+ setShow(false);
18
+ return;
19
+ }
20
+ var msgListPanel = document.querySelector(".".concat(MESSAGE_LIST_MAIN_PANEL_CLASS));
21
+ if (!msgListPanel)
22
+ return;
23
+ var observedTarget = document.querySelector(".".concat(UNREAD_MESSAGE_SEPARATOR_CLASS));
24
+ if (!observedTarget) {
25
+ setShow(true);
26
+ return;
27
+ }
28
+ setShow(!targetIsVisibleInContainer(observedTarget, msgListPanel));
29
+ var observer = new IntersectionObserver(function (elements) {
30
+ if (!elements.length)
31
+ return;
32
+ var _a = elements[0], boundingClientRect = _a.boundingClientRect, isIntersecting = _a.isIntersecting, rootBounds = _a.rootBounds;
33
+ var isScrolledAboveTargetTop = rootBounds && boundingClientRect && rootBounds.bottom < boundingClientRect.top;
34
+ setShow(!isIntersecting && !isScrolledAboveTargetTop);
35
+ }, { root: msgListPanel });
36
+ observer.observe(observedTarget);
37
+ return function () {
38
+ observer.disconnect();
39
+ };
40
+ }, [intersectionObserverIsSupported, messages, unreadCount]);
41
+ return { show: show && intersectionObserverIsSupported };
42
+ };
@@ -4,4 +4,5 @@ export * from './useNewMessageNotification';
4
4
  export * from './usePrependMessagesCount';
5
5
  export * from './useScrollToBottomOnNewMessage';
6
6
  export * from './useShouldForceScrollToBottom';
7
+ export * from './useUnreadMessagesNotificationVirtualized';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/MessageList/hooks/VirtualizedMessageList/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/MessageList/hooks/VirtualizedMessageList/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4CAA4C,CAAC"}
@@ -4,3 +4,4 @@ export * from './useNewMessageNotification';
4
4
  export * from './usePrependMessagesCount';
5
5
  export * from './useScrollToBottomOnNewMessage';
6
6
  export * from './useShouldForceScrollToBottom';
7
+ export * from './useUnreadMessagesNotificationVirtualized';