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

Fix shortcuts for Temp Targets WiP

polscm32 aka Marvout 1 год назад
Родитель
Сommit
d4c5ba312d

+ 4 - 4
FreeAPS.xcodeproj/project.pbxproj

@@ -377,7 +377,7 @@
 		CE7CA3502A064973004BE681 /* CancelTempPresetIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE7CA3462A064973004BE681 /* CancelTempPresetIntent.swift */; };
 		CE7CA3512A064973004BE681 /* ApplyTempPresetIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE7CA3472A064973004BE681 /* ApplyTempPresetIntent.swift */; };
 		CE7CA3522A064973004BE681 /* ListTempPresetsIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE7CA3482A064973004BE681 /* ListTempPresetsIntent.swift */; };
-		CE7CA3532A064973004BE681 /* tempPresetIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE7CA3492A064973004BE681 /* tempPresetIntent.swift */; };
+		CE7CA3532A064973004BE681 /* TempPresetIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE7CA3492A064973004BE681 /* TempPresetIntent.swift */; };
 		CE7CA3542A064973004BE681 /* TempPresetsIntentRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE7CA34A2A064973004BE681 /* TempPresetsIntentRequest.swift */; };
 		CE7CA3552A064973004BE681 /* ListStateIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE7CA34C2A064973004BE681 /* ListStateIntent.swift */; };
 		CE7CA3562A064973004BE681 /* StateIntentRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE7CA34D2A064973004BE681 /* StateIntentRequest.swift */; };
@@ -1065,7 +1065,7 @@
 		CE7CA3462A064973004BE681 /* CancelTempPresetIntent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CancelTempPresetIntent.swift; sourceTree = "<group>"; };
 		CE7CA3472A064973004BE681 /* ApplyTempPresetIntent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplyTempPresetIntent.swift; sourceTree = "<group>"; };
 		CE7CA3482A064973004BE681 /* ListTempPresetsIntent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListTempPresetsIntent.swift; sourceTree = "<group>"; };
-		CE7CA3492A064973004BE681 /* tempPresetIntent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = tempPresetIntent.swift; sourceTree = "<group>"; };
+		CE7CA3492A064973004BE681 /* TempPresetIntent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TempPresetIntent.swift; sourceTree = "<group>"; };
 		CE7CA34A2A064973004BE681 /* TempPresetsIntentRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TempPresetsIntentRequest.swift; sourceTree = "<group>"; };
 		CE7CA34C2A064973004BE681 /* ListStateIntent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListStateIntent.swift; sourceTree = "<group>"; };
 		CE7CA34D2A064973004BE681 /* StateIntentRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StateIntentRequest.swift; sourceTree = "<group>"; };
@@ -2534,7 +2534,7 @@
 				CE7CA3462A064973004BE681 /* CancelTempPresetIntent.swift */,
 				CE7CA3472A064973004BE681 /* ApplyTempPresetIntent.swift */,
 				CE7CA3482A064973004BE681 /* ListTempPresetsIntent.swift */,
-				CE7CA3492A064973004BE681 /* tempPresetIntent.swift */,
+				CE7CA3492A064973004BE681 /* TempPresetIntent.swift */,
 				CE7CA34A2A064973004BE681 /* TempPresetsIntentRequest.swift */,
 			);
 			path = TempPresets;
@@ -3547,7 +3547,7 @@
 				E39E418C56A5A46B61D960EE /* ConfigEditorStateModel.swift in Sources */,
 				45717281F743594AA9D87191 /* ConfigEditorRootView.swift in Sources */,
 				DD32CFA02CC824D6003686D6 /* TrioRemoteControl+APNS.swift in Sources */,
-				CE7CA3532A064973004BE681 /* tempPresetIntent.swift in Sources */,
+				CE7CA3532A064973004BE681 /* TempPresetIntent.swift in Sources */,
 				D6DEC113821A7F1056C4AA1E /* NightscoutConfigDataFlow.swift in Sources */,
 				DD6B7CBB2C7FBBFA00B75029 /* ReviewInsulinActionView.swift in Sources */,
 				38E98A3025F52FF700C0CED0 /* Config.swift in Sources */,

+ 13 - 3
FreeAPS/Sources/Modules/Adjustments/AdjustmentsStateModel.swift

@@ -183,16 +183,26 @@ extension Adjustments.StateModel {
             name: .didUpdateTempTargetConfiguration,
             object: nil
         )
