stream-chat-react-native-core 8.12.0 → 8.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/lib/commonjs/components/ChannelList/Skeleton.js +4 -2
- package/lib/commonjs/components/ChannelList/Skeleton.js.map +1 -1
- package/lib/commonjs/components/Message/MessageSimple/MessageWrapper.js +16 -23
- package/lib/commonjs/components/Message/MessageSimple/MessageWrapper.js.map +1 -1
- package/lib/commonjs/components/MessageList/MessageFlashList.js +12 -9
- package/lib/commonjs/components/MessageList/MessageFlashList.js.map +1 -1
- package/lib/commonjs/components/MessageList/MessageList.js +14 -9
- package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
- package/lib/commonjs/components/MessageList/hooks/useMessageDateSeparator.js +1 -10
- package/lib/commonjs/components/MessageList/hooks/useMessageDateSeparator.js.map +1 -1
- package/lib/commonjs/components/MessageList/hooks/useMessageGroupStyles.js +3 -13
- package/lib/commonjs/components/MessageList/hooks/useMessageGroupStyles.js.map +1 -1
- package/lib/commonjs/components/MessageList/hooks/useMessageList.js +1 -16
- package/lib/commonjs/components/MessageList/hooks/useMessageList.js.map +1 -1
- package/lib/commonjs/components/Thread/Thread.js +4 -2
- package/lib/commonjs/components/Thread/Thread.js.map +1 -1
- package/lib/commonjs/contexts/messageListItemContext/MessageListItemContext.js.map +1 -1
- package/lib/commonjs/version.json +1 -1
- package/lib/module/components/ChannelList/Skeleton.js +4 -2
- package/lib/module/components/ChannelList/Skeleton.js.map +1 -1
- package/lib/module/components/Message/MessageSimple/MessageWrapper.js +16 -23
- package/lib/module/components/Message/MessageSimple/MessageWrapper.js.map +1 -1
- package/lib/module/components/MessageList/MessageFlashList.js +12 -9
- package/lib/module/components/MessageList/MessageFlashList.js.map +1 -1
- package/lib/module/components/MessageList/MessageList.js +14 -9
- package/lib/module/components/MessageList/MessageList.js.map +1 -1
- package/lib/module/components/MessageList/hooks/useMessageDateSeparator.js +1 -10
- package/lib/module/components/MessageList/hooks/useMessageDateSeparator.js.map +1 -1
- package/lib/module/components/MessageList/hooks/useMessageGroupStyles.js +3 -13
- package/lib/module/components/MessageList/hooks/useMessageGroupStyles.js.map +1 -1
- package/lib/module/components/MessageList/hooks/useMessageList.js +1 -16
- package/lib/module/components/MessageList/hooks/useMessageList.js.map +1 -1
- package/lib/module/components/Thread/Thread.js +4 -2
- package/lib/module/components/Thread/Thread.js.map +1 -1
- package/lib/module/contexts/messageListItemContext/MessageListItemContext.js.map +1 -1
- package/lib/module/version.json +1 -1
- package/lib/typescript/components/ChannelList/Skeleton.d.ts.map +1 -1
- package/lib/typescript/components/Message/MessageSimple/MessageWrapper.d.ts +2 -0
- package/lib/typescript/components/Message/MessageSimple/MessageWrapper.d.ts.map +1 -1
- package/lib/typescript/components/MessageList/MessageFlashList.d.ts.map +1 -1
- package/lib/typescript/components/MessageList/MessageList.d.ts.map +1 -1
- package/lib/typescript/components/MessageList/hooks/useMessageDateSeparator.d.ts +2 -3
- package/lib/typescript/components/MessageList/hooks/useMessageDateSeparator.d.ts.map +1 -1
- package/lib/typescript/components/MessageList/hooks/useMessageGroupStyles.d.ts +3 -3
- package/lib/typescript/components/MessageList/hooks/useMessageGroupStyles.d.ts.map +1 -1
- package/lib/typescript/components/MessageList/hooks/useMessageList.d.ts +0 -2
- package/lib/typescript/components/MessageList/hooks/useMessageList.d.ts.map +1 -1
- package/lib/typescript/components/MessageList/utils/getGroupStyles.d.ts +2 -2
- package/lib/typescript/components/MessageList/utils/getGroupStyles.d.ts.map +1 -1
- package/lib/typescript/components/Thread/Thread.d.ts +1 -0
- package/lib/typescript/components/Thread/Thread.d.ts.map +1 -1
- package/lib/typescript/contexts/messageListItemContext/MessageListItemContext.d.ts +0 -5
- package/lib/typescript/contexts/messageListItemContext/MessageListItemContext.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/components/ChannelList/Skeleton.tsx +3 -1
- package/src/components/Message/MessageSimple/MessageWrapper.tsx +8 -19
- package/src/components/MessageList/MessageFlashList.tsx +17 -18
- package/src/components/MessageList/MessageList.tsx +21 -18
- package/src/components/MessageList/__tests__/useMessageDateSeparator.test.ts +5 -13
- package/src/components/MessageList/hooks/useMessageDateSeparator.ts +3 -17
- package/src/components/MessageList/hooks/useMessageGroupStyles.ts +6 -21
- package/src/components/MessageList/hooks/useMessageList.ts +2 -14
- package/src/components/MessageList/utils/getGroupStyles.ts +2 -2
- package/src/components/Thread/Thread.tsx +3 -1
- package/src/contexts/messageListItemContext/MessageListItemContext.tsx +0 -5
- package/src/version.json +1 -1
|
@@ -4,8 +4,8 @@ import type { PaginatedMessageListContextValue } from '../../../contexts/paginat
|
|
|
4
4
|
import type { ThreadContextValue } from '../../../contexts/threadContext/ThreadContext';
|
|
5
5
|
export type MessageGroupStylesParams = {
|
|
6
6
|
message: LocalMessage;
|
|
7
|
-
previousMessage
|
|
8
|
-
nextMessage
|
|
7
|
+
previousMessage?: LocalMessage;
|
|
8
|
+
nextMessage?: LocalMessage;
|
|
9
9
|
maxTimeBetweenGroupedMessages?: number;
|
|
10
10
|
dateSeparatorDate?: Date;
|
|
11
11
|
nextMessageDateSeparatorDate?: Date;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getGroupStyles.d.ts","sourceRoot":"","sources":["../../../../../src/components/MessageList/utils/getGroupStyles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,2EAA2E,CAAC;AAClI,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AAKxF,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,YAAY,CAAC;IACtB,eAAe,EAAE,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"getGroupStyles.d.ts","sourceRoot":"","sources":["../../../../../src/components/MessageList/utils/getGroupStyles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,2EAA2E,CAAC;AAClI,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AAKxF,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,YAAY,CAAC;IACtB,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,iBAAiB,CAAC,EAAE,IAAI,CAAC;IACzB,4BAA4B,CAAC,EAAE,IAAI,CAAC;CACrC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,gCAAgC,CAAC,UAAU,CAAC,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IAC9F;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,EAAE,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAErE;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,4HAO3B,wBAAwB,KAAG,UAAU,EAsEvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,oBAAoB;;CA0B1D,CAAC"}
|
|
@@ -38,6 +38,7 @@ type ThreadPropsWithContext = Pick<ChatContextValue, 'client'> & Pick<MessagesCo
|
|
|
38
38
|
* Call custom function on closing thread if handling thread state elsewhere
|
|
39
39
|
*/
|
|
40
40
|
onThreadDismount?: () => void;
|
|
41
|
+
shouldUseFlashList?: boolean;
|
|
41
42
|
};
|
|
42
43
|
export type ThreadProps = Partial<ThreadPropsWithContext>;
|
|
43
44
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Thread.d.ts","sourceRoot":"","sources":["../../../../src/components/Thread/Thread.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiC,MAAM,OAAO,CAAC;AAKtD,OAAO,EAAE,gBAAgB,EAAkB,MAAM,wCAAwC,CAAC;AAC1F,OAAO,EACL,oBAAoB,EAErB,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAoB,MAAM,4CAA4C,CAAC;AAElG,OAAO,EAEL,iBAAiB,EAClB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAoB,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC1F,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAU9D,KAAK,sBAAsB,GAAG,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,GAC5D,IAAI,CAAC,oBAAoB,EAAE,aAAa,CAAC,GACzC,IAAI,CACF,kBAAkB,EAChB,aAAa,GACb,gBAAgB,GAChB,2BAA2B,GAC3B,cAAc,GACd,QAAQ,GACR,gBAAgB,CACnB,GAAG;IACF;;;SAGK;IACL,2BAA2B,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACzD;;;SAGK;IACL,0BAA0B,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvD;;;;;OAKG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACjE,0CAA0C;IAC1C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kDAAkD;IAClD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gFAAgF;IAChF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACtD;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"Thread.d.ts","sourceRoot":"","sources":["../../../../src/components/Thread/Thread.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiC,MAAM,OAAO,CAAC;AAKtD,OAAO,EAAE,gBAAgB,EAAkB,MAAM,wCAAwC,CAAC;AAC1F,OAAO,EACL,oBAAoB,EAErB,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAoB,MAAM,4CAA4C,CAAC;AAElG,OAAO,EAEL,iBAAiB,EAClB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAoB,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC1F,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAU9D,KAAK,sBAAsB,GAAG,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,GAC5D,IAAI,CAAC,oBAAoB,EAAE,aAAa,CAAC,GACzC,IAAI,CACF,kBAAkB,EAChB,aAAa,GACb,gBAAgB,GAChB,2BAA2B,GAC3B,cAAc,GACd,QAAQ,GACR,gBAAgB,CACnB,GAAG;IACF;;;SAGK;IACL,2BAA2B,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACzD;;;SAGK;IACL,0BAA0B,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvD;;;;;OAKG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACjE,0CAA0C;IAC1C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kDAAkD;IAClD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gFAAgF;IAChF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACtD;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAmFJ,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAE1D;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,GAAI,OAAO,WAAW,sBA0BxC,CAAC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import React, { PropsWithChildren } from 'react';
|
|
2
2
|
import { MessageListProps } from '../../components/MessageList/MessageList';
|
|
3
|
-
import { MessagePreviousAndNextMessageStore } from '../../state-store/message-list-prev-next-state';
|
|
4
3
|
import { Theme } from '../themeContext/utils/theme';
|
|
5
4
|
export type MessageListItemContextValue = {
|
|
6
5
|
/**
|
|
@@ -10,10 +9,6 @@ export type MessageListItemContextValue = {
|
|
|
10
9
|
* @returns void
|
|
11
10
|
*/
|
|
12
11
|
goToMessage: (messageId: string) => void;
|
|
13
|
-
/**
|
|
14
|
-
* Store to get the previous and next message in the message list
|
|
15
|
-
*/
|
|
16
|
-
messageListPreviousAndNextMessageStore: MessagePreviousAndNextMessageStore;
|
|
17
12
|
/**
|
|
18
13
|
* Theme to use for the message list item
|
|
19
14
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageListItemContext.d.ts","sourceRoot":"","sources":["../../../../src/contexts/messageListItemContext/MessageListItemContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAiB,iBAAiB,EAAc,MAAM,OAAO,CAAC;AAE5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"MessageListItemContext.d.ts","sourceRoot":"","sources":["../../../../src/contexts/messageListItemContext/MessageListItemContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAiB,iBAAiB,EAAc,MAAM,OAAO,CAAC;AAE5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAE5E,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAIpD,MAAM,MAAM,2BAA2B,GAAG;IACxC;;;;;OAKG;IACH,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC;;OAEG;IACH,aAAa,EAAE,KAAK,CAAC;IACrB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,cAAc,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;CACpD,CAAC;AAEF,eAAO,MAAM,sBAAsB,4CAElC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,sBAGrC,iBAAiB,CAAC;IACnB,KAAK,CAAC,EAAE,2BAA2B,CAAC;CACrC,CAAC,sBAID,CAAC;AAEF,eAAO,MAAM,yBAAyB,mCAUrC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stream-chat-react-native-core",
|
|
3
3
|
"description": "The official React Native and Expo components for Stream Chat, a service for building chat applications",
|
|
4
|
-
"version": "8.12.
|
|
4
|
+
"version": "8.12.2",
|
|
5
5
|
"author": {
|
|
6
6
|
"company": "Stream.io Inc",
|
|
7
7
|
"name": "Stream.io Inc"
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
]
|
|
69
69
|
},
|
|
70
70
|
"dependencies": {
|
|
71
|
-
"@gorhom/bottom-sheet": "
|
|
71
|
+
"@gorhom/bottom-sheet": "5.1.8",
|
|
72
72
|
"@ungap/structured-clone": "^1.3.0",
|
|
73
73
|
"dayjs": "1.11.13",
|
|
74
74
|
"emoji-regex": "^10.4.0",
|
|
@@ -13,6 +13,8 @@ import { Defs, LinearGradient, Path, Rect, Stop, Svg } from 'react-native-svg';
|
|
|
13
13
|
|
|
14
14
|
import { useTheme } from '../../contexts/themeContext/ThemeContext';
|
|
15
15
|
|
|
16
|
+
const AnimatedPath = Animated.createAnimatedComponent(Path);
|
|
17
|
+
|
|
16
18
|
const paddingLarge = 16;
|
|
17
19
|
const paddingMedium = 12;
|
|
18
20
|
const paddingSmall = 8;
|
|
@@ -148,7 +150,7 @@ export const Skeleton = () => {
|
|
|
148
150
|
</Svg>
|
|
149
151
|
</Animated.View>
|
|
150
152
|
<Svg height={height} width={width}>
|
|
151
|
-
<
|
|
153
|
+
<AnimatedPath animatedProps={svgAnimatedProps} fill={maskFillColor || white_snow} />
|
|
152
154
|
</Svg>
|
|
153
155
|
</View>
|
|
154
156
|
);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React
|
|
1
|
+
import React from 'react';
|
|
2
2
|
|
|
3
3
|
import { View } from 'react-native';
|
|
4
4
|
|
|
@@ -14,7 +14,6 @@ import { ThemeProvider, useTheme } from '../../../contexts/themeContext/ThemeCon
|
|
|
14
14
|
|
|
15
15
|
import { useStateStore } from '../../../hooks/useStateStore';
|
|
16
16
|
import { ChannelUnreadStateStoreType } from '../../../state-store/channel-unread-state';
|
|
17
|
-
import { MessagePreviousAndNextMessageStoreType } from '../../../state-store/message-list-prev-next-state';
|
|
18
17
|
|
|
19
18
|
const channelUnreadStateSelector = (state: ChannelUnreadStateStoreType) => ({
|
|
20
19
|
first_unread_message_id: state.channelUnreadState?.first_unread_message_id,
|
|
@@ -25,10 +24,12 @@ const channelUnreadStateSelector = (state: ChannelUnreadStateStoreType) => ({
|
|
|
25
24
|
|
|
26
25
|
export type MessageWrapperProps = {
|
|
27
26
|
message: LocalMessage;
|
|
27
|
+
previousMessage?: LocalMessage;
|
|
28
|
+
nextMessage?: LocalMessage;
|
|
28
29
|
};
|
|
29
30
|
|
|
30
31
|
export const MessageWrapper = React.memo((props: MessageWrapperProps) => {
|
|
31
|
-
const { message } = props;
|
|
32
|
+
const { message, previousMessage, nextMessage } = props;
|
|
32
33
|
const { client } = useChatContext();
|
|
33
34
|
const {
|
|
34
35
|
channelUnreadStateStore,
|
|
@@ -47,35 +48,23 @@ export const MessageWrapper = React.memo((props: MessageWrapperProps) => {
|
|
|
47
48
|
myMessageTheme,
|
|
48
49
|
shouldShowUnreadUnderlay,
|
|
49
50
|
} = useMessagesContext();
|
|
50
|
-
const {
|
|
51
|
-
goToMessage,
|
|
52
|
-
onThreadSelect,
|
|
53
|
-
noGroupByUser,
|
|
54
|
-
modifiedTheme,
|
|
55
|
-
messageListPreviousAndNextMessageStore,
|
|
56
|
-
} = useMessageListItemContext();
|
|
51
|
+
const { goToMessage, onThreadSelect, noGroupByUser, modifiedTheme } = useMessageListItemContext();
|
|
57
52
|
|
|
58
53
|
const dateSeparatorDate = useMessageDateSeparator({
|
|
59
54
|
hideDateSeparators,
|
|
60
55
|
message,
|
|
61
|
-
|
|
56
|
+
previousMessage,
|
|
62
57
|
});
|
|
63
58
|
|
|
64
|
-
const selector = useCallback(
|
|
65
|
-
(state: MessagePreviousAndNextMessageStoreType) => ({
|
|
66
|
-
nextMessage: state.messageList[message.id]?.nextMessage,
|
|
67
|
-
}),
|
|
68
|
-
[message.id],
|
|
69
|
-
);
|
|
70
|
-
const { nextMessage } = useStateStore(messageListPreviousAndNextMessageStore.state, selector);
|
|
71
59
|
const isNewestMessage = nextMessage === undefined;
|
|
72
60
|
const groupStyles = useMessageGroupStyles({
|
|
73
61
|
dateSeparatorDate,
|
|
74
62
|
getMessageGroupStyle,
|
|
75
63
|
maxTimeBetweenGroupedMessages,
|
|
76
64
|
message,
|
|
77
|
-
|
|
65
|
+
nextMessage,
|
|
78
66
|
noGroupByUser,
|
|
67
|
+
previousMessage,
|
|
79
68
|
});
|
|
80
69
|
|
|
81
70
|
const { first_unread_message_id, last_read_timestamp, last_read_message_id, unread_messages } =
|
|
@@ -254,10 +254,6 @@ const getItemTypeInternal = (message: LocalMessage) => {
|
|
|
254
254
|
return 'generic-message';
|
|
255
255
|
};
|
|
256
256
|
|
|
257
|
-
const renderItem = ({ item: message }: { item: LocalMessage }) => {
|
|
258
|
-
return <MessageWrapper message={message} />;
|
|
259
|
-
};
|
|
260
|
-
|
|
261
257
|
const MessageFlashListWithContext = (props: MessageFlashListPropsWithContext) => {
|
|
262
258
|
const LoadingMoreRecentIndicator = props.threadList
|
|
263
259
|
? InlineLoadingMoreRecentThreadIndicator
|
|
@@ -350,18 +346,28 @@ const MessageFlashListWithContext = (props: MessageFlashListPropsWithContext) =>
|
|
|
350
346
|
[myMessageThemeString, theme],
|
|
351
347
|
);
|
|
352
348
|
|
|
353
|
-
const {
|
|
354
|
-
messageListPreviousAndNextMessageStore,
|
|
355
|
-
processedMessageList,
|
|
356
|
-
rawMessageList,
|
|
357
|
-
viewabilityChangedCallback,
|
|
358
|
-
} = useMessageList({
|
|
349
|
+
const { processedMessageList, rawMessageList, viewabilityChangedCallback } = useMessageList({
|
|
359
350
|
isFlashList: true,
|
|
360
351
|
isLiveStreaming,
|
|
361
352
|
noGroupByUser,
|
|
362
353
|
threadList,
|
|
363
354
|
});
|
|
364
355
|
|
|
356
|
+
const renderItem = useCallback(
|
|
357
|
+
({ item: message, index }: { item: LocalMessage; index: number }) => {
|
|
358
|
+
const previousMessage = processedMessageList[index - 1];
|
|
359
|
+
const nextMessage = processedMessageList[index + 1];
|
|
360
|
+
return (
|
|
361
|
+
<MessageWrapper
|
|
362
|
+
message={message}
|
|
363
|
+
nextMessage={nextMessage}
|
|
364
|
+
previousMessage={previousMessage}
|
|
365
|
+
/>
|
|
366
|
+
);
|
|
367
|
+
},
|
|
368
|
+
[processedMessageList],
|
|
369
|
+
);
|
|
370
|
+
|
|
365
371
|
/**
|
|
366
372
|
* We need topMessage and channelLastRead values to set the initial scroll position.
|
|
367
373
|
* So these values only get used if `initialScrollToFirstUnreadMessage` prop is true.
|
|
@@ -722,18 +728,11 @@ const MessageFlashListWithContext = (props: MessageFlashListPropsWithContext) =>
|
|
|
722
728
|
const messageListItemContextValue: MessageListItemContextValue = useMemo(
|
|
723
729
|
() => ({
|
|
724
730
|
goToMessage,
|
|
725
|
-
messageListPreviousAndNextMessageStore,
|
|
726
731
|
modifiedTheme,
|
|
727
732
|
noGroupByUser,
|
|
728
733
|
onThreadSelect,
|
|
729
734
|
}),
|
|
730
|
-
[
|
|
731
|
-
goToMessage,
|
|
732
|
-
messageListPreviousAndNextMessageStore,
|
|
733
|
-
modifiedTheme,
|
|
734
|
-
noGroupByUser,
|
|
735
|
-
onThreadSelect,
|
|
736
|
-
],
|
|
735
|
+
[goToMessage, modifiedTheme, noGroupByUser, onThreadSelect],
|
|
737
736
|
);
|
|
738
737
|
|
|
739
738
|
const messagesWithImages =
|
|
@@ -233,10 +233,6 @@ type MessageListPropsWithContext = Pick<
|
|
|
233
233
|
isLiveStreaming?: boolean;
|
|
234
234
|
};
|
|
235
235
|
|
|
236
|
-
const renderItem = ({ item: message }: { item: LocalMessage }) => {
|
|
237
|
-
return <MessageWrapper message={message} />;
|
|
238
|
-
};
|
|
239
|
-
|
|
240
236
|
/**
|
|
241
237
|
* The message list component renders a list of messages. It consumes the following contexts:
|
|
242
238
|
*
|
|
@@ -320,16 +316,30 @@ const MessageListWithContext = (props: MessageListPropsWithContext) => {
|
|
|
320
316
|
* NOTE: rawMessageList changes only when messages array state changes
|
|
321
317
|
* processedMessageList changes on any state change
|
|
322
318
|
*/
|
|
323
|
-
const {
|
|
324
|
-
messageListPreviousAndNextMessageStore,
|
|
325
|
-
processedMessageList,
|
|
326
|
-
rawMessageList,
|
|
327
|
-
viewabilityChangedCallback,
|
|
328
|
-
} = useMessageList({
|
|
319
|
+
const { processedMessageList, rawMessageList, viewabilityChangedCallback } = useMessageList({
|
|
329
320
|
isLiveStreaming,
|
|
330
321
|
noGroupByUser,
|
|
331
322
|
threadList,
|
|
332
323
|
});
|
|
324
|
+
|
|
325
|
+
const processedMessageListRef = useRef(processedMessageList);
|
|
326
|
+
processedMessageListRef.current = processedMessageList;
|
|
327
|
+
|
|
328
|
+
const renderItem = useCallback(
|
|
329
|
+
({ item: message, index }: { item: LocalMessage; index: number }) => {
|
|
330
|
+
const previousMessage = processedMessageListRef.current[index + 1];
|
|
331
|
+
const nextMessage = processedMessageListRef.current[index - 1];
|
|
332
|
+
return (
|
|
333
|
+
<MessageWrapper
|
|
334
|
+
message={message}
|
|
335
|
+
nextMessage={nextMessage}
|
|
336
|
+
previousMessage={previousMessage}
|
|
337
|
+
/>
|
|
338
|
+
);
|
|
339
|
+
},
|
|
340
|
+
[processedMessageListRef],
|
|
341
|
+
);
|
|
342
|
+
|
|
333
343
|
const messageListLengthBeforeUpdate = useRef(0);
|
|
334
344
|
const messageListLengthAfterUpdate = processedMessageList.length;
|
|
335
345
|
|
|
@@ -771,18 +781,11 @@ const MessageListWithContext = (props: MessageListPropsWithContext) => {
|
|
|
771
781
|
const messageListItemContextValue: MessageListItemContextValue = useMemo(
|
|
772
782
|
() => ({
|
|
773
783
|
goToMessage,
|
|
774
|
-
messageListPreviousAndNextMessageStore,
|
|
775
784
|
modifiedTheme,
|
|
776
785
|
noGroupByUser,
|
|
777
786
|
onThreadSelect,
|
|
778
787
|
}),
|
|
779
|
-
[
|
|
780
|
-
goToMessage,
|
|
781
|
-
messageListPreviousAndNextMessageStore,
|
|
782
|
-
modifiedTheme,
|
|
783
|
-
noGroupByUser,
|
|
784
|
-
onThreadSelect,
|
|
785
|
-
],
|
|
788
|
+
[goToMessage, modifiedTheme, noGroupByUser, onThreadSelect],
|
|
786
789
|
);
|
|
787
790
|
|
|
788
791
|
/**
|
|
@@ -2,15 +2,12 @@ import { renderHook } from '@testing-library/react-native';
|
|
|
2
2
|
|
|
3
3
|
import { LocalMessage } from 'stream-chat';
|
|
4
4
|
|
|
5
|
-
import { MessagePreviousAndNextMessageStore } from '../../../state-store/message-list-prev-next-state';
|
|
6
5
|
import { useMessageDateSeparator } from '../hooks/useMessageDateSeparator';
|
|
7
6
|
|
|
8
7
|
describe('useMessageDateSeparator', () => {
|
|
9
|
-
let messageListPreviousAndNextMessageStore: MessagePreviousAndNextMessageStore;
|
|
10
8
|
let messages: LocalMessage[];
|
|
11
9
|
|
|
12
10
|
beforeEach(() => {
|
|
13
|
-
messageListPreviousAndNextMessageStore = new MessagePreviousAndNextMessageStore();
|
|
14
11
|
messages = [
|
|
15
12
|
{
|
|
16
13
|
created_at: new Date('2020-01-01T00:00:00.000Z'),
|
|
@@ -28,13 +25,10 @@ describe('useMessageDateSeparator', () => {
|
|
|
28
25
|
text: 'Hello World',
|
|
29
26
|
},
|
|
30
27
|
] as LocalMessage[];
|
|
31
|
-
messageListPreviousAndNextMessageStore.setMessageListPreviousAndNextMessage({ messages });
|
|
32
28
|
});
|
|
33
29
|
|
|
34
30
|
it('should return undefined if no message is passed', () => {
|
|
35
|
-
const { result } = renderHook(() =>
|
|
36
|
-
useMessageDateSeparator({ message: undefined, messageListPreviousAndNextMessageStore }),
|
|
37
|
-
);
|
|
31
|
+
const { result } = renderHook(() => useMessageDateSeparator({ message: undefined }));
|
|
38
32
|
expect(result.current).toBeUndefined();
|
|
39
33
|
});
|
|
40
34
|
|
|
@@ -43,7 +37,7 @@ describe('useMessageDateSeparator', () => {
|
|
|
43
37
|
useMessageDateSeparator({
|
|
44
38
|
hideDateSeparators: true,
|
|
45
39
|
message: messages[1],
|
|
46
|
-
|
|
40
|
+
previousMessage: messages[0],
|
|
47
41
|
}),
|
|
48
42
|
);
|
|
49
43
|
expect(result.current).toBeUndefined();
|
|
@@ -51,7 +45,7 @@ describe('useMessageDateSeparator', () => {
|
|
|
51
45
|
|
|
52
46
|
it('should return the date separator for a message if previous message is not the same day', () => {
|
|
53
47
|
const { result } = renderHook(() =>
|
|
54
|
-
useMessageDateSeparator({ message: messages[1],
|
|
48
|
+
useMessageDateSeparator({ message: messages[1], previousMessage: messages[0] }),
|
|
55
49
|
);
|
|
56
50
|
expect(result.current).toBe(messages[1].created_at);
|
|
57
51
|
});
|
|
@@ -69,14 +63,12 @@ describe('useMessageDateSeparator', () => {
|
|
|
69
63
|
text: 'World',
|
|
70
64
|
},
|
|
71
65
|
] as LocalMessage[];
|
|
72
|
-
const messageListPreviousAndNextMessageStore = new MessagePreviousAndNextMessageStore();
|
|
73
|
-
messageListPreviousAndNextMessageStore.setMessageListPreviousAndNextMessage({ messages });
|
|
74
66
|
const { result: resultOfFirstMessage } = renderHook(() =>
|
|
75
|
-
useMessageDateSeparator({ message: messages[0],
|
|
67
|
+
useMessageDateSeparator({ message: messages[0], previousMessage: undefined }),
|
|
76
68
|
);
|
|
77
69
|
expect(resultOfFirstMessage.current).toBe(messages[0].created_at);
|
|
78
70
|
const { result: resultOfSecondMessage } = renderHook(() =>
|
|
79
|
-
useMessageDateSeparator({ message: messages[1],
|
|
71
|
+
useMessageDateSeparator({ message: messages[1], previousMessage: messages[0] }),
|
|
80
72
|
);
|
|
81
73
|
expect(resultOfSecondMessage.current).toBeUndefined();
|
|
82
74
|
});
|
|
@@ -1,13 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
2
|
|
|
3
3
|
import { LocalMessage } from 'stream-chat';
|
|
4
4
|
|
|
5
|
-
import { useStateStore } from '../../../hooks/useStateStore';
|
|
6
|
-
import {
|
|
7
|
-
MessagePreviousAndNextMessageStore,
|
|
8
|
-
MessagePreviousAndNextMessageStoreType,
|
|
9
|
-
} from '../../../state-store/message-list-prev-next-state';
|
|
10
|
-
|
|
11
5
|
export const getDateSeparatorValue = ({
|
|
12
6
|
hideDateSeparators,
|
|
13
7
|
message,
|
|
@@ -37,20 +31,12 @@ export const getDateSeparatorValue = ({
|
|
|
37
31
|
export const useMessageDateSeparator = ({
|
|
38
32
|
hideDateSeparators,
|
|
39
33
|
message,
|
|
40
|
-
|
|
34
|
+
previousMessage,
|
|
41
35
|
}: {
|
|
42
36
|
hideDateSeparators?: boolean;
|
|
43
37
|
message?: LocalMessage;
|
|
44
|
-
|
|
38
|
+
previousMessage?: LocalMessage;
|
|
45
39
|
}) => {
|
|
46
|
-
const selector = useCallback(
|
|
47
|
-
(state: MessagePreviousAndNextMessageStoreType) => ({
|
|
48
|
-
previousMessage: message ? state.messageList[message.id]?.previousMessage : undefined,
|
|
49
|
-
}),
|
|
50
|
-
[message],
|
|
51
|
-
);
|
|
52
|
-
const { previousMessage } = useStateStore(messageListPreviousAndNextMessageStore.state, selector);
|
|
53
|
-
|
|
54
40
|
const dateSeparatorDate = useMemo(() => {
|
|
55
41
|
if (!message && !previousMessage) {
|
|
56
42
|
return undefined;
|
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
2
|
|
|
3
3
|
import { LocalMessage } from 'stream-chat';
|
|
4
4
|
|
|
5
5
|
import { useMessageDateSeparator } from './useMessageDateSeparator';
|
|
6
6
|
|
|
7
7
|
import { MessagesContextValue } from '../../../contexts/messagesContext/MessagesContext';
|
|
8
|
-
import { useStateStore } from '../../../hooks/useStateStore';
|
|
9
|
-
import {
|
|
10
|
-
MessagePreviousAndNextMessageStore,
|
|
11
|
-
MessagePreviousAndNextMessageStoreType,
|
|
12
|
-
} from '../../../state-store/message-list-prev-next-state';
|
|
13
8
|
import { getGroupStyle } from '../utils/getGroupStyles';
|
|
14
9
|
|
|
15
10
|
/**
|
|
@@ -20,7 +15,8 @@ export const useMessageGroupStyles = ({
|
|
|
20
15
|
dateSeparatorDate,
|
|
21
16
|
maxTimeBetweenGroupedMessages,
|
|
22
17
|
message,
|
|
23
|
-
|
|
18
|
+
previousMessage,
|
|
19
|
+
nextMessage,
|
|
24
20
|
getMessageGroupStyle = getGroupStyle,
|
|
25
21
|
}: {
|
|
26
22
|
noGroupByUser?: boolean;
|
|
@@ -28,24 +24,13 @@ export const useMessageGroupStyles = ({
|
|
|
28
24
|
dateSeparatorDate?: Date;
|
|
29
25
|
maxTimeBetweenGroupedMessages?: number;
|
|
30
26
|
message: LocalMessage;
|
|
31
|
-
|
|
27
|
+
previousMessage?: LocalMessage;
|
|
28
|
+
nextMessage?: LocalMessage;
|
|
32
29
|
}) => {
|
|
33
|
-
const selector = useCallback(
|
|
34
|
-
(state: MessagePreviousAndNextMessageStoreType) => ({
|
|
35
|
-
nextMessage: state.messageList[message.id]?.nextMessage,
|
|
36
|
-
previousMessage: state.messageList[message.id]?.previousMessage,
|
|
37
|
-
}),
|
|
38
|
-
[message.id],
|
|
39
|
-
);
|
|
40
|
-
const { previousMessage, nextMessage } = useStateStore(
|
|
41
|
-
messageListPreviousAndNextMessageStore.state,
|
|
42
|
-
selector,
|
|
43
|
-
);
|
|
44
|
-
|
|
45
30
|
// This is needed to calculate the group styles for the next message
|
|
46
31
|
const nextMessageDateSeparatorDate = useMessageDateSeparator({
|
|
47
32
|
message: nextMessage,
|
|
48
|
-
|
|
33
|
+
previousMessage: message,
|
|
49
34
|
});
|
|
50
35
|
|
|
51
36
|
const groupStyles = useMemo(() => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useMemo, useRef } from 'react';
|
|
2
2
|
|
|
3
3
|
import type { LocalMessage } from 'stream-chat';
|
|
4
4
|
|
|
@@ -12,7 +12,6 @@ import { usePaginatedMessageListContext } from '../../../contexts/paginatedMessa
|
|
|
12
12
|
import { useThreadContext } from '../../../contexts/threadContext/ThreadContext';
|
|
13
13
|
|
|
14
14
|
import { useRAFCoalescedValue } from '../../../hooks';
|
|
15
|
-
import { MessagePreviousAndNextMessageStore } from '../../../state-store/message-list-prev-next-state';
|
|
16
15
|
import { DateSeparators, getDateSeparators } from '../utils/getDateSeparators';
|
|
17
16
|
import { getGroupStyles } from '../utils/getGroupStyles';
|
|
18
17
|
|
|
@@ -70,9 +69,6 @@ export const useMessageList = (params: UseMessageListParams) => {
|
|
|
70
69
|
const { messages, viewabilityChangedCallback } = usePaginatedMessageListContext();
|
|
71
70
|
const { threadMessages } = useThreadContext();
|
|
72
71
|
const messageList = threadList ? threadMessages : messages;
|
|
73
|
-
const [messageListPreviousAndNextMessageStore] = useState(
|
|
74
|
-
() => new MessagePreviousAndNextMessageStore(),
|
|
75
|
-
);
|
|
76
72
|
|
|
77
73
|
const processedMessageList = useMemo<LocalMessage[]>(() => {
|
|
78
74
|
const newMessageList = [];
|
|
@@ -94,13 +90,6 @@ export const useMessageList = (params: UseMessageListParams) => {
|
|
|
94
90
|
return newMessageList;
|
|
95
91
|
}, [messageList, deletedMessagesVisibilityType, client.userID, isFlashList]);
|
|
96
92
|
|
|
97
|
-
useEffect(() => {
|
|
98
|
-
messageListPreviousAndNextMessageStore.setMessageListPreviousAndNextMessage({
|
|
99
|
-
isFlashList,
|
|
100
|
-
messages: processedMessageList,
|
|
101
|
-
});
|
|
102
|
-
}, [processedMessageList, messageListPreviousAndNextMessageStore, isFlashList]);
|
|
103
|
-
|
|
104
93
|
/**
|
|
105
94
|
* @deprecated use `useDateSeparator` hook instead directly in the Message.
|
|
106
95
|
*/
|
|
@@ -156,13 +145,12 @@ export const useMessageList = (params: UseMessageListParams) => {
|
|
|
156
145
|
dateSeparatorsRef,
|
|
157
146
|
/** Message group styles */
|
|
158
147
|
messageGroupStylesRef,
|
|
159
|
-
messageListPreviousAndNextMessageStore,
|
|
160
148
|
/** Messages enriched with dates/readby/groups and also reversed in order */
|
|
161
149
|
processedMessageList: data,
|
|
162
150
|
/** Raw messages from the channel state */
|
|
163
151
|
rawMessageList: messageList,
|
|
164
152
|
viewabilityChangedCallback,
|
|
165
153
|
}),
|
|
166
|
-
[data, messageList,
|
|
154
|
+
[data, messageList, viewabilityChangedCallback],
|
|
167
155
|
);
|
|
168
156
|
};
|
|
@@ -10,8 +10,8 @@ import type { GroupType } from '../hooks/useMessageList';
|
|
|
10
10
|
|
|
11
11
|
export type MessageGroupStylesParams = {
|
|
12
12
|
message: LocalMessage;
|
|
13
|
-
previousMessage
|
|
14
|
-
nextMessage
|
|
13
|
+
previousMessage?: LocalMessage;
|
|
14
|
+
nextMessage?: LocalMessage;
|
|
15
15
|
maxTimeBetweenGroupedMessages?: number;
|
|
16
16
|
dateSeparatorDate?: Date;
|
|
17
17
|
nextMessageDateSeparatorDate?: Date;
|
|
@@ -68,6 +68,7 @@ type ThreadPropsWithContext = Pick<ChatContextValue, 'client'> &
|
|
|
68
68
|
* Call custom function on closing thread if handling thread state elsewhere
|
|
69
69
|
*/
|
|
70
70
|
onThreadDismount?: () => void;
|
|
71
|
+
shouldUseFlashList?: boolean;
|
|
71
72
|
};
|
|
72
73
|
|
|
73
74
|
const ThreadWithContext = (props: ThreadPropsWithContext) => {
|
|
@@ -86,6 +87,7 @@ const ThreadWithContext = (props: ThreadPropsWithContext) => {
|
|
|
86
87
|
parentMessagePreventPress = true,
|
|
87
88
|
thread,
|
|
88
89
|
threadInstance,
|
|
90
|
+
shouldUseFlashList = false,
|
|
89
91
|
} = props;
|
|
90
92
|
|
|
91
93
|
useEffect(() => {
|
|
@@ -125,7 +127,7 @@ const ThreadWithContext = (props: ThreadPropsWithContext) => {
|
|
|
125
127
|
|
|
126
128
|
return (
|
|
127
129
|
<React.Fragment key={`thread-${thread.id}`}>
|
|
128
|
-
{FlashList ? (
|
|
130
|
+
{FlashList && shouldUseFlashList ? (
|
|
129
131
|
<MessageFlashList
|
|
130
132
|
HeaderComponent={MemoizedThreadFooterComponent}
|
|
131
133
|
threadList
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import React, { createContext, PropsWithChildren, useContext } from 'react';
|
|
2
2
|
|
|
3
3
|
import { MessageListProps } from '../../components/MessageList/MessageList';
|
|
4
|
-
import { MessagePreviousAndNextMessageStore } from '../../state-store/message-list-prev-next-state';
|
|
5
4
|
|
|
6
5
|
import { Theme } from '../themeContext/utils/theme';
|
|
7
6
|
import { DEFAULT_BASE_CONTEXT_VALUE } from '../utils/defaultBaseContextValue';
|
|
@@ -15,10 +14,6 @@ export type MessageListItemContextValue = {
|
|
|
15
14
|
* @returns void
|
|
16
15
|
*/
|
|
17
16
|
goToMessage: (messageId: string) => void;
|
|
18
|
-
/**
|
|
19
|
-
* Store to get the previous and next message in the message list
|
|
20
|
-
*/
|
|
21
|
-
messageListPreviousAndNextMessageStore: MessagePreviousAndNextMessageStore;
|
|
22
17
|
/**
|
|
23
18
|
* Theme to use for the message list item
|
|
24
19
|
*/
|
package/src/version.json
CHANGED