Skip to content

fix(mobile): keep iOS thread menus short enough for drag selection - #30944

Merged
shivamhwp merged 1 commit into
pingdotgg:mainfrom
shivamhwp:issue-watch/30748
Nov 5, 2026
Merged

shivamhwp merged 1 commit into
pingdotgg:mainfrom
shivamhwp:issue-watch/30748

Conversation

@shivamhwp

@shivamhwp shivamhwp commented Nov 4, 2026 •

Copy link
Copy Markdown
Collaborator

On iOS, long thread menus start scrolling during the initial press-drag-release gesture, leaving the menu open without selecting an action. Branch and pinned rows can cross that height limit.

Keep common actions in the iOS thread menu and move secondary actions into More, with reordering under More → Arrange. The top level now has at most seven items. Android keeps its existing flat order. Action IDs, handlers, disabled states, and selected states are unchanged.

Closes #30748

Verified at cb2bc9ca05c73da35bcbb8584e0cf18ca35eaec1, against 9e85538535c8553901351112ab02dd1dd62db5ee:

  • Simlock iPhone 17, iOS 27.0, isolated test backend and Metro. Native fingerprint 994fd7249d9b61e4302f1767d4e23664fbde5277. The same continuous gesture, holding 1200 ms, dragging 800 ms, then holding 500 ms, failed before and passed after on branch rows. Unpinned branch, pinned branch, and pinned scratch rows selected Copy thread and dismissed the menu; clipboard checks confirmed the fixture links.
  • More → Arrange opens with unavailable moves disabled. More → Auto-settle retains the selected Enabled state. The branch gesture also passed at the largest standard Dynamic Type size.
  • Physical POCO M3 Pro 5G, Android 13, native fingerprint aba84043a4edb30381916d38ad6a4e7aad2cc74f, same commit and isolated backend. Long press opens the unchanged 14-item flat menu; selecting Copy thread ID dismisses it.
  • vp run check:changed passed formatting, lint, both knip passes, affected-package typechecks, 64 tests, and 7 React compiler checks. The focused threadListV2.test.ts run also passed all 64 tests. Fresh Codex review found no issues.

Known limit: Accessibility Large still makes the iOS menu scroll. This changes the thread menu layout, rather than fixing UIKit's handling of every scrollable menu. Web, desktop, server, and provider behavior are outside this mobile-only diff.

Before: the branch menu stays open after release.

Before menu

before-branch.mp4

After: the compact menu selects and dismisses for unpinned and pinned branch rows.

After menu

after-branch.mp4

Arrange submenu

Auto-settle selected state

Android flat menu

Check output
check:changed summary
  pass  format
  pass  lint
  pass  knip 1/2
  pass  knip 2/2
  pass  typecheck (2 packages)
  pass  test (1 file): 64 passed
  pass  react compiler (2 files): 7 passed

Focused threadListV2.test.ts: 64 passed

Upward-opening branch menu, verified on the same head cb2bc9ca05c73da35bcbb8584e0cf18ca35eaec1 in a fresh Simlock iPhone 17 / iOS 27.0 session, using native fingerprint 994fd7249d9b61e4302f1767d4e23664fbde5277 and the isolated test backend. The branch row is at y=721; its menu opens upward. One continuous 1200 ms hold, 800 ms drag upward onto Copy thread ID, and 500 ms hold before release selects the action and dismisses the menu. The clipboard changed from upward-before to upward-branch.

upward-gesture.mp4

Upward-opening menu with Copy thread ID highlighted

Implemented by Opus 5.5 through Claude Code. Investigated, device-tested, and reviewed by GPT-6.1 Sol through Codex in T3 Code.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Nov 4, 2026
@macroscopeapp

macroscopeapp Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at cb2bc9c

Macroscope's review found this PR approvable — The change shortens iOS thread menus by nesting secondary actions while retaining existing handlers and Android ordering. Exact-revision device verification supports the interaction improvement, with risk limited to menu navigation.

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

@coderabbitai

coderabbitai Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Explain Change →

No actionable comments were generated in the recent review.

Walkthrough

Thread-row menus now use a shared layout helper to arrange actions for flat and nested menus. Row state determines the action groups, and iOS uses nested menus.

Changes: Thread row menu layout

