feat(swift-ios): present the command drawer catalog - #8350
Conversation
Define the command drawer geometry, gesture arbitration, responder ownership, and bounded focus renewal as a focused foundation slice. Restore the exact prior responder after an abandoned pull and cover cancellation, teardown, and eligibility paths with focused tests.
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
| /// ever receiving `.began`. | ||
| func gestureRecognizer( | ||
| _ gestureRecognizer: UIGestureRecognizer, | ||
| shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer |
There was a problem hiding this comment.
🟡 Medium Workspace/FeatureCommandDrawerView.swift:435
The drawer pan waits for the scroll view's pan to fail, so a vertical pull in the grab band lets the scroll view begin first and prevents the drawer from opening or closing. shouldBeRequiredToFailBy reverses the intended priority here; use shouldRequireFailureOf so the scroll view waits for the drawer.
| shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer | |
| shouldRequireFailureOf otherGestureRecognizer |
🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift around line 435:
The drawer pan waits for the scroll view's pan to fail, so a vertical pull in the grab band lets the scroll view begin first and prevents the drawer from opening or closing. `shouldBeRequiredToFailBy` reverses the intended priority here; use `shouldRequireFailureOf` so the scroll view waits for the drawer.
Observed problem and reproduction
The SwiftUI workspace has existing task, project, and settings destinations, but no searchable overlay that keeps those destinations available over the current page. After the stacked foundation recognizes a top-bar pull, users need a real drawer surface with useful content and routing rather than gesture state with nothing to present.
To exercise this slice, pull down from the top bar on Home or an open thread, browse or filter the rows, then choose a thread, project, or workspace action.
Important
This is a draft stack. GitHub cannot use the fork-only foundation head as an upstream PR base, so the upstream diff temporarily includes #7345. The presentation-only comparison is foundation
0e0fb949…presentation32a60bb8. Do not review or merge this draft until #7345 lands and this PR is rebased so its upstream file list contains only the four presentation files.Cause
The workspace has no shared catalog for its existing destinations and no presentation that renders the foundation drawer state over the workspace. Navigation also has no single typed boundary for translating a drawer row into the workspace behavior that already owns the destination.
Change and boundary
This stacked PR adds the presentation/integration half of the command drawer:
WorkspaceViewalready owns.The parent PR owns geometry, the drawer state machine, gesture recognition, and responder ownership. This PR consumes those types without changing their lifecycle.
Intentionally unchanged and follow-ups
Affected areas
Validation
Current head:
32a60bb8d239ef994a8dd2a28617e20c2a6d0410, stacked on foundation0e0fb94960b080b724b50a3f14145ecbb6a5dd63.xcodebuildexit 0. The result includes all 50 foundation tests and all 9 presentation/integration tests, with a nonzero count read from the xcresult.session limit; resets 2pm Australia/Sydney), so no independent-review finding is claimed.Risks, limitations, and untested paths
NavigationSplitViewUIKit descendants while open, so actual VoiceOver traversal isolation remains a known proof gap rather than a claimed pass.UI evidence
This is a new surface, so there is no truthful before-state drawer to show. After-only evidence is appropriate. The evidence lives on a separate media branch and no PR-only media is committed in the product diff.
After — populated drawer, light appearance
After — populated drawer, dark appearance
Interaction — light appearance
Open the drawer, browse the catalog, search
react, and select a projectInteraction — dark appearance
Open the drawer, browse the catalog, search
boot, and open a threadOwning issue and stack
This is slice (b) of the split authorized for #7345, tracked by saphid/t3code-personal#86. It is stacked on the rewritten foundation PR, which owns gesture/state/focus behavior and the #154 abandoned-pull fix.
Maintainer edits are enabled. This draft does not request review. After #7345 lands, the branch will be rebased, the affected checks and proof will be refreshed, and only then can the vouched handoff gate be reconsidered.
Checklist
Implemented by GPT-5.6 Sol via the Codex harness.
Note
Add command drawer catalog to
WorkspaceViewin swift-iosFeatureCommandDrawerState), geometry helpers, gesture policy, responder ownership/lookup utilities, and aFeatureCommandDrawerCatalogbuilder that filters and sorts actions, threads, and projects by queryNavigationSplitViewbody insideFeatureCommandDrawerContainerand extendsdismissTransientPresentationsto close the drawer without restoring prior responder when navigation is requesteddismissTransientPresentationsnow closes the command drawer and setscommandDrawerRestoresPriorResponderOnCloseto false; callers relying on the drawer staying open during transient dismissal will see it close📊 Macroscope summarized 32a60bb. 5 files reviewed, 2 issues evaluated, 0 issues filtered, 1 comment posted
🗂️ Filtered Issues