-    }
 
-    @objc private func handleOverrideConfigurationUpdate() {
-        updateLatestOverrideConfiguration()
+        // Creates a publisher that updates the Override View when the Custom notification was sent (via shortcut)
         Foundation.NotificationCenter.default.publisher(for: .willUpdateOverrideConfiguration)
             .sink { [weak self] _ in
                 guard let self = self else { return }
                 self.updateLatestOverrideConfiguration()
             }
             .store(in: &cancellables)
+
+        // Creates a publisher that updates the Temp Target View when the Custom notification was sent (via shortcut)
+        Foundation.NotificationCenter.default.publisher(for: .willUpdateTempTargetConfiguration)
+            .sink { [weak self] _ in
+                guard let self = self else { return }
+                self.updateLatestTempTargetConfiguration()
+            }
+            .store(in: &cancellables)
+    }
+
+    @objc private func handleOverrideConfigurationUpdate() {
+        updateLatestOverrideConfiguration()
     }
 
     @objc private func handleTempTargetConfigurationUpdate() {

+ 12 - 0
FreeAPS/Sources/Services/Network/NightscoutManager.swift

@@ -173,6 +173,18 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
                 }
             }
             .store(in: &subscriptions)
+
+        Foundation.NotificationCenter.default.publisher(for: .willUpdateTempTargetConfiguration)
+            .sink { [weak self] _ in
+                guard let self = self else { return }
+                Task {
+                    await self.uploadOverrides()
+
+                    // Post a notification indicating that the upload has finished and that we can end the background task in the TempTargetPresetsIntentRequest
+                    Foundation.NotificationCenter.default.post(name: .didUpdateTempTargetConfiguration, object: nil)
+                }
+            }
+            .store(in: &subscriptions)
     }
 
     func sourceInfo() -> [String: Any]? {

+ 1 - 1
FreeAPS/Sources/Shortcuts/Override/ListOverridePresetIntent.swift

@@ -19,7 +19,7 @@ import Foundation
     ) var preset: OverridePreset?
 
     static var parameterSummary: some ParameterSummary {
-        Summary("Choose the override  \(\.$preset)", table: "ShortcutsDetail")
+        Summary("Choose the Override  \(\.$preset)", table: "ShortcutsDetail")
     }
 
     @MainActor func perform() async throws -> some ReturnsValue<OverridePreset> {

+ 22 - 12
FreeAPS/Sources/Shortcuts/TempPresets/ApplyTempPresetIntent.swift

@@ -14,7 +14,7 @@ import Foundation
         intentRequest = TempPresetsIntentRequest()
     }
 
-    @Parameter(title: "Preset") var preset: tempPreset?
+    @Parameter(title: "Preset") var preset: TempPreset?
 
     @Parameter(
         title: "Confirm Before applying",
@@ -46,12 +46,12 @@ import Foundation
 
     @MainActor func perform() async throws -> some ProvidesDialog {
         do {
-            let presetToApply: tempPreset
+            let presetToApply: TempPreset
             if let preset = preset {
                 presetToApply = preset
             } else {
                 presetToApply = try await $preset.requestDisambiguation(
-                    among: intentRequest.fetchAll(),
+                    among: intentRequest.fetchAndProcessTempTargets(),
                     dialog: "Select Temporary Target"
                 )
             }
@@ -63,15 +63,25 @@ import Foundation
                 )
             }
 
-            // TODO: enact the temp target
-            let tempTarget = try intentRequest.findTempTarget(presetToApply)
-            let finalTempTargetApply = try await intentRequest.enactTempTarget(tempTarget)
-            let formattedTime = decimalToTimeFormattedString(decimal: finalTempTargetApply.duration)
-            let displayDetail: String =
-                "Target '\(finalTempTargetApply.displayName)' applied for \(formattedTime)"
-            return .result(
-                dialog: IntentDialog(stringLiteral: displayDetail)
-            )
+            if await intentRequest.enactTempTarget(presetToApply) {
+                return .result(
+                    dialog: IntentDialog(
+                        LocalizedStringResource(
+                            "TempTarget '\(presetToApply.name)' applied",
+                            table: "ShortcutsDetail"
+                        )
+                    )
+                )
+            } else {
+                return .result(
+                    dialog: IntentDialog(
+                        LocalizedStringResource(
+                            "TempTarget '\(presetToApply.name)' failed",
+                            table: "ShortcutsDetail"
+                        )
+                    )
+                )
+            }
         } catch {
             throw error
         }

