Repository navigation
fix(mobile): Duo feed scroll indicator stays left of the vertical bar while streaming - #36063
Conversation
… while streaming React Native rewrites all of a scroll view's indicator insets whenever its scrollIndicatorInsets prop changes. The keyboard-aware thread list animates that prop's bottom inset as a reply streams, so each update reset the right inset that the scroll-edge bleed view sets, and the indicator jumped under the bar until the bleed view's next layout pass. While bleeding, observe the indicator insets and put the right inset back immediately. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — Keeps the Duo scroll indicator clear of the vertical bar when streaming updates rewrite its insets. The change is limited to active scroll-edge presentation, with observations removed when that behavior ends. You can add or adjust custom eligibility rules. Learn more. |
|
No actionable comments were generated in the recent review. Walkthrough
Merge Risk:
|
|
🤖 Android preview
|
|
🚀 Expo continuous deployment is ready!
|
Problem
On an unfolded iPhone Duo, the thread feed's scroll indicator flickers during a streaming run. It jumps between its correct place, left of the vertical bar, and the screen edge under the bar.
T3ScrollEdgeBleedViewwidens the feed's scroll view under the bar and setsverticalScrollIndicatorInsets.rightso the indicator stays clear of it. Fabric'sRCTScrollViewComponentView(RN 0.88.1,updateProps) assigns the wholescrollIndicatorInsets(both axes,right= 0) whenever that prop changes. The bleed view only restored the inset on its ownlayoutSubviews, so for those frames the indicator sat under the bar.That prop changes far more often than
ThreadFeed's{ top, bottom: 0 }suggests.KeyboardAwareLegendListrenders react-native-keyboard-controller'sScrollViewWithBottomPadding, which sendsscrollIndicatorInsetsthrough ReanimatedanimatedPropswithbottom= keyboard + anchored end space. That end space shrinks as a streaming reply grows, so the prop changes over and over during a run. Header show/hide also changestop.Fix
While bleeding, the bleed view KVO-observes the scroll view's indicator insets and puts
rightback right away, in the same main-thread pass as React Native's write. Off the Duo, bleed is zero: no observation is installed and nothing is written, same as before. Observations are dropped when the bleed ends or the view detaches.Verification
vp run check:changed: format and typecheck pass. No Swift toolchain on the Linux dev box, so this PR's iOS dev-client build and SwiftLint in CI are the compile check.mobile-dev-clientworkflow onmacos-26, is built with the iOS 26.5 SDK. On the Duo that runs letterboxed in compatibility mode, and the bleed view's vertical-bar code (#if canImport(UIKit, _version: 9127.0.85)) is compiled out. Reproducing needs an iOS 27.1-SDK build, and no machine I could use had Xcode 27.1. Someone with that build should check it on a Duo before merging.Model and harness: Claude Opus 5.5 in Claude Code (T3 Code).
🤖 Generated with Claude Code