@@ -9,6 +9,7 @@ import { useChatContext } from '../../contexts/chatContext/ChatContext';
99import { useMessagesContext } from '../../contexts/messagesContext/MessagesContext' ;
1010
1111import { mergeThemes , ThemeProvider , useTheme } from '../../contexts/themeContext/ThemeContext' ;
12+ import { ThreadContextValue } from '../../contexts/threadContext/ThreadContext' ;
1213import { ChannelUnreadState , DefaultStreamChatGenerics } from '../../types/types' ;
1314
1415const shouldShowUnreadSeparator = <
@@ -36,108 +37,108 @@ const shouldShowUnreadSeparator = <
3637 return showUnreadSeparator ;
3738} ;
3839
39- export const MessageItem = React . memo (
40- < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics > ( {
41- index,
42- message,
43- goToMessage,
44- highlightedMessageId,
45- lastReceivedMessageId,
46- onThreadSelect,
47- shouldApplyAndroidWorkaround,
48- } : {
49- index : number ;
50- message : MessageType < StreamChatGenerics > ;
51- goToMessage : ( messageId : string ) => Promise < void > ;
52- highlightedMessageId ?: string ;
53- lastReceivedMessageId ?: string ;
54- onThreadSelect ?: ( message : MessageType < DefaultStreamChatGenerics > ) => void ;
55- shouldApplyAndroidWorkaround : boolean ;
56- } ) => {
57- const { client } = useChatContext ( ) ;
58- const clientUserId = client . user ?. id ;
59- const { theme } = useTheme ( ) ;
60- const {
61- messageList : { messageContainer } ,
62- screenPadding,
63- } = theme ;
64-
65- const { channelUnreadState, threadList } = useChannelContext ( ) ;
66- const {
67- Message,
68- MessageSystem,
69- myMessageTheme,
70- InlineDateSeparator,
71- InlineUnreadIndicator,
72- shouldShowUnreadUnderlay,
73- } = useMessagesContext ( ) ;
74-
75- const myMessageThemeString = useMemo ( ( ) => JSON . stringify ( myMessageTheme ) , [ myMessageTheme ] ) ;
76-
77- const modifiedTheme = useMemo (
78- ( ) => mergeThemes ( { style : myMessageTheme , theme } ) ,
79- // eslint-disable-next-line react-hooks/exhaustive-deps
80- [ myMessageThemeString , theme ] ,
81- ) ;
82-
83- const showUnreadUnderlay =
84- ! ! shouldShowUnreadUnderlay && shouldShowUnreadSeparator ( message , index , channelUnreadState ) ;
85-
86- const wrapMessageInTheme = clientUserId === message . user ?. id && ! ! myMessageTheme ;
87- const renderDateSeperator = isMessageWithStylesReadByAndDateSeparator ( message ) &&
88- message . dateSeparator && < InlineDateSeparator date = { message . dateSeparator } /> ;
89-
90- const renderMessage = (
91- < Message
92- goToMessage = { goToMessage }
93- groupStyles = { isMessageWithStylesReadByAndDateSeparator ( message ) ? message . groupStyles : [ ] }
94- isTargetedMessage = { highlightedMessageId === message . id }
95- lastReceivedId = {
96- lastReceivedMessageId === message . id || message . quoted_message_id
97- ? lastReceivedMessageId
98- : undefined
99- }
100- message = { message }
101- onThreadSelect = { onThreadSelect }
102- showUnreadUnderlay = { showUnreadUnderlay }
103- style = { [ messageContainer ] }
104- threadList = { threadList }
105- />
106- ) ;
107-
108- return (
109- < View
110- style = { [ shouldApplyAndroidWorkaround ? styles . invertAndroid : undefined ] }
111- testID = { `message-list-item-${ index } ` }
112- >
113- { message . type === 'system' ? (
114- < MessageSystem
115- message = { message }
116- style = { [ { paddingHorizontal : screenPadding } , messageContainer ] }
117- />
118- ) : wrapMessageInTheme ? (
119- < ThemeProvider mergedStyle = { modifiedTheme } >
120- < View testID = { `message-list-item-${ index } ` } >
121- { renderDateSeperator }
122- { renderMessage }
123- </ View >
124- </ ThemeProvider >
125- ) : (
40+ export const UnmemoizedMessageItem = <
41+ StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics ,
42+ > ( {
43+ index,
44+ message,
45+ goToMessage,
46+ highlightedMessageId,
47+ lastReceivedMessageId,
48+ onThreadSelect,
49+ shouldApplyAndroidWorkaround,
50+ } : {
51+ index : number ;
52+ message : MessageType < StreamChatGenerics > ;
53+ goToMessage : ( messageId : string ) => Promise < void > ;
54+ highlightedMessageId ?: string ;
55+ lastReceivedMessageId ?: string ;
56+ onThreadSelect ?: ( message : ThreadContextValue < StreamChatGenerics > [ 'thread' ] ) => void ;
57+ shouldApplyAndroidWorkaround : boolean ;
58+ } ) => {
59+ const { client } = useChatContext ( ) ;
60+ const clientUserId = client . user ?. id ;
61+ const { theme } = useTheme ( ) ;
62+ const {
63+ messageList : { messageContainer } ,
64+ screenPadding,
65+ } = theme ;
66+
67+ const { channelUnreadState, threadList } = useChannelContext ( ) ;
68+ const {
69+ Message,
70+ MessageSystem,
71+ myMessageTheme,
72+ InlineDateSeparator,
73+ InlineUnreadIndicator,
74+ shouldShowUnreadUnderlay,
75+ } = useMessagesContext < StreamChatGenerics > ( ) ;
76+
77+ const myMessageThemeString = useMemo ( ( ) => JSON . stringify ( myMessageTheme ) , [ myMessageTheme ] ) ;
78+
79+ const modifiedTheme = useMemo (
80+ ( ) => mergeThemes ( { style : myMessageTheme , theme } ) ,
81+ // eslint-disable-next-line react-hooks/exhaustive-deps
82+ [ myMessageThemeString , theme ] ,
83+ ) ;
84+
85+ const showUnreadUnderlay =
86+ ! ! shouldShowUnreadUnderlay && shouldShowUnreadSeparator ( message , index , channelUnreadState ) ;
87+
88+ const wrapMessageInTheme = clientUserId === message . user ?. id && ! ! myMessageTheme ;
89+ const renderDateSeperator = isMessageWithStylesReadByAndDateSeparator ( message ) &&
90+ message . dateSeparator && < InlineDateSeparator date = { message . dateSeparator } /> ;
91+
92+ const renderMessage = (
93+ < Message
94+ goToMessage = { goToMessage }
95+ groupStyles = { isMessageWithStylesReadByAndDateSeparator ( message ) ? message . groupStyles : [ ] }
96+ isTargetedMessage = { highlightedMessageId === message . id }
97+ lastReceivedId = {
98+ lastReceivedMessageId === message . id || message . quoted_message_id
99+ ? lastReceivedMessageId
100+ : undefined
101+ }
102+ message = { message }
103+ onThreadSelect = { onThreadSelect }
104+ showUnreadUnderlay = { showUnreadUnderlay }
105+ style = { [ messageContainer ] }
106+ threadList = { threadList }
107+ />
108+ ) ;
109+
110+ return (
111+ < View
112+ style = { [ shouldApplyAndroidWorkaround ? styles . invertAndroid : undefined ] }
113+ testID = { `message-list-item-${ index } ` }
114+ >
115+ { message . type === 'system' ? (
116+ < MessageSystem
117+ message = { message }
118+ style = { [ { paddingHorizontal : screenPadding } , messageContainer ] }
119+ />
120+ ) : wrapMessageInTheme ? (
121+ < ThemeProvider mergedStyle = { modifiedTheme } >
126122 < View testID = { `message-list-item-${ index } ` } >
127123 { renderDateSeperator }
128124 { renderMessage }
129125 </ View >
130- ) }
131- { showUnreadUnderlay && < InlineUnreadIndicator /> }
132- </ View >
133- ) ;
134- } ,
135- ) ;
126+ </ ThemeProvider >
127+ ) : (
128+ < View testID = { `message-list-item-${ index } ` } >
129+ { renderDateSeperator }
130+ { renderMessage }
131+ </ View >
132+ ) }
133+ { showUnreadUnderlay && < InlineUnreadIndicator /> }
134+ </ View >
135+ ) ;
136+ } ;
136137
137138const styles = StyleSheet . create ( {
138139 invertAndroid : {
139140 transform : [ { scaleX : - 1 } , { scaleY : - 1 } ] ,
140141 } ,
141142} ) ;
142143
143- MessageItem . displayName = 'MessageItem' ;
144+ export const MessageItem = React . memo ( UnmemoizedMessageItem ) as typeof UnmemoizedMessageItem ;
0 commit comments