Skip to content

Commit cb46db8

Browse files
committed
fix: use anyChanged flag to preserve array referential identity in useStableRows
The anyChanged variable was assigned but never read, causing a new array reference to always be returned from useMemo even when all rows were structurally identical. This partially defeated the purpose of the structural sharing hook for LegendList's data prop. Now we track the previous result and return it when no rows changed, preserving referential identity and avoiding unnecessary list reconciliation.
1 parent 97ca347 commit cb46db8

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

apps/web/src/components/chat/MessagesTimeline.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -785,11 +785,12 @@ const UserMessageBody = memo(function UserMessageBody(props: {
785785
* hasn't changed since last call, the previous object reference is reused. */
786786
function useStableRows(rows: MessagesTimelineRow[]): MessagesTimelineRow[] {
787787
const prevById = useRef(new Map<string, MessagesTimelineRow>());
788+
const prevResult = useRef<MessagesTimelineRow[]>([]);
788789

789790
return useMemo(() => {
790791
const prev = prevById.current;
791792
const next = new Map<string, MessagesTimelineRow>();
792-
let anyChanged = false;
793+
let anyChanged = rows.length !== prev.size;
793794

794795
const result = rows.map((row) => {
795796
const prevRow = prev.get(row.id);
@@ -803,6 +804,9 @@ function useStableRows(rows: MessagesTimelineRow[]): MessagesTimelineRow[] {
803804
});
804805

805806
prevById.current = next;
807+
808+
if (!anyChanged) return prevResult.current;
809+
prevResult.current = result;
806810
return result;
807811
}, [rows]);
808812
}

0 commit comments

Comments
 (0)