fix(ios): preserve project picker scroll during refresh - #5660

Merged
t3dotgg merged 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-project-picker-scroll
Aug 9, 2026
Merged

fix(ios): preserve project picker scroll during refresh#5660
t3dotgg merged 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-project-picker-scroll

Conversation

@saphid

@saphidsaphid commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Replace the New Task project Menu with a sheet-backed SwiftUI List whose logical row identities survive live refreshes without resetting the picker viewport.
  • Re-resolve a tapped group against the latest project snapshot before selecting it, so stale rows cannot choose a vanished project or dismiss the sheet.
  • Share one typed sheet route with the existing branch picker, keep environment choice separate, show an empty live-update state, and make each plain-styled project row fully tappable.

Why

The SwiftUI client continuously receives project snapshots. Rebuilding the old Menu while someone was browsing it reset the viewport to the top. A List updates stable rows in place, so an incoming project can appear without interrupting the user's position.

This is a focused follow-up to the experimental SwiftUI client in #5178 and targets t3code/rebuild-mobile-app-swift, where that client currently lives.

UI Changes

Before: live refresh resets the menuAfter: live refresh preserves the list position
Before refresh, scrolledFixed picker before refresh, anchored at project 10
After refresh, reset to topAfter refresh, still anchored at project 10 with project 23 visible

9-second interaction proof: project 23 arrives while the picker remains anchored (MP4)

Validation

  • T3CodeTests/DailyUXNewTaskTests: 14 passed, 0 failed, 0 skipped on the final reviewed head.
  • Debug build, install, and launch passed on iPhone 17 Pro Max, iOS 26.5.
  • Integrated live-refresh proof: project 10 remained the visual anchor while project 23 arrived and became visible.
  • Integrated final-build interaction: the project sheet opened, selecting project 02 dismissed it, and the composer updated to project 02.
  • Controlled branch-picker comparison: branch search, refresh, Cancel, and visible rows matched the untouched stacking base; the same row-tap automation limitation reproduced on both builds.
  • Stale rows, empty state, environment preference, and stable identities were rechecked in the focused model test and source audit.
  • git diff --check: passed.
  • Direct Claude Opus 5 High review found one project-row hit-area issue; commit 827aae58e fixed it. A fresh post-fix review exited 0 with no actionable findings.
  • Theo merged the reviewed head as 65e66ee51; the three PR-owned files are byte-for-byte identical to 827aae58e, and git range-diff shows the hit-area follow-up folded into the squash while the CI repair remains a separate base commit.
  • Post-merge stacking-head verification: CI passed, and SwiftUI iOS run 31290353405 passed fixture verification plus the full native test job.

Scope

This is one SwiftUI-only bug fix: three files, 208 changed lines, no wire contract, server, web, desktop, or React Native mobile changes. The size:L label reflects the extracted sheet view and focused regression test, not additional product scope.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Implementation and verification used GPT-5.6 Sol High in T3 Code with the Codex harness. Independent review used Claude Opus 5 High in Claude Code.


Note

Low Risk
Focused SwiftUI UX and selection-validation changes in the new-thread flow; no auth, networking, or data-model changes beyond grouping helper usage.

Overview
Replaces the New Task projectMenu with a sheet-backed List so live project snapshot updates no longer jump scroll position to the top. Project and branch pickers now share a single activePicker sheet route (NewTaskPicker).

NewTaskProjectPicker shows grouped projects with checkmarks, empty state, and accessibility on the hero control; the sheet dismisses only when selectProject / selectProjectGroup succeed (Bool return). Group picks resolve via new DailyUXProjectGrouping.selectionTarget against the current groups (handles stale IDs after refresh); tests cover that path.

Reviewed by Cursor Bugbot for commit 827aae5. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Preserve project picker scroll position during refresh in iOS new thread view

  • Replaces the inline Menu for project selection in NewThreadView with a dedicated sheet (NewTaskProjectPicker) driven by a new NewTaskPicker enum, fixing scroll position loss on refresh.
  • Adds DailyUXProjectGrouping.selectionTarget to resolve a project group against the current live groups, so stale or removed group IDs fail gracefully without mutating state.
  • selectProject now validates that the provided project ID exists in creationProjects before applying changes, returning a Bool to indicate success.
  • Behavioral Change: project selection no longer uses a popover menu — it opens a modal sheet with medium/large detents.

Macroscope summarized 827aae5.

Summary by CodeRabbit

  • New Features

    • Added a project picker that groups projects and indicates the current selection.
    • Added clear empty-state handling when no projects are available.
    • Improved project and branch selection with a consistent picker experience.
    • Added accessibility labels and values to the project selector.
  • Bug Fixes

    • Project selection now safely handles outdated or removed project groups and selects the appropriate available project when possible.

@saphid
saphid marked this pull request as ready for review August 7, 2026 23:15
@coderabbitai

coderabbitaiBot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b3edda16-3c3a-4a65-852f-c965a3e1d0af

📥 Commits

Reviewing files that changed from the base of the PR and between ab95c07 and 827aae5.

📒 Files selected for processing (3)
  • apps/swift-ios/Features/Workspace/DailyUXModels.swift
  • apps/swift-ios/Features/Workspace/NewThreadView.swift
  • apps/swift-ios/Tests/FeatureTests/DailyUXNewTaskTests.swift

📝 Walkthrough

Walkthrough

The new thread view now uses a shared project or branch picker. Project groups resolve to preferred current-environment projects, validate selections, and dismiss the picker after successful selection. Tests cover stale and removed group IDs.

Changes

Project selection

Layer / File(s)Summary
Selection resolution
apps/swift-ios/Features/Workspace/DailyUXModels.swift, apps/swift-ios/Features/Workspace/NewThreadView.swift, apps/swift-ios/Tests/FeatureTests/DailyUXNewTaskTests.swift
selectionTarget resolves group IDs to preferred projects. Selection helpers validate IDs and preserve draft state. Tests cover stale and removed groups.
Shared picker presentation
apps/swift-ios/Features/Workspace/NewThreadView.swift
Project and branch sheets use shared picker state. Controls open the correct picker and expose accessibility metadata.
Project picker interface
apps/swift-ios/Features/Workspace/NewThreadView.swift
The project picker displays grouped rows, selection indicators, empty-state handling, cancellation, accessibility traits, and sheet sizing.

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

Sequence Diagram(s)

sequenceDiagram
participant User
participant NewThreadView
participant ProjectPicker
participant DailyUXProjectGrouping
User->>NewThreadView: Open project selector
NewThreadView->>ProjectPicker: Present project groups
User->>ProjectPicker: Select project group
ProjectPicker->>NewThreadView: Return selected group ID
NewThreadView->>DailyUXProjectGrouping: Resolve selectionTarget
DailyUXProjectGrouping-->>NewThreadView: Return preferred project
NewThreadView-->>User: Apply selection and dismiss picker
Loading

Suggested reviewers:t3dotgg

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly and concisely describes the primary change: preserving project picker scroll during refresh.
Description check✅ PassedThe description covers the required sections, explains the change and rationale, includes UI evidence, and completes the checklist.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 7, 2026
@macroscopeapp

macroscopeappBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 827aae5

This is a self-contained iOS UI fix that changes the project picker from a Menu to a sheet-based presentation to preserve scroll position during refresh. The changes include defensive validation and corresponding tests, with no impact outside the picker UI.

You can customize Macroscope's approvability policy. Learn more.

@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch 2 times, most recently from 38b865c to ccf65fcCompareAugust 8, 2026 22:47
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 8, 2026
@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch from ccf65fc to 0b43ed7CompareAugust 8, 2026 23:22
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 8, 2026 23:22

Dismissing prior approval to re-evaluate 0b43ed7

@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch from 0b43ed7 to bb4ab33CompareAugust 8, 2026 23:23
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 8, 2026
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 responding on behalf of Theo

/recheck-vouch

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 9, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 9, 2026 02:09

Dismissing prior approval to re-evaluate 827aae5

@saphid

Copy link
Copy Markdown
ContributorAuthor

@coderabbitai review

@coderabbitai

coderabbitaiBot commented Aug 9, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@t3dotgg
t3dotgg merged commit 65e66ee into pingdotgg:t3code/rebuild-mobile-app-swiftAug 9, 2026
13 of 17 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@saphid@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(ios): preserve project picker scroll during refresh - #5660

