authorgravatar for 134711311+Exotic209093@users.noreply.github.comJames C <134711311+Exotic209093@users.noreply.github.com> 2026-09-17 19:12:48+01:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-09-17 18:12:48+00:00
log8db3c250f41e8f1d0b36da6b5a5093821e72d4f3
tree856c0b5f2c3aa7f5639858082c8b346275642277
parentc25c3e0ee678ef62245cb5eef20eeafb9a86d9d9
signature Signed by PGP key B5690EEEBB952194

fix(mobile): prevent overlapping text and UI on Android chat messages (#11611)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

1 files changed, 7 insertions(+), 2 deletions(-)

apps/mobile/src/features/threads/ThreadFeed.tsx+7-2
...@@ -627,6 +627,7 @@ const markdownLinkStyles = StyleSheet.create({...@@ -627,6 +627,7 @@ const markdownLinkStyles = StyleSheet.create({
627 height: 14,627 height: 14,
628 marginHorizontal: 3,628 marginHorizontal: 3,
629 transform: [{ translateY: 2 }],629 transform: [{ translateY: 2 }],
630 flexShrink: 0,
630 },631 },
631 favicon: {632 favicon: {
632 borderRadius: 3,633 borderRadius: 3,
...@@ -1155,7 +1156,7 @@ function useMarkdownStyles(...@@ -1155,7 +1156,7 @@ function useMarkdownStyles(
1155 >1156 >
1156 {ordered ? `${start + index}.` : "•"}1157 {ordered ? `${start + index}.` : "•"}
1157 </NativeText>1158 </NativeText>
1158 <View className="min-w-0 flex-1">1159 <View className="min-w-0 flex-1 shrink overflow-hidden">
1159 <Renderer node={child} depth={1} inListItem parentIsText={false} />1160 <Renderer node={child} depth={1} inListItem parentIsText={false} />
1160 </View>1161 </View>
1161 </View>1162 </View>
...@@ -1684,10 +1685,14 @@ function renderFeedEntry(...@@ -1684,10 +1685,14 @@ function renderFeedEntry(
1684 return null;1685 return null;
1685 }1686 }
16861687
1688 // Assistant messages hit the same Android unclamped-pass bug as user
1689 // bubbles: wide markdown blocks cause children to be positioned at
1690 // intrinsic width before the container is clamped, overlapping the
1691 // timestamp/copy button row. Pinning the width removes that pass.
1687 const enterAnimated = isFreshTimestamp(message.createdAt);1692 const enterAnimated = isFreshTimestamp(message.createdAt);
1688 return (1693 return (
1689 <Animated.View1694 <Animated.View
1690 className={cn(showAssistantMeta ? "mb-5 px-1" : "mb-1 px-1")}1695 className={cn(showAssistantMeta ? "mb-5 px-1" : "mb-1 px-1", hasWideBlock && "w-full")}
1691 {...(enterAnimated ? { entering: FadeIn.duration(220) } : {})}1696 {...(enterAnimated ? { entering: FadeIn.duration(220) } : {})}
1692 >1697 >
1693 {renderedText.trim().length > 0 ? (1698 {renderedText.trim().length > 0 ? (