Skip to content

Commit ee1aac8

Browse files
committed
fix: move renderItem in the MessageList outside of the main component
1 parent d9cebfa commit ee1aac8

File tree

1 file changed

+95
-93
lines changed

1 file changed

+95
-93
lines changed

package/src/components/MessageList/MessageItem.tsx

Lines changed: 95 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -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

137137
const styles = StyleSheet.create({
138138
invertAndroid: {
139139
transform: [{ scaleX: -1 }, { scaleY: -1 }],
140140
},
141141
});
142+
143+
MessageItem.displayName = 'MessageItem';

0 commit comments

Comments
 (0)