From 7843ab5e450cceb29ab86b7a20c50d44d6ee20a3 Mon Sep 17 00:00:00 2001 From: Mariano Belinky Date: Sun, 15 Feb 2026 16:35:10 +0000 Subject: [PATCH] iOS: avoid onboarding modal when gateway already configured --- apps/ios/Sources/Onboarding/OnboardingStateStore.swift | 3 +++ apps/ios/Sources/RootCanvas.swift | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/ios/Sources/Onboarding/OnboardingStateStore.swift b/apps/ios/Sources/Onboarding/OnboardingStateStore.swift index 193fdbf792d..9822ac1706f 100644 --- a/apps/ios/Sources/Onboarding/OnboardingStateStore.swift +++ b/apps/ios/Sources/Onboarding/OnboardingStateStore.swift @@ -25,6 +25,9 @@ enum OnboardingStateStore { @MainActor static func shouldPresentOnLaunch(appModel: NodeAppModel, defaults: UserDefaults = .standard) -> Bool { if defaults.bool(forKey: Self.completedDefaultsKey) { return false } + // If we have a last-known connection config, don't force onboarding on launch. Auto-connect + // should handle reconnecting, and users can always open onboarding manually if needed. + if GatewaySettingsStore.loadLastGatewayConnection() != nil { return false } return appModel.gatewayServerName == nil } diff --git a/apps/ios/Sources/RootCanvas.swift b/apps/ios/Sources/RootCanvas.swift index ebbf36a3444..ea6a245e0ea 100644 --- a/apps/ios/Sources/RootCanvas.swift +++ b/apps/ios/Sources/RootCanvas.swift @@ -67,7 +67,9 @@ struct RootCanvas: View { SettingsTab() case .chat: ChatSheet( - gateway: self.appModel.operatorSession, + // Mobile chat UI should use the node role RPC surface (chat.* / sessions.*) + // to avoid requiring operator scopes like operator.read. + gateway: self.appModel.gatewaySession, sessionKey: self.appModel.mainSessionKey, agentName: self.appModel.activeAgentName, userAccent: self.appModel.seamColor) @@ -109,6 +111,7 @@ struct RootCanvas: View { if newValue != nil { self.onboardingComplete = true self.hasConnectedOnce = true + OnboardingStateStore.markCompleted(mode: nil) } self.maybeAutoOpenSettings() } @@ -176,6 +179,11 @@ struct RootCanvas: View { guard !self.didEvaluateOnboarding else { return } self.didEvaluateOnboarding = true + // If we've connected before or have a saved connection config, don't force onboarding on launch. + // Auto-connect + Settings cover recovery without blocking the UI behind onboarding. + if self.hasConnectedOnce || self.onboardingComplete || self.hasExistingGatewayConfig() { + return + } guard OnboardingStateStore.shouldPresentOnLaunch(appModel: self.appModel) else { return } self.onboardingAllowSkip = true self.showOnboarding = true