+ 3 - 21
FreeAPS/Sources/Shortcuts/TempPresets/ListTempPresetsIntent.swift

@@ -11,33 +11,15 @@ import Foundation
         categoryName: "Navigation"
     )
 
-    @Parameter(title: "Preset") var preset: tempPreset?
+    @Parameter(title: "Preset") var preset: TempPreset?
 
     static var parameterSummary: some ParameterSummary {
-        Summary("Choose the temp preset  \(\.$preset)")
+        Summary("Choose the Temp Target preset  \(\.$preset)")
     }
 
-    @MainActor func perform() async throws -> some ReturnsValue<tempPreset> {
+    @MainActor func perform() async throws -> some ReturnsValue<TempPreset> {
         .result(
             value: preset!
         )
     }
 }
-
-@available(iOS 16.0, *) struct tempPresetsQuery: EntityQuery {
-    internal var intentRequest: TempPresetsIntentRequest
-
-    init() {
-        intentRequest = TempPresetsIntentRequest()
-    }
-
-    func entities(for identifiers: [tempPreset.ID]) async throws -> [tempPreset] {
-        let tempTargets = intentRequest.fetchIDs(identifiers)
-        return tempTargets
-    }
-
-    func suggestedEntities() async throws -> [tempPreset] {
-        let tempTargets = intentRequest.fetchAll()
-        return tempTargets
-    }
-}

+ 47 - 0
FreeAPS/Sources/Shortcuts/TempPresets/TempPresetIntent.swift

@@ -0,0 +1,47 @@
+import AppIntents
+import Foundation
+import Intents
+import Swinject
+
+@available(iOS 16.0, *) struct TempPreset: AppEntity, Identifiable {
+    static var defaultQuery = TempPresetsQuery()
+
+    var id: UUID
+    var name: String
+    var targetTop: Decimal?
+    var targetBottom: Decimal?
+    var duration: Decimal
+
+    var displayRepresentation: DisplayRepresentation {
+        DisplayRepresentation(title: "\(name)")
+    }
+
+    static var typeDisplayRepresentation: TypeDisplayRepresentation = "Presets"
+
+//    static func convert(_ tempTarget: TempTarget) -> TempPreset {
+//        var tp = TempPreset(
+//            id: UUID(uuidString: tempTarget.id)!,
+//            name: tempTarget.displayName,
+//            duration: tempTarget.duration
+//        )
+//        tp.targetTop = tempTarget.targetTop
+//        tp.targetBottom = tempTarget.targetBottom
+//        return tp
+//    }
+}
+
+struct TempPresetsQuery: EntityQuery {
+    internal var intentRequest: TempPresetsIntentRequest
+
+    init() {
+        intentRequest = TempPresetsIntentRequest()
+    }
+
+    func entities(for identifiers: [TempPreset.ID]) async throws -> [TempPreset] {
+        await intentRequest.fetchIDs(identifiers)
+    }
+
+    func suggestedEntities() async throws -> [TempPreset] {
+        await intentRequest.fetchAndProcessTempTargets()
+    }
+}

+ 202 - 68
FreeAPS/Sources/Shortcuts/TempPresets/TempPresetsIntentRequest.swift

@@ -1,5 +1,6 @@
 import CoreData
 import Foundation
