@@ -36,106 +36,108 @@ const shouldShowUnreadSeparator = <
3636 return showUnreadSeparator ;
3737} ;
3838
39- export const MessageItem = <
40- StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics ,
41- > ( {
42- index,
43- message,
44- goToMessage,
45- highlightedMessageId,
46- lastReceivedMessageId,
47- onThreadSelect,
48- shouldApplyAndroidWorkaround,
49- } : {
50- index : number ;
51- message : MessageType < StreamChatGenerics > ;
52- goToMessage : ( messageId : string ) => Promise < void > ;
53- highlightedMessageId ?: string ;
54- lastReceivedMessageId ?: string ;
55- onThreadSelect ?: ( message : MessageType < DefaultStreamChatGenerics > ) => void ;
56- shouldApplyAndroidWorkaround : boolean ;
57- } ) => {
58- const { client } = useChatContext ( ) ;
59- const clientUserId = client . user ?. id ;
60- const { theme } = useTheme ( ) ;
61- const {
62- messageList : { messageContainer } ,
63- screenPadding,
64- } = theme ;
65-
66- const { channelUnreadState, threadList } = useChannelContext ( ) ;
67- const {
68- Message,
69- MessageSystem,
70- myMessageTheme,
71- InlineDateSeparator,
72- InlineUnreadIndicator,
73- shouldShowUnreadUnderlay,
74- } = useMessagesContext ( ) ;
75-
76- const myMessageThemeString = useMemo ( ( ) => JSON . stringify ( myMessageTheme ) , [ myMessageTheme ] ) ;
77-
78- const modifiedTheme = useMemo (
79- ( ) => mergeThemes ( { style : myMessageTheme , theme } ) ,
80- // eslint-disable-next-line react-hooks/exhaustive-deps
81- [ myMessageThemeString , theme ] ,
82- ) ;
83-
84- const showUnreadUnderlay =
85- ! ! shouldShowUnreadUnderlay && shouldShowUnreadSeparator ( message , index , channelUnreadState ) ;
86-
87- const wrapMessageInTheme = clientUserId === message . user ?. id && ! ! myMessageTheme ;
88- const renderDateSeperator = isMessageWithStylesReadByAndDateSeparator ( message ) &&
89- message . dateSeparator && < InlineDateSeparator date = { message . dateSeparator } /> ;
90-
91- const renderMessage = (
92- < Message
93- goToMessage = { goToMessage }
94- groupStyles = { isMessageWithStylesReadByAndDateSeparator ( message ) ? message . groupStyles : [ ] }
95- isTargetedMessage = { highlightedMessageId === message . id }
96- lastReceivedId = {
97- lastReceivedMessageId === message . id || message . quoted_message_id
98- ? lastReceivedMessageId
99- : undefined
100- }
101- message = { message }
102- onThreadSelect = { onThreadSelect }
103- showUnreadUnderlay = { showUnreadUnderlay }
104- style = { [ messageContainer ] }
105- threadList = { threadList }
106- />
107- ) ;
108-
109- return (
110- < View
111- style = { [ shouldApplyAndroidWorkaround ? styles . invertAndroid : undefined ] }
112- testID = { `message-list-item-${ index } ` }
113- >
114- { message . type === 'system' ? (
115- < MessageSystem
116- message = { message }
117- style = { [ { paddingHorizontal : screenPadding } , messageContainer ] }
118- />
119- ) : wrapMessageInTheme ? (
120- < ThemeProvider mergedStyle = { modifiedTheme } >
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+ ) : (
121126 < View testID = { `message-list-item-${ index } ` } >
122127 { renderDateSeperator }
123128 { renderMessage }
124129 </ View >
125- </ ThemeProvider >
126- ) : (
127- < View testID = { `message-list-item-${ index } ` } >
128- { renderDateSeperator }
129- { renderMessage }
130- </ View >
131- ) }
132- { showUnreadUnderlay && < InlineUnreadIndicator /> }
133- </ View >
134- ) ;
135- } ;
130+ ) }
131+ { showUnreadUnderlay && < InlineUnreadIndicator /> }
132+ </ View >
133+ ) ;
134+ } ,
135+ ) ;
136136
137137const styles = StyleSheet . create ( {
138138 invertAndroid : {
139139 transform : [ { scaleX : - 1 } , { scaleY : - 1 } ] ,
140140 } ,
141141} ) ;
142+
143+ MessageItem . displayName = 'MessageItem' ;
0 commit comments