stream-chat-react 13.10.1 → 13.11.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.
@@ -24,7 +24,7 @@ export const useChat = ({ client, defaultLanguage = 'en', i18nInstance, initialN
24
24
  useEffect(() => {
25
25
  if (!client)
26
26
  return;
27
- const version = "13.10.1";
27
+ const version = "13.11.0";
28
28
  const userAgent = client.getUserAgent();
29
29
  if (!userAgent.includes('stream-chat-react')) {
30
30
  // result looks like: 'stream-chat-react-2.3.2-stream-chat-javascript-client-browser-2.2.2'
@@ -9,7 +9,7 @@ import type { ChatContextValue } from '../../context/ChatContext';
9
9
  import type { ComponentContextValue } from '../../context/ComponentContext';
10
10
  import type { LocalMessage, UserResponse } from 'stream-chat';
11
11
  import type { UnknownType } from '../../types/types';
12
- type PropsDrilledToMessage = 'additionalMessageInputProps' | 'customMessageActions' | 'formatDate' | 'messageActions' | 'openThread' | 'reactionDetailsSort' | 'sortReactions' | 'sortReactionDetails';
12
+ type PropsDrilledToMessage = 'additionalMessageInputProps' | 'customMessageActions' | 'formatDate' | 'messageActions' | 'openThread' | 'reactionDetailsSort' | 'renderText' | 'sortReactions' | 'sortReactionDetails';
13
13
  type VirtualizedMessageListPropsForContext = PropsDrilledToMessage | 'closeReactionSelectorOnClick' | 'customMessageRenderer' | 'head' | 'loadingMore' | 'Message' | 'returnAllReadData' | 'shouldGroupByUser' | 'threadList';
14
14
  /**
15
15
  * Context object provided to some Virtuoso props that are functions (components rendered by Virtuoso and other functions)
@@ -56,7 +56,7 @@ function calculateInitialTopMostItemIndex(messages, highlightedMessageId) {
56
56
  const VirtualizedMessageListWithContext = (props) => {
57
57
  const { additionalMessageInputProps, additionalVirtuosoProps = {}, channel, channelUnreadUiState, closeReactionSelectorOnClick, customMessageActions, customMessageRenderer, defaultItemHeight, disableDateSeparator = true, formatDate, groupStyles, hasMoreNewer, head, hideDeletedMessages = false, hideNewMessageSeparator = false, highlightedMessageId, jumpToLatestMessage, loadingMore, loadMore, loadMoreNewer, maxTimeBetweenGroupedMessages, Message: MessageUIComponentFromProps, messageActions, messageLimit = DEFAULT_NEXT_CHANNEL_PAGE_SIZE, messages, notifications, openThread,
58
58
  // TODO: refactor to scrollSeekPlaceHolderConfiguration and components.ScrollSeekPlaceholder, like the Virtuoso Component
59
- overscan = 0, reactionDetailsSort, returnAllReadData = false, reviewProcessedMessage, scrollSeekPlaceHolder, scrollToLatestMessageOnFocus = false, separateGiphyPreview = false, shouldGroupByUser = false, showUnreadNotificationAlways, sortReactionDetails, sortReactions, stickToBottomScrollBehavior = 'smooth', suppressAutoscroll, threadList, } = props;
59
+ overscan = 0, reactionDetailsSort, renderText, returnAllReadData = false, reviewProcessedMessage, scrollSeekPlaceHolder, scrollToLatestMessageOnFocus = false, separateGiphyPreview = false, shouldGroupByUser = false, showUnreadNotificationAlways, sortReactionDetails, sortReactions, stickToBottomScrollBehavior = 'smooth', suppressAutoscroll, threadList, } = props;
60
60
  const { components: virtuosoComponentsFromProps, ...overridingVirtuosoProps } = additionalVirtuosoProps;
61
61
  // Stops errors generated from react-virtuoso to bubble up
62
62
  // to Sentry or other tracking tools.
@@ -245,6 +245,7 @@ const VirtualizedMessageListWithContext = (props) => {
245
245
  ownMessagesReadByOthers,
246
246
  processedMessages,
247
247
  reactionDetailsSort,
248
+ renderText,
248
249
  returnAllReadData,
249
250
  shouldGroupByUser,
250
251
  sortReactionDetails,
@@ -51,7 +51,7 @@ export const EmptyPlaceholder = ({ context }) => {
51
51
  return (React.createElement(React.Fragment, null, EmptyStateIndicator && (React.createElement(EmptyStateIndicator, { listType: context?.threadList ? 'thread' : 'message' }))));
52
52
  };
53
53
  export const messageRenderer = (virtuosoIndex, _data, virtuosoContext) => {
54
- const { additionalMessageInputProps, closeReactionSelectorOnClick, customMessageActions, customMessageRenderer, DateSeparator, firstUnreadMessageId, formatDate, lastOwnMessage, lastReadDate, lastReadMessageId, lastReceivedMessageId, Message: MessageUIComponent, messageActions, messageGroupStyles, MessageSystem, numItemsPrepended, openThread, ownMessagesDeliveredToOthers, ownMessagesReadByOthers, processedMessages: messageList, reactionDetailsSort, returnAllReadData, shouldGroupByUser, sortReactionDetails, sortReactions, threadList, unreadMessageCount = 0, UnreadMessagesSeparator, virtuosoRef, } = virtuosoContext;
54
+ const { additionalMessageInputProps, closeReactionSelectorOnClick, customMessageActions, customMessageRenderer, DateSeparator, firstUnreadMessageId, formatDate, lastOwnMessage, lastReadDate, lastReadMessageId, lastReceivedMessageId, Message: MessageUIComponent, messageActions, messageGroupStyles, MessageSystem, numItemsPrepended, openThread, ownMessagesDeliveredToOthers, ownMessagesReadByOthers, processedMessages: messageList, reactionDetailsSort, renderText, returnAllReadData, shouldGroupByUser, sortReactionDetails, sortReactions, threadList, unreadMessageCount = 0, UnreadMessagesSeparator, virtuosoRef, } = virtuosoContext;
55
55
  const streamMessageIndex = calculateItemIndex(virtuosoIndex, numItemsPrepended);
56
56
  if (customMessageRenderer) {
57
57
  return customMessageRenderer(messageList, streamMessageIndex);
@@ -88,5 +88,5 @@ export const messageRenderer = (virtuosoIndex, _data, virtuosoContext) => {
88
88
  return (React.createElement(React.Fragment, null,
89
89
  isFirstUnreadMessage && (React.createElement("div", { className: 'str-chat__unread-messages-separator-wrapper' },
90
90
  React.createElement(UnreadMessagesSeparator, { unreadCount: unreadMessageCount }))),
91
- React.createElement(Message, { additionalMessageInputProps: additionalMessageInputProps, autoscrollToBottom: virtuosoRef.current?.autoscrollToBottom, closeReactionSelectorOnClick: closeReactionSelectorOnClick, customMessageActions: customMessageActions, deliveredTo: ownMessagesDeliveredToOthers[message.id] || [], endOfGroup: endOfGroup, firstOfGroup: firstOfGroup, formatDate: formatDate, groupedByUser: groupedByUser, groupStyles: [messageGroupStyles[message.id] ?? ''], lastOwnMessage: lastOwnMessage, lastReceivedId: lastReceivedMessageId, message: message, Message: MessageUIComponent, messageActions: messageActions, openThread: openThread, reactionDetailsSort: reactionDetailsSort, readBy: ownMessagesReadByOthers[message.id] || [], returnAllReadData: returnAllReadData, sortReactionDetails: sortReactionDetails, sortReactions: sortReactions, threadList: threadList })));
91
+ React.createElement(Message, { additionalMessageInputProps: additionalMessageInputProps, autoscrollToBottom: virtuosoRef.current?.autoscrollToBottom, closeReactionSelectorOnClick: closeReactionSelectorOnClick, customMessageActions: customMessageActions, deliveredTo: ownMessagesDeliveredToOthers[message.id] || [], endOfGroup: endOfGroup, firstOfGroup: firstOfGroup, formatDate: formatDate, groupedByUser: groupedByUser, groupStyles: [messageGroupStyles[message.id] ?? ''], lastOwnMessage: lastOwnMessage, lastReceivedId: lastReceivedMessageId, message: message, Message: MessageUIComponent, messageActions: messageActions, openThread: openThread, reactionDetailsSort: reactionDetailsSort, readBy: ownMessagesReadByOthers[message.id] || [], renderText: renderText, returnAllReadData: returnAllReadData, sortReactionDetails: sortReactionDetails, sortReactions: sortReactions, threadList: threadList })));
92
92
  };
@@ -1,16 +1,14 @@
1
1
  import { useCallback, useEffect, useState } from 'react';
2
2
  export const useLastDeliveredData = (props) => {
3
3
  const { channel, lastOwnMessage, messages, returnAllReadData } = props;
4
- const calculate = useCallback(() => {
5
- if (returnAllReadData) {
6
- return messages.reduce((acc, msg) => {
7
- acc[msg.id] = channel.messageReceiptsTracker.deliveredForMessage({
8
- msgId: msg.id,
9
- timestampMs: msg.created_at.getTime(),
10
- });
11
- return acc;
12
- }, {});
13
- }
4
+ const calculateForAll = useCallback(() => messages.reduce((acc, msg) => {
5
+ acc[msg.id] = channel.messageReceiptsTracker.deliveredForMessage({
6
+ msgId: msg.id,
7
+ timestampMs: msg.created_at.getTime(),
8
+ });
9
+ return acc;
10
+ }, {}), [channel, messages]);
11
+ const calculateForLastOwn = useCallback(() => {
14
12
  if (!lastOwnMessage)
15
13
  return {};
16
14
  return {
@@ -19,8 +17,22 @@ export const useLastDeliveredData = (props) => {
19
17
  timestampMs: lastOwnMessage.created_at.getTime(),
20
18
  }),
21
19
  };
22
- }, [channel, lastOwnMessage, messages, returnAllReadData]);
23
- const [deliveredTo, setDeliveredTo] = useState(calculate);
24
- useEffect(() => channel.on('message.delivered', () => setDeliveredTo(calculate)).unsubscribe, [channel, calculate]);
20
+ }, [channel, lastOwnMessage]);
21
+ const [deliveredTo, setDeliveredTo] = useState(returnAllReadData ? calculateForAll : calculateForLastOwn);
22
+ useEffect(() => {
23
+ if (!returnAllReadData)
24
+ return;
25
+ setDeliveredTo(calculateForAll);
26
+ return channel.on('message.delivered', () => setDeliveredTo(calculateForAll))
27
+ .unsubscribe;
28
+ }, [channel, calculateForAll, returnAllReadData]);
29
+ useEffect(() => {
30
+ if (returnAllReadData)
31
+ return;
32
+ else
33
+ setDeliveredTo(calculateForLastOwn);
34
+ return channel.on('message.delivered', () => setDeliveredTo(calculateForLastOwn))
35
+ .unsubscribe;
36
+ }, [channel, calculateForLastOwn, returnAllReadData]);
25
37
  return deliveredTo;
26
38
  };
@@ -1,6 +1,6 @@
1
1
  import { useMemo } from 'react';
2
2
  import { ACTIONS_NOT_WORKING_IN_THREAD, useUserRole } from '../../../components';
3
- import { useMessageContext } from '../../../context';
3
+ import { useChannelStateContext, useMessageContext } from '../../../context';
4
4
  /**
5
5
  * Base filter hook which covers actions of type `delete`, `edit`,
6
6
  * `flag`, `markUnread`, `mute`, `quote`, `react` and `reply`, whether
@@ -9,6 +9,7 @@ import { useMessageContext } from '../../../context';
9
9
  */
10
10
  export const useBaseMessageActionSetFilter = (messageActionSet, disable = false) => {
11
11
  const { initialMessage: isInitialMessage, message } = useMessageContext();
12
+ const { channelConfig } = useChannelStateContext();
12
13
  const { canDelete, canEdit, canFlag, canMarkUnread, canMute, canQuote, canReact, canReply, } = useUserRole(message);
13
14
  const isMessageThreadReply = typeof message.parent_id === 'string';
14
15
  return useMemo(() => {
@@ -34,7 +35,9 @@ export const useBaseMessageActionSetFilter = (messageActionSet, disable = false)
34
35
  (type === 'mute' && !canMute) ||
35
36
  (type === 'quote' && !canQuote) ||
36
37
  (type === 'react' && !canReact) ||
37
- (type === 'reply' && !canReply))
38
+ (type === 'reply' && !canReply) ||
39
+ (type === 'remindMe' && !channelConfig?.['user_message_reminders']) ||
40
+ (type === 'saveForLater' && !channelConfig?.['user_message_reminders']))
38
41
  return false;
39
42
  return true;
40
43
  });
@@ -47,6 +50,7 @@ export const useBaseMessageActionSetFilter = (messageActionSet, disable = false)
47
50
  canQuote,
48
51
  canReact,
49
52
  canReply,
53
+ channelConfig,
50
54
  isInitialMessage,
51
55
  isMessageThreadReply,
52
56
  message.status,
@@ -14944,6 +14944,7 @@ var useSearchQueriesInProgress = (searchController) => {
14944
14944
  var import_react40 = require("react");
14945
14945
  var useBaseMessageActionSetFilter = (messageActionSet, disable2 = false) => {
14946
14946
  const { initialMessage: isInitialMessage, message } = useMessageContext();
14947
+ const { channelConfig } = useChannelStateContext();
14947
14948
  const {
14948
14949
  canDelete,
14949
14950
  canEdit,
@@ -14963,7 +14964,7 @@ var useBaseMessageActionSetFilter = (messageActionSet, disable2 = false) => {
14963
14964
  return messageActionSet.filter(({ type }) => {
14964
14965
  if (ACTIONS_NOT_WORKING_IN_THREAD.includes(type) && isMessageThreadReply)
14965
14966
  return false;
14966
- if (type === "delete" && !canDelete || type === "edit" && !canEdit || type === "flag" && !canFlag || type === "markUnread" && !canMarkUnread || type === "mute" && !canMute || type === "quote" && !canQuote || type === "react" && !canReact || type === "reply" && !canReply)
14967
+ if (type === "delete" && !canDelete || type === "edit" && !canEdit || type === "flag" && !canFlag || type === "markUnread" && !canMarkUnread || type === "mute" && !canMute || type === "quote" && !canQuote || type === "react" && !canReact || type === "reply" && !canReply || type === "remindMe" && !channelConfig?.["user_message_reminders"] || type === "saveForLater" && !channelConfig?.["user_message_reminders"])
14967
14968
  return false;
14968
14969
  return true;
14969
14970
  });
@@ -14976,6 +14977,7 @@ var useBaseMessageActionSetFilter = (messageActionSet, disable2 = false) => {
14976
14977
  canQuote,
14977
14978
  canReact,
14978
14979
  canReply,
14980
+ channelConfig,
14979
14981
  isInitialMessage,
14980
14982
  isMessageThreadReply,
14981
14983
  message.status,