fix(mobile): use native full-width sheets on iPhone Duo#22985

merged1
duo/tab-sync
duo/sheets
opened2d agobyJJulius Marminge
View on GitHubTwo-way sync enabledPR last imported 2d ago

Several folded Duo sheets stopped short of the available width or mixed content headers with rail controls. Opt these sheets into horizontal native bars and consolidate their headers at the route.

Ports the work from #22551 and #20435, retaining author credit. Uses the previous layer's Screens support; it does not add the redundant nativeKeepsBottomToolbar option.

Verified Git overview and thread settings in folded and unfolded landscape. Mobile typecheck and 31 focused tests passed. Shared Sheet was not reached on device; unfolded portrait remains unverified. It uses #22979's Screens t3.31 release.

Before: Before: Git overview stops short beside rail

After: After: native header and full-width sheet

Implemented with Claude Opus 5.5 in Claude Code; integrated and reviewed with GPT-6.1 in Codex.

Motion verification

Fresh, real-time 30 fps recordings from the exact commits labeled in the videos, using fingerprint-matched debug native clients. Black cards mark cuts between displays.

Before

Before — PR 22980

After

After — PR 22980

These clean runs show Git overview and folded Thread settings. Branches/worktrees and unfolded Thread settings were not recorded.

Unfold-after-sheets assertion

Unfolding after using folded sheets hit a React Native touch-handler double-detach assertion in one of two runs at both ee9cd8c1b4a and fe16f614bef. Screens t3.35 in #23149 fixes it: the touch handler is attached and detached only when that changes something.

Unfold-after-sheets assertion, before t3.35

Restack

Restacked onto main a12d6ed942 on 2026-10-21. The commits are unchanged apart from lockfile peer strings. The recordings above show the pre-restack commits they name.

Checks

All checks passed
Synced from GitHub

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ℹ️ No successful main baseline artifact is available yet. This run establishes the initial measurement.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire—5.0 KiB—6.8 KiB✅
CodexThread snapshot wire—3.8 KiB—4.9 KiB✅
CodexLive turn WebSocket wire—1.2 KiB—2.0 KiB✅
CodexLive turn WebSocket decoded—20.9 KiB—29.3 KiB✅
CodexLive turn messages—2—8✅
ClaudeTotal thread wire—5.0 KiB—6.8 KiB✅
ClaudeThread snapshot wire—3.8 KiB—4.9 KiB✅
ClaudeLive turn WebSocket wire—1.2 KiB—2.0 KiB✅
ClaudeLive turn WebSocket decoded—21.2 KiB—29.3 KiB✅
ClaudeLive turn messages—2—8✅

Baseline: unavailable · PR result: fe869ab · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 108.5 KiB
  • Claude decoded thread snapshot: 108.8 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Synced from GitHub

🚀 Expo continuous deployment is ready!

  • Project → t3-code
  • Platforms → android, ios
  • Scheme → t3code-preview
 🤖 Android🍎 iOS
Fingerprint90a87832e146bcec28e11597ac772b4c8e8d8cca013146abbe4c044d737386970fc36f203ffc8fe1
Build DetailsBuild Permalink
DetailsDistribution: INTERNAL
Build profile: preview:dev
Runtime version: 90a87832e146bcec28e11597ac772b4c8e8d8cca
App version: 2.0.0
Git commit: 0e5fc3a7421692b47d5d186e7abe1894916d2c03
Build Permalink
DetailsDistribution: INTERNAL
Build profile: preview:dev
Runtime version: 013146abbe4c044d737386970fc36f203ffc8fe1
App version: 2.0.0
Git commit: 0e5fc3a7421692b47d5d186e7abe1894916d2c03
Update DetailsUpdate Permalink
DetailsBranch: pr-22980
Runtime version: 90a87832e146bcec28e11597ac772b4c8e8d8cca
Git commit: 4dad4483674e68eb2f59da5d5c7dc0b962374f1f
Update Permalink
DetailsBranch: pr-22980
Runtime version: 013146abbe4c044d737386970fc36f203ffc8fe1
Git commit: 4dad4483674e68eb2f59da5d5c7dc0b962374f1f
Update QRExternal imageExternal image
Synced from GitHub

Approvability

Verdict: Needs Human Approval

Macroscope's review found this PR requires human approval — This changes the default presentation of existing mobile sheets across multiple routes, including native bar placement, detents, headers, and search/filter layout, with supporting changes to shared navigation infrastructure. The broad existing-path UI behavior change warrants human review.

No code changes detected at fe869ab. Prior analysis still applies.

You can add or adjust custom eligibility rules. Learn more.

Synced from GitHub

Review in Change Stack →

Important

