Skip to content

Commit 70ed772

Browse files
committed
fix: date separator and group styles extraction to store
1 parent 2300afc commit 70ed772

File tree

15 files changed

+623
-278
lines changed

15 files changed

+623
-278
lines changed

package/src/components/Channel/Channel.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ export type ChannelPropsWithContext = Pick<ChannelContextValue, 'channel'> &
325325
| 'forceAlignMessages'
326326
| 'Gallery'
327327
| 'getMessagesGroupStyles'
328+
| 'getMessageGroupStyle'
328329
| 'Giphy'
329330
| 'giphyVersion'
330331
| 'handleBan'
@@ -614,6 +615,7 @@ const ChannelWithContext = (props: PropsWithChildren<ChannelPropsWithContext>) =
614615
forceAlignMessages,
615616
Gallery = GalleryDefault,
616617
getMessagesGroupStyles,
618+
getMessageGroupStyle,
617619
Giphy = GiphyDefault,
618620
giphyVersion = 'fixed_height',
619621
handleAttachButtonPress,
@@ -1912,6 +1914,7 @@ const ChannelWithContext = (props: PropsWithChildren<ChannelPropsWithContext>) =
19121914
FlatList,
19131915
forceAlignMessages,
19141916
Gallery,
1917+
getMessageGroupStyle,
19151918
getMessagesGroupStyles,
19161919
Giphy,
19171920
giphyVersion,

