Ver código fonte

add input validation for override target

polscm32 aka Marvout 1 ano atrás
pai
commit
ba057e96f6

+ 22 - 0
FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift

@@ -34,6 +34,7 @@ extension OverrideProfilesConfig {
         @Published var activeOverrideName: String = ""
         @Published var currentActiveOverride: OverrideStored?
         @Published var showOverrideEditSheet = false
+        @Published var showInvalidTargetAlert = false
 
         var units: GlucoseUnits = .mmolL
 
@@ -50,6 +51,11 @@ extension OverrideProfilesConfig {
         @Published var hbt: Double = 160
         @Published var didSaveSettings: Bool = false
 
+        var alertMessage: String {
+            let target: String = units == .mgdL ? "70-270 mg/dl" : "4-15 mmol/l"
+            return "Please enter a valid target between" + " \(target)."
+        }
+
         override func subscribe() {
             setupNotification()
             units = settingsManager.settings.units
@@ -64,6 +70,22 @@ extension OverrideProfilesConfig {
 
         let coredataContext = CoreDataStack.shared.newTaskContext()
         let viewContext = CoreDataStack.shared.persistentContainer.viewContext
+
+        func isInputInvalid(target: Decimal) -> Bool {
+            if units == .mgdL,
+               target < 70 || target > 270
+            {
+                showInvalidTargetAlert = true
+                return true
+            } else if units == .mmolL,
+                      target < 4 || target > 15
+            {
+                showInvalidTargetAlert = true
+                return true
+            } else {
+                return false
+            }
+        }
     }
 }
 

+ 51 - 35
FreeAPS/Sources/Modules/OverrideProfilesConfig/View/AddOverrideForm.swift

@@ -47,6 +47,11 @@ struct AddOverrideForm: View {
         return formatter
     }
 
+    private var alertMessage: String {
+        let target: String = state.units == .mgdL ? "70-270 mg/dl" : "4-15 mmol/l"
+        return "Please enter a valid target between" + " \(target)."
+    }
+
     var body: some View {
         NavigationView {
             Form {
@@ -181,40 +186,42 @@ struct AddOverrideForm: View {
     private var startAndSaveProfiles: some View {
         HStack {
             Button("Start new Override") {
-                showAlert.toggle()
+                if !state.isInputInvalid(target: state.target) {
+                    showAlert.toggle()
 
-                alertString = "\(state.overrideSliderPercentage.formatted(.number)) %, " +
-                    (
-                        state.overrideDuration > 0 || !state
-                            .indefinite ?
-                            (
-                                state
-                                    .overrideDuration
-                                    .formatted(.number.grouping(.never).rounded().precision(.fractionLength(0))) +
-                                    " min."
-                            ) :
-                            NSLocalizedString(" infinite duration.", comment: "")
-                    ) +
-                    (
-                        (state.target == 0 || !state.shouldOverrideTarget) ? "" :
-                            (" Target: " + state.target.formatted() + " " + state.units.rawValue + ".")
-                    )
-                    +
-                    (
-                        state
-                            .smbIsOff ?
-                            NSLocalizedString(
-                                " SMBs are disabled either by schedule or during the entire duration.",
-                                comment: ""
-                            ) : ""
-                    )
-                    +
-                    "\n\n"
-                    +
-                    NSLocalizedString(
-                        "Starting this override will change your profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Override” will start your new Override or edit your current active Override.",
-                        comment: ""
-                    )
+                    alertString = "\(state.overrideSliderPercentage.formatted(.number)) %, " +
+                        (
+                            state.overrideDuration > 0 || !state
+                                .indefinite ?
+                                (
+                                    state
+                                        .overrideDuration
+                                        .formatted(.number.grouping(.never).rounded().precision(.fractionLength(0))) +
+                                        " min."
+                                ) :
+                                NSLocalizedString(" infinite duration.", comment: "")
+                        ) +
+                        (
+                            (state.target == 0 || !state.shouldOverrideTarget) ? "" :
+                                (" Target: " + state.target.formatted() + " " + state.units.rawValue + ".")
+                        )
+                        +
+                        (
+                            state
+                                .smbIsOff ?
+                                NSLocalizedString(
+                                    " SMBs are disabled either by schedule or during the entire duration.",
+                                    comment: ""
+                                ) : ""
+                        )
+                        +
+                        "\n\n"
+                        +
+                        NSLocalizedString(
+                            "Starting this override will change your profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Override” will start your new Override or edit your current active Override.",
+                            comment: ""
+                        )
+                }
             }
             .disabled(unChanged())
             .buttonStyle(BorderlessButtonStyle())
@@ -239,10 +246,19 @@ struct AddOverrideForm: View {
                     Text(alertString)
                 }
             )
+            .alert(isPresented: $state.showInvalidTargetAlert) {
+                Alert(
+                    title: Text("Invalid Input"),
+                    message: Text("\(state.alertMessage)"),
+                    dismissButton: .default(Text("OK")) { state.showInvalidTargetAlert = false }
+                )
+            }
             Button {
                 Task {
-                    await state.saveOverridePreset()
-                    dismiss()
+                    if !state.isInputInvalid(target: state.target) {
+                        await state.saveOverridePreset()
+                        dismiss()
+                    }
                 }
             }
             label: { Text("Save as Override") }

+ 22 - 8
FreeAPS/Sources/Modules/OverrideProfilesConfig/View/EditOverrideForm.swift

@@ -26,6 +26,7 @@ struct EditOverrideForm: View {
     @State private var hasChanges = false
     @State private var isEditing = false
     @State private var target_override = false
+    @State private var showAlert = false
 
     init(overrideToEdit: OverrideStored, state: OverrideProfilesConfig.StateModel) {
         override = overrideToEdit
@@ -104,6 +105,13 @@ struct EditOverrideForm: View {
                         resetValues()
                     }
                 }
+                .alert(isPresented: $state.showInvalidTargetAlert) {
+                    Alert(
+                        title: Text("Invalid Input"),
+                        message: Text("\(state.alertMessage)"),
+                        dismissButton: .default(Text("OK")) { state.showInvalidTargetAlert = false }
+                    )
+                }
         }
     }
 
@@ -279,13 +287,18 @@ struct EditOverrideForm: View {
         HStack {
             Spacer()
             Button(action: {
-                saveChanges()
-                do {
-                    try override.managedObjectContext?.save()
-                    hasChanges = false
-                    presentationMode.wrappedValue.dismiss()
-                } catch {
-                    debugPrint("\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to edit Override")
+                if !state.isInputInvalid(target: target ?? 0) {
+                    saveChanges()
+
+                    do {
+                        guard let moc = override.managedObjectContext else { return }
+                        guard moc.hasChanges else { return }
+                        try moc.save()
+                        hasChanges = false
+                        presentationMode.wrappedValue.dismiss()
+                    } catch {
+                        debugPrint("\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to edit Override")
+                    }
                 }
             }, label: {
                 Text("Save")
@@ -309,7 +322,8 @@ struct EditOverrideForm: View {
         override.duration = NSDecimalNumber(decimal: duration)
         if target_override {
             override.target = target.map {
-                state.units == .mmolL ? NSDecimalNumber(decimal: $0.asMgdL) : NSDecimalNumber(decimal: $0) }
+                state.units == .mmolL ? NSDecimalNumber(decimal: $0.asMgdL) : NSDecimalNumber(decimal: $0)
+            }
         } else {
             override.target = 0
         }