Merged
t3dotgg merged 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-project-picker-scroll
Aug 9, 2026
Merged

fix(ios): preserve project picker scroll during refresh#5660
t3dotgg merged 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-project-picker-scroll

Conversation

@saphid

@saphidsaphid commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Replace the New Task project Menu with a sheet-backed SwiftUI List whose logical row identities survive live refreshes without resetting the picker viewport.
  • Re-resolve a tapped group against the latest project snapshot before selecting it, so stale rows cannot choose a vanished project or dismiss the sheet.
  • Share one typed sheet route with the existing branch picker, keep environment choice separate, show an empty live-update state, and make each plain-styled project row fully tappable.

Why

The SwiftUI client continuously receives project snapshots. Rebuilding the old Menu while someone was browsing it reset the viewport to the top. A List updates stable rows in place, so an incoming project can appear without interrupting the user's position.

This is a focused follow-up to the experimental SwiftUI client in #5178 and targets t3code/rebuild-mobile-app-swift, where that client currently lives.

UI Changes

Before: live refresh resets the menuAfter: live refresh preserves the list position
Before refresh, scrolledFixed picker before refresh, anchored at project 10
After refresh, reset to topAfter refresh, still anchored at project 10 with project 23 visible

9-second interaction proof: project 23 arrives while the picker remains anchored (MP4)

Validation

  • T3CodeTests/DailyUXNewTaskTests: 14 passed, 0 failed, 0 skipped on the final reviewed head.
  • Debug build, install, and launch passed on iPhone 17 Pro Max, iOS 26.5.
  • Integrated live-refresh proof: project 10 remained the visual anchor while project 23 arrived and became visible.
  • Integrated final-build interaction: the project sheet opened, selecting project 02 dismissed it, and the composer updated to project 02.
  • Controlled branch-picker comparison: branch search, refresh, Cancel, and visible rows matched the untouched stacking base; the same row-tap automation limitation reproduced on both builds.
  • Stale rows, empty state, environment preference, and stable identities were rechecked in the focused model test and source audit.
  • git diff --check: passed.
  • Direct Claude Opus 5 High review found one project-row hit-area issue; commit 827aae58e fixed it. A fresh post-fix review exited 0 with no actionable findings.
  • Theo merged the reviewed head as 65e66ee51; the three PR-owned files are byte-for-byte identical to 827aae58e, and git range-diff shows the hit-area follow-up folded into the squash while the CI repair remains a separate base commit.
  • Post-merge stacking-head verification: CI passed, and SwiftUI iOS run 31290353405 passed fixture verification plus the full native test job.

Scope

This is one SwiftUI-only bug fix: three files, 208 changed lines, no wire contract, server, web, desktop, or React Native mobile changes. The size:L label reflects the extracted sheet view and focused regression test, not additional product scope.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Implementation and verification used GPT-5.6 Sol High in T3 Code with the Codex harness. Independent review used Claude Opus 5 High in Claude Code.


Note

Low Risk
Focused SwiftUI UX and selection-validation changes in the new-thread flow; no auth, networking, or data-model changes beyond grouping helper usage.

Overview
Replaces the New Task projectMenu with a sheet-backed List so live project snapshot updates no longer jump scroll position to the top. Project and branch pickers now share a single activePicker sheet route (NewTaskPicker).

NewTaskProjectPicker shows grouped projects with checkmarks, empty state, and accessibility on the hero control; the sheet dismisses only when selectProject / selectProjectGroup succeed (Bool return). Group picks resolve via new DailyUXProjectGrouping.selectionTarget against the current groups (handles stale IDs after refresh); tests cover that path.

Reviewed by Cursor Bugbot for commit 827aae5. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Preserve project picker scroll position during refresh in iOS new thread view

  • Replaces the inline Menu for project selection in NewThreadView with a dedicated sheet (NewTaskProjectPicker) driven by a new NewTaskPicker enum, fixing scroll position loss on refresh.
  • Adds DailyUXProjectGrouping.selectionTarget to resolve a project group against the current live groups, so stale or removed group IDs fail gracefully without mutating state.
  • selectProject now validates that the provided project ID exists in creationProjects before applying changes, returning a Bool to indicate success.
  • Behavioral Change: project selection no longer uses a popover menu — it opens a modal sheet with medium/large detents.

Macroscope summarized 827aae5.

Summary by CodeRabbit

  • New Features

    • Added a project picker that groups projects and indicates the current selection.
    • Added clear empty-state handling when no projects are available.
    • Improved project and branch selection with a consistent picker experience.
    • Added accessibility labels and values to the project selector.
  • Bug Fixes

    • Project selection now safely handles outdated or removed project groups and selects the appropriate available project when possible.

@saphid
saphid marked this pull request as ready for review August 7, 2026 23:15
@coderabbitai

coderabbitaiBot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b3edda16-3c3a-4a65-852f-c965a3e1d0af

📥 Commits

Reviewing files that changed from the base of the PR and between ab95c07 and 827aae5.

📒 Files selected for processing (3)
  • apps/swift-ios/Features/Workspace/DailyUXModels.swift
  • apps/swift-ios/Features/Workspace/NewThreadView.swift
  • apps/swift-ios/Tests/FeatureTests/DailyUXNewTaskTests.swift

📝 Walkthrough

Walkthrough

The new thread view now uses a shared project or branch picker. Project groups resolve to preferred current-environment projects, validate selections, and dismiss the picker after successful selection. Tests cover stale and removed group IDs.

Changes

Project selection

Layer / File(s)Summary
Selection resolution
apps/swift-ios/Features/Workspace/DailyUXModels.swift, apps/swift-ios/Features/Workspace/NewThreadView.swift, apps/swift-ios/Tests/FeatureTests/DailyUXNewTaskTests.swift
selectionTarget resolves group IDs to preferred projects. Selection helpers validate IDs and preserve draft state. Tests cover stale and removed groups.
Shared picker presentation
apps/swift-ios/Features/Workspace/NewThreadView.swift
Project and branch sheets use shared picker state. Controls open the correct picker and expose accessibility metadata.
Project picker interface
apps/swift-ios/Features/Workspace/NewThreadView.swift
The project picker displays grouped rows, selection indicators, empty-state handling, cancellation, accessibility traits, and sheet sizing.

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

Sequence Diagram(s)

sequenceDiagram
participant User
participant NewThreadView
participant ProjectPicker
participant DailyUXProjectGrouping
User->>NewThreadView: Open project selector
NewThreadView->>ProjectPicker: Present project groups
User->>ProjectPicker: Select project group
ProjectPicker->>NewThreadView: Return selected group ID
NewThreadView->>DailyUXProjectGrouping: Resolve selectionTarget
DailyUXProjectGrouping-->>NewThreadView: Return preferred project
NewThreadView-->>User: Apply selection and dismiss picker
Loading

Suggested reviewers:t3dotgg

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly and concisely describes the primary change: preserving project picker scroll during refresh.
Description check✅ PassedThe description covers the required sections, explains the change and rationale, includes UI evidence, and completes the checklist.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 7, 2026
@macroscopeapp

macroscopeappBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 827aae5

This is a self-contained iOS UI fix that changes the project picker from a Menu to a sheet-based presentation to preserve scroll position during refresh. The changes include defensive validation and corresponding tests, with no impact outside the picker UI.

You can customize Macroscope's approvability policy. Learn more.

@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch 2 times, most recently from 38b865c to ccf65fcCompareAugust 8, 2026 22:47
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 8, 2026
@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch from ccf65fc to 0b43ed7CompareAugust 8, 2026 23:22
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 8, 2026 23:22

Dismissing prior approval to re-evaluate 0b43ed7

@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch from 0b43ed7 to bb4ab33CompareAugust 8, 2026 23:23
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 8, 2026
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 responding on behalf of Theo

/recheck-vouch

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 9, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 9, 2026 02:09

Dismissing prior approval to re-evaluate 827aae5

@saphid

Copy link
Copy Markdown
ContributorAuthor

@coderabbitai review

@coderabbitai

coderabbitaiBot commented Aug 9, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@t3dotgg
t3dotgg merged commit 65e66ee into pingdotgg:t3code/rebuild-mobile-app-swiftAug 9, 2026
13 of 17 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@saphid@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(ios): preserve project picker scroll during refresh - #5660

