polscm32 1 год назад
Родитель
Сommit
468bcea62b

+ 44 - 7
FreeAPS/Sources/Modules/OverrideConfig/OverrideStateModel.swift

@@ -47,7 +47,7 @@ extension OverrideConfig {
         @Published var isTempTargetEnabled: Bool = false
         @Published var date = Date()
         @Published var newPresetName = ""
-        @Published var presetsTT: [TempTarget] = []
+        @Published var tempTargetPresets: [TempTargetStored] = []
         @Published var percentageTT = 100.0
         @Published var maxValue: Decimal = 1.2
         @Published var viewPercantage = false
@@ -63,13 +63,14 @@ extension OverrideConfig {
         }
 
         override func subscribe() {
+            // TODO: - execute the init concurrently
             setupNotification()
             units = settingsManager.settings.units
             defaultSmbMinutes = settingsManager.preferences.maxSMBBasalMinutes
             defaultUamMinutes = settingsManager.preferences.maxUAMSMBBasalMinutes
             setupOverridePresetsArray()
+            setupTempTargetPresetsArray()
             updateLatestOverrideConfiguration()
-            presetsTT = storage.presets()
             maxValue = settingsManager.preferences.autosensMax
             broadcaster.register(SettingsObserver.self, observer: self)
         }
@@ -434,6 +435,44 @@ extension OverrideConfig.StateModel {
 // MARK: - Temp Targets
 
 extension OverrideConfig.StateModel {
+    // Fill the array of the Override Presets to display them in the UI
+    private func setupTempTargetPresetsArray() {
+        Task {
+            let ids = await self.fetchForTempTargetPresets()
+            await updateTempTargetPresetsArray(with: ids)
+        }
+    }
+
+    /// Returns the NSManagedObjectID of the Temp Target Presets
+    func fetchForTempTargetPresets() async -> [NSManagedObjectID] {
+        let results = await CoreDataStack.shared.fetchEntitiesAsync(
+            ofType: TempTargetStored.self,
+            onContext: coredataContext,
+            predicate: NSPredicate.allTempTargetPresets,
+            key: "date",
+            ascending: true
+        )
+
+        guard let fetchedResults = results as? [TempTargetStored] else { return [] }
+
+        return await coredataContext.perform {
+            return fetchedResults.map(\.objectID)
+        }
+    }
+
+    @MainActor private func updateTempTargetPresetsArray(with IDs: [NSManagedObjectID]) async {
+        do {
+            let tempTargetObjects = try IDs.compactMap { id in
+                try viewContext.existingObject(with: id) as? TempTargetStored
+            }
+            tempTargetPresets = tempTargetObjects
+        } catch {
+            debugPrint(
+                "\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to extract Temp Targets as NSManagedObjects from the NSManagedObjectIDs with error: \(error.localizedDescription)"
+            )
+        }
+    }
+
     // Creates and enacts a non Preset Temp Target
     func saveCustomTempTarget() async {
         let newTempTarget = TempTargetStored(context: coredataContext)
@@ -444,6 +483,7 @@ extension OverrideConfig.StateModel {
         newTempTarget.isUploadedToNS = false
         newTempTarget.name = tempTargetName
         newTempTarget.target = tempTargetTarget as NSDecimalNumber
+        newTempTarget.isPreset = false
 
         // disable all TempTargets
 
@@ -473,6 +513,7 @@ extension OverrideConfig.StateModel {
         newTempTarget.isUploadedToNS = false
         newTempTarget.name = tempTargetName
         newTempTarget.target = tempTargetTarget as NSDecimalNumber
+        newTempTarget.isPreset = true
 
         // disable all TempTargets
 
@@ -490,6 +531,7 @@ extension OverrideConfig.StateModel {
         await resetTempTargetState()
 
         // Update View
+        setupTempTargetPresetsArray()
     }
 
     // Enact Temp Target Preset
@@ -598,11 +640,6 @@ extension OverrideConfig.StateModel {
         tempTargetDuration = 0
     }
 
-    func removePreset(id: String) {
-        presetsTT = presetsTT.filter { $0.id != id }
-        storage.storePresets(presetsTT)
-    }
-
     func computeTarget() -> Decimal {
         var ratio = Decimal(percentageTT / 100)
         let c = Decimal(hbt - 100)

+ 1 - 0
FreeAPS/Sources/Modules/OverrideConfig/View/AddTempTargetForm.swift

@@ -112,6 +112,7 @@ struct AddTempTargetForm: View {
                 Button {
                     Task {
                         await state.saveTempTargetPreset()
+                        dismiss()
                     }
                 }
                 label: { Text("Save as preset") }

+ 18 - 16
FreeAPS/Sources/Modules/OverrideConfig/View/OverrideRootView.swift

@@ -14,6 +14,7 @@ extension OverrideConfig {
         @State private var showingDetail = false
         @State private var showCheckmark: Bool = false
         @State private var selectedPresetID: String?
+        @State private var selectedTempTargetPresetID: String?
         @State private var selectedOverride: OverrideStored?
         @State private var selectedTempTarget: OverrideStored?
 
@@ -147,8 +148,8 @@ extension OverrideConfig {
         }
 
         @ViewBuilder func tempTargets() -> some View {
-            if state.presetsTT.isNotEmpty {
-                overridePresets
+            if state.tempTargetPresets.isNotEmpty {
+                tempTargetPresets
             } else {
                 defaultText
             }
@@ -218,7 +219,7 @@ extension OverrideConfig {
 
         private var tempTargetPresets: some View {
             Section {
-                ForEach(state.presetsTT) { preset in
+                ForEach(state.tempTargetPresets) { preset in
                     tempTargetView(for: preset)
                         .swipeActions(edge: .trailing, allowsFullSwipe: true) {
                             Button(role: .none) {
@@ -313,25 +314,23 @@ extension OverrideConfig {
             }
         }
 
-        private func tempTargetView(for preset: TempTarget) -> some View {
-            var low = preset.targetBottom
-            var high = preset.targetTop
-            if state.units == .mmolL {
-                low = low?.asMmolL
-                high = high?.asMmolL
-            }
-            let isSelected = preset.id == selectedPresetID
+        private func tempTargetView(for preset: TempTargetStored) -> some View {
+            var target = preset.target
+//            if state.units == .mmolL {
+//                target.asMmolL
+//            }
+            let isSelected = preset.id?.uuidString == selectedTempTargetPresetID
 
             return ZStack(alignment: .trailing, content: {
                 HStack {
                     VStack {
                         HStack {
-                            Text(preset.displayName)
+                            Text(preset.name ?? "")
                             Spacer()
                         }
                         HStack(spacing: 2) {
                             Text(
-                                "\(formatter.string(from: (low ?? 0) as NSNumber)!) - \(formatter.string(from: (high ?? 0) as NSNumber)!)"
+                                "\(formatter.string(from: (target ?? 0) as NSNumber)!)"
                             )
                             .foregroundColor(.secondary)
                             .font(.caption)
@@ -342,7 +341,7 @@ extension OverrideConfig {
                             Text("for")
                                 .foregroundColor(.secondary)
                                 .font(.caption)
-                            Text("\(formatter.string(from: preset.duration as NSNumber)!)")
+                            Text("\(formatter.string(from: (preset.duration ?? 0) as NSNumber)!)")
                                 .foregroundColor(.secondary)
                                 .font(.caption)
                             Text("min")
@@ -371,8 +370,11 @@ extension OverrideConfig {
                         .onTapGesture {
                             removeAlert = Alert(
                                 title: Text("Are you sure?"),
-                                message: Text("Delete preset \"\(preset.displayName)\""),
-                                primaryButton: .destructive(Text("Delete"), action: { state.removePreset(id: preset.id) }),
+                                message: Text("Delete preset \"\(preset.name ?? "")\""),
+                                primaryButton: .destructive(Text("Delete"), action: {
+                                    // TODO: add deletion for Presets
+//                                    state.removePreset(id: preset.id)
+                                }),
                                 secondaryButton: .cancel()
                             )
                             isRemoveAlertPresented = true

+ 4 - 0
Model/Helper/TempTargetStored+Helper.swift

@@ -2,6 +2,10 @@ import CoreData
 import Foundation
 
 extension NSPredicate {
+    static var allTempTargetPresets: NSPredicate {
+        NSPredicate(format: "isPreset == %@", true as NSNumber)
+    }
+
     static var lastActiveTempTarget: NSPredicate {
         let date = Date.oneDayAgo
         return NSPredicate(