Ver código fonte

Try fixing editability of running presets WIP

Deniz Cengiz 1 ano atrás
pai
commit
fbb4af1671

+ 24 - 2
FreeAPS/Sources/APS/Storage/OverrideStorage.swift

@@ -3,11 +3,12 @@ import Foundation
 import Swinject
 
 protocol OverrideStorage {
+    func fetchLastCreatedOverride() async -> [NSManagedObjectID]
     func loadLatestOverrideConfigurations(fetchLimit: Int) async -> [NSManagedObjectID]
     func fetchForOverridePresets() async -> [NSManagedObjectID]
     func calculateTarget(override: OverrideStored) -> Decimal
     func storeOverride(override: Override) async
-    func copyRunningOverride(_ override: OverrideStored) async
+    func copyRunningOverride(_ override: OverrideStored) async -> NSManagedObjectID
     func deleteOverridePreset(_ objectID: NSManagedObjectID) async
     func getOverridesNotYetUploadedToNightscout() async -> [NightscoutExercise]
     func getOverrideRunsNotYetUploadedToNightscout() async -> [NightscoutExercise]
@@ -29,6 +30,24 @@ final class BaseOverrideStorage: OverrideStorage, Injectable {
         return df
     }
 
+    func fetchLastCreatedOverride() async -> [NSManagedObjectID] {
+        let results = await CoreDataStack.shared.fetchEntitiesAsync(
+            ofType: OverrideStored.self,
+            onContext: backgroundContext,
+            predicate: NSPredicate(
+                format: "date >= %@",
+                Date.oneDayAgo as NSDate
+            ),
+            key: "date",
+            ascending: false,
+            fetchLimit: 1
+        )
+
+        return await backgroundContext.perform {
+            return results.map(\.objectID)
+        }
+    }
+
     func loadLatestOverrideConfigurations(fetchLimit: Int) async -> [NSManagedObjectID] {
         let results = await CoreDataStack.shared.fetchEntitiesAsync(
             ofType: OverrideStored.self,
@@ -142,7 +161,7 @@ final class BaseOverrideStorage: OverrideStorage, Injectable {
 
     // Copy the current Override if it is a RUNNING Preset
     /// otherwise we would edit the Preset
-    @MainActor func copyRunningOverride(_ override: OverrideStored) async {
+    @MainActor func copyRunningOverride(_ override: OverrideStored) async -> NSManagedObjectID {
         let newOverride = OverrideStored(context: viewContext)
         newOverride.duration = override.duration
         newOverride.indefinite = override.indefinite
@@ -162,6 +181,7 @@ final class BaseOverrideStorage: OverrideStorage, Injectable {
         newOverride.end = override.end
         newOverride.smbMinutes = override.smbMinutes
         newOverride.uamMinutes = override.uamMinutes
+        newOverride.isUploadedToNS = true // set to true to avoid getting duplicate entries on NS
 
         await viewContext.perform {
             do {
@@ -173,6 +193,8 @@ final class BaseOverrideStorage: OverrideStorage, Injectable {
                 )
             }
         }
+
+        return newOverride.objectID
     }
 
     /// marked as MainActor to be able to publish changes from the background

+ 7 - 1
FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift

@@ -391,7 +391,7 @@ extension OverrideProfilesConfig.StateModel {
         guard let overridePresetToDuplicate = currentActiveOverride, overridePresetToDuplicate.isPreset == true else { return }
 
         // Copy the current Override-Preset to not edit the underlying Preset
-        await overrideStorage.copyRunningOverride(overridePresetToDuplicate)
+        let duplidateId = await overrideStorage.copyRunningOverride(overridePresetToDuplicate)
 
         // Cancel the duplicated Override
         /// As we are on the Main Thread already we don't need to cancel via the objectID in this case
@@ -402,6 +402,12 @@ extension OverrideProfilesConfig.StateModel {
                 guard self.viewContext.hasChanges else { return }
                 try self.viewContext.save()
             }
+
+            if let overrideToEdit = try viewContext.existingObject(with: duplidateId) as? OverrideStored
+            {
+                currentActiveOverride = overrideToEdit
+                activeOverrideName = overrideToEdit.name ?? "Custom Override"
+            }
         } catch {
             debugPrint(
                 "\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to cancel previous override with error: \(error.localizedDescription)"

+ 10 - 0
FreeAPS/Sources/Modules/OverrideProfilesConfig/View/EditOverrideForm.swift

@@ -294,6 +294,15 @@ struct EditOverrideForm: View {
                         guard let moc = override.managedObjectContext else { return }
                         guard moc.hasChanges else { return }
                         try moc.save()
+
+                        if let currentActiveOverride = state.currentActiveOverride {
+                            Task {
+                                await state.disableAllActiveOverrides(
+                                    except: currentActiveOverride.objectID,
+                                    createOverrideRunEntry: true
+                                )
+                            }
+                        }
                         hasChanges = false
                         presentationMode.wrappedValue.dismiss()
                     } catch {
@@ -337,6 +346,7 @@ struct EditOverrideForm: View {
         override.cr = cr
         override.smbMinutes = smbMinutes.map { NSDecimalNumber(decimal: $0) }
         override.uamMinutes = uamMinutes.map { NSDecimalNumber(decimal: $0) }
+        override.isUploadedToNS = false
     }
 
     private func resetValues() {