Browse Source

Fix default target when sheet opens; UI adjustments WIP

Deniz Cengiz 1 năm trước cách đây
mục cha
commit
011c1de8cd

+ 7 - 1
FreeAPS/Sources/Modules/OverrideConfig/OverrideProvider.swift

@@ -1,3 +1,9 @@
 extension OverrideConfig {
-    final class Provider: BaseProvider, OverrideProvider {}
+    final class Provider: BaseProvider, OverrideProvider {
+        func getBGTarget() async -> BGTargets {
+            await storage.retrieveAsync(OpenAPS.Settings.bgTargets, as: BGTargets.self)
+                ?? BGTargets(from: OpenAPS.defaults(for: OpenAPS.Settings.bgTargets))
+                ?? BGTargets(units: .mgdL, userPreferredUnits: .mgdL, targets: [])
+        }
+    }
 }

+ 59 - 2
FreeAPS/Sources/Modules/OverrideConfig/OverrideStateModel.swift

@@ -15,6 +15,7 @@ extension OverrideConfig {
         var indefinite = true
         var overrideDuration: Decimal = 0
         var target: Decimal = 0
+        var currentGlucoseTarget: Decimal = 100
         var shouldOverrideTarget: Bool = false
         var smbIsOff: Bool = false
         var id = ""
@@ -105,6 +106,56 @@ extension OverrideConfig {
             }
         }
 
+        func getCurrentGlucoseTarget() async {
+            let now = Date()
+            let calendar = Calendar.current
+            let dateFormatter = DateFormatter()
+            dateFormatter.dateFormat = "HH:mm:ss"
+            dateFormatter.timeZone = TimeZone.current
+
+            let bgTargets = await provider.getBGTarget()
+            let entries: [(start: String, value: Decimal)] = bgTargets.targets.map { ($0.start, $0.low) }
+
+            for (index, entry) in entries.enumerated() {
+                guard let entryTime = dateFormatter.date(from: entry.start) else {
+                    print("Invalid entry start time: \(entry.start)")
+                    continue
+                }
+
+                let entryComponents = calendar.dateComponents([.hour, .minute, .second], from: entryTime)
+                let entryStartTime = calendar.date(
+                    bySettingHour: entryComponents.hour!,
+                    minute: entryComponents.minute!,
+                    second: entryComponents.second!,
+                    of: now
+                )!
+
+                let entryEndTime: Date
+                if index < entries.count - 1,
+                   let nextEntryTime = dateFormatter.date(from: entries[index + 1].start)
+                {
+                    let nextEntryComponents = calendar.dateComponents([.hour, .minute, .second], from: nextEntryTime)
+                    entryEndTime = calendar.date(
+                        bySettingHour: nextEntryComponents.hour!,
+                        minute: nextEntryComponents.minute!,
+                        second: nextEntryComponents.second!,
+                        of: now
+                    )!
+                } else {
+                    entryEndTime = calendar.date(byAdding: .day, value: 1, to: entryStartTime)!
+                }
+
+                if now >= entryStartTime, now < entryEndTime {
+                    await MainActor.run {
+                        currentGlucoseTarget = units == .mgdL ? entry.value : entry.value.asMmolL
+                        target = currentGlucoseTarget
+                        tempTargetTarget = currentGlucoseTarget
+                    }
+                    return
+                }
+            }
+        }
+
         private func setupSettings() {
             units = settingsManager.settings.units
             defaultSmbMinutes = settingsManager.preferences.maxSMBBasalMinutes
@@ -114,6 +165,9 @@ extension OverrideConfig {
             settingHalfBasalTarget = settingsManager.preferences.halfBasalExerciseTarget
             halfBasalTarget = settingsManager.preferences.halfBasalExerciseTarget
             percentage = Double(computeAdjustedPercentage() * 100)
+            Task {
+                await getCurrentGlucoseTarget()
+            }
         }
 
         func isInputInvalid(target: Decimal) -> Bool {
@@ -507,7 +561,7 @@ extension OverrideConfig.StateModel {
         end = 23
         smbMinutes = defaultSmbMinutes
         uamMinutes = defaultUamMinutes
-        target = 0
+        target = currentGlucoseTarget
     }
 }
 
@@ -791,7 +845,7 @@ extension OverrideConfig.StateModel {
 
     @MainActor func resetTempTargetState() async {
         tempTargetName = ""
-        tempTargetTarget = 0
+        tempTargetTarget = currentGlucoseTarget
         tempTargetDuration = 0
         percentage = 100
         halfBasalTarget = settingsManager.preferences.halfBasalExerciseTarget
@@ -862,5 +916,8 @@ extension OverrideConfig.StateModel: SettingsObserver {
         defaultUamMinutes = settingsManager.preferences.maxUAMSMBBasalMinutes
         maxValue = settingsManager.preferences.autosensMax
         minValue = settingsManager.preferences.autosensMin
+        Task {
+            await getCurrentGlucoseTarget()
+        }
     }
 }

+ 45 - 15
FreeAPS/Sources/Modules/OverrideConfig/View/AddTempTargetForm.swift

@@ -93,7 +93,12 @@ struct AddTempTargetForm: View {
                     sheetTitle: "Help"
                 )
             }
-            .onAppear { targetStep = state.units == .mgdL ? 5 : 9 }
+            .onAppear {
+                targetStep = state.units == .mgdL ? 5 : 9
+                Task {
+                    await state.getCurrentGlucoseTarget()
+                }
+            }
         }
     }
 
