Skip to content

Commit 1e17452

Browse files
committed
perf: optimize message list creation
1 parent 45e9b4b commit 1e17452

File tree

1 file changed

+42
-20
lines changed

1 file changed

+42
-20
lines changed

package/src/components/MessageList/hooks/useMessageList.ts

Lines changed: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,29 @@ export const isMessageWithStylesReadByAndDateSeparator = <
4646
): message is MessagesWithStylesReadByAndDateSeparator<StreamChatGenerics> =>
4747
(message as MessagesWithStylesReadByAndDateSeparator<StreamChatGenerics>).readBy !== undefined;
4848

49+
export const shouldIncludeMessageInList = <
50+
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
51+
>(
52+
message: MessageType<StreamChatGenerics>,
53+
options: { deletedMessagesVisibilityType?: DeletedMessagesVisibilityType; userId?: string },
54+
) => {
55+
const { deletedMessagesVisibilityType, userId } = options;
56+
const isMessageTypeDeleted = message.type === 'deleted';
57+
switch (deletedMessagesVisibilityType) {
58+
case 'sender':
59+
return !isMessageTypeDeleted || message.user?.id === userId;
60+
61+
case 'receiver':
62+
return !isMessageTypeDeleted || message.user?.id !== userId;
63+
64+
case 'never':
65+
return !isMessageTypeDeleted;
66+
67+
default:
68+
return !!message;
69+
}
70+
};
71+
4972
export const useMessageList = <
5073
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
5174
>(
@@ -87,26 +110,25 @@ export const useMessageList = <
87110
noGroupByUser,
88111
userId: client.userID,
89112
});
90-
return messageList
91-
.filter((msg) => {
92-
const isMessageTypeDeleted = msg.type === 'deleted';
93-
if (deletedMessagesVisibilityType === 'sender') {
94-
return !isMessageTypeDeleted || msg.user?.id === client.userID;
95-
} else if (deletedMessagesVisibilityType === 'receiver') {
96-
return !isMessageTypeDeleted || msg.user?.id !== client.userID;
97-
} else if (deletedMessagesVisibilityType === 'never') {
98-
return !isMessageTypeDeleted;
99-
} else {
100-
return msg;
101-
}
102-
})
103-
.map((msg) => ({
104-
...msg,
105-
dateSeparator: dateSeparators[msg.id] || undefined,
106-
groupStyles: messageGroupStyles[msg.id] || ['single'],
107-
readBy: msg.id ? readData[msg.id] || false : false,
108-
}))
109-
.reverse() as MessageType<StreamChatGenerics>[];
113+
114+
const newMessageList = [];
115+
for (const message of messageList) {
116+
if (
117+
shouldIncludeMessageInList(message, {
118+
deletedMessagesVisibilityType,
119+
userId: client.userID,
120+
})
121+
) {
122+
const messageId = message.id;
123+
newMessageList.unshift({
124+
...message,
125+
dateSeparator: dateSeparators[messageId] || undefined,
126+
groupStyles: messageGroupStyles[messageId] || ['single'],
127+
readBy: messageId ? readData[messageId] || false : false,
128+
});
129+
}
130+
}
131+
return newMessageList;
110132
}, [
111133
client.userID,
112134
deletedMessagesVisibilityType,

0 commit comments

Comments
 (0)