Просмотр исходного кода

Merge pull request #512 from nightscout/fix-onboarding-ns-import-errors

Onboarding: Ensure Nightscout Import Errors Trigger Alert Display Properly
Sam King 1 год назад
Родитель
Сommit
b91b99faab

+ 3 - 0
Trio/Sources/Localizations/Main/Localizable.xcstrings

@@ -228886,6 +228886,9 @@
         }
       }
     },
+    "Try again in a moment, or configure your Therapy Settings manually instead." : {
+
+    },
     "Turn this setting on to give basal adjustments more agility. Keep this setting off if your basal needs are not highly variable." : {
       "localizations" : {
         "bg" : {

+ 0 - 3
Trio/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift

@@ -7,9 +7,6 @@ extension NightscoutConfig {
         let resolver: Resolver
         let displayClose: Bool
         @StateObject var state = StateModel()
-        @State var importAlert: Alert?
-        @State var isImportAlertPresented = false
-        @State var importedHasRun = false
         @State private var shouldDisplayHint: Bool = false
         @State var hintDetent = PresentationDetent.large
         @State var selectedVerboseHint: AnyView?

+ 9 - 17
Trio/Sources/Modules/Onboarding/OnboardingStateModel+Nightscout.swift

@@ -59,13 +59,10 @@ extension Onboarding.StateModel {
 
         do {
             guard let fetchedProfile = await nightscoutManager.importSettings() else {
-                await MainActor.run {
-                    nightscoutImportStatus = .failed
-                }
                 throw NSError(
                     domain: "ImportError",
                     code: 1,
-                    userInfo: [NSLocalizedDescriptionKey: "Cannot find the default Nightscout Profile."]
+                    userInfo: [NSLocalizedDescriptionKey: "Cannot find the Nightscout Profile named \"default\"."]
                 )
             }
 
@@ -83,9 +80,6 @@ extension Onboarding.StateModel {
             }
 
             if carbratios.contains(where: { $0.ratio <= 0 }) {
-                await MainActor.run {
-                    nightscoutImportStatus = .failed
-                }
                 throw NSError(
                     domain: "ImportError",
                     code: 2,
@@ -105,9 +99,6 @@ extension Onboarding.StateModel {
             }
 
             if basals.contains(where: { $0.rate <= 0 }) {
-                await MainActor.run {
-                    nightscoutImportStatus = .failed
-                }
                 throw NSError(
                     domain: "ImportError",
                     code: 3,
@@ -116,9 +107,6 @@ extension Onboarding.StateModel {
             }
 
             if basals.reduce(0, { $0 + $1.rate }) <= 0 {
-                await MainActor.run {
-                    nightscoutImportStatus = .failed
-                }
                 throw NSError(
                     domain: "ImportError",
                     code: 4,
@@ -139,9 +127,6 @@ extension Onboarding.StateModel {
             }
 
             if sensitivities.contains(where: { $0.sensitivity <= 0 }) {
-                await MainActor.run {
-                    nightscoutImportStatus = .failed
-                }
                 throw NSError(
                     domain: "ImportError",
                     code: 5,
@@ -178,7 +163,8 @@ extension Onboarding.StateModel {
             )
         } catch {
             await MainActor.run {
-                self.nightscoutImportErrors.append(error.localizedDescription)
+                self.nightscoutImportError = NightscoutImportError(message: error.localizedDescription)
+                self.nightscoutImportStatus = .failed
                 debug(.service, "Settings import failed with error: \(error.localizedDescription)")
             }
         }
@@ -259,8 +245,14 @@ extension Onboarding.StateModel {
     }
 
     enum ImportStatus {
+        case none
         case running
         case finished
         case failed
     }
 }
+
+struct NightscoutImportError: Identifiable {
+    let id = UUID()
+    let message: String
+}

+ 2 - 2
Trio/Sources/Modules/Onboarding/OnboardingStateModel.swift

@@ -104,8 +104,8 @@ extension Onboarding {
         var isValidNightscoutURL: Bool = false
         var isConnectingToNS: Bool = false
         var isConnectedToNS: Bool = false
-        var nightscoutImportErrors: [String] = []
-        var nightscoutImportStatus: ImportStatus = .finished
+        var nightscoutImportError: NightscoutImportError?
+        var nightscoutImportStatus: ImportStatus = .none
 
         // MARK: - Units and Pump Omboarding Option
 

+ 15 - 16
Trio/Sources/Modules/Onboarding/View/OnboardingSteps/Nightscout/NightscoutImportStepView.swift

@@ -2,9 +2,7 @@ import SwiftUI
 
 struct NightscoutImportStepView: View {
     @Bindable var state: Onboarding.StateModel
-
-    @State var importAlert: Alert?
-    @State var isImportAlertPresented: Bool = false
+    @State private var activeImportError: NightscoutImportError?
 
     var body: some View {
         ZStack {
@@ -71,20 +69,21 @@ struct NightscoutImportStepView: View {
             }
         }
         .frame(maxWidth: .infinity, maxHeight: .infinity)
-        .alert(isPresented: $isImportAlertPresented) {
-            if state.nightscoutImportStatus == .failed, state.nightscoutImportErrors.isNotEmpty,
-               let errorMessage = state.nightscoutImportErrors.first
-            {
-                DispatchQueue.main.async {
-                    importAlert = Alert(
-                        title: Text("Import Failed"),
-                        message: Text(errorMessage.description),
-                        dismissButton: .default(Text("OK"))
-                    )
-                    isImportAlertPresented = true
-                }
+        .alert(item: $activeImportError) { error in
+            Alert(
+                title: Text("Import Failed"),
+                message: Text(
+                    error
+                        .message + "\n\n" +
+                        String(localized: "Try again in a moment, or configure your Therapy Settings manually instead.")
+                ),
+                dismissButton: .default(Text("OK"))
+            )
+        }
+        .onChange(of: state.nightscoutImportStatus) { _, newStatus in
+            if newStatus == .failed {
+                activeImportError = state.nightscoutImportError
             }
-            return importAlert ?? Alert(title: Text("Unknown Error"))
         }
     }
 }