@@ -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' ;
3337import {
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+
254263const 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