@@ -205,14 +210,33 @@ struct AddTempTargetForm: View {
                 }
             }.listRowBackground(Color.chart)
 
-            if state.tempTargetTarget != 0 {
-                let headerText = state
-                    .tempTargetTarget > 100 ?
-                    "Raised Sensitivity: Insulin reduced to \(formattedPercentage(state.percentage))% of regular amount." :
-                    "Lowered Sensitivity: Insulin increased to \(formattedPercentage(state.percentage))% of regular amount."
+            if state.tempTargetTarget != state.currentGlucoseTarget {
+                let computedHalfBasalTarget = state.computeHalfBasalTarget()
+
                 Section(
-                    header: Text(headerText).textCase(.none)
-                        .foregroundStyle(colorScheme == .dark ? Color.orange : Color.accentColor),
+                    header: HStack {
+                        if state
+                            .tempTargetTarget > state.currentGlucoseTarget
+                        {
+                            HStack(spacing: 5) {
+                                Text("Sensitivity")
+                                Image(systemName: "arrow.up.circle")
+                                Text("Insulin")
+                                Image(systemName: "arrow.down.circle")
+                                Text("using \(formattedPercentage(state.percentage))% of default.")
+                            }
+                        } else {
+                            HStack(spacing: 5) {
+                                Text("Sensitivity")
+                                Image(systemName: "arrow.down.circle")
+                                Text("Insulin")
+                                Image(systemName: "arrow.up.circle")
+                                Text("using \(formattedPercentage(state.percentage))% of default.")
+                            }
+                        }
+                    }
+                    .textCase(.none)
+                    .foregroundStyle(colorScheme == .dark ? Color.orange : Color.accentColor),
                     content: {
                         VStack {
                             Text("\(Int(state.percentage)) % Insulin")
@@ -234,18 +258,24 @@ struct AddTempTargetForm: View {
                             .disabled(!isSliderEnabled)
 
                             Divider()
+
                             HStack {
                                 Text(
-                                    "Half Basal Exercise Target at: \(formattedGlucose(glucose: Decimal(state.computeHalfBasalTarget())))"
+                                    "Half Basal Exercise Target:"
                                 )
-                                .lineLimit(1)
-                                .minimumScaleFactor(0.8)
-                                .foregroundColor(.secondary)
                                 Spacer()
-                            }
-                        }
+                                Text(
+                                    (
+                                        state.units == .mgdL ? computedHalfBasalTarget.description : computedHalfBasalTarget
+                                            .formattedAsMmolL
+                                    ) + " " + state.units.rawValue
+                                )
+                            }.foregroundStyle(.primary)
+                        }.padding(.vertical, 10)
                     }
-                ).listRowBackground(Color.chart)
+                )
+                .listRowBackground(Color.chart)
+                .padding(.top, -10)
             }
         }
     }

+ 2 - 2
FreeAPS/Sources/Modules/OverrideConfig/View/OverrideRootView.swift

@@ -169,16 +169,16 @@ extension OverrideConfig {
                     }
                     .sheet(isPresented: $showTempTargetCreationSheet, onDismiss: {
                         Task {
+                            await state.resetTempTargetState()
                             showTempTargetCreationSheet = false
-                            await state.resetStateVariables()
                         }
                     }) {
                         AddTempTargetForm(state: state)
                     }
                     .sheet(isPresented: $state.showTempTargetEditSheet, onDismiss: {
                         Task {
-                            state.showTempTargetEditSheet = false
                             await state.resetTempTargetState()
+                            state.showTempTargetEditSheet = false
                         }
 
                     }) {