From 9cbd7b88c71fde7ab7e6bc4a8c41562fad30c4d0 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Thu, 1 Jul 2021 18:41:08 -0500 Subject: [PATCH] Chats: memoize ChatMessageList messages for performance --- .../chats/components/chat_message_list.js | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/app/soapbox/features/chats/components/chat_message_list.js b/app/soapbox/features/chats/components/chat_message_list.js index b51915ae6..426075504 100644 --- a/app/soapbox/features/chats/components/chat_message_list.js +++ b/app/soapbox/features/chats/components/chat_message_list.js @@ -14,6 +14,7 @@ import { MediaGallery } from 'soapbox/features/ui/util/async-components'; import Bundle from 'soapbox/features/ui/components/bundle'; import DropdownMenuContainer from 'soapbox/containers/dropdown_menu_container'; import { initReportById } from 'soapbox/actions/reports'; +import { createSelector } from 'reselect'; const messages = defineMessages({ today: { id: 'chats.dividers.today', defaultMessage: 'Today' }, @@ -38,15 +39,34 @@ const makeEmojiMap = record => record.get('emojis', ImmutableList()).reduce((map return map.set(`:${emoji.get('shortcode')}:`, emoji); }, ImmutableMap()); -const mapStateToProps = (state, { chatMessageIds }) => ({ - me: state.get('me'), - chatMessages: chatMessageIds.reduce((acc, curr) => { - const chatMessage = state.getIn(['chat_messages', curr]); - return chatMessage ? acc.push(chatMessage) : acc; - }, ImmutableList()), -}); +const makeGetChatMessages = () => { + return createSelector( + [(chatMessages, chatMessageIds) => ( + chatMessageIds.reduce((acc, curr) => { + const chatMessage = chatMessages.get(curr); + return chatMessage ? acc.push(chatMessage) : acc; + }, ImmutableList()) + )], + chatMessages => chatMessages, + ); +}; -export default @connect(mapStateToProps) +const makeMapStateToProps = () => { + const getChatMessages = makeGetChatMessages(); + + const mapStateToProps = (state, { chatMessageIds }) => { + const chatMessages = state.get('chat_messages'); + + return { + me: state.get('me'), + chatMessages: getChatMessages(chatMessages, chatMessageIds), + }; + }; + + return mapStateToProps; +}; + +export default @connect(makeMapStateToProps) @injectIntl class ChatMessageList extends ImmutablePureComponent {