Merged
t3dotgg merged 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-project-picker-scroll
Aug 9, 2026
Merged

fix(ios): preserve project picker scroll during refresh#5660
t3dotgg merged 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-project-picker-scroll

Conversation

@saphid

@saphidsaphid commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Replace the New Task project Menu with a sheet-backed SwiftUI List whose logical row identities survive live refreshes without resetting the picker viewport.
  • Re-resolve a tapped group against the latest project snapshot before selecting it, so stale rows cannot choose a vanished project or dismiss the sheet.
  • Share one typed sheet route with the existing branch picker, keep environment choice separate, show an empty live-update state, and make each plain-styled project row fully tappable.

Why

The SwiftUI client continuously receives project snapshots. Rebuilding the old Menu while someone was browsing it reset the viewport to the top. A List updates stable rows in place, so an incoming project can appear without interrupting the user's position.

This is a focused follow-up to the experimental SwiftUI client in #5178 and targets t3code/rebuild-mobile-app-swift, where that client currently lives.

UI Changes

Before: live refresh resets the menuAfter: live refresh preserves the list position
Before refresh, scrolledFixed picker before refresh, anchored at project 10
After refresh, reset to topAfter refresh, still anchored at project 10 with project 23 visible

9-second interaction proof: project 23 arrives while the picker remains anchored (MP4)

Validation

  • T3CodeTests/DailyUXNewTaskTests: 14 passed, 0 failed, 0 skipped on the final reviewed head.
  • Debug build, install, and launch passed on iPhone 17 Pro Max, iOS 26.5.
  • Integrated live-refresh proof: project 10 remained the visual anchor while project 23 arrived and became visible.
  • Integrated final-build interaction: the project sheet opened, selecting project 02 dismissed it, and the composer updated to project 02.
  • Controlled branch-picker comparison: branch search, refresh, Cancel, and visible rows matched the untouched stacking base; the same row-tap automation limitation reproduced on both builds.
  • Stale rows, empty state, environment preference, and stable identities were rechecked in the focused model test and source audit.
  • git diff --check: passed.
  • Direct Claude Opus 5 High review found one project-row hit-area issue; commit 827aae58e fixed it. A fresh post-fix review exited 0 with no actionable findings.
  • Theo merged the reviewed head as 65e66ee51; the three PR-owned files are byte-for-byte identical to 827aae58e, and git range-diff shows the hit-area follow-up folded into the squash while the CI repair remains a separate base commit.
  • Post-merge stacking-head verification: CI passed, and SwiftUI iOS run 31290353405 passed fixture verification plus the full native test job.

Scope

This is one SwiftUI-only bug fix: three files, 208 changed lines, no wire contract, server, web, desktop, or React Native mobile changes. The size:L label reflects the extracted sheet view and focused regression test, not additional product scope.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Implementation and verification used GPT-5.6 Sol High in T3 Code with the Codex harness. Independent review used Claude Opus 5 High in Claude Code.


Note

Low Risk
Focused SwiftUI UX and selection-validation changes in the new-thread flow; no auth, networking, or data-model changes beyond grouping helper usage.

Overview
Replaces the New Task projectMenu with a sheet-backed List so live project snapshot updates no longer jump scroll position to the top. Project and branch pickers now share a single activePicker sheet route (NewTaskPicker).

NewTaskProjectPicker shows grouped projects with checkmarks, empty state, and accessibility on the hero control; the sheet dismisses only when selectProject / selectProjectGroup succeed (Bool return). Group picks resolve via new DailyUXProjectGrouping.selectionTarget against the current groups (handles stale IDs after refresh); tests cover that path.

Reviewed by Cursor Bugbot for commit 827aae5. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Preserve project picker scroll position during refresh in iOS new thread view

  • Replaces the inline Menu for project selection in NewThreadView with a dedicated sheet (NewTaskProjectPicker) driven by a new NewTaskPicker enum, fixing scroll position loss on refresh.
  • Adds DailyUXProjectGrouping.selectionTarget to resolve a project group against the current live groups, so stale or removed group IDs fail gracefully without mutating state.
  • selectProject now validates that the provided project ID exists in creationProjects before applying changes, returning a Bool to indicate success.
  • Behavioral Change: project selection no longer uses a popover menu — it opens a modal sheet with medium/large detents.

Macroscope summarized 827aae5.

Summary by CodeRabbit

  • New Features

    • Added a project picker that groups projects and indicates the current selection.
    • Added clear empty-state handling when no projects are available.
    • Improved project and branch selection with a consistent picker experience.
    • Added accessibility labels and values to the project selector.
  • Bug Fixes

    • Project selection now safely handles outdated or removed project groups and selects the appropriate available project when possible.

@saphid
saphid marked this pull request as ready for review August 7, 2026 23:15
@coderabbitai

coderabbitaiBot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b3edda16-3c3a-4a65-852f-c965a3e1d0af

📥 Commits

Reviewing files that changed from the base of the PR and between ab95c07 and 827aae5.

📒 Files selected for processing (3)
  • apps/swift-ios/Features/Workspace/DailyUXModels.swift
  • apps/swift-ios/Features/Workspace/NewThreadView.swift
  • apps/swift-ios/Tests/FeatureTests/DailyUXNewTaskTests.swift

📝 Walkthrough

Walkthrough

The new thread view now uses a shared project or branch picker. Project groups resolve to preferred current-environment projects, validate selections, and dismiss the picker after successful selection. Tests cover stale and removed group IDs.

Changes

Project selection

Layer / File(s)Summary
Selection resolution
apps/swift-ios/Features/Workspace/DailyUXModels.swift, apps/swift-ios/Features/Workspace/NewThreadView.swift, apps/swift-ios/Tests/FeatureTests/DailyUXNewTaskTests.swift
selectionTarget resolves group IDs to preferred projects. Selection helpers validate IDs and preserve draft state. Tests cover stale and removed groups.
Shared picker presentation
apps/swift-ios/Features/Workspace/NewThreadView.swift
Project and branch sheets use shared picker state. Controls open the correct picker and expose accessibility metadata.
Project picker interface
apps/swift-ios/Features/Workspace/NewThreadView.swift
The project picker displays grouped rows, selection indicators, empty-state handling, cancellation, accessibility traits, and sheet sizing.

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

Sequence Diagram(s)

sequenceDiagram
participant User
participant NewThreadView
participant ProjectPicker
participant DailyUXProjectGrouping
User->>NewThreadView: Open project selector
NewThreadView->>ProjectPicker: Present project groups
User->>ProjectPicker: Select project group
ProjectPicker->>NewThreadView: Return selected group ID
NewThreadView->>DailyUXProjectGrouping: Resolve selectionTarget
DailyUXProjectGrouping-->>NewThreadView: Return preferred project
NewThreadView-->>User: Apply selection and dismiss picker
Loading

Suggested reviewers:t3dotgg

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly and concisely describes the primary change: preserving project picker scroll during refresh.
Description check✅ PassedThe description covers the required sections, explains the change and rationale, includes UI evidence, and completes the checklist.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 7, 2026
@macroscopeapp

macroscopeappBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 827aae5

This is a self-contained iOS UI fix that changes the project picker from a Menu to a sheet-based presentation to preserve scroll position during refresh. The changes include defensive validation and corresponding tests, with no impact outside the picker UI.

You can customize Macroscope's approvability policy. Learn more.

@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch 2 times, most recently from 38b865c to ccf65fcCompareAugust 8, 2026 22:47
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 8, 2026
@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch from ccf65fc to 0b43ed7CompareAugust 8, 2026 23:22
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 8, 2026 23:22

Dismissing prior approval to re-evaluate 0b43ed7

@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch from 0b43ed7 to bb4ab33CompareAugust 8, 2026 23:23
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 8, 2026
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 responding on behalf of Theo

/recheck-vouch

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 9, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 9, 2026 02:09

Dismissing prior approval to re-evaluate 827aae5

@saphid

Copy link
Copy Markdown
ContributorAuthor

@coderabbitai review

@coderabbitai

coderabbitaiBot commented Aug 9, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@t3dotgg
t3dotgg merged commit 65e66ee into pingdotgg:t3code/rebuild-mobile-app-swiftAug 9, 2026
13 of 17 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@saphid@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(ios): preserve project picker scroll during refresh - #5660