+import UIKit
 
 @available(iOS 16.0, *) final class TempPresetsIntentRequest: BaseIntentsRequest {
     enum TempPresetsError: Error {
@@ -7,95 +8,228 @@ import Foundation
         case noDurationDefined
     }
 
-    private func convert(tt: [TempTarget]) -> [tempPreset] {
-        tt.map { tempPreset.convert($0) }
-    }
+    func fetchAndProcessTempTargets() async -> [TempPreset] {
+        // Fetch all Temp Target Presets via TempTargetStorage
+        let allTempTargetPresetsIDs = await tempTargetsStorage.fetchForTempTargetPresets()
 
-    func fetchAll() -> [tempPreset] {
-        convert(tt: tempTargetsStorage.presets())
-    }
+        // Perform the fetch and process on the Core Data context's thread
+        return await coredataContext.perform {
+            // Fetch existing TempTargetStored objects based on their NSManagedObjectIDs
+            let tempTargetObjects: [TempTargetStored] = allTempTargetPresetsIDs.compactMap { id in
+                guard let object = try? self.coredataContext.existingObject(with: id) as? TempTargetStored else {
+                    debugPrint("\(#file) \(#function) Failed to fetch object for ID: \(id)")
+                    return nil
+                }
+                return object
+            }
 
-    func fetchIDs(_ uuid: [tempPreset.ID]) -> [tempPreset] {
-        let UUIDTempTarget = tempTargetsStorage.presets().filter { uuid.contains(UUID(uuidString: $0.id)!) }
-        return convert(tt: UUIDTempTarget)
+            // Map fetched TempTargetStored objects to TempPreset
+            return tempTargetObjects.compactMap { object in
+                guard let id = object.id,
+                      let name = object.name,
+                      let target = object.target?.decimalValue,
+                      let duration = object.duration?.decimalValue
+                else {
+                    debugPrint("\(#file) \(#function) Missing data for TempTargetStored object.")
+                    return TempPreset(id: UUID(), name: "", duration: 0)
+                }
+                return TempPreset(id: id, name: name, targetTop: target, duration: duration)
+            }
+        }
     }
 
-    func fetchOne(_ uuid: tempPreset.ID) -> tempPreset? {
-        let UUIDTempTarget = tempTargetsStorage.presets().filter { UUID(uuidString: $0.id) == uuid }
-        guard let OneTempTarget = UUIDTempTarget.first else { return nil }
-        return tempPreset.convert(OneTempTarget)
+    func fetchIDs(_ uuid: [TempPreset.ID]) async -> [TempPreset] {
+        await coredataContext.perform {
+            let fetchRequest: NSFetchRequest<TempTargetStored> = TempTargetStored.fetchRequest()
+            fetchRequest.predicate = NSPredicate(format: "id IN %@", uuid)
+
+            do {
+                let result = try self.coredataContext.fetch(fetchRequest)
+
+                if result.isEmpty {
+                    debugPrint("\(DebuggingIdentifiers.failed) \(#file) \(#function) No TempTargetStored found for ids: \(uuid)")
+                    return [TempPreset(id: UUID(), name: "", duration: 0)]
+                }
+
+                return result.map { tempTargetStored in
+                    TempPreset(
+                        id: tempTargetStored.id ?? UUID(),
+                        name: tempTargetStored.name ?? "",
+                        duration: tempTargetStored.duration as? Decimal ?? 0
+                    )
+                }
+            } catch let error as NSError {
+                debugPrint(
+                    "\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to fetch TempTarget: \(error.localizedDescription)"
+                )
+                return [TempPreset(id: UUID(), name: "", duration: 0)]
+            }
+        }
     }
 
-    func findTempTarget(_ tempPreset: tempPreset) throws -> TempTarget {
-        let tempTargetFound = tempTargetsStorage.presets().filter { $0.id == tempPreset.id.uuidString }
-        guard let tempOneTarget = tempTargetFound.first else { throw TempPresetsError.noTempTargetFound }
-        return tempOneTarget
+    private func fetchTempTargetID(_ preset: TempPreset) async -> NSManagedObjectID? {
+        let fetchRequest: NSFetchRequest<TempTargetStored> = TempTargetStored.fetchRequest()
+        fetchRequest.predicate = NSPredicate(format: "id == %@", preset.id.uuidString)
+        fetchRequest.fetchLimit = 1
+
+        return await coredataContext.perform {
+            do {
+                return try self.coredataContext.fetch(fetchRequest).first?.objectID
+            } catch {
+                debugPrint(
+                    "\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to fetch Override: \(error.localizedDescription)"
+                )
+                return nil
+            }
+        }
     }
 
-    // TODO: - probably broken for now...
+    @MainActor func enactTempTarget(_ preset: TempPreset) async -> Bool {
+        // Start background task
+        var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid
+        backgroundTaskID = await UIApplication.shared.beginBackgroundTask(withName: "Override Upload") {
+            guard backgroundTaskID != .invalid else { return }
+            Task {
+                // End background task when the time is about to expire
+                await UIApplication.shared.endBackgroundTask(backgroundTaskID)
+            }
+            backgroundTaskID = .invalid
+        }
+
+        // Defer block to end background task when function exits
+        defer {
+            if backgroundTaskID != .invalid {
+                Task {
+                    await UIApplication.shared.endBackgroundTask(backgroundTaskID)
+                }
+                backgroundTaskID = .invalid
+            }
+        }
+
+        do {
+            // Get NSManagedObjectID of Preset
+            guard let tempTargetID = await fetchTempTargetID(preset),
+                  let tempTargetObject = try viewContext.existingObject(with: tempTargetID) as? TempTargetStored
+            else { return false }
 
-    func enactTempTarget(_ presetTarget: TempTarget) async throws -> TempTarget {
-        var tempTarget = presetTarget
-        tempTarget.createdAt = Date()
-        await storage.storeTempTarget(tempTarget: tempTarget)
+            // Enable TempTarget
+            tempTargetObject.enabled = true
+            tempTargetObject.date = Date()
+            tempTargetObject.isUploadedToNS = false
 
-        coredataContext.performAndWait {
-            var tempTargetsArray = [TempTargetStored]()
-            let requestTempTargets = TempTargetStored.fetchRequest() as NSFetchRequest<TempTargetStored>
-            let sortTT = NSSortDescriptor(key: "date", ascending: false)
-            requestTempTargets.sortDescriptors = [sortTT]
-            if coredataContext.hasChanges {
-                try? tempTargetsArray = coredataContext.fetch(requestTempTargets)
+            // Disable previous overrides if necessary, without starting a background task
+            await disableAllActiveTempTargets(
+                except: tempTargetID,
+                createTempTargetRunEntry: true,
+                shouldStartBackgroundTask: false
+            )
+
+            if viewContext.hasChanges {
+                try viewContext.save()
+
+                // Update State variables in TempTargetView
+                Foundation.NotificationCenter.default.post(name: .willUpdateTempTargetConfiguration, object: nil)
+
+                // Await the notification
+                print("Waiting for notification...")
+                await awaitNotification(.didUpdateTempTargetConfiguration)
+                print("Notification received, continuing...")
+
+                return true
             }
+        } catch {
+            // Handle error and ensure background task is ended
+            debugPrint("Failed to enact TempTarget: \(error.localizedDescription)")
+        }
+
+        return false
+    }
+
+    func cancelTempTarget() async {
+        await disableAllActiveTempTargets(createTempTargetRunEntry: true, shouldStartBackgroundTask: true)
+    }
 
-            let whichID = tempTargetsArray.first(where: { $0.id == UUID(uuidString: tempTarget.id) })
-
-            if whichID != nil {
-                let saveToCoreData = TempTargetStored(context: self.coredataContext)
-                saveToCoreData.enabled = true
-                saveToCoreData.date = Date()
-                saveToCoreData.target = whichID?.target ?? 160
-                saveToCoreData.date = Date()
-                saveToCoreData.duration = whichID?.duration ?? 0
-
-                do {
-                    guard coredataContext.hasChanges else { return }
-                    try self.coredataContext.save()
-                } catch {
-                    print(error.localizedDescription)
+    @MainActor func disableAllActiveTempTargets(
+        except tempTargetID: NSManagedObjectID? = nil,
+        createTempTargetRunEntry: Bool,
+        shouldStartBackgroundTask: Bool = true
+    ) async {
+        var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid
+
+        if shouldStartBackgroundTask {
+            // Start background task
+            backgroundTaskID = await UIApplication.shared.beginBackgroundTask(withName: "TempTarget Cancel") {
+                guard backgroundTaskID != .invalid else { return }
+                Task {
+                    // End background task when the time is about to expire
+                    await UIApplication.shared.endBackgroundTask(backgroundTaskID)
                 }
-            } else {
-                let saveToCoreData = TempTargetStored(context: self.coredataContext)
-                saveToCoreData.enabled = false
-                saveToCoreData.date = Date()
-                do {
-                    guard coredataContext.hasChanges else { return }
-                    try self.coredataContext.save()
-                } catch {
-                    print(error.localizedDescription)
+                backgroundTaskID = .invalid
+            }
+        }
+
+        // Defer block to end background task when function exits, only if it was started
+        defer {
+            if shouldStartBackgroundTask, backgroundTaskID != .invalid {
+                Task {
+                    await UIApplication.shared.endBackgroundTask(backgroundTaskID)
                 }
+                backgroundTaskID = .invalid
             }
         }
 
-        return tempTarget
-    }
+        // Get NSManagedObjectID of all active temp Targets
+        let ids = await tempTargetsStorage.loadLatestTempTargetConfigurations(fetchLimit: 0)
+
+        do {
+            // Fetch existing OverrideStored objects
+            let results = try ids.compactMap { id in
+                try self.viewContext.existingObject(with: id) as? TempTargetStored
+            }
+
+            // Return early if no results
+            guard !results.isEmpty else { return }
+
+            // Create TempTargetRunStored entry if needed
+            if createTempTargetRunEntry {
+                // Use the first temp target to create a new TempTargetRunStored entry
+                if let canceledTempTarget = results.first {
+                    let newTempTargetRunStored = TempTargetRunStored(context: viewContext)
+                    newTempTargetRunStored.id = UUID()
+                    newTempTargetRunStored.name = canceledTempTarget.name
+                    newTempTargetRunStored.startDate = canceledTempTarget.date ?? .distantPast
+                    newTempTargetRunStored.endDate = Date()
+                    newTempTargetRunStored
+                        .target = canceledTempTarget.target ?? 0
+                    newTempTargetRunStored.tempTarget = canceledTempTarget
+                    newTempTargetRunStored.isUploadedToNS = false
+                }
+            }
 
-    func cancelTempTarget() async throws {
-        await storage.storeTempTarget(tempTarget: TempTarget.cancel(at: Date()))
-        try coredataContext.performAndWait {
-            let saveToCoreData = TempTargetStored(context: self.coredataContext)
-            saveToCoreData.enabled = false
-            saveToCoreData.date = Date()
-            if coredataContext.hasChanges {
-                try self.coredataContext.save()
+            // Disable all override except the one with overrideID
+            for tempTargetToCancel in results {
+                if tempTargetToCancel.objectID != tempTargetID {
+                    tempTargetToCancel.enabled = false
+                    tempTargetToCancel.isUploadedToNS = false
+                }
             }
 
-            let setHBT = TempTargetStored(context: self.coredataContext)
-            setHBT.enabled = false
-            setHBT.date = Date()
-            if coredataContext.hasChanges {
-                try self.coredataContext.save()
+            if viewContext.hasChanges {
+                try viewContext.save()
+
+                // Update State variables in OverrideView
+                Foundation.NotificationCenter.default.post(name: .willUpdateTempTargetConfiguration, object: nil)
             }
+
+            // Await the notification
+            print("Waiting for notification...")
+            await awaitNotification(.didUpdateTempTargetConfiguration)
+            print("Notification received, continuing...")
+
+        } catch {
+            debugPrint(
+                "\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to disable active Temp Targets with error: \(error.localizedDescription)"
+            )
         }
     }
 }

+ 0 - 31
FreeAPS/Sources/Shortcuts/TempPresets/tempPresetIntent.swift

@@ -1,31 +0,0 @@
-import AppIntents
-import Foundation
-import Intents
-import Swinject
-
-@available(iOS 16.0, *) struct tempPreset: AppEntity, Identifiable {
-    static var defaultQuery = tempPresetsQuery()
-
-    var id: UUID
-    var name: String
-    var targetTop: Decimal?
-    var targetBottom: Decimal?
-    var duration: Decimal
-
-    var displayRepresentation: DisplayRepresentation {
-        DisplayRepresentation(title: "\(name)")
-    }
-
-    static var typeDisplayRepresentation: TypeDisplayRepresentation = "Presets"
-
-    static func convert(_ tempTarget: TempTarget) -> tempPreset {
-        var tp = tempPreset(
-            id: UUID(uuidString: tempTarget.id)!,
-            name: tempTarget.displayName,
-            duration: tempTarget.duration
-        )
-        tp.targetTop = tempTarget.targetTop
-        tp.targetBottom = tempTarget.targetBottom
-        return tp
-    }
-}

+ 1 - 0
Model/Helper/CustomNotification.swift

@@ -4,6 +4,7 @@ import Foundation
 extension Notification.Name {
     static let willUpdateOverrideConfiguration = Notification.Name("willUpdateOverrideConfiguration")
     static let didUpdateOverrideConfiguration = Notification.Name("didUpdateOverrideConfiguration")
+    static let willUpdateTempTargetConfiguration = Notification.Name("willUpdateTempTargetConfiguration")
     static let didUpdateTempTargetConfiguration = Notification.Name("didUpdateTempTargetConfiguration")
     static let liveActivityOrderDidChange = Notification.Name("liveActivityOrderDidChange")
 }