fix(ios): gateway error shows twice on the Settings Gateway page#98856
Conversation
|
Codex review: needs maintainer review before merge. Reviewed July 2, 2026, 7:17 AM ET / 11:17 UTC. Summary PR surface: Other +66. Total +66 across 9 files. Reproducibility: yes. from source inspection, though I did not run the simulator: current main renders the same appModel.lastGatewayProblem in RootTabs and again at the top of Settings > Gateway. Review metrics: none identified. Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Mantis proof suggestion Risk before merge
Maintainer options:
Next step before merge
Security Review detailsBest possible solution: Land the current resolved branch after required checks finish, keeping RootTabs as the single steady-state gateway problem surface while preserving onboarding and quick-setup local banners. Do we have a high-confidence way to reproduce the issue? Yes from source inspection, though I did not run the simulator: current main renders the same appModel.lastGatewayProblem in RootTabs and again at the top of Settings > Gateway. Is this the best way to solve the issue? Yes. Centralizing steady-state gateway problem UI in RootTabs deletes the duplicate settings path while keeping details, retry, trust, reset-onboarding actions, and local cover banners available. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 574604e3dae6. Label changesLabel justifications:
Evidence reviewedPR surface: Other +66. Total +66 across 9 files. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
|
e45bc0c to
6b25164
Compare
Gateway connection errors on the Settings > Gateway page appeared twice: as the app-wide toast and again as an embedded banner section. Remove the embedded banner (and its now-dead sheet/action helpers) so problems surface only via the root toast, animate the toast in smoothly from the top, and support swipe-up to dismiss with re-arm on new problems.
A swiped-away toast stayed hidden when a retry failed with an identical problem, because value equality alone produces no observable change. The model now counts every problem report; a report while hidden re-shows the toast, and a report while visible shakes it instead of stacking a new one.
…i18n inventory The root toast is now the only gateway problem surface outside covers, so it must keep the reset-onboarding primary action the removed settings banner had: auth-token-mismatch problems now show Reset onboarding and run the full GatewayOnboardingReset flow. Also refreshes the native i18n inventory for the changed Swift strings.
6b25164 to
4cfafa3
Compare
|
Merged via squash.
|
…nclaw#98856) * fix(ios): show gateway errors once as a swipeable animated toast Gateway connection errors on the Settings > Gateway page appeared twice: as the app-wide toast and again as an embedded banner section. Remove the embedded banner (and its now-dead sheet/action helpers) so problems surface only via the root toast, animate the toast in smoothly from the top, and support swipe-up to dismiss with re-arm on new problems. * fix(ios): re-surface gateway toast on repeated problem reports A swiped-away toast stayed hidden when a retry failed with an identical problem, because value equality alone produces no observable change. The model now counts every problem report; a report while hidden re-shows the toast, and a report while visible shakes it instead of stacking a new one. * fix(ios): keep reset-onboarding action on the gateway toast and sync i18n inventory The root toast is now the only gateway problem surface outside covers, so it must keep the reset-onboarding primary action the removed settings banner had: auth-token-mismatch problems now show Reset onboarding and run the full GatewayOnboardingReset flow. Also refreshes the native i18n inventory for the changed Swift strings. * fix(ios): preserve gateway problem recovery state --------- Co-authored-by: Peter Steinberger <steipete@gmail.com>
…nclaw#98856) * fix(ios): show gateway errors once as a swipeable animated toast Gateway connection errors on the Settings > Gateway page appeared twice: as the app-wide toast and again as an embedded banner section. Remove the embedded banner (and its now-dead sheet/action helpers) so problems surface only via the root toast, animate the toast in smoothly from the top, and support swipe-up to dismiss with re-arm on new problems. * fix(ios): re-surface gateway toast on repeated problem reports A swiped-away toast stayed hidden when a retry failed with an identical problem, because value equality alone produces no observable change. The model now counts every problem report; a report while hidden re-shows the toast, and a report while visible shakes it instead of stacking a new one. * fix(ios): keep reset-onboarding action on the gateway toast and sync i18n inventory The root toast is now the only gateway problem surface outside covers, so it must keep the reset-onboarding primary action the removed settings banner had: auth-token-mismatch problems now show Reset onboarding and run the full GatewayOnboardingReset flow. Also refreshes the native i18n inventory for the changed Swift strings. * fix(ios): preserve gateway problem recovery state --------- Co-authored-by: Peter Steinberger <steipete@gmail.com>
What Problem This Solves
Fixes an issue where users opening Settings > Gateway on iOS would see the same gateway connection error twice: once as the app-wide toast at the top of the screen and again as a duplicate banner section embedded at the top of the Gateway details page. The toast also appeared and disappeared without animation, and once swiped away it could stay hidden forever when the same error kept recurring.
Why This Change Was Made
Gateway problems now surface through a single owner — the root toast in
RootTabs— so the embedded settings-page banner, its details sheet, and the settings-side action helpers were deleted rather than kept as a second path. The toast springs in smoothly from the top (respecting Reduce Motion) and supports swipe-up to dismiss. Dismissal only lasts until the next problem report:NodeAppModelcounts every report (including re-reports of a value-equal problem, which SwiftUI observation alone cannot see), so a report while hidden re-shows the toast, and a report while it is already visible shakes it instead of stacking a duplicate. The toast also keeps the reset-onboarding primary action the settings banner used to own — auth-token-mismatch problems show "Reset onboarding" and run the fullGatewayOnboardingResetflow. The onboarding wizard and quick-setup sheet keep their embedded banners intentionally, since they are presented as covers where the root toast is not visible.User Impact
Gateway errors appear exactly once, as an animated toast that users can swipe up to hide; it reliably returns on the next failure and shakes when the same error fires while it is on screen. Retry, Details, and Reset onboarding actions all remain available from the toast. The settings layer shrank by 76 lines; the net prod growth (+21 lines) is the new report-signal, shake, and swipe-dismiss behavior.
Evidence
GatewayProblemPrimaryActionTestsran on the iOS 26.5 simulator: 3/3 passed, including a new test pinning the "Reset onboarding" title for reset-suggesting problems.pnpm native:i18n:syncregeneratedapps/.i18n/native-source.json;pnpm native:i18n:checkis green (this was the failingnative-i18nCI job).swiftformat --lintclean on all touched files;RootTabsSourceGuardTestsassertions verified against the updated sources, including guards that the settings page no longer embedsGatewayProblemBanner, that the root toast owns swipe dismissal and the reset action, and that every problem report re-surfaces or shakes the toast.onDisappearreset), and swipe-dismiss state is a plain flag rather than a captured problem value.gateway-toast-demo.mp4