-
Notifications
You must be signed in to change notification settings - Fork 1
β‘ Bolt: Memoize conversations sorting in sidebar #477
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| ## 2026-04-24 - Memoizing expensive list sorting in React | ||
| **Learning:** Parsing Dates inside a sort function during every render cycle scales poorly as list size grows (O(n log n) operations where n is the number of conversations). | ||
| **Action:** Always wrap list sorting operations, especially those involving Date parsing or string conversions, in a `useMemo` hook to prevent redundant calculations on unaffected state updates. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -2,7 +2,7 @@ | |
| * Conversations sidebar component β left sidebar with conversation list. | ||
| */ | ||
|
|
||
| import { useEffect, useRef, useState } from "react"; | ||
| import { useEffect, useMemo, useRef, useState } from "react"; | ||
| import { useApp } from "../AppContext"; | ||
|
|
||
| interface ConversationsSidebarProps { | ||
|
|
@@ -54,11 +54,14 @@ export function ConversationsSidebar({ | |
| } | ||
| }, [editingId]); | ||
|
|
||
| const sortedConversations = [...conversations].sort((a, b) => { | ||
| const aTime = new Date(a.updatedAt).getTime(); | ||
| const bTime = new Date(b.updatedAt).getTime(); | ||
| return bTime - aTime; | ||
| }); | ||
| // β‘ Bolt: Memoize the sorting of conversations to avoid O(n log n) work and Date parsing on every render | ||
| const sortedConversations = useMemo(() => { | ||
| return [...conversations].sort((a, b) => { | ||
| const aTime = new Date(a.updatedAt).getTime(); | ||
| const bTime = new Date(b.updatedAt).getTime(); | ||
| return bTime - aTime; | ||
| }); | ||
| }, [conversations]); | ||
|
Comment on lines
+58
to
+64
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Potential Stale MemoizationThe Recommended Solution: |
||
|
|
||
| const handleDoubleClick = (conv: { id: string; title: string }) => { | ||
| setEditingId(conv.id); | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While memoizing the sort is a significant improvement, the sorting logic itself can be further optimized. Since
updatedAtis an ISO 8601 string, you can compare the strings directly usinglocaleCompareinstead of parsing them intoDateobjects on every comparison. This avoids the overhead of object instantiation and parsing inside the O(n log n) sort operation.