Merged
t3dotgg merged 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-project-picker-scroll
Aug 9, 2026
Merged

fix(ios): preserve project picker scroll during refresh#5660
t3dotgg merged 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-project-picker-scroll

Conversation

@saphid

@saphidsaphid commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Replace the New Task project Menu with a sheet-backed SwiftUI List whose logical row identities survive live refreshes without resetting the picker viewport.
  • Re-resolve a tapped group against the latest project snapshot before selecting it, so stale rows cannot choose a vanished project or dismiss the sheet.
  • Share one typed sheet route with the existing branch picker, keep environment choice separate, show an empty live-update state, and make each plain-styled project row fully tappable.

Why

The SwiftUI client continuously receives project snapshots. Rebuilding the old Menu while someone was browsing it reset the viewport to the top. A List updates stable rows in place, so an incoming project can appear without interrupting the user's position.

This is a focused follow-up to the experimental SwiftUI client in #5178 and targets t3code/rebuild-mobile-app-swift, where that client currently lives.

UI Changes

Before: live refresh resets the menuAfter: live refresh preserves the list position
Before refresh, scrolledFixed picker before refresh, anchored at project 10
After refresh, reset to topAfter refresh, still anchored at project 10 with project 23 visible

9-second interaction proof: project 23 arrives while the picker remains anchored (MP4)

Validation

  • T3CodeTests/DailyUXNewTaskTests: 14 passed, 0 failed, 0 skipped on the final reviewed head.
  • Debug build, install, and launch passed on iPhone 17 Pro Max, iOS 26.5.
  • Integrated live-refresh proof: project 10 remained the visual anchor while project 23 arrived and became visible.
  • Integrated final-build interaction: the project sheet opened, selecting project 02 dismissed it, and the composer updated to project 02.
  • Controlled branch-picker comparison: branch search, refresh, Cancel, and visible rows matched the untouched stacking base; the same row-tap automation limitation reproduced on both builds.
  • Stale rows, empty state, environment preference, and stable identities were rechecked in the focused model test and source audit.
  • git diff --check: passed.
  • Direct Claude Opus 5 High review found one project-row hit-area issue; commit 827aae58e fixed it. A fresh post-fix review exited 0 with no actionable findings.
  • Theo merged the reviewed head as 65e66ee51; the three PR-owned files are byte-for-byte identical to 827aae58e, and git range-diff shows the hit-area follow-up folded into the squash while the CI repair remains a separate base commit.
  • Post-merge stacking-head verification: CI passed, and SwiftUI iOS run 31290353405 passed fixture verification plus the full native test job.

Scope

This is one SwiftUI-only bug fix: three files, 208 changed lines, no wire contract, server, web, desktop, or React Native mobile changes. The size:L label reflects the extracted sheet view and focused regression test, not additional product scope.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Implementation and verification used GPT-5.6 Sol High in T3 Code with the Codex harness. Independent review used Claude Opus 5 High in Claude Code.


Note

Low Risk
Focused SwiftUI UX and selection-validation changes in the new-thread flow; no auth, networking, or data-model changes beyond grouping helper usage.

Overview
Replaces the New Task projectMenu with a sheet-backed List so live project snapshot updates no longer jump scroll position to the top. Project and branch pickers now share a single activePicker sheet route (NewTaskPicker).

NewTaskProjectPicker shows grouped projects with checkmarks, empty state, and accessibility on the hero control; the sheet dismisses only when selectProject / selectProjectGroup succeed (Bool return). Group picks resolve via new DailyUXProjectGrouping.selectionTarget against the current groups (handles stale IDs after refresh); tests cover that path.

Reviewed by Cursor Bugbot for commit 827aae5. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Preserve project picker scroll position during refresh in iOS new thread view

  • Replaces the inline Menu for project selection in NewThreadView with a dedicated sheet (NewTaskProjectPicker) driven by a new NewTaskPicker enum, fixing scroll position loss on refresh.
  • Adds DailyUXProjectGrouping.selectionTarget to resolve a project group against the current live groups, so stale or removed group IDs fail gracefully without mutating state.
  • selectProject now validates that the provided project ID exists in creationProjects before applying changes, returning a Bool to indicate success.
  • Behavioral Change: project selection no longer uses a popover menu — it opens a modal sheet with medium/large detents.

Macroscope summarized 827aae5.

Summary by CodeRabbit

  • New Features

    • Added a project picker that groups projects and indicates the current selection.
    • Added clear empty-state handling when no projects are available.
    • Improved project and branch selection with a consistent picker experience.
    • Added accessibility labels and values to the project selector.
  • Bug Fixes

    • Project selection now safely handles outdated or removed project groups and selects the appropriate available project when possible.

@saphid
saphid marked this pull request as ready for review August 7, 2026 23:15
@coderabbitai

coderabbitaiBot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b3edda16-3c3a-4a65-852f-c965a3e1d0af

📥 Commits

Reviewing files that changed from the base of the PR and between ab95c07 and 827aae5.

📒 Files selected for processing (3)
  • apps/swift-ios/Features/Workspace/DailyUXModels.swift
  • apps/swift-ios/Features/Workspace/NewThreadView.swift
  • apps/swift-ios/Tests/FeatureTests/DailyUXNewTaskTests.swift

📝 Walkthrough

Walkthrough

The new thread view now uses a shared project or branch picker. Project groups resolve to preferred current-environment projects, validate selections, and dismiss the picker after successful selection. Tests cover stale and removed group IDs.

Changes

Project selection

Layer / File(s)Summary
Selection resolution
apps/swift-ios/Features/Workspace/DailyUXModels.swift, apps/swift-ios/Features/Workspace/NewThreadView.swift, apps/swift-ios/Tests/FeatureTests/DailyUXNewTaskTests.swift
selectionTarget resolves group IDs to preferred projects. Selection helpers validate IDs and preserve draft state. Tests cover stale and removed groups.
Shared picker presentation
apps/swift-ios/Features/Workspace/NewThreadView.swift
Project and branch sheets use shared picker state. Controls open the correct picker and expose accessibility metadata.
Project picker interface
apps/swift-ios/Features/Workspace/NewThreadView.swift
The project picker displays grouped rows, selection indicators, empty-state handling, cancellation, accessibility traits, and sheet sizing.

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

Sequence Diagram(s)

sequenceDiagram
participant User
participant NewThreadView
participant ProjectPicker
participant DailyUXProjectGrouping
User->>NewThreadView: Open project selector
NewThreadView->>ProjectPicker: Present project groups
User->>ProjectPicker: Select project group
ProjectPicker->>NewThreadView: Return selected group ID
NewThreadView->>DailyUXProjectGrouping: Resolve selectionTarget
DailyUXProjectGrouping-->>NewThreadView: Return preferred project
NewThreadView-->>User: Apply selection and dismiss picker
Loading

Suggested reviewers:t3dotgg

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly and concisely describes the primary change: preserving project picker scroll during refresh.
Description check✅ PassedThe description covers the required sections, explains the change and rationale, includes UI evidence, and completes the checklist.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 7, 2026
@macroscopeapp

macroscopeappBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 827aae5

This is a self-contained iOS UI fix that changes the project picker from a Menu to a sheet-based presentation to preserve scroll position during refresh. The changes include defensive validation and corresponding tests, with no impact outside the picker UI.

You can customize Macroscope's approvability policy. Learn more.

@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch 2 times, most recently from 38b865c to ccf65fcCompareAugust 8, 2026 22:47
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 8, 2026
@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch from ccf65fc to 0b43ed7CompareAugust 8, 2026 23:22
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 8, 2026 23:22

Dismissing prior approval to re-evaluate 0b43ed7

@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch from 0b43ed7 to bb4ab33CompareAugust 8, 2026 23:23
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 8, 2026
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 responding on behalf of Theo

/recheck-vouch

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 9, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 9, 2026 02:09

Dismissing prior approval to re-evaluate 827aae5

@saphid

Copy link
Copy Markdown
ContributorAuthor

@coderabbitai review

@coderabbitai

coderabbitaiBot commented Aug 9, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@t3dotgg
t3dotgg merged commit 65e66ee into pingdotgg:t3code/rebuild-mobile-app-swiftAug 9, 2026
13 of 17 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@saphid@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(ios): preserve project picker scroll during refresh - #5660

