diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index 33d5b99ba8..55109fd166 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -1025,6 +1025,7 @@ func initializeChat(start: Bool, dbKey: String? = nil, refreshInvitations: Bool m.chatInitialized = true m.currentUser = try apiGetActiveUser() if m.currentUser == nil { + onboardingStageDefault.set(.step1_SimpleXInfo) m.onboardingStage = .step1_SimpleXInfo } else if start { try startChat(refreshInvitations: refreshInvitations) @@ -1050,9 +1051,10 @@ func startChat(refreshInvitations: Bool = true) throws { registerToken(token: token) } withAnimation { - m.onboardingStage = m.onboardingStage == .step2_CreateProfile && m.users.count == 1 + let savedOnboardingStage = onboardingStageDefault.get() + m.onboardingStage = [.step1_SimpleXInfo, .step2_CreateProfile].contains(savedOnboardingStage) && m.users.count == 1 ? .step3_CreateSimpleXAddress - : .onboardingComplete + : savedOnboardingStage } } ChatReceiver.shared.start() diff --git a/apps/ios/Shared/Views/Database/MigrateToAppGroupView.swift b/apps/ios/Shared/Views/Database/MigrateToAppGroupView.swift index d2c0d4d860..79b5ea52c8 100644 --- a/apps/ios/Shared/Views/Database/MigrateToAppGroupView.swift +++ b/apps/ios/Shared/Views/Database/MigrateToAppGroupView.swift @@ -109,6 +109,7 @@ struct MigrateToAppGroupView: View { do { resetChatCtrl() try initializeChat(start: true) + onboardingStageDefault.set(.step4_SetNotificationsMode) chatModel.onboardingStage = .step4_SetNotificationsMode setV3DBMigration(.ready) } catch let error { diff --git a/apps/ios/Shared/Views/Onboarding/CreateProfile.swift b/apps/ios/Shared/Views/Onboarding/CreateProfile.swift index 50048b502a..316eb2b78b 100644 --- a/apps/ios/Shared/Views/Onboarding/CreateProfile.swift +++ b/apps/ios/Shared/Views/Onboarding/CreateProfile.swift @@ -124,7 +124,10 @@ struct CreateProfile: View { m.currentUser = try apiCreateActiveUser(profile) if m.users.isEmpty { try startChat() - withAnimation { m.onboardingStage = .step3_CreateSimpleXAddress } + withAnimation { + onboardingStageDefault.set(.step3_CreateSimpleXAddress) + m.onboardingStage = .step3_CreateSimpleXAddress + } } else { dismiss() m.users = try listUsers() diff --git a/apps/ios/Shared/Views/Onboarding/CreateSimpleXAddress.swift b/apps/ios/Shared/Views/Onboarding/CreateSimpleXAddress.swift index 7cf4f3b065..28a58ba7cd 100644 --- a/apps/ios/Shared/Views/Onboarding/CreateSimpleXAddress.swift +++ b/apps/ios/Shared/Views/Onboarding/CreateSimpleXAddress.swift @@ -113,6 +113,7 @@ struct CreateSimpleXAddress: View { VStack(spacing: 8) { Button { withAnimation { + onboardingStageDefault.set(.step4_SetNotificationsMode) m.onboardingStage = .step4_SetNotificationsMode } } label: { @@ -154,6 +155,7 @@ struct CreateSimpleXAddress: View { case let .success(composeResult): switch composeResult { case .sent: + onboardingStageDefault.set(.step4_SetNotificationsMode) m.onboardingStage = .step4_SetNotificationsMode default: () } @@ -173,6 +175,7 @@ struct CreateSimpleXAddress: View { private func continueButton() -> some View { Button { withAnimation { + onboardingStageDefault.set(.step4_SetNotificationsMode) m.onboardingStage = .step4_SetNotificationsMode } } label: { diff --git a/apps/ios/Shared/Views/Onboarding/OnboardingView.swift b/apps/ios/Shared/Views/Onboarding/OnboardingView.swift index 3d2c45dfae..b0734be642 100644 --- a/apps/ios/Shared/Views/Onboarding/OnboardingView.swift +++ b/apps/ios/Shared/Views/Onboarding/OnboardingView.swift @@ -22,12 +22,14 @@ struct OnboardingView: View { } } -enum OnboardingStage { +enum OnboardingStage: String, Identifiable { case step1_SimpleXInfo case step2_CreateProfile case step3_CreateSimpleXAddress case step4_SetNotificationsMode case onboardingComplete + + public var id: Self { self } } struct OnboardingStepsView_Previews: PreviewProvider { diff --git a/apps/ios/Shared/Views/Onboarding/SetNotificationsMode.swift b/apps/ios/Shared/Views/Onboarding/SetNotificationsMode.swift index 1a608f82c3..3bbd7a5c94 100644 --- a/apps/ios/Shared/Views/Onboarding/SetNotificationsMode.swift +++ b/apps/ios/Shared/Views/Onboarding/SetNotificationsMode.swift @@ -35,6 +35,7 @@ struct SetNotificationsMode: View { } else { AlertManager.shared.showAlertMsg(title: "No device token!") } + onboardingStageDefault.set(.onboardingComplete) m.onboardingStage = .onboardingComplete } label: { if case .off = notificationMode { diff --git a/apps/ios/Shared/Views/Onboarding/SimpleXInfo.swift b/apps/ios/Shared/Views/Onboarding/SimpleXInfo.swift index 5a0cdff2c6..ce1d727b10 100644 --- a/apps/ios/Shared/Views/Onboarding/SimpleXInfo.swift +++ b/apps/ios/Shared/Views/Onboarding/SimpleXInfo.swift @@ -99,6 +99,7 @@ struct OnboardingActionButton: View { private func actionButton(_ label: LocalizedStringKey, onboarding: OnboardingStage) -> some View { Button { withAnimation { + onboardingStageDefault.set(onboarding) m.onboardingStage = onboarding } } label: { diff --git a/apps/ios/Shared/Views/UserSettings/SettingsView.swift b/apps/ios/Shared/Views/UserSettings/SettingsView.swift index 4f8bb4f503..5f5c1334b6 100644 --- a/apps/ios/Shared/Views/UserSettings/SettingsView.swift +++ b/apps/ios/Shared/Views/UserSettings/SettingsView.swift @@ -45,6 +45,7 @@ let DEFAULT_LIVE_MESSAGE_ALERT_SHOWN = "liveMessageAlertShown" let DEFAULT_SHOW_HIDDEN_PROFILES_NOTICE = "showHiddenProfilesNotice" let DEFAULT_SHOW_MUTE_PROFILE_ALERT = "showMuteProfileAlert" let DEFAULT_WHATS_NEW_VERSION = "defaultWhatsNewVersion" +let DEFAULT_ONBOARDING_STAGE = "onboardingStage" let appDefaults: [String: Any] = [ DEFAULT_SHOW_LA_NOTICE: false, @@ -71,6 +72,7 @@ let appDefaults: [String: Any] = [ DEFAULT_LIVE_MESSAGE_ALERT_SHOWN: false, DEFAULT_SHOW_HIDDEN_PROFILES_NOTICE: true, DEFAULT_SHOW_MUTE_PROFILE_ALERT: true, + DEFAULT_ONBOARDING_STAGE: OnboardingStage.onboardingComplete.rawValue, ] enum SimpleXLinkMode: String, Identifiable { @@ -105,6 +107,8 @@ let privacySimplexLinkModeDefault = EnumDefault(defaults: UserD let privacyLocalAuthModeDefault = EnumDefault(defaults: UserDefaults.standard, forKey: DEFAULT_LA_MODE, withDefault: .system) +let onboardingStageDefault = EnumDefault(defaults: UserDefaults.standard, forKey: DEFAULT_ONBOARDING_STAGE, withDefault: .onboardingComplete) + func setGroupDefaults() { privacyAcceptImagesGroupDefault.set(UserDefaults.standard.bool(forKey: DEFAULT_PRIVACY_ACCEPT_IMAGES)) }