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.
- package/dist/components/Chat/hooks/useChat.js +1 -1
- package/dist/components/MessageList/VirtualizedMessageList.d.ts +1 -1
- package/dist/components/MessageList/VirtualizedMessageList.js +2 -1
- package/dist/components/MessageList/VirtualizedMessageListComponents.js +2 -2
- package/dist/components/MessageList/hooks/useLastDeliveredData.js +25 -13
- package/dist/experimental/MessageActions/hooks/useBaseMessageActionSetFilter.js +6 -2
- package/dist/experimental/index.browser.cjs +3 -1
- package/dist/experimental/index.browser.cjs.map +2 -2
- package/dist/experimental/index.node.cjs +3 -1
- package/dist/experimental/index.node.cjs.map +2 -2
- package/dist/index.browser.cjs +33 -20
- package/dist/index.browser.cjs.map +3 -3
- package/dist/index.node.cjs +33 -20
- package/dist/index.node.cjs.map +3 -3
- package/package.json +1 -1
|
@@ -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.
|
|
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
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
23
|
-
const [deliveredTo, setDeliveredTo] = useState(
|
|
24
|
-
useEffect(() =>
|
|
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,
|