Merged
t3dotgg merged 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-project-picker-scroll
Aug 9, 2026
Merged

fix(ios): preserve project picker scroll during refresh#5660
t3dotgg merged 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-project-picker-scroll

Conversation

@saphid

@saphidsaphid commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Replace the New Task project Menu with a sheet-backed SwiftUI List whose logical row identities survive live refreshes without resetting the picker viewport.
  • Re-resolve a tapped group against the latest project snapshot before selecting it, so stale rows cannot choose a vanished project or dismiss the sheet.
  • Share one typed sheet route with the existing branch picker, keep environment choice separate, show an empty live-update state, and make each plain-styled project row fully tappable.

Why

The SwiftUI client continuously receives project snapshots. Rebuilding the old Menu while someone was browsing it reset the viewport to the top. A List updates stable rows in place, so an incoming project can appear without interrupting the user's position.

This is a focused follow-up to the experimental SwiftUI client in #5178 and targets t3code/rebuild-mobile-app-swift, where that client currently lives.

UI Changes

Before: live refresh resets the menuAfter: live refresh preserves the list position
Before refresh, scrolledFixed picker before refresh, anchored at project 10
After refresh, reset to topAfter refresh, still anchored at project 10 with project 23 visible

9-second interaction proof: project 23 arrives while the picker remains anchored (MP4)

Validation

  • T3CodeTests/DailyUXNewTaskTests: 14 passed, 0 failed, 0 skipped on the final reviewed head.
  • Debug build, install, and launch passed on iPhone 17 Pro Max, iOS 26.5.
  • Integrated live-refresh proof: project 10 remained the visual anchor while project 23 arrived and became visible.
  • Integrated final-build interaction: the project sheet opened, selecting project 02 dismissed it, and the composer updated to project 02.
  • Controlled branch-picker comparison: branch search, refresh, Cancel, and visible rows matched the untouched stacking base; the same row-tap automation limitation reproduced on both builds.
  • Stale rows, empty state, environment preference, and stable identities were rechecked in the focused model test and source audit.
  • git diff --check: passed.
  • Direct Claude Opus 5 High review found one project-row hit-area issue; commit 827aae58e fixed it. A fresh post-fix review exited 0 with no actionable findings.
  • Theo merged the reviewed head as 65e66ee51; the three PR-owned files are byte-for-byte identical to 827aae58e, and git range-diff shows the hit-area follow-up folded into the squash while the CI repair remains a separate base commit.
  • Post-merge stacking-head verification: CI passed, and SwiftUI iOS run 31290353405 passed fixture verification plus the full native test job.

Scope

This is one SwiftUI-only bug fix: three files, 208 changed lines, no wire contract, server, web, desktop, or React Native mobile changes. The size:L label reflects the extracted sheet view and focused regression test, not additional product scope.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Implementation and verification used GPT-5.6 Sol High in T3 Code with the Codex harness. Independent review used Claude Opus 5 High in Claude Code.


Note

Low Risk
Focused SwiftUI UX and selection-validation changes in the new-thread flow; no auth, networking, or data-model changes beyond grouping helper usage.

Overview
Replaces the New Task projectMenu with a sheet-backed List so live project snapshot updates no longer jump scroll position to the top. Project and branch pickers now share a single activePicker sheet route (NewTaskPicker).

NewTaskProjectPicker shows grouped projects with checkmarks, empty state, and accessibility on the hero control; the sheet dismisses only when selectProject / selectProjectGroup succeed (Bool return). Group picks resolve via new DailyUXProjectGrouping.selectionTarget against the current groups (handles stale IDs after refresh); tests cover that path.

Reviewed by Cursor Bugbot for commit 827aae5. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Preserve project picker scroll position during refresh in iOS new thread view

  • Replaces the inline Menu for project selection in NewThreadView with a dedicated sheet (NewTaskProjectPicker) driven by a new NewTaskPicker enum, fixing scroll position loss on refresh.
  • Adds DailyUXProjectGrouping.selectionTarget to resolve a project group against the current live groups, so stale or removed group IDs fail gracefully without mutating state.
  • selectProject now validates that the provided project ID exists in creationProjects before applying changes, returning a Bool to indicate success.
  • Behavioral Change: project selection no longer uses a popover menu — it opens a modal sheet with medium/large detents.

Macroscope summarized 827aae5.

Summary by CodeRabbit

  • New Features

    • Added a project picker that groups projects and indicates the current selection.
    • Added clear empty-state handling when no projects are available.
    • Improved project and branch selection with a consistent picker experience.
    • Added accessibility labels and values to the project selector.
  • Bug Fixes

    • Project selection now safely handles outdated or removed project groups and selects the appropriate available project when possible.

@saphid
saphid marked this pull request as ready for review August 7, 2026 23:15
@coderabbitai

coderabbitaiBot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b3edda16-3c3a-4a65-852f-c965a3e1d0af

📥 Commits

Reviewing files that changed from the base of the PR and between ab95c07 and 827aae5.

📒 Files selected for processing (3)
  • apps/swift-ios/Features/Workspace/DailyUXModels.swift
  • apps/swift-ios/Features/Workspace/NewThreadView.swift
  • apps/swift-ios/Tests/FeatureTests/DailyUXNewTaskTests.swift

📝 Walkthrough

Walkthrough

The new thread view now uses a shared project or branch picker. Project groups resolve to preferred current-environment projects, validate selections, and dismiss the picker after successful selection. Tests cover stale and removed group IDs.

Changes

Project selection

Layer / File(s)Summary
Selection resolution
apps/swift-ios/Features/Workspace/DailyUXModels.swift, apps/swift-ios/Features/Workspace/NewThreadView.swift, apps/swift-ios/Tests/FeatureTests/DailyUXNewTaskTests.swift
selectionTarget resolves group IDs to preferred projects. Selection helpers validate IDs and preserve draft state. Tests cover stale and removed groups.
Shared picker presentation
apps/swift-ios/Features/Workspace/NewThreadView.swift
Project and branch sheets use shared picker state. Controls open the correct picker and expose accessibility metadata.
Project picker interface
apps/swift-ios/Features/Workspace/NewThreadView.swift
The project picker displays grouped rows, selection indicators, empty-state handling, cancellation, accessibility traits, and sheet sizing.

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

Sequence Diagram(s)

sequenceDiagram
participant User
participant NewThreadView
participant ProjectPicker
participant DailyUXProjectGrouping
User->>NewThreadView: Open project selector
NewThreadView->>ProjectPicker: Present project groups
User->>ProjectPicker: Select project group
ProjectPicker->>NewThreadView: Return selected group ID
NewThreadView->>DailyUXProjectGrouping: Resolve selectionTarget
DailyUXProjectGrouping-->>NewThreadView: Return preferred project
NewThreadView-->>User: Apply selection and dismiss picker
Loading

Suggested reviewers:t3dotgg

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly and concisely describes the primary change: preserving project picker scroll during refresh.
Description check✅ PassedThe description covers the required sections, explains the change and rationale, includes UI evidence, and completes the checklist.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 7, 2026
@macroscopeapp

macroscopeappBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 827aae5

This is a self-contained iOS UI fix that changes the project picker from a Menu to a sheet-based presentation to preserve scroll position during refresh. The changes include defensive validation and corresponding tests, with no impact outside the picker UI.

You can customize Macroscope's approvability policy. Learn more.

@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch 2 times, most recently from 38b865c to ccf65fcCompareAugust 8, 2026 22:47
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 8, 2026
@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch from ccf65fc to 0b43ed7CompareAugust 8, 2026 23:22
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 8, 2026 23:22

Dismissing prior approval to re-evaluate 0b43ed7

@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch from 0b43ed7 to bb4ab33CompareAugust 8, 2026 23:23
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 8, 2026
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 responding on behalf of Theo

/recheck-vouch

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 9, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 9, 2026 02:09

Dismissing prior approval to re-evaluate 827aae5

@saphid

Copy link
Copy Markdown
ContributorAuthor

@coderabbitai review

@coderabbitai

coderabbitaiBot commented Aug 9, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@t3dotgg
t3dotgg merged commit 65e66ee into pingdotgg:t3code/rebuild-mobile-app-swiftAug 9, 2026
13 of 17 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@saphid@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(ios): preserve project picker scroll during refresh - #5660

