Skip to content

Commit 16df6f2

Browse files
authored
Merge pull request #4 from 0x3EF8/bolt/optimize-chat-filtering-14681113663465310253
⚡ Bolt: Memoize message filtering in Chat component
2 parents 7de6df8 + 6623298 commit 16df6f2

2 files changed

Lines changed: 13 additions & 3 deletions

File tree

.jules/bolt.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
## 2024-04-07 - Filtering Performance Optimization in Chat Component
2+
**Learning:** Extracting inline array filtering (O(N) operations) out of the return statement into a `useMemo` hook reduces UI lag during text entry by preventing re-computation on unrelated state changes (like typing). Early returning the unmodified array when no filter is applied allows child components to bail out of re-rendering.
3+
**Action:** Always scan for unmemoized O(N) array transformations inside JSX props, especially when the parent component has rapidly changing states like text inputs.

app/components/Chat.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,15 @@ export default function Chat({ user }: { user: User }) {
334334
.reverse();
335335
}, [messages]);
336336

337+
// Performance optimization: Memoize the filtered messages to avoid O(N) string manipulation on every keystroke
338+
// when typing a message (which triggers a re-render of Chat.tsx). This significantly improves typing latency
339+
// in conversations with many messages.
340+
const filteredMessages = useMemo(() => {
341+
if (!messageSearch) return messages;
342+
const lowerSearch = messageSearch.toLowerCase();
343+
return messages.filter((m) => (m.text || "").toLowerCase().includes(lowerSearch));
344+
}, [messages, messageSearch]);
345+
337346
return (
338347
<>
339348
<MediaViewerModal
@@ -489,9 +498,7 @@ export default function Chat({ user }: { user: User }) {
489498

490499
<div className="flex-1 flex flex-col overflow-hidden z-10 min-h-0">
491500
<Messages
492-
messages={messages.filter((m) =>
493-
(m.text || "").toLowerCase().includes(messageSearch.toLowerCase())
494-
)}
501+
messages={filteredMessages}
495502
user={user}
496503
conversations={conversations}
497504
bottomRef={bottomRef}

0 commit comments

Comments
 (0)