stream-chat-react 11.4.0 → 11.6.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/browser.full-bundle.js +6138 -5630
- package/dist/browser.full-bundle.js.map +1 -1
- package/dist/browser.full-bundle.min.js +4 -4
- package/dist/browser.full-bundle.min.js.map +1 -1
- package/dist/components/Channel/Channel.d.ts +9 -2
- package/dist/components/Channel/Channel.d.ts.map +1 -1
- package/dist/components/Channel/Channel.js +86 -22
- package/dist/components/ChannelPreview/ChannelPreview.d.ts +16 -0
- package/dist/components/ChannelPreview/ChannelPreview.d.ts.map +1 -1
- package/dist/components/ChannelPreview/ChannelPreview.js +16 -2
- package/dist/components/ChannelPreview/ChannelPreviewMessenger.d.ts +5 -0
- package/dist/components/ChannelPreview/ChannelPreviewMessenger.d.ts.map +1 -1
- package/dist/components/ChannelPreview/ChannelPreviewMessenger.js +62 -2
- package/dist/components/Emojis/index.cjs.js +1 -1
- package/dist/components/Message/Message.d.ts.map +1 -1
- package/dist/components/Message/Message.js +40 -8
- package/dist/components/Message/hooks/index.d.ts +2 -0
- package/dist/components/Message/hooks/index.d.ts.map +1 -1
- package/dist/components/Message/hooks/index.js +2 -0
- package/dist/components/Message/hooks/useMarkUnreadHandler.d.ts +10 -0
- package/dist/components/Message/hooks/useMarkUnreadHandler.d.ts.map +1 -0
- package/dist/components/Message/hooks/useMarkUnreadHandler.js +45 -0
- package/dist/components/Message/hooks/useReactionsFetcher.d.ts +11 -0
- package/dist/components/Message/hooks/useReactionsFetcher.d.ts.map +1 -0
- package/dist/components/Message/hooks/useReactionsFetcher.js +58 -0
- package/dist/components/Message/hooks/useUserRole.d.ts +1 -0
- package/dist/components/Message/hooks/useUserRole.d.ts.map +1 -1
- package/dist/components/Message/hooks/useUserRole.js +2 -0
- package/dist/components/Message/types.d.ts +7 -1
- package/dist/components/Message/types.d.ts.map +1 -1
- package/dist/components/Message/utils.d.ts +4 -1
- package/dist/components/Message/utils.d.ts.map +1 -1
- package/dist/components/Message/utils.js +12 -3
- package/dist/components/MessageActions/MessageActions.d.ts +1 -1
- package/dist/components/MessageActions/MessageActions.d.ts.map +1 -1
- package/dist/components/MessageActions/MessageActions.js +4 -3
- package/dist/components/MessageActions/MessageActionsBox.d.ts +1 -1
- package/dist/components/MessageActions/MessageActionsBox.d.ts.map +1 -1
- package/dist/components/MessageActions/MessageActionsBox.js +3 -4
- package/dist/components/MessageList/MessageList.d.ts +3 -1
- package/dist/components/MessageList/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList/MessageList.js +29 -13
- package/dist/components/MessageList/MessageListMainPanel.d.ts +1 -0
- package/dist/components/MessageList/MessageListMainPanel.d.ts.map +1 -1
- package/dist/components/MessageList/MessageListMainPanel.js +2 -1
- package/dist/components/MessageList/MessageListNotifications.d.ts +1 -0
- package/dist/components/MessageList/MessageListNotifications.d.ts.map +1 -1
- package/dist/components/MessageList/MessageListNotifications.js +2 -2
- package/dist/components/MessageList/MessageNotification.d.ts +2 -0
- package/dist/components/MessageList/MessageNotification.d.ts.map +1 -1
- package/dist/components/MessageList/ScrollToBottomButton.d.ts +1 -1
- package/dist/components/MessageList/ScrollToBottomButton.d.ts.map +1 -1
- package/dist/components/MessageList/ScrollToBottomButton.js +3 -44
- package/dist/components/MessageList/UnreadMessagesNotification.d.ts +6 -0
- package/dist/components/MessageList/UnreadMessagesNotification.d.ts.map +1 -0
- package/dist/components/MessageList/UnreadMessagesNotification.js +12 -0
- package/dist/components/MessageList/UnreadMessagesSeparator.d.ts +6 -0
- package/dist/components/MessageList/UnreadMessagesSeparator.d.ts.map +1 -0
- package/dist/components/MessageList/UnreadMessagesSeparator.js +10 -0
- package/dist/components/MessageList/VirtualizedMessageList.d.ts +12 -1
- package/dist/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
- package/dist/components/MessageList/VirtualizedMessageList.js +42 -19
- package/dist/components/MessageList/VirtualizedMessageListComponents.d.ts +5 -3
- package/dist/components/MessageList/VirtualizedMessageListComponents.d.ts.map +1 -1
- package/dist/components/MessageList/VirtualizedMessageListComponents.js +27 -6
- package/dist/components/MessageList/hooks/MessageList/index.d.ts +1 -0
- package/dist/components/MessageList/hooks/MessageList/index.d.ts.map +1 -1
- package/dist/components/MessageList/hooks/MessageList/index.js +1 -0
- package/dist/components/MessageList/hooks/MessageList/useMessageListElements.d.ts +2 -5
- package/dist/components/MessageList/hooks/MessageList/useMessageListElements.d.ts.map +1 -1
- package/dist/components/MessageList/hooks/MessageList/useMessageListElements.js +3 -1
- package/dist/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.d.ts +7 -0
- package/dist/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.d.ts.map +1 -0
- package/dist/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.js +42 -0
- package/dist/components/MessageList/hooks/VirtualizedMessageList/index.d.ts +1 -0
- package/dist/components/MessageList/hooks/VirtualizedMessageList/index.d.ts.map +1 -1
- package/dist/components/MessageList/hooks/VirtualizedMessageList/index.js +1 -0
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.d.ts +22 -0
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.d.ts.map +1 -0
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.js +29 -0
- package/dist/components/MessageList/hooks/useMarkRead.d.ts +19 -0
- package/dist/components/MessageList/hooks/useMarkRead.d.ts.map +1 -0
- package/dist/components/MessageList/hooks/useMarkRead.js +38 -0
- package/dist/components/MessageList/icons.d.ts +1 -0
- package/dist/components/MessageList/icons.d.ts.map +1 -1
- package/dist/components/MessageList/icons.js +2 -0
- package/dist/components/MessageList/index.d.ts +2 -0
- package/dist/components/MessageList/index.d.ts.map +1 -1
- package/dist/components/MessageList/index.js +2 -0
- package/dist/components/MessageList/renderMessages.d.ts +13 -2
- package/dist/components/MessageList/renderMessages.d.ts.map +1 -1
- package/dist/components/MessageList/renderMessages.js +16 -11
- package/dist/components/Reactions/ReactionsList.d.ts +2 -1
- package/dist/components/Reactions/ReactionsList.d.ts.map +1 -1
- package/dist/components/Reactions/ReactionsList.js +32 -41
- package/dist/components/Reactions/ReactionsListModal.d.ts +13 -0
- package/dist/components/Reactions/ReactionsListModal.d.ts.map +1 -0
- package/dist/components/Reactions/ReactionsListModal.js +46 -0
- package/dist/components/Reactions/SimpleReactionsList.d.ts +2 -4
- package/dist/components/Reactions/SimpleReactionsList.d.ts.map +1 -1
- package/dist/components/Reactions/SimpleReactionsList.js +7 -24
- package/dist/components/Reactions/hooks/useFetchReactions.d.ts +12 -0
- package/dist/components/Reactions/hooks/useFetchReactions.d.ts.map +1 -0
- package/dist/components/Reactions/hooks/useFetchReactions.js +50 -0
- package/dist/components/Reactions/hooks/useProcessReactions.d.ts +3 -13
- package/dist/components/Reactions/hooks/useProcessReactions.d.ts.map +1 -1
- package/dist/components/Reactions/hooks/useProcessReactions.js +51 -46
- package/dist/components/Reactions/types.d.ts +9 -0
- package/dist/components/Reactions/types.d.ts.map +1 -0
- package/dist/components/Reactions/types.js +1 -0
- package/dist/context/ChannelActionContext.d.ts +2 -0
- package/dist/context/ChannelActionContext.d.ts.map +1 -1
- package/dist/context/ComponentContext.d.ts +6 -2
- package/dist/context/ComponentContext.d.ts.map +1 -1
- package/dist/context/MessageContext.d.ts +8 -2
- package/dist/context/MessageContext.d.ts.map +1 -1
- package/dist/css/v2/index.css +1 -1
- package/dist/css/v2/index.layout.css +1 -1
- package/dist/i18n/Streami18n.d.ts +10 -0
- package/dist/i18n/Streami18n.d.ts.map +1 -1
- package/dist/i18n/de.json +10 -0
- package/dist/i18n/en.json +10 -0
- package/dist/i18n/es.json +12 -0
- package/dist/i18n/fr.json +12 -0
- package/dist/i18n/hi.json +11 -0
- package/dist/i18n/it.json +12 -0
- package/dist/i18n/ja.json +8 -0
- package/dist/i18n/ko.json +8 -0
- package/dist/i18n/nl.json +10 -0
- package/dist/i18n/pt.json +12 -0
- package/dist/i18n/ru.json +14 -0
- package/dist/i18n/tr.json +10 -0
- package/dist/{icons-b84cd102.js → icons-7ead3d97.js} +12 -12
- package/dist/index.cjs.js +4880 -4372
- package/dist/scss/v2/AttachmentPreviewList/AttachmentPreviewList-layout.scss +1 -0
- package/dist/scss/v2/Autocomplete/Autocomplete-layout.scss +16 -8
- package/dist/scss/v2/Avatar/Avatar-theme.scss +1 -0
- package/dist/scss/v2/Message/Message-layout.scss +68 -10
- package/dist/scss/v2/Message/Message-theme.scss +34 -2
- package/dist/scss/v2/MessageActionsBox/MessageActionsBox-layout.scss +0 -11
- package/dist/scss/v2/MessageBounceOptions/MessageBounceOptions-layout.scss +18 -0
- package/dist/scss/v2/MessageBounceOptions/MessageBounceOptions-theme.scss +51 -0
- package/dist/scss/v2/MessageReactions/MessageReactions-layout.scss +74 -0
- package/dist/scss/v2/MessageReactions/MessageReactions-theme.scss +17 -0
- package/dist/scss/v2/_base.scss +3 -20
- package/dist/scss/v2/_global-theme-variables.scss +3 -0
- package/dist/scss/v2/index.layout.scss +1 -0
- package/dist/scss/v2/index.scss +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +5 -3
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { StreamMessage } from '../../../../context';
|
|
2
|
+
import type { DefaultStreamChatGenerics } from '../../../../types/types';
|
|
3
|
+
export type UseUnreadMessagesNotificationParams = {
|
|
4
|
+
unreadCount: number;
|
|
5
|
+
lastRead?: Date | null;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Controls the logic when an `UnreadMessagesNotification` component should be shown.
|
|
9
|
+
* In virtualized message list there is no notion of being scrolled below or above `UnreadMessagesSeparator`.
|
|
10
|
+
* Therefore, the `UnreadMessagesNotification` component is rendered based on timestamps.
|
|
11
|
+
* If the there are unread messages in the channel and the `VirtualizedMessageList` renders
|
|
12
|
+
* messages created later than the last read message in the channel, then the
|
|
13
|
+
* `UnreadMessagesNotification` component is rendered. This is an approximate equivalent to being
|
|
14
|
+
* scrolled below the `UnreadMessagesNotification` component.
|
|
15
|
+
* @param lastRead
|
|
16
|
+
* @param unreadCount
|
|
17
|
+
*/
|
|
18
|
+
export declare const useUnreadMessagesNotificationVirtualized: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>({ lastRead, unreadCount, }: UseUnreadMessagesNotificationParams) => {
|
|
19
|
+
show: boolean;
|
|
20
|
+
toggleShowUnreadMessagesNotification: (renderedMessages: StreamMessage<StreamChatGenerics>[]) => void;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=useUnreadMessagesNotificationVirtualized.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUnreadMessagesNotificationVirtualized.d.ts","sourceRoot":"","sources":["../../../../../src/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEzE,MAAM,MAAM,mCAAmC,GAAG;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wCAAwC,iHAKlD,mCAAmC;;;CAmBrC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Controls the logic when an `UnreadMessagesNotification` component should be shown.
|
|
4
|
+
* In virtualized message list there is no notion of being scrolled below or above `UnreadMessagesSeparator`.
|
|
5
|
+
* Therefore, the `UnreadMessagesNotification` component is rendered based on timestamps.
|
|
6
|
+
* If the there are unread messages in the channel and the `VirtualizedMessageList` renders
|
|
7
|
+
* messages created later than the last read message in the channel, then the
|
|
8
|
+
* `UnreadMessagesNotification` component is rendered. This is an approximate equivalent to being
|
|
9
|
+
* scrolled below the `UnreadMessagesNotification` component.
|
|
10
|
+
* @param lastRead
|
|
11
|
+
* @param unreadCount
|
|
12
|
+
*/
|
|
13
|
+
export var useUnreadMessagesNotificationVirtualized = function (_a) {
|
|
14
|
+
var lastRead = _a.lastRead, unreadCount = _a.unreadCount;
|
|
15
|
+
var _b = useState(false), show = _b[0], setShow = _b[1];
|
|
16
|
+
var toggleShowUnreadMessagesNotification = useCallback(function (renderedMessages) {
|
|
17
|
+
if (!renderedMessages.length)
|
|
18
|
+
return;
|
|
19
|
+
var firstRenderedMessageTimestamp = renderedMessages[0].created_at
|
|
20
|
+
? new Date(renderedMessages[0].created_at).getTime()
|
|
21
|
+
: 0;
|
|
22
|
+
setShow(unreadCount > 0 && !!lastRead && firstRenderedMessageTimestamp > lastRead.getTime());
|
|
23
|
+
}, [unreadCount, lastRead]);
|
|
24
|
+
useEffect(function () {
|
|
25
|
+
if (!unreadCount)
|
|
26
|
+
setShow(false);
|
|
27
|
+
}, [unreadCount]);
|
|
28
|
+
return { show: show, toggleShowUnreadMessagesNotification: toggleShowUnreadMessagesNotification };
|
|
29
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
type UseMarkReadParams = {
|
|
2
|
+
isMessageListScrolledToBottom: boolean;
|
|
3
|
+
messageListIsThread: boolean;
|
|
4
|
+
unreadCount: number;
|
|
5
|
+
markReadOnScrolledToBottom?: boolean;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Takes care of marking a channel read. The channel is read only if all the following applies:
|
|
9
|
+
* 1. the message list is not rendered in a thread
|
|
10
|
+
* 2. the message list is scrolled to the bottom
|
|
11
|
+
* 3. the channel was not marked unread by the user
|
|
12
|
+
* @param isMessageListScrolledToBottom
|
|
13
|
+
* @param messageListIsThread
|
|
14
|
+
* @param unreadCount
|
|
15
|
+
* @param wasChannelMarkedUnread
|
|
16
|
+
*/
|
|
17
|
+
export declare const useMarkRead: ({ isMessageListScrolledToBottom, markReadOnScrolledToBottom, messageListIsThread, unreadCount, }: UseMarkReadParams) => void;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=useMarkRead.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMarkRead.d.ts","sourceRoot":"","sources":["../../../../src/components/MessageList/hooks/useMarkRead.ts"],"names":[],"mappings":"AAGA,KAAK,iBAAiB,GAAG;IACvB,6BAA6B,EAAE,OAAO,CAAC;IACvC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,qGAKrB,iBAAiB,SA4BnB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { useChannelActionContext } from '../../../context';
|
|
3
|
+
/**
|
|
4
|
+
* Takes care of marking a channel read. The channel is read only if all the following applies:
|
|
5
|
+
* 1. the message list is not rendered in a thread
|
|
6
|
+
* 2. the message list is scrolled to the bottom
|
|
7
|
+
* 3. the channel was not marked unread by the user
|
|
8
|
+
* @param isMessageListScrolledToBottom
|
|
9
|
+
* @param messageListIsThread
|
|
10
|
+
* @param unreadCount
|
|
11
|
+
* @param wasChannelMarkedUnread
|
|
12
|
+
*/
|
|
13
|
+
export var useMarkRead = function (_a) {
|
|
14
|
+
var isMessageListScrolledToBottom = _a.isMessageListScrolledToBottom, markReadOnScrolledToBottom = _a.markReadOnScrolledToBottom, messageListIsThread = _a.messageListIsThread, unreadCount = _a.unreadCount;
|
|
15
|
+
var markRead = useChannelActionContext('useMarkRead').markRead;
|
|
16
|
+
useEffect(function () {
|
|
17
|
+
var shouldMarkRead = !messageListIsThread &&
|
|
18
|
+
isMessageListScrolledToBottom &&
|
|
19
|
+
markReadOnScrolledToBottom &&
|
|
20
|
+
unreadCount > 0;
|
|
21
|
+
var onVisibilityChange = function () {
|
|
22
|
+
if (!document.hidden && shouldMarkRead)
|
|
23
|
+
markRead();
|
|
24
|
+
};
|
|
25
|
+
document.addEventListener('visibilitychange', onVisibilityChange);
|
|
26
|
+
if (shouldMarkRead)
|
|
27
|
+
markRead();
|
|
28
|
+
return function () {
|
|
29
|
+
document.removeEventListener('visibilitychange', onVisibilityChange);
|
|
30
|
+
};
|
|
31
|
+
}, [
|
|
32
|
+
isMessageListScrolledToBottom,
|
|
33
|
+
markRead,
|
|
34
|
+
messageListIsThread,
|
|
35
|
+
unreadCount,
|
|
36
|
+
markReadOnScrolledToBottom,
|
|
37
|
+
]);
|
|
38
|
+
};
|
|
@@ -4,5 +4,6 @@ interface ArrowProps {
|
|
|
4
4
|
}
|
|
5
5
|
export declare const ArrowUp: ({ className, color }: ArrowProps) => JSX.Element;
|
|
6
6
|
export declare const ArrowDown: ({ className, color }: ArrowProps) => JSX.Element;
|
|
7
|
+
export declare const CloseIcon: () => JSX.Element;
|
|
7
8
|
export {};
|
|
8
9
|
//# sourceMappingURL=icons.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/icons.tsx"],"names":[],"mappings":"AAEA,UAAU,UAAU;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,OAAO,yBAA0B,UAAU,gBAevD,CAAC;AAEF,eAAO,MAAM,SAAS,yBAA0B,UAAU,gBAezD,CAAC"}
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/icons.tsx"],"names":[],"mappings":"AAEA,UAAU,UAAU;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,OAAO,yBAA0B,UAAU,gBAevD,CAAC;AAEF,eAAO,MAAM,SAAS,yBAA0B,UAAU,gBAezD,CAAC;AAEF,eAAO,MAAM,SAAS,mBAIrB,CAAC"}
|
|
@@ -9,3 +9,5 @@ export var ArrowDown = function (_a) {
|
|
|
9
9
|
return (React.createElement("svg", { className: className, "data-testid": 'arrow-down', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },
|
|
10
10
|
React.createElement("path", { d: 'M7.41 8.29504L12 12.875L16.59 8.29504L18 9.70504L12 15.705L6 9.70504L7.41 8.29504Z', fill: color || 'var(--primary-color)' })));
|
|
11
11
|
};
|
|
12
|
+
export var CloseIcon = function () { return (React.createElement("svg", { fill: 'currentColor', viewBox: '0 0 14 13', xmlns: 'http://www.w3.org/2000/svg' },
|
|
13
|
+
React.createElement("path", { d: 'M1.32227 12.3408C0.944336 11.9629 0.953125 11.3213 1.32227 10.9521L5.60254 6.66309L1.32227 2.38281C0.953125 2.01367 0.944336 1.37207 1.32227 0.994141C1.7002 0.616211 2.3418 0.625 2.71094 0.985352L7 5.27441L11.2803 0.994141C11.6494 0.625 12.291 0.616211 12.6689 0.994141C13.0469 1.37207 13.0381 2.01367 12.6689 2.38281L8.38867 6.66309L12.6689 10.9521C13.0381 11.3213 13.0469 11.9629 12.6689 12.3408C12.291 12.7188 11.6494 12.71 11.2803 12.3408L7 8.06055L2.71094 12.3408C2.3418 12.71 1.7002 12.7188 1.32227 12.3408Z' }))); };
|
|
@@ -4,6 +4,8 @@ export * from './MessageList';
|
|
|
4
4
|
export * from './MessageListNotifications';
|
|
5
5
|
export * from './MessageNotification';
|
|
6
6
|
export * from './ScrollToBottomButton';
|
|
7
|
+
export * from './UnreadMessagesNotification';
|
|
8
|
+
export * from './UnreadMessagesSeparator';
|
|
7
9
|
export * from './VirtualizedMessageList';
|
|
8
10
|
export * from './hooks';
|
|
9
11
|
export * from './renderMessages';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC"}
|
|
@@ -4,6 +4,8 @@ export * from './MessageList';
|
|
|
4
4
|
export * from './MessageListNotifications';
|
|
5
5
|
export * from './MessageNotification';
|
|
6
6
|
export * from './ScrollToBottomButton';
|
|
7
|
+
export * from './UnreadMessagesNotification';
|
|
8
|
+
export * from './UnreadMessagesSeparator';
|
|
7
9
|
export * from './VirtualizedMessageList';
|
|
8
10
|
export * from './hooks';
|
|
9
11
|
export * from './renderMessages';
|
|
@@ -4,19 +4,30 @@ import { StreamMessage } from '../../context/ChannelStateContext';
|
|
|
4
4
|
import { DefaultStreamChatGenerics } from '../../types/types';
|
|
5
5
|
import { ComponentContextValue, CustomClasses } from '../../context';
|
|
6
6
|
import { GroupStyle } from './utils';
|
|
7
|
-
import { UserResponse } from 'stream-chat';
|
|
7
|
+
import { ChannelState as StreamChannelState, UserResponse } from 'stream-chat';
|
|
8
8
|
export interface RenderMessagesOptions<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> {
|
|
9
9
|
components: ComponentContextValue<StreamChatGenerics>;
|
|
10
10
|
lastReceivedMessageId: string | null;
|
|
11
11
|
messageGroupStyles: Record<string, GroupStyle>;
|
|
12
12
|
messages: Array<StreamMessage<StreamChatGenerics>>;
|
|
13
|
+
/**
|
|
14
|
+
* Object mapping message IDs of own messages to the users who read those messages.
|
|
15
|
+
*/
|
|
13
16
|
readData: Record<string, Array<UserResponse<StreamChatGenerics>>>;
|
|
17
|
+
/**
|
|
18
|
+
* Props forwarded to the Message component.
|
|
19
|
+
*/
|
|
14
20
|
sharedMessageProps: SharedMessageProps<StreamChatGenerics>;
|
|
15
21
|
customClasses?: CustomClasses;
|
|
22
|
+
/**
|
|
23
|
+
* Current user's read status.
|
|
24
|
+
* Useful to determine, when a channel has been marked read the last time, the last read message, count of unread messages.
|
|
25
|
+
*/
|
|
26
|
+
ownReadState?: StreamChannelState<StreamChatGenerics>['read'][keyof StreamChannelState<StreamChatGenerics>['read']];
|
|
16
27
|
}
|
|
17
28
|
export type SharedMessageProps<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> = Omit<MessageProps<StreamChatGenerics>, MessagePropsToOmit>;
|
|
18
29
|
export type MessageRenderer<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> = (options: RenderMessagesOptions<StreamChatGenerics>) => Array<ReactNode>;
|
|
19
30
|
type MessagePropsToOmit = 'channel' | 'groupStyles' | 'initialMessage' | 'lastReceivedId' | 'message' | 'readBy';
|
|
20
|
-
export declare function defaultRenderMessages<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>({ components, customClasses, lastReceivedMessageId: lastReceivedId, messageGroupStyles, messages, readData, sharedMessageProps: messageProps, }: RenderMessagesOptions<StreamChatGenerics>): JSX.Element[];
|
|
31
|
+
export declare function defaultRenderMessages<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>({ components, customClasses, lastReceivedMessageId: lastReceivedId, messageGroupStyles, messages, ownReadState, readData, sharedMessageProps: messageProps, }: RenderMessagesOptions<StreamChatGenerics>): JSX.Element[];
|
|
21
32
|
export {};
|
|
22
33
|
//# sourceMappingURL=renderMessages.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderMessages.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/renderMessages.tsx"],"names":[],"mappings":"AAAA,OAAc,
|
|
1
|
+
{"version":3,"file":"renderMessages.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/renderMessages.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAY,SAAS,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAU,MAAM,eAAe,CAAC;AAE7E,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,YAAY,IAAI,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/E,MAAM,WAAW,qBAAqB,CACpC,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB;IAEhF,UAAU,EAAE,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;IACtD,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/C,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACnD;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAClE;;OAEG;IACH,kBAAkB,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;IAC3D,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;OAGG;IACH,YAAY,CAAC,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;CACrH;AAED,MAAM,MAAM,kBAAkB,CAC5B,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,CAAC;AAE/D,MAAM,MAAM,eAAe,CACzB,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E,CAAC,OAAO,EAAE,qBAAqB,CAAC,kBAAkB,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;AAE7E,KAAK,kBAAkB,GACnB,SAAS,GACT,aAAa,GACb,gBAAgB,GAChB,gBAAgB,GAChB,SAAS,GACT,QAAQ,CAAC;AAEb,wBAAgB,qBAAqB,CACnC,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,EAChF,EACA,UAAU,EACV,aAAa,EACb,qBAAqB,EAAE,cAAc,EACrC,kBAAkB,EAClB,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,kBAAkB,EAAE,YAAY,GACjC,EAAE,qBAAqB,CAAC,kBAAkB,CAAC,iBA6D3C"}
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
import { __assign } from "tslib";
|
|
2
|
-
import React from 'react';
|
|
2
|
+
import React, { Fragment } from 'react';
|
|
3
3
|
import { isDate } from '../../context';
|
|
4
4
|
import { CUSTOM_MESSAGE_TYPE } from '../../constants/messageTypes';
|
|
5
5
|
import { Message } from '../Message/Message';
|
|
6
6
|
export function defaultRenderMessages(_a) {
|
|
7
|
-
var components = _a.components, customClasses = _a.customClasses, lastReceivedId = _a.lastReceivedMessageId, messageGroupStyles = _a.messageGroupStyles, messages = _a.messages, readData = _a.readData, messageProps = _a.sharedMessageProps;
|
|
8
|
-
var DateSeparator = components.DateSeparator, HeaderComponent = components.HeaderComponent, MessageSystem = components.MessageSystem;
|
|
9
|
-
return messages.map(function (message) {
|
|
10
|
-
if (message.customType === CUSTOM_MESSAGE_TYPE.date &&
|
|
11
|
-
message.date &&
|
|
12
|
-
isDate(message.date) &&
|
|
13
|
-
DateSeparator) {
|
|
7
|
+
var components = _a.components, customClasses = _a.customClasses, lastReceivedId = _a.lastReceivedMessageId, messageGroupStyles = _a.messageGroupStyles, messages = _a.messages, ownReadState = _a.ownReadState, readData = _a.readData, messageProps = _a.sharedMessageProps;
|
|
8
|
+
var DateSeparator = components.DateSeparator, HeaderComponent = components.HeaderComponent, MessageSystem = components.MessageSystem, UnreadMessagesSeparator = components.UnreadMessagesSeparator;
|
|
9
|
+
return messages.map(function (message, index) {
|
|
10
|
+
if (message.customType === CUSTOM_MESSAGE_TYPE.date && message.date && isDate(message.date)) {
|
|
14
11
|
return (React.createElement("li", { key: "".concat(message.date.toISOString(), "-i") },
|
|
15
12
|
React.createElement(DateSeparator, { date: message.date, formatDate: messageProps.formatDate, unread: message.unread })));
|
|
16
13
|
}
|
|
@@ -18,13 +15,21 @@ export function defaultRenderMessages(_a) {
|
|
|
18
15
|
return (React.createElement("li", { key: 'intro' },
|
|
19
16
|
React.createElement(HeaderComponent, null)));
|
|
20
17
|
}
|
|
21
|
-
if (message.type === 'system'
|
|
18
|
+
if (message.type === 'system') {
|
|
22
19
|
return (React.createElement("li", { key: message.id || message.created_at },
|
|
23
20
|
React.createElement(MessageSystem, { message: message })));
|
|
24
21
|
}
|
|
25
22
|
var groupStyles = messageGroupStyles[message.id] || '';
|
|
26
23
|
var messageClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.message) || "str-chat__li str-chat__li--".concat(groupStyles);
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
var isNewestMessage = index === messages.length - 1;
|
|
25
|
+
var isLastReadMessage = (ownReadState === null || ownReadState === void 0 ? void 0 : ownReadState.last_read_message_id) === message.id;
|
|
26
|
+
var showUnreadSeparator = isLastReadMessage &&
|
|
27
|
+
!isNewestMessage &&
|
|
28
|
+
((ownReadState === null || ownReadState === void 0 ? void 0 : ownReadState.first_unread_message_id) || (ownReadState === null || ownReadState === void 0 ? void 0 : ownReadState.unread_messages) > 0); // unread count can be 0 if the user marks unread only own messages
|
|
29
|
+
return (React.createElement(Fragment, { key: message.id || message.created_at },
|
|
30
|
+
React.createElement("li", { className: messageClass, "data-message-id": message.id, "data-testid": messageClass },
|
|
31
|
+
React.createElement(Message, __assign({ groupStyles: [groupStyles], lastReceivedId: lastReceivedId, message: message, readBy: readData[message.id] || [] }, messageProps))),
|
|
32
|
+
showUnreadSeparator && UnreadMessagesSeparator && (React.createElement("li", { className: 'str-chat__li str-chat__unread-messages-separator-wrapper' },
|
|
33
|
+
React.createElement(UnreadMessagesSeparator, { unreadCount: ownReadState.unread_messages })))));
|
|
29
34
|
});
|
|
30
35
|
}
|
|
@@ -2,7 +2,8 @@ import type { ReactionResponse } from 'stream-chat';
|
|
|
2
2
|
import type { ReactEventHandler } from '../Message/types';
|
|
3
3
|
import type { DefaultStreamChatGenerics } from '../../types/types';
|
|
4
4
|
import type { ReactionOptions } from './reactionOptions';
|
|
5
|
-
|
|
5
|
+
import { MessageContextValue } from '../../context';
|
|
6
|
+
export type ReactionsListProps<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> = Partial<Pick<MessageContextValue<StreamChatGenerics>, 'handleFetchReactions'>> & {
|
|
6
7
|
/** Custom on click handler for an individual reaction, defaults to `onReactionListClick` from the `MessageContext` */
|
|
7
8
|
onClick?: ReactEventHandler;
|
|
8
9
|
/** An array of the own reaction objects to distinguish own reactions visually */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReactionsList.d.ts","sourceRoot":"","sources":["../../../src/components/Reactions/ReactionsList.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ReactionsList.d.ts","sourceRoot":"","sources":["../../../src/components/Reactions/ReactionsList.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,MAAM,MAAM,kBAAkB,CAC5B,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,EAAE,sBAAsB,CAAC,CAAC,GAAG;IACnF,sHAAsH;IACtH,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,iFAAiF;IACjF,aAAa,CAAC,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,EAAE,CAAC;IACvD,oFAAoF;IACpF,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,+DAA+D;IAC/D,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,8DAA8D;IAC9D,SAAS,CAAC,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,EAAE,CAAC;IACnD,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AA8EF;;GAEG;AACH,eAAO,MAAM,aAAa,yJAAwE,CAAC"}
|
|
@@ -1,49 +1,40 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { __rest } from "tslib";
|
|
2
2
|
import React, { useState } from 'react';
|
|
3
3
|
import clsx from 'clsx';
|
|
4
|
-
import { useMessageContext } from '../../context/MessageContext';
|
|
5
|
-
import { useChatContext } from '../../context/ChatContext';
|
|
6
4
|
import { useProcessReactions } from './hooks/useProcessReactions';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
var ButtonWithTooltip = function (_a) {
|
|
10
|
-
var children = _a.children, onMouseEnter = _a.onMouseEnter, onMouseLeave = _a.onMouseLeave, rest = __rest(_a, ["children", "onMouseEnter", "onMouseLeave"]);
|
|
11
|
-
var _b = useState(null), referenceElement = _b[0], setReferenceElement = _b[1];
|
|
12
|
-
var _c = useEnterLeaveHandlers({
|
|
13
|
-
onMouseEnter: onMouseEnter,
|
|
14
|
-
onMouseLeave: onMouseLeave,
|
|
15
|
-
}), handleEnter = _c.handleEnter, handleLeave = _c.handleLeave, tooltipVisible = _c.tooltipVisible;
|
|
16
|
-
var themeVersion = useChatContext('ButtonWithTooltip').themeVersion;
|
|
17
|
-
return (React.createElement(React.Fragment, null,
|
|
18
|
-
themeVersion === '2' && (React.createElement(PopperTooltip, { referenceElement: referenceElement, visible: tooltipVisible }, rest.title)),
|
|
19
|
-
React.createElement("button", __assign({ onMouseEnter: handleEnter, onMouseLeave: handleLeave, ref: setReferenceElement }, rest), children)));
|
|
20
|
-
};
|
|
5
|
+
import { ReactionsListModal } from './ReactionsListModal';
|
|
6
|
+
import { MAX_MESSAGE_REACTIONS_TO_FETCH } from '../Message/hooks';
|
|
21
7
|
var UnMemoizedReactionsList = function (props) {
|
|
22
|
-
var
|
|
23
|
-
var
|
|
24
|
-
var
|
|
25
|
-
|
|
8
|
+
var handleFetchReactions = props.handleFetchReactions, _a = props.reverse, reverse = _a === void 0 ? false : _a, rest = __rest(props, ["handleFetchReactions", "reverse"]);
|
|
9
|
+
var _b = useProcessReactions(rest), existingReactions = _b.existingReactions, hasReactions = _b.hasReactions, totalReactionCount = _b.totalReactionCount;
|
|
10
|
+
var _c = useState(null), selectedReactionType = _c[0], setSelectedReactionType = _c[1];
|
|
11
|
+
var handleReactionButtonClick = function (reactionType) {
|
|
12
|
+
if (totalReactionCount > MAX_MESSAGE_REACTIONS_TO_FETCH) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
setSelectedReactionType(reactionType);
|
|
16
|
+
};
|
|
17
|
+
if (!hasReactions)
|
|
26
18
|
return null;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
'
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
React.createElement(
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
React.createElement("span", { className: 'str-chat__reaction-list--counter' }, totalReactionCount)))));
|
|
19
|
+
return (React.createElement(React.Fragment, null,
|
|
20
|
+
React.createElement("div", { "aria-label": 'Reaction list', className: clsx('str-chat__reaction-list str-chat__message-reactions-container', {
|
|
21
|
+
'str-chat__reaction-list--reverse': reverse,
|
|
22
|
+
}), "data-testid": 'reaction-list', role: 'figure' },
|
|
23
|
+
React.createElement("ul", { className: 'str-chat__message-reactions' },
|
|
24
|
+
existingReactions.map(function (_a) {
|
|
25
|
+
var EmojiComponent = _a.EmojiComponent, isOwnReaction = _a.isOwnReaction, reactionCount = _a.reactionCount, reactionType = _a.reactionType;
|
|
26
|
+
return EmojiComponent && (React.createElement("li", { className: clsx('str-chat__message-reaction', {
|
|
27
|
+
'str-chat__message-reaction-own': isOwnReaction,
|
|
28
|
+
}), key: reactionType },
|
|
29
|
+
React.createElement("button", { "aria-label": "Reactions: ".concat(reactionType), "data-testid": "reactions-list-button-".concat(reactionType), onClick: function () { return handleReactionButtonClick(reactionType); }, type: 'button' },
|
|
30
|
+
React.createElement("span", { className: 'str-chat__message-reaction-emoji' },
|
|
31
|
+
React.createElement(EmojiComponent, null)),
|
|
32
|
+
"\u00A0",
|
|
33
|
+
React.createElement("span", { className: 'str-chat__message-reaction-count', "data-testclass": 'reaction-list-reaction-count' }, reactionCount))));
|
|
34
|
+
}),
|
|
35
|
+
React.createElement("li", null,
|
|
36
|
+
React.createElement("span", { className: 'str-chat__reaction-list--counter' }, totalReactionCount)))),
|
|
37
|
+
React.createElement(ReactionsListModal, { handleFetchReactions: handleFetchReactions, onClose: function () { return setSelectedReactionType(null); }, onSelectedReactionTypeChange: setSelectedReactionType, open: selectedReactionType !== null, reactions: existingReactions, selectedReactionType: selectedReactionType })));
|
|
47
38
|
};
|
|
48
39
|
/**
|
|
49
40
|
* Component that displays a list of reactions on a message.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { ModalProps } from '../Modal';
|
|
3
|
+
import { ReactionSummary } from './types';
|
|
4
|
+
import { MessageContextValue } from '../../context';
|
|
5
|
+
import { DefaultStreamChatGenerics } from '../../types/types';
|
|
6
|
+
type ReactionsListModalProps<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> = ModalProps & Partial<Pick<MessageContextValue<StreamChatGenerics>, 'handleFetchReactions'>> & {
|
|
7
|
+
reactions: ReactionSummary[];
|
|
8
|
+
selectedReactionType: string | null;
|
|
9
|
+
onSelectedReactionTypeChange?: (reactionType: string) => void;
|
|
10
|
+
};
|
|
11
|
+
export declare function ReactionsListModal({ handleFetchReactions, onSelectedReactionTypeChange, reactions, selectedReactionType, ...modalProps }: ReactionsListModalProps): JSX.Element;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=ReactionsListModal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReactionsListModal.d.ts","sourceRoot":"","sources":["../../../src/components/Reactions/ReactionsListModal.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAS,UAAU,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAI1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,KAAK,uBAAuB,CAC1B,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E,UAAU,GACZ,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,EAAE,sBAAsB,CAAC,CAAC,GAAG;IAC/E,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,4BAA4B,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/D,CAAC;AAEJ,wBAAgB,kBAAkB,CAAC,EACjC,oBAAoB,EACpB,4BAA4B,EAC5B,SAAS,EACT,oBAAoB,EACpB,GAAG,UAAU,EACd,EAAE,uBAAuB,eAyEzB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { __assign, __rest } from "tslib";
|
|
2
|
+
import React, { useMemo } from 'react';
|
|
3
|
+
import clsx from 'clsx';
|
|
4
|
+
import { Modal } from '../Modal';
|
|
5
|
+
import { useFetchReactions } from './hooks/useFetchReactions';
|
|
6
|
+
import { LoadingIndicator } from '../Loading';
|
|
7
|
+
import { Avatar } from '../Avatar';
|
|
8
|
+
export function ReactionsListModal(_a) {
|
|
9
|
+
var _b;
|
|
10
|
+
var handleFetchReactions = _a.handleFetchReactions, onSelectedReactionTypeChange = _a.onSelectedReactionTypeChange, reactions = _a.reactions, selectedReactionType = _a.selectedReactionType, modalProps = __rest(_a, ["handleFetchReactions", "onSelectedReactionTypeChange", "reactions", "selectedReactionType"]);
|
|
11
|
+
var selectedReaction = reactions.find(function (_a) {
|
|
12
|
+
var reactionType = _a.reactionType;
|
|
13
|
+
return reactionType === selectedReactionType;
|
|
14
|
+
});
|
|
15
|
+
var SelectedEmojiComponent = (_b = selectedReaction === null || selectedReaction === void 0 ? void 0 : selectedReaction.EmojiComponent) !== null && _b !== void 0 ? _b : null;
|
|
16
|
+
var _c = useFetchReactions({
|
|
17
|
+
handleFetchReactions: handleFetchReactions,
|
|
18
|
+
shouldFetch: modalProps.open,
|
|
19
|
+
}), areReactionsLoading = _c.isLoading, allReactions = _c.reactions;
|
|
20
|
+
var currentReactions = useMemo(function () {
|
|
21
|
+
if (!selectedReactionType) {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
return allReactions.filter(function (reaction) { return reaction.type === selectedReactionType && reaction.user; });
|
|
25
|
+
}, [allReactions, selectedReactionType]);
|
|
26
|
+
return (React.createElement(Modal, __assign({}, modalProps),
|
|
27
|
+
React.createElement("div", { className: 'str-chat__message-reactions-details', "data-testid": 'reactions-list-modal' },
|
|
28
|
+
React.createElement("div", { className: 'str-chat__message-reactions-details-reaction-types' }, reactions.map(function (_a) {
|
|
29
|
+
var EmojiComponent = _a.EmojiComponent, reactionCount = _a.reactionCount, reactionType = _a.reactionType;
|
|
30
|
+
return EmojiComponent && (React.createElement("div", { className: clsx('str-chat__message-reactions-details-reaction-type', {
|
|
31
|
+
'str-chat__message-reactions-details-reaction-type--selected': selectedReactionType === reactionType,
|
|
32
|
+
}), "data-testid": "reaction-details-selector-".concat(reactionType), key: reactionType, onClick: function () { return onSelectedReactionTypeChange === null || onSelectedReactionTypeChange === void 0 ? void 0 : onSelectedReactionTypeChange(reactionType); } },
|
|
33
|
+
React.createElement("span", { className: 'emoji str-chat__message-reaction-emoji' },
|
|
34
|
+
React.createElement(EmojiComponent, null)),
|
|
35
|
+
"\u00A0",
|
|
36
|
+
React.createElement("span", { className: 'str-chat__message-reaction-count' }, reactionCount)));
|
|
37
|
+
})),
|
|
38
|
+
SelectedEmojiComponent && (React.createElement("div", { className: 'emoji str-chat__message-reaction-emoji str-chat__message-reaction-emoji-big' },
|
|
39
|
+
React.createElement(SelectedEmojiComponent, null))),
|
|
40
|
+
React.createElement("div", { className: 'str-chat__message-reactions-details-reacting-users', "data-testid": 'all-reacting-users' }, areReactionsLoading ? (React.createElement(LoadingIndicator, null)) : (currentReactions.map(function (_a) {
|
|
41
|
+
var user = _a.user;
|
|
42
|
+
return (React.createElement("div", { className: 'str-chat__message-reactions-details-reacting-user', key: user === null || user === void 0 ? void 0 : user.id },
|
|
43
|
+
React.createElement(Avatar, { "data-testid": 'avatar', image: user === null || user === void 0 ? void 0 : user.image, name: (user === null || user === void 0 ? void 0 : user.name) || (user === null || user === void 0 ? void 0 : user.id) }),
|
|
44
|
+
React.createElement("span", { className: 'str-chat__user-item--name', "data-testid": 'reaction-user-username' }, (user === null || user === void 0 ? void 0 : user.name) || (user === null || user === void 0 ? void 0 : user.id))));
|
|
45
|
+
}))))));
|
|
46
|
+
}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
1
|
import type { ReactionResponse } from 'stream-chat';
|
|
2
|
+
import { MessageContextValue } from '../../context/MessageContext';
|
|
3
3
|
import type { DefaultStreamChatGenerics } from '../../types/types';
|
|
4
4
|
import type { ReactionOptions } from './reactionOptions';
|
|
5
|
-
export type SimpleReactionsListProps<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> = {
|
|
6
|
-
/** Function that adds/removes a reaction on a message (overrides the function stored in `MessageContext`) */
|
|
7
|
-
handleReaction?: (reactionType: string, event: React.BaseSyntheticEvent) => Promise<void>;
|
|
5
|
+
export type SimpleReactionsListProps<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> = Partial<Pick<MessageContextValue, 'handleFetchReactions' | 'handleReaction'>> & {
|
|
8
6
|
/** An array of the own reaction objects to distinguish own reactions visually */
|
|
9
7
|
own_reactions?: ReactionResponse<StreamChatGenerics>[];
|
|
10
8
|
/** An object that keeps track of the count of each type of reaction on a message */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SimpleReactionsList.d.ts","sourceRoot":"","sources":["../../../src/components/Reactions/SimpleReactionsList.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SimpleReactionsList.d.ts","sourceRoot":"","sources":["../../../src/components/Reactions/SimpleReactionsList.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAAE,mBAAmB,EAAqB,MAAM,8BAA8B,CAAC;AAKtF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAoCzD,MAAM,MAAM,wBAAwB,CAClC,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,sBAAsB,GAAG,gBAAgB,CAAC,CAAC,GAAG;IAClF,iFAAiF;IACjF,aAAa,CAAC,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,EAAE,CAAC;IACvD,oFAAoF;IACpF,eAAe,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAC5C,+DAA+D;IAC/D,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,8DAA8D;IAC9D,SAAS,CAAC,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,EAAE,CAAC;CACpD,CAAC;AAyEF,eAAO,MAAM,mBAAmB,+JAES,CAAC"}
|
|
@@ -6,8 +6,6 @@ import { useMessageContext } from '../../context/MessageContext';
|
|
|
6
6
|
import { useProcessReactions } from './hooks/useProcessReactions';
|
|
7
7
|
import { useEnterLeaveHandlers } from '../Tooltip/hooks';
|
|
8
8
|
import { PopperTooltip } from '../Tooltip';
|
|
9
|
-
// todo: merge with ReactionsList/ButtonWithTooltip
|
|
10
|
-
// avoiding breaking change of replacing <span> with <button>
|
|
11
9
|
var WithTooltip = function (_a) {
|
|
12
10
|
var children = _a.children, onMouseEnter = _a.onMouseEnter, onMouseLeave = _a.onMouseLeave, title = _a.title;
|
|
13
11
|
var _b = useState(null), referenceElement = _b[0], setReferenceElement = _b[1];
|
|
@@ -23,38 +21,23 @@ var WithTooltip = function (_a) {
|
|
|
23
21
|
var UnMemoizedSimpleReactionsList = function (props) {
|
|
24
22
|
var propHandleReaction = props.handleReaction, rest = __rest(props, ["handleReaction"]);
|
|
25
23
|
var contextHandleReaction = useMessageContext('SimpleReactionsList').handleReaction;
|
|
26
|
-
var _a = useProcessReactions(rest),
|
|
24
|
+
var _a = useProcessReactions(rest), existingReactions = _a.existingReactions, hasReactions = _a.hasReactions, totalReactionCount = _a.totalReactionCount;
|
|
27
25
|
var _b = useState(undefined), tooltipReactionType = _b[0], setTooltipReactionType = _b[1];
|
|
28
26
|
var themeVersion = useChatContext('SimpleReactionsList').themeVersion;
|
|
29
27
|
var handleReaction = propHandleReaction || contextHandleReaction;
|
|
30
|
-
if (!
|
|
28
|
+
if (!hasReactions)
|
|
31
29
|
return null;
|
|
32
|
-
if (!supportedReactionsArePresent)
|
|
33
|
-
return null;
|
|
34
|
-
var getUsersPerReactionType = function (type) {
|
|
35
|
-
return latestReactions
|
|
36
|
-
.map(function (reaction) {
|
|
37
|
-
var _a, _b;
|
|
38
|
-
if (type && reaction.type === type) {
|
|
39
|
-
return ((_a = reaction.user) === null || _a === void 0 ? void 0 : _a.name) || ((_b = reaction.user) === null || _b === void 0 ? void 0 : _b.id);
|
|
40
|
-
}
|
|
41
|
-
return null;
|
|
42
|
-
})
|
|
43
|
-
.filter(Boolean);
|
|
44
|
-
};
|
|
45
30
|
return (React.createElement("div", { className: 'str-chat__message-reactions-container' },
|
|
46
31
|
React.createElement("ul", { className: 'str-chat__simple-reactions-list str-chat__message-reactions', "data-testid": 'simple-reaction-list', onMouseLeave: function () { return setTooltipReactionType(undefined); } },
|
|
47
|
-
|
|
48
|
-
var _a;
|
|
49
|
-
var ReactionOption = getEmojiByReactionType(reactionType);
|
|
50
|
-
var isOwnReaction = iHaveReactedWithReaction(reactionType);
|
|
32
|
+
existingReactions.map(function (_a) {
|
|
33
|
+
var EmojiComponent = _a.EmojiComponent, isOwnReaction = _a.isOwnReaction, latestReactedUserNames = _a.latestReactedUserNames, reactionType = _a.reactionType;
|
|
51
34
|
var tooltipVisible = tooltipReactionType === reactionType;
|
|
52
|
-
var tooltipContent =
|
|
53
|
-
return (
|
|
35
|
+
var tooltipContent = latestReactedUserNames.join(', ');
|
|
36
|
+
return (EmojiComponent && (React.createElement("li", { className: clsx('str-chat__simple-reactions-list-item', {
|
|
54
37
|
'str-chat__message-reaction-own': isOwnReaction,
|
|
55
38
|
}), key: reactionType, onClick: function (event) { return handleReaction(reactionType, event); }, onKeyUp: function (event) { return handleReaction(reactionType, event); } },
|
|
56
39
|
React.createElement(WithTooltip, { onMouseEnter: function () { return setTooltipReactionType(reactionType); }, onMouseLeave: function () { return setTooltipReactionType(undefined); }, title: tooltipContent },
|
|
57
|
-
React.createElement(
|
|
40
|
+
React.createElement(EmojiComponent, null),
|
|
58
41
|
"\u00A0",
|
|
59
42
|
tooltipVisible && themeVersion === '1' && (React.createElement("div", { className: 'str-chat__simple-reactions-list-tooltip' },
|
|
60
43
|
React.createElement("div", { className: 'arrow' }),
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ReactionResponse } from 'stream-chat';
|
|
2
|
+
import { MessageContextValue } from '../../../context';
|
|
3
|
+
import { DefaultStreamChatGenerics } from '../../../types/types';
|
|
4
|
+
export interface FetchReactionsOptions<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> {
|
|
5
|
+
shouldFetch: boolean;
|
|
6
|
+
handleFetchReactions?: MessageContextValue<StreamChatGenerics>['handleFetchReactions'];
|
|
7
|
+
}
|
|
8
|
+
export declare function useFetchReactions<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>(options: FetchReactionsOptions): {
|
|
9
|
+
isLoading: boolean;
|
|
10
|
+
reactions: ReactionResponse<import("stream-chat").DefaultGenerics>[];
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=useFetchReactions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFetchReactions.d.ts","sourceRoot":"","sources":["../../../../src/components/Reactions/hooks/useFetchReactions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAqB,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,qBAAqB,CACpC,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB;IAEhF,WAAW,EAAE,OAAO,CAAC;IACrB,oBAAoB,CAAC,EAAE,mBAAmB,CAAC,kBAAkB,CAAC,CAAC,sBAAsB,CAAC,CAAC;CACxF;AAED,wBAAgB,iBAAiB,CAC/B,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,EAChF,OAAO,EAAE,qBAAqB;;;EAyC/B"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { __awaiter, __generator } from "tslib";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { useMessageContext } from '../../../context';
|
|
4
|
+
export function useFetchReactions(options) {
|
|
5
|
+
var _this = this;
|
|
6
|
+
var contextHandleFetchReactions = useMessageContext('useFetchReactions').handleFetchReactions;
|
|
7
|
+
var _a = useState(false), isLoading = _a[0], setIsLoading = _a[1];
|
|
8
|
+
var _b = useState([]), reactions = _b[0], setReactions = _b[1];
|
|
9
|
+
var propHandleFetchReactions = options.handleFetchReactions, shouldFetch = options.shouldFetch;
|
|
10
|
+
var handleFetchReactions = propHandleFetchReactions !== null && propHandleFetchReactions !== void 0 ? propHandleFetchReactions : contextHandleFetchReactions;
|
|
11
|
+
useEffect(function () {
|
|
12
|
+
if (!shouldFetch) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
var cancel = false;
|
|
16
|
+
(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
17
|
+
var reactions_1, e_1;
|
|
18
|
+
return __generator(this, function (_a) {
|
|
19
|
+
switch (_a.label) {
|
|
20
|
+
case 0:
|
|
21
|
+
_a.trys.push([0, 2, 3, 4]);
|
|
22
|
+
setIsLoading(true);
|
|
23
|
+
return [4 /*yield*/, handleFetchReactions()];
|
|
24
|
+
case 1:
|
|
25
|
+
reactions_1 = _a.sent();
|
|
26
|
+
if (!cancel) {
|
|
27
|
+
setReactions(reactions_1);
|
|
28
|
+
}
|
|
29
|
+
return [3 /*break*/, 4];
|
|
30
|
+
case 2:
|
|
31
|
+
e_1 = _a.sent();
|
|
32
|
+
if (!cancel) {
|
|
33
|
+
setReactions([]);
|
|
34
|
+
}
|
|
35
|
+
return [3 /*break*/, 4];
|
|
36
|
+
case 3:
|
|
37
|
+
if (!cancel) {
|
|
38
|
+
setIsLoading(false);
|
|
39
|
+
}
|
|
40
|
+
return [7 /*endfinally*/];
|
|
41
|
+
case 4: return [2 /*return*/];
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}); })();
|
|
45
|
+
return function () {
|
|
46
|
+
cancel = true;
|
|
47
|
+
};
|
|
48
|
+
}, [handleFetchReactions, shouldFetch]);
|
|
49
|
+
return { isLoading: isLoading, reactions: reactions };
|
|
50
|
+
}
|