Merged
t3dotgg merged 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-project-picker-scroll
Aug 9, 2026
Merged

fix(ios): preserve project picker scroll during refresh#5660
t3dotgg merged 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-project-picker-scroll

Conversation

@saphid

@saphidsaphid commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Replace the New Task project Menu with a sheet-backed SwiftUI List whose logical row identities survive live refreshes without resetting the picker viewport.
  • Re-resolve a tapped group against the latest project snapshot before selecting it, so stale rows cannot choose a vanished project or dismiss the sheet.
  • Share one typed sheet route with the existing branch picker, keep environment choice separate, show an empty live-update state, and make each plain-styled project row fully tappable.

Why

The SwiftUI client continuously receives project snapshots. Rebuilding the old Menu while someone was browsing it reset the viewport to the top. A List updates stable rows in place, so an incoming project can appear without interrupting the user's position.

This is a focused follow-up to the experimental SwiftUI client in #5178 and targets t3code/rebuild-mobile-app-swift, where that client currently lives.

UI Changes

Before: live refresh resets the menuAfter: live refresh preserves the list position
Before refresh, scrolledFixed picker before refresh, anchored at project 10
After refresh, reset to topAfter refresh, still anchored at project 10 with project 23 visible

9-second interaction proof: project 23 arrives while the picker remains anchored (MP4)

Validation

  • T3CodeTests/DailyUXNewTaskTests: 14 passed, 0 failed, 0 skipped on the final reviewed head.
  • Debug build, install, and launch passed on iPhone 17 Pro Max, iOS 26.5.
  • Integrated live-refresh proof: project 10 remained the visual anchor while project 23 arrived and became visible.
  • Integrated final-build interaction: the project sheet opened, selecting project 02 dismissed it, and the composer updated to project 02.
  • Controlled branch-picker comparison: branch search, refresh, Cancel, and visible rows matched the untouched stacking base; the same row-tap automation limitation reproduced on both builds.
  • Stale rows, empty state, environment preference, and stable identities were rechecked in the focused model test and source audit.
  • git diff --check: passed.
  • Direct Claude Opus 5 High review found one project-row hit-area issue; commit 827aae58e fixed it. A fresh post-fix review exited 0 with no actionable findings.
  • Theo merged the reviewed head as 65e66ee51; the three PR-owned files are byte-for-byte identical to 827aae58e, and git range-diff shows the hit-area follow-up folded into the squash while the CI repair remains a separate base commit.
  • Post-merge stacking-head verification: CI passed, and SwiftUI iOS run 31290353405 passed fixture verification plus the full native test job.

Scope

This is one SwiftUI-only bug fix: three files, 208 changed lines, no wire contract, server, web, desktop, or React Native mobile changes. The size:L label reflects the extracted sheet view and focused regression test, not additional product scope.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Implementation and verification used GPT-5.6 Sol High in T3 Code with the Codex harness. Independent review used Claude Opus 5 High in Claude Code.


Note

Low Risk
Focused SwiftUI UX and selection-validation changes in the new-thread flow; no auth, networking, or data-model changes beyond grouping helper usage.

Overview
Replaces the New Task projectMenu with a sheet-backed List so live project snapshot updates no longer jump scroll position to the top. Project and branch pickers now share a single activePicker sheet route (NewTaskPicker).

NewTaskProjectPicker shows grouped projects with checkmarks, empty state, and accessibility on the hero control; the sheet dismisses only when selectProject / selectProjectGroup succeed (Bool return). Group picks resolve via new DailyUXProjectGrouping.selectionTarget against the current groups (handles stale IDs after refresh); tests cover that path.

Reviewed by Cursor Bugbot for commit 827aae5. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Preserve project picker scroll position during refresh in iOS new thread view

  • Replaces the inline Menu for project selection in NewThreadView with a dedicated sheet (NewTaskProjectPicker) driven by a new NewTaskPicker enum, fixing scroll position loss on refresh.
  • Adds DailyUXProjectGrouping.selectionTarget to resolve a project group against the current live groups, so stale or removed group IDs fail gracefully without mutating state.
  • selectProject now validates that the provided project ID exists in creationProjects before applying changes, returning a Bool to indicate success.
  • Behavioral Change: project selection no longer uses a popover menu — it opens a modal sheet with medium/large detents.

Macroscope summarized 827aae5.

Summary by CodeRabbit

  • New Features

    • Added a project picker that groups projects and indicates the current selection.
    • Added clear empty-state handling when no projects are available.
    • Improved project and branch selection with a consistent picker experience.
    • Added accessibility labels and values to the project selector.
  • Bug Fixes

    • Project selection now safely handles outdated or removed project groups and selects the appropriate available project when possible.

@saphid
saphid marked this pull request as ready for review August 7, 2026 23:15
@coderabbitai

coderabbitaiBot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b3edda16-3c3a-4a65-852f-c965a3e1d0af

📥 Commits

Reviewing files that changed from the base of the PR and between ab95c07 and 827aae5.

📒 Files selected for processing (3)
  • apps/swift-ios/Features/Workspace/DailyUXModels.swift
  • apps/swift-ios/Features/Workspace/NewThreadView.swift
  • apps/swift-ios/Tests/FeatureTests/DailyUXNewTaskTests.swift

📝 Walkthrough

Walkthrough

The new thread view now uses a shared project or branch picker. Project groups resolve to preferred current-environment projects, validate selections, and dismiss the picker after successful selection. Tests cover stale and removed group IDs.

Changes

Project selection

Layer / File(s)Summary
Selection resolution
apps/swift-ios/Features/Workspace/DailyUXModels.swift, apps/swift-ios/Features/Workspace/NewThreadView.swift, apps/swift-ios/Tests/FeatureTests/DailyUXNewTaskTests.swift
selectionTarget resolves group IDs to preferred projects. Selection helpers validate IDs and preserve draft state. Tests cover stale and removed groups.
Shared picker presentation
apps/swift-ios/Features/Workspace/NewThreadView.swift
Project and branch sheets use shared picker state. Controls open the correct picker and expose accessibility metadata.
Project picker interface
apps/swift-ios/Features/Workspace/NewThreadView.swift
The project picker displays grouped rows, selection indicators, empty-state handling, cancellation, accessibility traits, and sheet sizing.

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

Sequence Diagram(s)

sequenceDiagram
participant User
participant NewThreadView
participant ProjectPicker
participant DailyUXProjectGrouping
User->>NewThreadView: Open project selector
NewThreadView->>ProjectPicker: Present project groups
User->>ProjectPicker: Select project group
ProjectPicker->>NewThreadView: Return selected group ID
NewThreadView->>DailyUXProjectGrouping: Resolve selectionTarget
DailyUXProjectGrouping-->>NewThreadView: Return preferred project
NewThreadView-->>User: Apply selection and dismiss picker
Loading

Suggested reviewers:t3dotgg

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly and concisely describes the primary change: preserving project picker scroll during refresh.
Description check✅ PassedThe description covers the required sections, explains the change and rationale, includes UI evidence, and completes the checklist.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 7, 2026
@macroscopeapp

macroscopeappBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 827aae5

This is a self-contained iOS UI fix that changes the project picker from a Menu to a sheet-based presentation to preserve scroll position during refresh. The changes include defensive validation and corresponding tests, with no impact outside the picker UI.

You can customize Macroscope's approvability policy. Learn more.

@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch 2 times, most recently from 38b865c to ccf65fcCompareAugust 8, 2026 22:47
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 8, 2026
@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch from ccf65fc to 0b43ed7CompareAugust 8, 2026 23:22
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 8, 2026 23:22

Dismissing prior approval to re-evaluate 0b43ed7

@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch from 0b43ed7 to bb4ab33CompareAugust 8, 2026 23:23
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 8, 2026
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 responding on behalf of Theo

/recheck-vouch

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 9, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 9, 2026 02:09

Dismissing prior approval to re-evaluate 827aae5

@saphid

Copy link
Copy Markdown
ContributorAuthor

@coderabbitai review

@coderabbitai

coderabbitaiBot commented Aug 9, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@t3dotgg
t3dotgg merged commit 65e66ee into pingdotgg:t3code/rebuild-mobile-app-swiftAug 9, 2026
13 of 17 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@saphid@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(ios): preserve project picker scroll during refresh - #5660

