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

Change treatment view calculation handling (#24)

* Change treatment view calculation handling
* Add onChange handler for carb input
* onChange listener handles input in a debounced fashion; waits for user input to stop before calculation
* Remove Calculate button from treatment view, no longer required

* Address review feedback by @polscm32
* Remove obsolete state variable
* Lower debounce delay from 0.5s to 0.35s
* Gracefully unwrap variable debounce when assigning it to the Dispatch queue
Deniz Cengiz 2 лет назад
Родитель
Сommit
f80d20d365

+ 3 - 1
FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift

@@ -182,7 +182,9 @@ extension Bolus {
             deltaBG = delta
         }
 
-        // CALCULATIONS FOR THE BOLUS CALCULATOR
+        // MARK: CALCULATIONS FOR THE BOLUS CALCULATOR
+
+        /// Calculate insulin recommendation
         func calculateInsulin() -> Decimal {
             // ensure that isf is in mg/dL
             var conversion: Decimal {

+ 23 - 29
FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift

@@ -10,15 +10,15 @@ extension Bolus {
 
         @StateObject var state: StateModel
 
-        @State private var showInfo = false
+        @State private var showInfo: Bool = false
         @State private var showAlert = false
         @State private var autofocus: Bool = true
         @State private var calculatorDetent = PresentationDetent.medium
-        @State var pushed = false
-        @State var isPromptPresented = false
-        @State var dish: String = ""
-        @State var saved = false
-        @State var isCalculating: Bool = false
+        @State private var pushed: Bool = false
+        @State private var isPromptPresented: Bool = false
+        @State private var dish: String = ""
+        @State private var saved: Bool = false
+        @State private var debounce: DispatchWorkItem?
 
         @Environment(\.managedObjectContext) var moc
 
@@ -81,7 +81,18 @@ extension Bolus {
         }
 
         private var empty: Bool {
-            state.carbs <= 0 && state.fat <= 0 && state.protein <= 0
+            state.useFPUconversion ? (state.carbs <= 0 && state.fat <= 0 && state.protein <= 0) : (state.carbs <= 0)
+        }
+
+        /// Handles macro input (carb, fat, protein) in a debounced fashion.
+        func handleDebouncedInput() {
+            debounce?.cancel()
+            debounce = DispatchWorkItem { [self] in
+                state.insulinCalculated = state.calculateInsulin()
+            }
+            if let debounce = debounce {
+                DispatchQueue.main.asyncAfter(deadline: .now() + 0.35, execute: debounce)
+            }
         }
 
         private var presetPopover: some View {
@@ -277,7 +288,11 @@ extension Bolus {
                                     formatter: formatter,
                                     autofocus: false,
                                     cleanInput: true
-                                )
+                                ).onChange(of: state.carbs) { _ in
+                                    if state.carbs > 0 {
+                                        handleDebouncedInput()
+                                    }
+                                }
                                 Text("g").foregroundColor(.secondary)
                             }
 
@@ -327,27 +342,6 @@ extension Bolus {
                             .popover(isPresented: $isPromptPresented) {
                                 presetPopover
                             }
-
-                            HStack {
-                                Spacer()
-                                Button {
-                                    isCalculating = true
-                                    state.insulinCalculated = state.calculateInsulin()
-
-                                    DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
-                                        isCalculating = false
-                                    }
-                                }
-                                label: {
-                                    if !isCalculating {
-                                        Text("Calculate")
-                                    } else {
-                                        ProgressView().progressViewStyle(CircularProgressViewStyle())
-                                    }
-                                }.disabled(empty)
-
-                                Spacer()
-                            }
                         }.listRowBackground(Color.chart)
 
                         if state.displayPresets {

+ 17 - 15
FreeAPS/Sources/Modules/Home/HomeStateModel.swift

@@ -259,25 +259,27 @@ extension Home {
         }
 
         private func setupGlucose() {
-                  DispatchQueue.main.async { [weak self] in
-                      guard let self = self else { return }
-                      let filteredGlucose = self.provider.filteredGlucose(hours: self.filteredHours)
+            DispatchQueue.main.async { [weak self] in
+                guard let self = self else { return }
+                let filteredGlucose = self.provider.filteredGlucose(hours: self.filteredHours)
+
+                self.glucose = filteredGlucose
+                self.manualGlucose = filteredGlucose.filter { $0.type == GlucoseType.manual.rawValue }
 
-                      self.glucose = filteredGlucose
-                      self.manualGlucose = filteredGlucose.filter { $0.type == GlucoseType.manual.rawValue }
+                self.recentGlucose = self.glucose.last
 
-                      self.recentGlucose = self.glucose.last
+                if self.glucose.count >= 2 {
+                    self
+                        .glucoseDelta = (self.recentGlucose?.glucose ?? 0) -
+                        (self.glucose[self.glucose.count - 2].glucose ?? 0)
+                } else {
+                    self.glucoseDelta = nil
+                }
 
-                      if self.glucose.count >= 2 {
-                          self.glucoseDelta = (self.recentGlucose?.glucose ?? 0) - (self.glucose[self.glucose.count - 2].glucose ?? 0)
-                      } else {
-                          self.glucoseDelta = nil
-                      }
+                self.alarm = self.provider.glucoseStorage.alarm
+            }
+        }
 
-                      self.alarm = self.provider.glucoseStorage.alarm
-                  }
-              }
-        
         private func setupBasals() {
             DispatchQueue.main.async { [weak self] in
                 guard let self = self else { return }