package/src/components/Channel/hooks/useCreateMessagesContext.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export const useCreateMessagesContext = ({
2727
FlatList,
2828
forceAlignMessages,
2929
Gallery,
30+
getMessageGroupStyle,
3031
getMessagesGroupStyles,
3132
Giphy,
3233
giphyVersion,
@@ -145,6 +146,7 @@ export const useCreateMessagesContext = ({
145146
FlatList,
146147
forceAlignMessages,
147148
Gallery,
149+
getMessageGroupStyle,
148150
getMessagesGroupStyles,
149151
Giphy,
150152
giphyVersion,

package/src/components/Message/MessageSimple/MessageWrapper.tsx

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ import { View } from 'react-native';
44

55
import { LocalMessage } from 'stream-chat';
66

7-
import { MessageListProps } from '../../../components/MessageList/MessageList';
7+
import { useMessageDateSeparator } from '../../../components/MessageList/hooks/useMessageDateSeparator';
8+
import { useMessageGroupStyles } from '../../../components/MessageList/hooks/useMessageGroupStyles';
89
import { useChannelContext } from '../../../contexts/channelContext/ChannelContext';
910
import { useChatContext } from '../../../contexts/chatContext/ChatContext';
10-
import { MessageContextValue } from '../../../contexts/messageContext/MessageContext';
11+
import { useMessageListItemContext } from '../../../contexts/messageListItemContext/MessageListItemContext';
1112
import { useMessagesContext } from '../../../contexts/messagesContext/MessagesContext';
1213
import { ThemeProvider, useTheme } from '../../../contexts/themeContext/ThemeContext';
1314

14-
import { Theme } from '../../../contexts/themeContext/utils/theme';
1515
import { useStateStore } from '../../../hooks/useStateStore';
1616
import { ChannelUnreadStateStoreType } from '../../../state-store/channel-unread-state';
1717

@@ -22,36 +22,53 @@ const channelUnreadStateSelector = (state: ChannelUnreadStateStoreType) => ({
2222
unread_messages: state.channelUnreadState?.unread_messages,
2323
});
2424

25-
export type MessageWrapperProps = Pick<MessageContextValue, 'goToMessage'> &
26-
Pick<MessageListProps, 'onThreadSelect'> & {
27-
isNewestMessage?: boolean;
28-
message: LocalMessage;
29-
modifiedTheme?: Theme;
30-
dateSeparatorDate?: Date;
31-
messageGroupStyles?: string[];
32-
};
25+
export type MessageWrapperProps = {
26+
isNewestMessage?: boolean;
27+
message: LocalMessage;
28+
};
3329

3430
export const MessageWrapper = (props: MessageWrapperProps) => {
35-
const {
36-
dateSeparatorDate,
37-
isNewestMessage,
38-
message,
39-
messageGroupStyles,
40-
goToMessage,
41-
onThreadSelect,
42-
modifiedTheme,
43-
} = props;
31+
const { isNewestMessage, message } = props;
4432
const { client } = useChatContext();
45-
const { channelUnreadStateStore, channel, highlightedMessageId, threadList } =
46-
useChannelContext();
4733
const {
34+
channelUnreadStateStore,
35+
channel,
36+
hideDateSeparators,
37+
highlightedMessageId,
38+
maxTimeBetweenGroupedMessages,
39+
threadList,
40+
} = useChannelContext();
41+
const {
42+
getMessageGroupStyle,
4843
InlineDateSeparator,
4944
InlineUnreadIndicator,
5045
Message,
5146
MessageSystem,
5247
myMessageTheme,
5348
shouldShowUnreadUnderlay,
5449
} = useMessagesContext();
50+
const {
51+
goToMessage,
52+
onThreadSelect,
53+
noGroupByUser,
54+
modifiedTheme,
55+
messageListPreviousAndNextMessageStore,
56+
} = useMessageListItemContext();
57+
58+
const dateSeparatorDate = useMessageDateSeparator({
59+
hideDateSeparators,
60+
message,
61+
messageListPreviousAndNextMessageStore,
62+
});
63+
64+
const groupStyles = useMessageGroupStyles({
65+
dateSeparatorDate,
66+
getMessageGroupStyle,
67+
maxTimeBetweenGroupedMessages,
68+
message,
69+
messageListPreviousAndNextMessageStore,
70+
noGroupByUser,
71+
});
5572

5673
const { first_unread_message_id, last_read, last_read_message_id, unread_messages } =
5774
useStateStore(channelUnreadStateStore.state, channelUnreadStateSelector);
@@ -87,7 +104,7 @@ export const MessageWrapper = (props: MessageWrapperProps) => {
87104
const renderMessage = (
88105
<Message
89106
goToMessage={goToMessage}
90-
groupStyles={messageGroupStyles ?? []}
107+
groupStyles={groupStyles}
91108
isTargetedMessage={highlightedMessageId === message.id}
92109
message={message}
93110
onThreadSelect={onThreadSelect}

package/src/components/MessageList/MessageFlashList.tsx

Lines changed: 55 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ import {
3030
ImageGalleryContextValue,
3131
useImageGalleryContext,
3232
} from '../../contexts/imageGalleryContext/ImageGalleryContext';
33+
import {
34+
MessageListItemContextValue,
35+
MessageListItemProvider,
36+
} from '../../contexts/messageListItemContext/MessageListItemContext';
3337
import {
3438
MessagesContextValue,
3539
useMessagesContext,
@@ -251,6 +255,11 @@ const getItemTypeInternal = (message: LocalMessage) => {
251255
return 'generic-message';
252256
};
253257

258+
const renderItem = ({ index, item: message }: { index: number; item: LocalMessage }) => {
259+
const isNewestMessage = index === 0;
260+
return <MessageWrapper isNewestMessage={isNewestMessage} message={message} />;
261+
};
262+
254263
const channelUnreadStateSelector = (state: ChannelUnreadStateStoreType) => ({
255264
first_unread_message_id: state.channelUnreadState?.first_unread_message_id,
256265
last_read: state.channelUnreadState?.last_read,
@@ -355,8 +364,7 @@ const MessageFlashListWithContext = (props: MessageFlashListPropsWithContext) =>
355364
);
356365

357366
const {
358-
dateSeparatorsRef,
359-
messageGroupStylesRef,
367+
messageListPreviousAndNextMessageStore,
360368
processedMessageList,
361369
rawMessageList,
362370
viewabilityChangedCallback,
@@ -715,25 +723,21 @@ const MessageFlashListWithContext = (props: MessageFlashListPropsWithContext) =>
715723
[],
716724
);
717725

718-
const renderItem = useCallback(
719-
({ index, item: message }: { index: number; item: LocalMessage }) => {
720-
const dateSeparatorDate = dateSeparatorsRef.current[message.id];
721-
const messageGroupStyles = messageGroupStylesRef.current[message.id] ?? [];
722-
const isNewestMessage = index === 0;
723-
724-
return (
725-
<MessageWrapper
726-
dateSeparatorDate={dateSeparatorDate}
727-
goToMessage={goToMessage}
728-
isNewestMessage={isNewestMessage}
729-
message={message}
730-
messageGroupStyles={messageGroupStyles}
731-
modifiedTheme={modifiedTheme}
732-
onThreadSelect={onThreadSelect}
733-
/>
734-
);
735-
},
736-
[dateSeparatorsRef, goToMessage, messageGroupStylesRef, modifiedTheme, onThreadSelect],
726+
const messageListItemContextValue: MessageListItemContextValue = useMemo(
727+
() => ({
728+
goToMessage,
729+
messageListPreviousAndNextMessageStore,
730+
modifiedTheme,
731+
noGroupByUser,
732+
onThreadSelect,
733+
}),
734+
[
735+
goToMessage,
736+
messageListPreviousAndNextMessageStore,
737+
modifiedTheme,
738+
noGroupByUser,
739+
onThreadSelect,
740+
],
737741
);
738742

739743
const messagesWithImages =
@@ -1063,34 +1067,36 @@ const MessageFlashListWithContext = (props: MessageFlashListPropsWithContext) =>
10631067
{EmptyStateIndicator ? <EmptyStateIndicator listType='message' /> : null}
10641068
</View>
10651069
) : (
1066-
<FlashList
1067-
contentContainerStyle={flatListContentContainerStyle}
1068-
data={processedMessageList}
1069-
drawDistance={800}
1070-
getItemType={getItemTypeInternal}
1071-
initialScrollIndex={
1072-
indexToScrollToRef.current === -1 ? undefined : indexToScrollToRef.current
1073-
}
1074-
keyboardShouldPersistTaps='handled'
1075-
keyExtractor={keyExtractor}
1076-
ListFooterComponent={FooterComponent}
1077-
ListHeaderComponent={HeaderComponent}
1078-
maintainVisibleContentPosition={maintainVisibleContentPosition}
1079-
onMomentumScrollEnd={onUserScrollEvent}
1080-
onScroll={handleScroll}
1081-
onScrollBeginDrag={onScrollBeginDrag}
1082-
onScrollEndDrag={onScrollEndDrag}
1083-
onTouchEnd={dismissImagePicker}
1084-
onViewableItemsChanged={stableOnViewableItemsChanged}
1085-
ref={refCallback}
1086-
renderItem={renderItem}
1087-
scrollEventThrottle={isLiveStreaming ? 16 : undefined}
1088-
showsVerticalScrollIndicator={false}
1089-
style={flatListStyle}
1090-
testID='message-flash-list'
1091-
viewabilityConfig={flatListViewabilityConfig}
1092-
{...additionalFlashListPropsExcludingStyle}
1093-
/>
1070+
<MessageListItemProvider value={messageListItemContextValue}>
1071+
<FlashList
1072+
contentContainerStyle={flatListContentContainerStyle}
1073+
data={processedMessageList}
1074+
drawDistance={800}
1075+
getItemType={getItemTypeInternal}
1076+
initialScrollIndex={
1077+
indexToScrollToRef.current === -1 ? undefined : indexToScrollToRef.current
1078+
}
1079+
keyboardShouldPersistTaps='handled'
1080+
keyExtractor={keyExtractor}
1081+
ListFooterComponent={FooterComponent}
1082+
ListHeaderComponent={HeaderComponent}
1083+
maintainVisibleContentPosition={maintainVisibleContentPosition}
1084+
onMomentumScrollEnd={onUserScrollEvent}
1085+
onScroll={handleScroll}
1086+
onScrollBeginDrag={onScrollBeginDrag}
1087+
onScrollEndDrag={onScrollEndDrag}
1088+
onTouchEnd={dismissImagePicker}
1089+
onViewableItemsChanged={stableOnViewableItemsChanged}
1090+
ref={refCallback}
1091+
renderItem={renderItem}
1092+
scrollEventThrottle={isLiveStreaming ? 16 : undefined}
1093+
showsVerticalScrollIndicator={false}
1094+
style={flatListStyle}
1095+
testID='message-flash-list'
1096+
viewabilityConfig={flatListViewabilityConfig}
1097+
{...additionalFlashListPropsExcludingStyle}
1098+
/>
1099+
</MessageListItemProvider>
10941100
)}
10951101
<View style={styles.stickyHeader}>
10961102
{messageListLengthAfterUpdate && StickyHeader ? (

0 commit comments

Comments
 (0)