Merged
t3dotgg merged 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-project-picker-scroll
Aug 9, 2026
Merged

fix(ios): preserve project picker scroll during refresh#5660
t3dotgg merged 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-project-picker-scroll

Conversation

@saphid

@saphidsaphid commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Replace the New Task project Menu with a sheet-backed SwiftUI List whose logical row identities survive live refreshes without resetting the picker viewport.
  • Re-resolve a tapped group against the latest project snapshot before selecting it, so stale rows cannot choose a vanished project or dismiss the sheet.
  • Share one typed sheet route with the existing branch picker, keep environment choice separate, show an empty live-update state, and make each plain-styled project row fully tappable.

Why

The SwiftUI client continuously receives project snapshots. Rebuilding the old Menu while someone was browsing it reset the viewport to the top. A List updates stable rows in place, so an incoming project can appear without interrupting the user's position.

This is a focused follow-up to the experimental SwiftUI client in #5178 and targets t3code/rebuild-mobile-app-swift, where that client currently lives.

UI Changes

Before: live refresh resets the menuAfter: live refresh preserves the list position
Before refresh, scrolledFixed picker before refresh, anchored at project 10
After refresh, reset to topAfter refresh, still anchored at project 10 with project 23 visible

9-second interaction proof: project 23 arrives while the picker remains anchored (MP4)

Validation

  • T3CodeTests/DailyUXNewTaskTests: 14 passed, 0 failed, 0 skipped on the final reviewed head.
  • Debug build, install, and launch passed on iPhone 17 Pro Max, iOS 26.5.
  • Integrated live-refresh proof: project 10 remained the visual anchor while project 23 arrived and became visible.
  • Integrated final-build interaction: the project sheet opened, selecting project 02 dismissed it, and the composer updated to project 02.
  • Controlled branch-picker comparison: branch search, refresh, Cancel, and visible rows matched the untouched stacking base; the same row-tap automation limitation reproduced on both builds.
  • Stale rows, empty state, environment preference, and stable identities were rechecked in the focused model test and source audit.
  • git diff --check: passed.
  • Direct Claude Opus 5 High review found one project-row hit-area issue; commit 827aae58e fixed it. A fresh post-fix review exited 0 with no actionable findings.
  • Theo merged the reviewed head as 65e66ee51; the three PR-owned files are byte-for-byte identical to 827aae58e, and git range-diff shows the hit-area follow-up folded into the squash while the CI repair remains a separate base commit.
  • Post-merge stacking-head verification: CI passed, and SwiftUI iOS run 31290353405 passed fixture verification plus the full native test job.

Scope

This is one SwiftUI-only bug fix: three files, 208 changed lines, no wire contract, server, web, desktop, or React Native mobile changes. The size:L label reflects the extracted sheet view and focused regression test, not additional product scope.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Implementation and verification used GPT-5.6 Sol High in T3 Code with the Codex harness. Independent review used Claude Opus 5 High in Claude Code.


Note

Low Risk
Focused SwiftUI UX and selection-validation changes in the new-thread flow; no auth, networking, or data-model changes beyond grouping helper usage.

Overview
Replaces the New Task projectMenu with a sheet-backed List so live project snapshot updates no longer jump scroll position to the top. Project and branch pickers now share a single activePicker sheet route (NewTaskPicker).

NewTaskProjectPicker shows grouped projects with checkmarks, empty state, and accessibility on the hero control; the sheet dismisses only when selectProject / selectProjectGroup succeed (Bool return). Group picks resolve via new DailyUXProjectGrouping.selectionTarget against the current groups (handles stale IDs after refresh); tests cover that path.

Reviewed by Cursor Bugbot for commit 827aae5. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Preserve project picker scroll position during refresh in iOS new thread view

  • Replaces the inline Menu for project selection in NewThreadView with a dedicated sheet (NewTaskProjectPicker) driven by a new NewTaskPicker enum, fixing scroll position loss on refresh.
  • Adds DailyUXProjectGrouping.selectionTarget to resolve a project group against the current live groups, so stale or removed group IDs fail gracefully without mutating state.
  • selectProject now validates that the provided project ID exists in creationProjects before applying changes, returning a Bool to indicate success.
  • Behavioral Change: project selection no longer uses a popover menu — it opens a modal sheet with medium/large detents.

Macroscope summarized 827aae5.

Summary by CodeRabbit

  • New Features

    • Added a project picker that groups projects and indicates the current selection.
    • Added clear empty-state handling when no projects are available.
    • Improved project and branch selection with a consistent picker experience.
    • Added accessibility labels and values to the project selector.
  • Bug Fixes

    • Project selection now safely handles outdated or removed project groups and selects the appropriate available project when possible.

@saphid
saphid marked this pull request as ready for review August 7, 2026 23:15
@coderabbitai

coderabbitaiBot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b3edda16-3c3a-4a65-852f-c965a3e1d0af

📥 Commits

Reviewing files that changed from the base of the PR and between ab95c07 and 827aae5.

📒 Files selected for processing (3)
  • apps/swift-ios/Features/Workspace/DailyUXModels.swift
  • apps/swift-ios/Features/Workspace/NewThreadView.swift
  • apps/swift-ios/Tests/FeatureTests/DailyUXNewTaskTests.swift

📝 Walkthrough

Walkthrough

The new thread view now uses a shared project or branch picker. Project groups resolve to preferred current-environment projects, validate selections, and dismiss the picker after successful selection. Tests cover stale and removed group IDs.

Changes

Project selection

Layer / File(s)Summary
Selection resolution
apps/swift-ios/Features/Workspace/DailyUXModels.swift, apps/swift-ios/Features/Workspace/NewThreadView.swift, apps/swift-ios/Tests/FeatureTests/DailyUXNewTaskTests.swift
selectionTarget resolves group IDs to preferred projects. Selection helpers validate IDs and preserve draft state. Tests cover stale and removed groups.
Shared picker presentation
apps/swift-ios/Features/Workspace/NewThreadView.swift
Project and branch sheets use shared picker state. Controls open the correct picker and expose accessibility metadata.
Project picker interface
apps/swift-ios/Features/Workspace/NewThreadView.swift
The project picker displays grouped rows, selection indicators, empty-state handling, cancellation, accessibility traits, and sheet sizing.

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

Sequence Diagram(s)

sequenceDiagram
participant User
participant NewThreadView
participant ProjectPicker
participant DailyUXProjectGrouping
User->>NewThreadView: Open project selector
NewThreadView->>ProjectPicker: Present project groups
User->>ProjectPicker: Select project group
ProjectPicker->>NewThreadView: Return selected group ID
NewThreadView->>DailyUXProjectGrouping: Resolve selectionTarget
DailyUXProjectGrouping-->>NewThreadView: Return preferred project
NewThreadView-->>User: Apply selection and dismiss picker
Loading

Suggested reviewers:t3dotgg

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly and concisely describes the primary change: preserving project picker scroll during refresh.
Description check✅ PassedThe description covers the required sections, explains the change and rationale, includes UI evidence, and completes the checklist.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 7, 2026
@macroscopeapp

macroscopeappBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 827aae5

This is a self-contained iOS UI fix that changes the project picker from a Menu to a sheet-based presentation to preserve scroll position during refresh. The changes include defensive validation and corresponding tests, with no impact outside the picker UI.

You can customize Macroscope's approvability policy. Learn more.

@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch 2 times, most recently from 38b865c to ccf65fcCompareAugust 8, 2026 22:47
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 8, 2026
@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch from ccf65fc to 0b43ed7CompareAugust 8, 2026 23:22
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 8, 2026 23:22

Dismissing prior approval to re-evaluate 0b43ed7

@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch from 0b43ed7 to bb4ab33CompareAugust 8, 2026 23:23
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 8, 2026
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 responding on behalf of Theo

/recheck-vouch

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 9, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 9, 2026 02:09

Dismissing prior approval to re-evaluate 827aae5

@saphid

Copy link
Copy Markdown
ContributorAuthor

@coderabbitai review

@coderabbitai

coderabbitaiBot commented Aug 9, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@t3dotgg
t3dotgg merged commit 65e66ee into pingdotgg:t3code/rebuild-mobile-app-swiftAug 9, 2026
13 of 17 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@saphid@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(ios): preserve project picker scroll during refresh - #5660