Layer / File(s) Summary
Define and test menu layouts
apps/mobile/src/features/threads/threadListV2.ts, apps/mobile/src/features/threads/threadListV2.test.ts
The helper assembles flat menus from direct, reorder, pin, and secondary actions. In nested menus, it groups secondary actions and reorder actions under “More,” and groups multiple reorder actions under “Arrange.” Tests check action order and submenu contents.
Build row-specific action groups
apps/mobile/src/features/threads/thread-list-v2-items.tsx
Rows build reorder and pin groups separately. Row state selects direct and secondary actions, and iOS selects nested layouts. The row menu receives the precomputed actions.

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

Change: Bug fix · Severity of issue fixed: Low

Possibly related PRs

  • pingdotgg/t3code#26714: Adds folder actions to thread-row menus, which need placement in the new action groups.
  • pingdotgg/t3code#21760: Changes the swipe-action contract that the new menu construction uses to determine whether to add snooze.
  • pingdotgg/t3code#17914: Adds a Mark unread action to thread-row menus, which needs placement in the new action groups.

Suggested labels: size:M

Suggested reviewers: juliusmarminge, maria-rcks, macroscopeapp

Merge Risk: Minimal · up to cb2bc

The Android menu remains unchanged, and no actionable issue remains in the reviewed menu layout. The PR is mergeable after normal checks.

