authorgravatar for 76637177+SunkenInTime@users.noreply.github.comDara Adedeji <76637177+SunkenInTime@users.noreply.github.com> 2026-09-09 17:34:39-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-09-09 14:34:39-07:00
log75e4ceb96489a2fe92c710c79dbea59778cccfd1
tree8454c5f41a90c84a608ff999ffad2e63b8ffa77e
parent50f918c57a2df85bd97612b958386aaca035dcab
signature Signed by PGP key B5690EEEBB952194

fix(mobile): prevent Android chat rows overlapping during sync (#10983)


1 files changed, 9 insertions(+), 6 deletions(-)

apps/mobile/src/features/threads/ThreadFeed.tsx+9-6
......@@ -2866,13 +2866,16 @@ export const ThreadFeed = memo(function ThreadFeed(props: ThreadFeedProps) {
28662866 entry.type === "message" ? `message:${entry.message.role}` : entry.type
28672867 }
28682868 getFixedItemSize={getFixedItemSize}
2869 // LegendList swaps its position and size component types when this
2870 // becomes undefined, remounting the feed and replaying row entrances.
2871 // Keep those containers mounted while ordinary updates stay immediate.
2869 // Android can retain stale native row positions when layout transitions
2870 // race the measurements arriving during sync, even with duration 0.
2871 // Keep its rows on LegendList's non-animated positioning path. On iOS,
2872 // keep a transition installed between disclosures so containers don't remount.
28722873 itemLayoutAnimation={
2873 disclosureToggleSettling
2874 ? THREAD_FEED_LAYOUT_TRANSITION
2875 : THREAD_FEED_IMMEDIATE_TRANSITION
2874 Platform.OS === "android"
2875 ? undefined
2876 : disclosureToggleSettling
2877 ? THREAD_FEED_LAYOUT_TRANSITION
2878 : THREAD_FEED_IMMEDIATE_TRANSITION
28762879 }
28772880 onItemSizeChanged={handleItemSizeChanged}
28782881 // Measure rows well before they scroll into view so estimate→actual