refactor(mobile): split native menus by platform - #12382
Conversation
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: unavailable · PR result: Scenario and decoded snapshot size10 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.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Team Run ID: 📒 Files selected for processing (1)
Included review availability: Your plan provides up to 10 included reviews per hour; 2 remain after this review. 📝 WalkthroughWalkthroughThe change extracts ChangesControlPillMenu extraction
Priority: ⬇️ Low Estimated code review effort: 3 (Moderate) | ~25 minutes Change: Refactor Merge Risk: ⚪ Minimal · up to The menu split retains existing interaction and callback behavior, with no concrete merge-blocking risk identified. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Comment |
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This refactor separates the existing iOS and Android menu implementations without changing callers, APIs, or interaction logic. Runtime impact is limited to loading the platform-specific implementation, with no new user-facing capability or product-default change. You can add or adjust custom eligibility rules. Learn more. |
f23d3fa to
7828c61
Compare
Dismissing prior approval to re-evaluate 7828c61
This comment has been minimized.
This comment has been minimized.
## What's Changed * fix(mobile): use singular label for one settings environment by @juliusmarminge in pingdotgg/t3code#12282 * feat(mobile): add copy thread ID to thread list actions by @jakeleventhal in pingdotgg/t3code#12228 * fix(mobile): remove Android input underline backgrounds by @juliusmarminge in pingdotgg/t3code#12394 * chore(deps): upgrade Effect to rc.115 and Alchemy to beta.78 by @juliusmarminge in pingdotgg/t3code#12326 * chore(refs): sync Effect and Alchemy references to rc.115 and beta.78 by @juliusmarminge in pingdotgg/t3code#12327 * chore(relay): deploy with the Alchemy CLI and publish client config through an Action by @juliusmarminge in pingdotgg/t3code#12401 * chore(deps): bump the npm_and_yarn group across 1 directory with 3 updates by @dependabot[bot] in pingdotgg/t3code#12411 * fix(git): prevent stale branch selections from restoring files by @yashranaway in pingdotgg/t3code#10574 * chore(deps): bump parents that carry vulnerable transitive dependencies by @juliusmarminge in pingdotgg/t3code#12417 * fix(web): keep a file-to-symlink type change from crashing the diff view by @Mnigos in pingdotgg/t3code#11075 * Use T3 Device panel for mobile testing by @juliusmarminge in pingdotgg/t3code#12414 * fix(web): client spans reach the trace proxy again by @yordis in pingdotgg/t3code#12332 * fix(bitbucket): preserve rate limits from optional PR reads by @juliusmarminge in pingdotgg/t3code#12486 * fix(mobile): synchronize native permission registry access by @juliusmarminge in pingdotgg/t3code#12482 * fix(build): retain multiple license notices for one package by @juliusmarminge in pingdotgg/t3code#12489 * fix(build): parse executable imports without matching source strings by @juliusmarminge in pingdotgg/t3code#12488 * fix(mobile): synchronize native notification delegates by @juliusmarminge in pingdotgg/t3code#12483 * fix(relay): accept delegated thread IDs in activity routes by @juliusmarminge in pingdotgg/t3code#12484 * fix(git): explain fetch failures without exposing remote output by @juliusmarminge in pingdotgg/t3code#12485 * fix(web): sidebar search matches message content by @koushikxd in pingdotgg/t3code#11761 * fix(server): restore secrets when settings persistence fails by @juliusmarminge in pingdotgg/t3code#12487 * fix(ci): accept V2 transfer reports without cross-scenario comparisons by @juliusmarminge in pingdotgg/t3code#12492 * fix(web): speed up PR previews with fewer GitHub requests by @dominic-r in pingdotgg/t3code#11825 * fix(server): retry transient git failures during checkpoint capture by @saphid in pingdotgg/t3code#11665 * fix(mobile): keep archived threads visible during iOS search by @juliusmarminge in pingdotgg/t3code#12420 * perf(mobile): isolate Material You conversion on Android by @juliusmarminge in pingdotgg/t3code#12379 * perf(mobile): isolate iOS Live Activity imports by @juliusmarminge in pingdotgg/t3code#12380 * refactor(mobile): split home headers by platform by @juliusmarminge in pingdotgg/t3code#12381 * refactor(mobile): split native menus by platform by @juliusmarminge in pingdotgg/t3code#12382 * refactor(mobile): isolate thread row appearance by platform by @juliusmarminge in pingdotgg/t3code#12383 * refactor(mobile): split settings selection rows by platform by @juliusmarminge in pingdotgg/t3code#12384 * refactor(mobile): centralize platform header rendering by @juliusmarminge in pingdotgg/t3code#12388 * refactor(mobile): configure thread headers through the shared core by @juliusmarminge in pingdotgg/t3code#12389 * refactor(mobile): share file header actions and search configuration by @juliusmarminge in pingdotgg/t3code#12390 * refactor(mobile): share terminal header and menu configuration by @juliusmarminge in pingdotgg/t3code#12391 * refactor(mobile): share archived thread header configuration by @juliusmarminge in pingdotgg/t3code#12399 * refactor(mobile): compose review menus through the shared header by @juliusmarminge in pingdotgg/t3code#12400 * feat(mobile): search projects when starting a task by @juliusmarminge in pingdotgg/t3code#12496 * fix(mobile): preserve multiple model favorites by @juliusmarminge in pingdotgg/t3code#12505 * feat(server): export log records over OTLP by @yordis in pingdotgg/t3code#12493 * fix(mobile): use native settings and snooze controls by @juliusmarminge in pingdotgg/t3code#12512 * feat(web): sort pull requests by what is blocked on me by @flamboh in pingdotgg/t3code#12508 * fix(mobile): prefer pull-to-refresh on list screens by @juliusmarminge in pingdotgg/t3code#12515 * fix(acp): accept SDK elicitation requests by @shivamhwp in pingdotgg/t3code#11294 * fix(release): read relay configuration without loading deployment providers by @juliusmarminge in pingdotgg/t3code#12518 * fix(ci): reconcile native change labels against pinned commits by @juliusmarminge in pingdotgg/t3code#12517 * fix(release): strip Alchemy progress before parsing relay state by @juliusmarminge in pingdotgg/t3code#12519 * refactor: remove obsolete code by @t3dotgg in pingdotgg/t3code#9917 * fix(server): release oversized pull request diff cache entries by @juliusmarminge in pingdotgg/t3code#12523 * feat(mobile): view and control agent devices by @juliusmarminge in pingdotgg/t3code#12531 * fix(preview): recover host registration after request timeouts by @juliusmarminge in pingdotgg/t3code#12535 * fix(mobile): align built-in theme colors with desktop by @juliusmarminge in pingdotgg/t3code#12534 * feat(desktop): export main process telemetry over OTLP by @yordis in pingdotgg/t3code#12520 * fix(codex): surface app permission requests as approvable by @Exotic209093 in pingdotgg/t3code#7861 * chore(desktop): leave main process metrics export off until a metric exists by @juliusmarminge in pingdotgg/t3code#12540 * fix(release): drop placeholder allowBuilds entry that broke desktop builds by @juliusmarminge in pingdotgg/t3code#12544 ## New Contributors * @dependabot[bot] made their first contribution in pingdotgg/t3code#12411 * @koushikxd made their first contribution in pingdotgg/t3code#11761 **Full Changelog**: pingdotgg/t3code@v0.0.43-nightly.20260918.1895...v0.0.43-nightly.20260919.1948 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.43-nightly.20260919.1948
The shared menu wrapper loads and initializes the iOS themed MenuView wrapper on Android before choosing its Android branch. Use a base iOS ControlPillMenu and an
.android.tsxoverride and preserve its existing export from ControlPill, so all callers keep the same API. Keep iOS gesture suppression and menu lifecycle handlers with the native menu, and Android anchoring and haptics with the Android implementation.Verification:
The existing menu branches and handlers are preserved. No visual or interaction change is intended; evidence is release module resolution and existing tests.
Based on #12381.
Runtime verification on September 18, 2026: the integrated stack at 47a3dcb was tested on an iPhone 17 Pro simulator (iOS 27.0) and T3Code_API_36_1 emulator (Android 16.0), one at a time. Compatible development clients were built and installed from this checkout, then connected to a disposable environment with seeded Git projects. Coverage included Home/list rendering, thread navigation, file search and word wrap, terminal menus and session selection, review diff selection, archive menus, and Settings Add Environment / scanner open and close. Temporary connections were removed and the devices and test servers were stopped. Tablet layouts, QR decoding, and Live Activity start/update/stop were not exercised. Screenshots use seeded demo content; any test counts in demo messages or terminal output are fixture text, not validation results.
The iOS native menus and Android nested menus were exercised through file word wrap, terminal text size/session selection, and review diff selection. Runtime evidence is attached to #12391.
The pre-existing iOS archive keyboard issue and stale-connection loading limitation are recorded with comparison evidence in #12399.
Prepared with Codex.