fix(mobile): let sheet lists scroll before dismissal#17177

merged2
main
GitHub fork: t3/fix-popover-scroll-dismiss-gesture
openedOct 8, 2026byAAlex
View on GitHubTwo-way sync enabledPR last imported 20d ago

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 typecheck passed, including after restoring iOS behavior.
  • Targeted vp fmt --check and vp lint passed. 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 --check passed.
  • 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.

DeviceBefore recordingCurrent recording
AndroidBeforeAfter
Compact iPhoneBeforePreserved 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.

The iPhone sheet retains its existing controls and list gesture:

Model: GPT-6.1 Sol | Harness: Codex in T3 Code

Checks

23 successful · 7 skipped
All checks passed
ff6bb26
Synced from GitHub

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.

Synced from GitHub

Review in Change Stack →

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.tsx
  • apps/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.tsx
The 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.tsx
The 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.tsx
Nested 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 nameStatusExplanation
Title checkPassedThe title clearly and concisely describes the main fix: allowing mobile sheet lists to scroll before dismissal.
Description checkPassedThe description includes all required sections. It explains the problem, change, scope rationale, verification results, platform-specific behavior, limitations, and UI evidence.
Linked Issues checkPassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes checkPassedCheck 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

  • fix(mobile): let sheet lists scroll before dismissala887da1
  • fix(mobile): preserve iOS sheet refresh gesturesff6bb26

@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.