Pre-merge checks: Passed 4
Check name Status Explanation
Title check Passed The title clearly and concisely describes the primary change: shortening iOS thread menus to support drag selection.
Linked Issues check Passed Issue [#30748] requires press-drag-release selection for all thread rows, including project threads with branches. ThreadListV2Row now uses layoutThreadListV2RowMenuActions for every row. iOS keep…
Out of Scope Changes check Passed The changes stay within the mobile thread-menu fix. The helper changes only menu grouping and platform layout. The row code preserves existing action IDs, handlers, disabled states, and selected state…
Description check Passed The description is complete and follows the required structure. It explains the problem, change, linked issue, verification results, platform coverage, known limitations, and UI evidence. It does not …
Full details: Linked Issues check

Explanation

Issue [#30748] requires press-drag-release selection for all thread rows, including project threads with branches. ThreadListV2Row now uses layoutThreadListV2RowMenuActions for every row. iOS keeps direct actions at the top level and moves secondary actions under More; the implementation keeps the top level at seven items or fewer. Non-iOS menus retain the flat action order. Tests verify the nested layout and preservation of every leaf action ID. The reported device checks cover pinned and unpinned branch rows and scratch rows.

Full details: Out of Scope Changes check

Explanation

The changes stay within the mobile thread-menu fix. The helper changes only menu grouping and platform layout. The row code preserves existing action IDs, handlers, disabled states, and selected states. The added tests cover the new layout and Android flat ordering. No unrelated product area changes appear in the reviewed diff.

Full details: Description check

Explanation

The description is complete and follows the required structure. It explains the problem, change, linked issue, verification results, platform coverage, known limitations, and UI evidence. It does not include an explicit maintainer approval comment, but the linked issue and detailed scope information provide sufficient context for this focused fix.

Finishing Touches
Generate unit tests (beta)
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between 9e85538 and cb2bc9c.

Files selected for processing: 3
  • apps/mobile/src/features/threads/thread-list-v2-items.tsx
  • apps/mobile/src/features/threads/threadListV2.test.ts
  • apps/mobile/src/features/threads/threadListV2.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 5 remain after this review.

@shivamhwp

Copy link
Copy Markdown
Collaborator Author

[GPT-6.1 Sol][Codex] on behalf of shivam.

Added the missing upward-opening branch-menu recording at cb2bc9ca05c73da35bcbb8584e0cf18ca35eaec1. On the Simlock iPhone 17 with iOS 27.0 and native fingerprint 994fd7249d9b61e4302f1767d4e23664fbde5277, one continuous 1200 ms hold, 800 ms upward drag, and 500 ms hold before release selected Copy thread ID and dismissed the menu. The clipboard changed from upward-before to the fixture ID upward-branch.

The PR description now includes this recording and its selected-state screenshot. Accessibility Large remains the documented limitation.

@shivamhwp
shivamhwp merged commit c9d29e0 into pingdotgg:main Nov 5, 2026
32 checks passed
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Nov 5, 2026
**v0.1.8-nightly.20261105.4205** · 28 changes from 3 contributors

- **Claude MCP Apps.** Use interactive MCP Apps in Claude Code threads.
- **Organized repository clones.** Clone repositories into host, owner, and repository folders, including repositories with the same name.
- **Agent browser tabs.** Open new agent browser tabs when idle tabs have filled the shared limit.
- **Pending questions.** Answer or dismiss older questions and approval prompts even after their messages leave the loaded conversation.

### Plus 22 more bug fixes.

<details>
<summary>Full changelog</summary>

## What's Changed
* docs: scope managed-policy LAN note to old background services by @b2bvic in pingdotgg/t3code#30900
* feat(server): render MCP Apps from Claude tool calls by @juliusmarminge in pingdotgg/t3code#29803
* build: run Effect rules on mobile and lock in clean suggestion rules by @juliusmarminge in pingdotgg/t3code#31111
* fix(mobile): keep iOS composer empty after sending an autocorrected word by @shivamhwp in pingdotgg/t3code#30308
* fix(server): idle agent tabs free a slot when the server's 32-tab browser limit is full by @shivamhwp in pingdotgg/t3code#24186
* fix(web): keep message navigation visible on touch when there is room by @shivamhwp in pingdotgg/t3code#26806
* fix(mobile): pinch wide images from anywhere in the Android viewer by @shivamhwp in pingdotgg/t3code#30929
* fix(mobile): preserve autocorrect in custom question answers by @shivamhwp in pingdotgg/t3code#30744
* fix(web): show Setting up during worktree setup by @shivamhwp in pingdotgg/t3code#28832
* fix(mobile): keep iOS thread menus short enough for drag selection by @shivamhwp in pingdotgg/t3code#30944
* fix(web): show the comparison base beside Changes totals by @shivamhwp in pingdotgg/t3code#30085
* fix(mobile): use H.264 for iOS previews and keep Close reachable by @shivamhwp in pingdotgg/t3code#28622
* fix(mobile): iOS image previews open without waiting for the gallery by @shivamhwp in pingdotgg/t3code#29044
* feat: optionally clone repos into ghq-style <host>/<owner>/<repo> folders by @shivamhwp in pingdotgg/t3code#24904
* fix(devices): explain Windows SSH host failures by @shivamhwp in pingdotgg/t3code#30941
* fix(web): make styled composer Markdown markers editable by @shivamhwp in pingdotgg/t3code#30421
* fix(mobile): configure another Claude account from Providers by @shivamhwp in pingdotgg/t3code#28928
* fix(web,mobile): save pull request description checkbox changes by @shivamhwp in pingdotgg/t3code#30704
* fix(client): a big server config on a slow link no longer drops the connection in a loop by @shivamhwp in pingdotgg/t3code#23758
* fix(server): restart T3 Connect's tunnel client when Cloudflare drops it by @shivamhwp in pingdotgg/t3code#24946
* fix(mobile): compact stale Claude threads before sending by @shivamhwp in pingdotgg/t3code#27935
* fix(web): show saved service access with Local environment off by @shivamhwp in pingdotgg/t3code#26464
* fix: keep older pending questions answerable by @shivamhwp in pingdotgg/t3code#26435
* fix(web): deleted forks no longer remain in Lineage by @shivamhwp in pingdotgg/t3code#29000
* fix(server): preserve sibling wakeups when interrupting a completion wake by @shivamhwp in pingdotgg/t3code#28204
* fix(server): attribute usage-limit auto-resume to T3 Code by @shivamhwp in pingdotgg/t3code#29838
* fix(acp): time out silent Antigravity prompts by @shivamhwp in pingdotgg/t3code#30377
* fix(codex): sharing usage limits offer the existing recovery options by @shivamhwp in pingdotgg/t3code#25341

## New Contributors
* @b2bvic made their first contribution in pingdotgg/t3code#30900

**Full Changelog**: pingdotgg/t3code@v0.1.8-nightly.20261104.4192...v0.1.8-nightly.20261105.4205

</details>


Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.8-nightly.20261105.4205
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L 100-499 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: iOS thread long-press menu ignores press-drag-release on project threads with a branch

1 participant