Merged
t3dotgg merged 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-project-picker-scroll
Aug 9, 2026
Merged

fix(ios): preserve project picker scroll during refresh#5660
t3dotgg merged 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-project-picker-scroll

Conversation

@saphid

@saphidsaphid commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Replace the New Task project Menu with a sheet-backed SwiftUI List whose logical row identities survive live refreshes without resetting the picker viewport.
  • Re-resolve a tapped group against the latest project snapshot before selecting it, so stale rows cannot choose a vanished project or dismiss the sheet.
  • Share one typed sheet route with the existing branch picker, keep environment choice separate, show an empty live-update state, and make each plain-styled project row fully tappable.

Why

The SwiftUI client continuously receives project snapshots. Rebuilding the old Menu while someone was browsing it reset the viewport to the top. A List updates stable rows in place, so an incoming project can appear without interrupting the user's position.

This is a focused follow-up to the experimental SwiftUI client in #5178 and targets t3code/rebuild-mobile-app-swift, where that client currently lives.

UI Changes

Before: live refresh resets the menuAfter: live refresh preserves the list position
Before refresh, scrolledFixed picker before refresh, anchored at project 10
After refresh, reset to topAfter refresh, still anchored at project 10 with project 23 visible

9-second interaction proof: project 23 arrives while the picker remains anchored (MP4)

Validation

  • T3CodeTests/DailyUXNewTaskTests: 14 passed, 0 failed, 0 skipped on the final reviewed head.
  • Debug build, install, and launch passed on iPhone 17 Pro Max, iOS 26.5.
  • Integrated live-refresh proof: project 10 remained the visual anchor while project 23 arrived and became visible.
  • Integrated final-build interaction: the project sheet opened, selecting project 02 dismissed it, and the composer updated to project 02.
  • Controlled branch-picker comparison: branch search, refresh, Cancel, and visible rows matched the untouched stacking base; the same row-tap automation limitation reproduced on both builds.
  • Stale rows, empty state, environment preference, and stable identities were rechecked in the focused model test and source audit.
  • git diff --check: passed.
  • Direct Claude Opus 5 High review found one project-row hit-area issue; commit 827aae58e fixed it. A fresh post-fix review exited 0 with no actionable findings.
  • Theo merged the reviewed head as 65e66ee51; the three PR-owned files are byte-for-byte identical to 827aae58e, and git range-diff shows the hit-area follow-up folded into the squash while the CI repair remains a separate base commit.
  • Post-merge stacking-head verification: CI passed, and SwiftUI iOS run 31290353405 passed fixture verification plus the full native test job.

Scope

This is one SwiftUI-only bug fix: three files, 208 changed lines, no wire contract, server, web, desktop, or React Native mobile changes. The size:L label reflects the extracted sheet view and focused regression test, not additional product scope.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Implementation and verification used GPT-5.6 Sol High in T3 Code with the Codex harness. Independent review used Claude Opus 5 High in Claude Code.


Note

Low Risk
Focused SwiftUI UX and selection-validation changes in the new-thread flow; no auth, networking, or data-model changes beyond grouping helper usage.

Overview
Replaces the New Task projectMenu with a sheet-backed List so live project snapshot updates no longer jump scroll position to the top. Project and branch pickers now share a single activePicker sheet route (NewTaskPicker).

NewTaskProjectPicker shows grouped projects with checkmarks, empty state, and accessibility on the hero control; the sheet dismisses only when selectProject / selectProjectGroup succeed (Bool return). Group picks resolve via new DailyUXProjectGrouping.selectionTarget against the current groups (handles stale IDs after refresh); tests cover that path.

Reviewed by Cursor Bugbot for commit 827aae5. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Preserve project picker scroll position during refresh in iOS new thread view

  • Replaces the inline Menu for project selection in NewThreadView with a dedicated sheet (NewTaskProjectPicker) driven by a new NewTaskPicker enum, fixing scroll position loss on refresh.
  • Adds DailyUXProjectGrouping.selectionTarget to resolve a project group against the current live groups, so stale or removed group IDs fail gracefully without mutating state.
  • selectProject now validates that the provided project ID exists in creationProjects before applying changes, returning a Bool to indicate success.
  • Behavioral Change: project selection no longer uses a popover menu — it opens a modal sheet with medium/large detents.

Macroscope summarized 827aae5.

Summary by CodeRabbit

  • New Features

    • Added a project picker that groups projects and indicates the current selection.
    • Added clear empty-state handling when no projects are available.
    • Improved project and branch selection with a consistent picker experience.
    • Added accessibility labels and values to the project selector.
  • Bug Fixes

    • Project selection now safely handles outdated or removed project groups and selects the appropriate available project when possible.

@saphid
saphid marked this pull request as ready for review August 7, 2026 23:15
@coderabbitai

coderabbitaiBot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b3edda16-3c3a-4a65-852f-c965a3e1d0af

📥 Commits

Reviewing files that changed from the base of the PR and between ab95c07 and 827aae5.

📒 Files selected for processing (3)
  • apps/swift-ios/Features/Workspace/DailyUXModels.swift
  • apps/swift-ios/Features/Workspace/NewThreadView.swift
  • apps/swift-ios/Tests/FeatureTests/DailyUXNewTaskTests.swift

📝 Walkthrough

Walkthrough

The new thread view now uses a shared project or branch picker. Project groups resolve to preferred current-environment projects, validate selections, and dismiss the picker after successful selection. Tests cover stale and removed group IDs.

Changes

Project selection

Layer / File(s)Summary
Selection resolution
apps/swift-ios/Features/Workspace/DailyUXModels.swift, apps/swift-ios/Features/Workspace/NewThreadView.swift, apps/swift-ios/Tests/FeatureTests/DailyUXNewTaskTests.swift
selectionTarget resolves group IDs to preferred projects. Selection helpers validate IDs and preserve draft state. Tests cover stale and removed groups.
Shared picker presentation
apps/swift-ios/Features/Workspace/NewThreadView.swift
Project and branch sheets use shared picker state. Controls open the correct picker and expose accessibility metadata.
Project picker interface
apps/swift-ios/Features/Workspace/NewThreadView.swift
The project picker displays grouped rows, selection indicators, empty-state handling, cancellation, accessibility traits, and sheet sizing.

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

Sequence Diagram(s)

sequenceDiagram
participant User
participant NewThreadView
participant ProjectPicker
participant DailyUXProjectGrouping
User->>NewThreadView: Open project selector
NewThreadView->>ProjectPicker: Present project groups
User->>ProjectPicker: Select project group
ProjectPicker->>NewThreadView: Return selected group ID
NewThreadView->>DailyUXProjectGrouping: Resolve selectionTarget
DailyUXProjectGrouping-->>NewThreadView: Return preferred project
NewThreadView-->>User: Apply selection and dismiss picker
Loading

Suggested reviewers:t3dotgg

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly and concisely describes the primary change: preserving project picker scroll during refresh.
Description check✅ PassedThe description covers the required sections, explains the change and rationale, includes UI evidence, and completes the checklist.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 7, 2026
@macroscopeapp

macroscopeappBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 827aae5

This is a self-contained iOS UI fix that changes the project picker from a Menu to a sheet-based presentation to preserve scroll position during refresh. The changes include defensive validation and corresponding tests, with no impact outside the picker UI.

You can customize Macroscope's approvability policy. Learn more.

@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch 2 times, most recently from 38b865c to ccf65fcCompareAugust 8, 2026 22:47
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 8, 2026
@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch from ccf65fc to 0b43ed7CompareAugust 8, 2026 23:22
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 8, 2026 23:22

Dismissing prior approval to re-evaluate 0b43ed7

@saphid
saphidforce-pushed the agent/swiftui-project-picker-scroll branch from 0b43ed7 to bb4ab33CompareAugust 8, 2026 23:23
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 8, 2026
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 responding on behalf of Theo

/recheck-vouch

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 9, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 9, 2026 02:09

Dismissing prior approval to re-evaluate 827aae5

@saphid

Copy link
Copy Markdown
ContributorAuthor

@coderabbitai review

@coderabbitai

coderabbitaiBot commented Aug 9, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@t3dotgg
t3dotgg merged commit 65e66ee into pingdotgg:t3code/rebuild-mobile-app-swiftAug 9, 2026
13 of 17 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@saphid@t3dotgg