fix(mobile): let sheet lists scroll before dismissal#17177
Problem
In a compact Android Git sheet with a scrolled list, dragging down moves the sheet immediately instead of scrolling toward the top. One uninterrupted drag should scroll the list to its top, then pull the sheet down.
Change
Enable native nested scrolling on root lists in native form sheets. On Android, remove the pull-to-refresh wrapper from Git and Connect onboarding sheets so the list coordinates directly with native sheet dismissal; refresh remains accessible from the sheet header. Git sidebar pull-to-refresh remains available.
iOS keeps its existing pull-to-refresh controls and header dismissal behavior. The nested-scroll prop is Android-only. The connections, agents, queue, branches, commit, and confirmation sheets receive the same native scrolling opt-in. No native dependency change or gesture state machine is needed.
Scope and approval
This qualifies as a focused fix of an obvious existing bug: Android form sheets intercept downward list scrolling before the list reaches its top. The changes stay within native scroll coordination and preserve refresh access. All changed lists use the same native form-sheet mechanism. No prior maintainer approval or prerequisite PR is claimed.
Verification
vp run --filter @t3tools/mobile typecheckpassed, including after restoring iOS behavior.- Targeted
vp fmt --checkandvp lintpassed. The original eight-file lint reported 13 React compiler warnings and no errors; the two-file follow-up reported three warnings and no errors. git diff --checkpassed.- Android 15 emulator: reproduced the original premature sheet drag; verified short downward drags scroll without moving the sheet, a continuous drag scrolls to the top before moving the sheet, header dragging still works, top-of-list dragging dismisses, and header-menu refresh settles normally.
- iPhone 17e / iOS 26.5: verified scrolling back to the top and pulling to refresh keeps the sheet open, the refresh spinner settles, header dragging dismisses, and the extra header refresh button is absent.
- Used an isolated backend and 14 synthetic linked PR rows. Other form-sheet routes and wide-tablet sidebar interaction were not individually exercised. Web, desktop, providers, contracts, and connection modes are unaffected.
Matched pairs use the same fixture, viewport, theme, and continuous gesture. The background thread header is cropped consistently to omit machine labels.
| Device | Before recording | Current recording |
|---|---|---|
| Android | Before | After |
| Compact iPhone | Before | Preserved iOS behavior |
After the same Android drag, the original sheet collapses while the list stays scrolled; the fixed list reaches the top before the sheet moves.
| Before | After |
|---|---|
| Android sheet moves while its list stays scrolled | Android list reaches its top before the sheet moves |
The iPhone sheet retains its existing controls and list gesture:
Model: GPT-6.1 Sol | Harness: Codex in T3 Code
Checks
Approvability
Verdict: Approved at 2bb2cd6
Macroscope's review found this PR approvable — This is a localized mobile gesture bug fix that enables nested scrolling across existing sheets while preserving refresh access on both platforms. The implementation is repetitive and low risk, with no schema, infrastructure, security, billing, or static-analysis changes.
You can add or adjust custom eligibility rules. Learn more.
No actionable comments were generated in the recent review. 🎉
ℹ️ Recent review info
⚙️ Run configuration
- Configuration used: Path: .coderabbit.config.ts
- Review profile: CHILL
- Plan: Advanced
- Run ID:
4a2fb00c-a5fe-4f39-9f75-bff7a5d3572e
📥 Commits
Reviewing files that changed from the base of the PR and between 2bb2cd61fe82a3fee0052d5fa98664dbe6bf0cc5 and ff6bb2647ed0e2a3ed5a586e421ee3c2bb8fda92.
📒 Files selected for processing (2)
apps/mobile/src/features/threads/git/GitCommitSheet.tsxapps/mobile/src/features/threads/git/GitOverviewSheet.tsx
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.
📝 Walkthrough
Walkthrough
Cloud onboarding and Git overview screens update their refresh controls and refresh state. Nested scrolling is enabled on the connections screen and several thread sheets.
Changes
Refresh controls
Layer / File(s) Summary Cloud onboarding refresh actions
apps/mobile/src/features/cloud/ConnectOnboardingRouteScreen.tsxThe Android header refresh action and iOS pull-to-refresh control use shared refresh state and a handler that clears the state in finally.Git overview refresh actions
apps/mobile/src/features/threads/git/GitOverviewSheet.tsxThe Git overview uses shared refresh state and a handler. Pull-to-refresh appears on iOS or in inspector presentation. The Android repository menu uses the handler and disables its refresh action while busy or refreshing. Nested scrolling
Layer / File(s) Summary Enable nested scrolling
apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx,apps/mobile/src/features/threads/ThreadAgentsSheet.tsx,apps/mobile/src/features/threads/ThreadQueueControl.tsx,apps/mobile/src/features/threads/git/*Sheet.tsxNested scrolling is enabled on the connections screen and the subagent, queue, and Git sheets. Priority: ➖ Normal
Estimated code review effort: 2 (Simple) | ~12 minutes
Change: Bug fix
Suggested reviewers:
juliusmarminge
Merge Risk: ⚪ Minimal · up to ff6bb
The described Android and iOS refresh behavior is preserved while the affected views gain nested scrolling; no actionable merge-blocking risk is evident.
Pre-merge checks | Passed 4
✅ Passed checks (4 passed)
Check name Status Explanation Title check Passed The title clearly and concisely describes the main fix: allowing mobile sheet lists to scroll before dismissal. Description check Passed The description includes all required sections. It explains the problem, change, scope rationale, verification results, platform-specific behavior, limitations, and UI evidence. Linked Issues check Passed Check skipped because no linked issues were found for this pull request. Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
- Create a new PR
- Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Comment @coderabbitai help to get the list of available commands.
Added 2 commits
@juliusmarminge @maria-rcks This is rebased onto current main and ready for maintainer review. Mobile typecheck and scoped lint/format checks pass; existing before/after evidence is in the description.