diff --git a/apps/ios/Sources/RootTabsNavigation.swift b/apps/ios/Sources/RootTabsNavigation.swift index 7af1fe9f9ec2..bdeaf16c4cd5 100644 --- a/apps/ios/Sources/RootTabsNavigation.swift +++ b/apps/ios/Sources/RootTabsNavigation.swift @@ -243,13 +243,15 @@ extension RootTabs { if gatewayConnected { return .none } + // Saved gateway state survives independently of the onboarding markers. + // Explicit resets bypass this route through evaluateOnboardingPresentation(force:). + if hasExistingGatewayConfig { + return .none + } if shouldPresentOnLaunch || !hasConnectedOnce || !onboardingComplete { return .onboarding } - if !hasExistingGatewayConfig { - return .settings - } - return .none + return .settings } static func shouldPresentQuickSetup( diff --git a/apps/ios/Tests/RootTabsPresentationTests.swift b/apps/ios/Tests/RootTabsPresentationTests.swift index a2bb8a8d8af2..2a037d219758 100644 --- a/apps/ios/Tests/RootTabsPresentationTests.swift +++ b/apps/ios/Tests/RootTabsPresentationTests.swift @@ -5,6 +5,39 @@ import UIKit @MainActor struct RootTabsPresentationTests { + @Test func `configured gateway bypasses launch request and stale onboarding markers`() { + let route = RootTabs.startupPresentationRoute( + gatewayConnected: false, + hasConnectedOnce: false, + onboardingComplete: false, + hasExistingGatewayConfig: true, + shouldPresentOnLaunch: true) + + #expect(route == .none) + } + + @Test func `fresh install presents onboarding`() { + let route = RootTabs.startupPresentationRoute( + gatewayConnected: false, + hasConnectedOnce: false, + onboardingComplete: false, + hasExistingGatewayConfig: false, + shouldPresentOnLaunch: false) + + #expect(route == .onboarding) + } + + @Test func `completed setup without gateway opens settings`() { + let route = RootTabs.startupPresentationRoute( + gatewayConnected: false, + hasConnectedOnce: true, + onboardingComplete: true, + hasExistingGatewayConfig: false, + shouldPresentOnLaunch: false) + + #expect(route == .settings) + } + @Test func `quick setup does not present when gateway already configured`() { let shouldPresent = RootTabs.shouldPresentQuickSetup( quickSetupDismissed: false,