Review skipped

Review was skipped as selected files did not have any reviewable changes.

⛔ Files ignored due to path filters: 1
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
⚙️ Run configuration
  • Configuration used: Path: .coderabbit.config.ts
  • Review profile: CHILL
  • Plan: Team
  • Run ID: e75d2feb-304f-496b-b9d7-34a0686a3648
📥 Commits

Reviewing files that changed from the base of the PR and between 3dedf74ac2a2a21165c8588fce6a7a643ae54970 and fe869aba229e646d62674a08df914ce41c496803.

⛔ Files ignored due to path filters: 1
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Path: .coderabbit.config.ts
  • Review profile: CHILL
  • Plan: Team
  • Run ID: 0f6ee5e3-d9e4-482b-9b8f-06e7c4cdd085
📥 Commits

Reviewing files that changed from the base of the PR and between e5cb1170aa94552bd1d6fb956d81c2bde8eb0164 and 3dedf74ac2a2a21165c8588fce6a7a643ae54970.

⛔ Files ignored due to path filters: 1
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing: 12
  • apps/mobile/src/Stack.tsx
  • apps/mobile/src/components/ui/Sheet.tsx
  • apps/mobile/src/components/ui/SheetHeader.tsx
  • apps/mobile/src/features/threads/ThreadPullRequestsSheet.tsx
  • apps/mobile/src/features/threads/ThreadSettingsSheet.tsx
  • apps/mobile/src/features/threads/git/GitBranchesSheet.tsx
  • apps/mobile/src/features/threads/git/GitOverviewSheet.tsx
  • apps/mobile/src/native/NativeHeaderToolbar.tsx
  • apps/mobile/src/native/V5StackHeader.ios.tsx
  • apps/mobile/src/native/createV5StackNavigator.ios.tsx
  • apps/mobile/src/native/sheet-surface.ts
  • patches/@react-navigation%2Fnative-stack@7.21.0.patch

Limit details: You’ve used all 10 included reviews currently available.

📝 Walkthrough

Mobile form-sheet options and detents are updated across navigation routes. Several iOS sheets now render direct sheet headers, and thread settings update native and fallback search toolbar integration.

Changes: Mobile Sheet Configuration and Headers

Layer / File(s)Summary
Shared sheet and native stack options
apps/mobile/src/native/sheet-surface.ts, patches/@react-navigation%2Fnative-stack@7.21.0.patch, apps/mobile/src/native/createV5StackNavigator.ios.tsx, apps/mobile/src/native/NativeHeaderToolbar.tsx, apps/mobile/src/native/V5StackHeader.ios.tsx
A shared helper provides horizontal form-sheet options and platform-specific detents. The native stack patch forwards sheet-bar and presentation-envelope options. Toolbar buttons now support visibility priorities, including mapping "default" to "standard" on iOS.
Route sheet options and detents
apps/mobile/src/Stack.tsx, apps/mobile/src/components/ui/Sheet.tsx
Routes use shared horizontal form-sheet options and computed detents. Thread settings reuse a full-height configuration. Sheet uses the detent helper and enables horizontal bars.
iOS sheet headers and search toolbar
apps/mobile/src/components/ui/SheetHeader.tsx, apps/mobile/src/features/threads/ThreadPullRequestsSheet.tsx, apps/mobile/src/features/threads/ThreadSettingsSheet.tsx, apps/mobile/src/features/threads/git/GitBranchesSheet.tsx, apps/mobile/src/features/threads/git/GitOverviewSheet.tsx
Thread pull-request and Git sheets render direct headers on iOS. Thread settings update native and fallback search toolbar integration. The confirmation toolbar button sets high visibility priority.

Priority: ➖ Normal

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Bug fix

Suggested reviewers: maria-rcks, pixpmusic

Merge Risk: ⚪ Minimal · up to 3dedf

No actionable issue was established in the sheet changes; the PR is ready for normal merge checks.

Pre-merge checks: Passed 4
Check nameStatusExplanation
Title checkPassedThe title clearly identifies the mobile fix: enabling native full-width sheets on iPhone Duo.
Description checkPassedThe description covers the problem, implementation, scope, verification, screenshots, recordings, known limitations, and tooling used. It also explains that the change configures established native sh…
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.
Full details: Description check

Explanation

The description covers the problem, implementation, scope, verification, screenshots, recordings, known limitations, and tooling used. It also explains that the change configures established native sheet capabilities and links related prior work.

✨ Finishing Touches: 💡 1
🛠️ Fix failing CI checks: 💡
  • Commit to this branch
  • Create a new PR
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

Added 1 commit

  • fix(mobile): iPhone Duo sheets use their full width and native headersfe869ab