From 66dc17ee08568f31af2a5a83586e9aa933b5dbd4 Mon Sep 17 00:00:00 2001 From: none23 Date: Wed, 9 Sep 2026 10:31:11 +0400 Subject: [PATCH] fix(mobile): prevent overlapping Android thread rows --- apps/mobile/src/features/threads/ThreadFeed.tsx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/apps/mobile/src/features/threads/ThreadFeed.tsx b/apps/mobile/src/features/threads/ThreadFeed.tsx index c4f8eea9275a..ac28cd7cbd73 100644 --- a/apps/mobile/src/features/threads/ThreadFeed.tsx +++ b/apps/mobile/src/features/threads/ThreadFeed.tsx @@ -2866,13 +2866,16 @@ export const ThreadFeed = memo(function ThreadFeed(props: ThreadFeedProps) { entry.type === "message" ? `message:${entry.message.role}` : entry.type } getFixedItemSize={getFixedItemSize} - // LegendList swaps its position and size component types when this - // becomes undefined, remounting the feed and replaying row entrances. - // Keep those containers mounted while ordinary updates stay immediate. + // Android's animated list containers can retain overlapping row positions + // after thread switches or app resumes, even with a zero-duration transition. + // Keep Android on native layout. On iOS, keep animated containers mounted + // between disclosure toggles so rows do not remount and replay entrances. itemLayoutAnimation={ - disclosureToggleSettling - ? THREAD_FEED_LAYOUT_TRANSITION - : THREAD_FEED_IMMEDIATE_TRANSITION + Platform.OS === "android" + ? undefined + : disclosureToggleSettling + ? THREAD_FEED_LAYOUT_TRANSITION + : THREAD_FEED_IMMEDIATE_TRANSITION } onItemSizeChanged={handleItemSizeChanged} // Measure rows well before they scroll into view so estimate→actual