Przeglądaj źródła

Refactoring WiP

polscm32 1 rok temu
rodzic
commit
3b47e690d1

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

@@ -32,7 +32,9 @@ extension OverrideConfig {
         @Published var defaultUamMinutes: Decimal = 0
         @Published var selectedTab: Tab = .overrides
         @Published var activeOverrideName: String = ""
+        @Published var activeTempTargetName: String = ""
         @Published var currentActiveOverride: OverrideStored?
+        @Published var currentActiveTempTarget: TempTargetStored?
         @Published var showOverrideEditSheet = false
         @Published var showInvalidTargetAlert = false
 
@@ -71,6 +73,7 @@ extension OverrideConfig {
             setupOverridePresetsArray()
             setupTempTargetPresetsArray()
             updateLatestOverrideConfiguration()
+            updateLatestTempTargetConfiguration()
             maxValue = settingsManager.preferences.autosensMax
             broadcaster.register(SettingsObserver.self, observer: self)
         }
@@ -435,6 +438,58 @@ extension OverrideConfig.StateModel {
 // MARK: - Temp Targets
 
 extension OverrideConfig.StateModel {
+    // MARK: - Setup the State variables with the last Temp Target configuration
+
+    /// First get the latest Temp Target corresponding NSManagedObjectID with a background fetch
+    /// Then unpack it on the view context and update the State variables which can be used on in the View for some Logic
+    /// This also needs to be called when we cancel an Temp Target via the Home View to update the State of the Button for this case
+    func updateLatestTempTargetConfiguration() {
+        Task {
+            let id = await loadLatestTempTargetConfigurations(fetchLimit: 1)
+            async let updateState: () = updateLatestTempTargetConfigurationOfState(from: id)
+            async let setTempTarget: () = setCurrentTempTarget(from: id)
+
+            _ = await (updateState, setTempTarget)
+        }
+    }
+
+    @MainActor func updateLatestTempTargetConfigurationOfState(from IDs: [NSManagedObjectID]) async {
+        do {
+            let result = try IDs.compactMap { id in
+                try viewContext.existingObject(with: id) as? OverrideStored
+            }
+            isTempTargetEnabled = result.first?.enabled ?? false
+
+            if !isEnabled {
+                await resetTempTargetState()
+            }
+        } catch {
+            debugPrint(
+                "\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to update latest temp target configuration"
+            )
+        }
+    }
+
+    // Sets the current active Preset name to show in the UI
+    @MainActor func setCurrentTempTarget(from IDs: [NSManagedObjectID]) async {
+        do {
+            guard let firstID = IDs.first else {
+                activeTempTargetName = "Custom Temp Target"
+                currentActiveTempTarget = nil
+                return
+            }
+
+            if let tempTargetToEdit = try viewContext.existingObject(with: firstID) as? TempTargetStored {
+                currentActiveTempTarget = tempTargetToEdit
+                activeTempTargetName = tempTargetToEdit.name ?? "Custom Temp Target"
+            }
+        } catch {
+            debugPrint(
+                "\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to set active preset name with error: \(error.localizedDescription)"
+            )
+        }
+    }
+
     // Fill the array of the Override Presets to display them in the UI
     private func setupTempTargetPresetsArray() {
         Task {
@@ -501,6 +556,7 @@ extension OverrideConfig.StateModel {
         await resetTempTargetState()
 
         // Update View
+        updateLatestTempTargetConfiguration()
     }
 
     // Creates a new Temp Target Preset
@@ -557,7 +613,7 @@ extension OverrideConfig.StateModel {
             try viewContext.save()
 
             // Update View
-
+            updateLatestTempTargetConfiguration()
         } catch {
             debugPrint("\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to enact Override Preset")
         }
@@ -624,7 +680,7 @@ extension OverrideConfig.StateModel {
                     try self.viewContext.save()
 
                     // Update the View
-                    self.updateLatestOverrideConfiguration()
+                    self.updateLatestTempTargetConfiguration()
                 }
             } catch {
                 debugPrint(
@@ -634,6 +690,18 @@ extension OverrideConfig.StateModel {
         }
     }
 
+    // Deletion of Temp Targets
+    func invokeTempTargetPresetDeletion(_ objectID: NSManagedObjectID) async {
+        await deleteOverridePreset(objectID)
+
+        // Update Presets View
+        setupTempTargetPresetsArray()
+    }
+
+    @MainActor func deleteOverridePreset(_ objectID: NSManagedObjectID) async {
+        await CoreDataStack.shared.deleteObject(identifiedBy: objectID)
+    }
+
     @MainActor func resetTempTargetState() async {
         tempTargetName = ""
         tempTargetTarget = 0

+ 56 - 30
FreeAPS/Sources/Modules/OverrideConfig/View/OverrideRootView.swift

@@ -16,7 +16,7 @@ extension OverrideConfig {
         @State private var selectedPresetID: String?
         @State private var selectedTempTargetPresetID: String?
         @State private var selectedOverride: OverrideStored?
-        @State private var selectedTempTarget: OverrideStored?
+        @State private var selectedTempTarget: TempTargetStored?
 
         // temp targets
         @State private var isRemoveAlertPresented = false
@@ -224,15 +224,15 @@ extension OverrideConfig {
                         .swipeActions(edge: .trailing, allowsFullSwipe: true) {
                             Button(role: .none) {
                                 Task {
-//                                    await state.invokeOverridePresetDeletion(preset.objectID)
+                                    await state.invokeTempTargetPresetDeletion(preset.objectID)
                                 }
                             } label: {
                                 Label("Delete", systemImage: "trash")
                                     .tint(.red)
                             }
                             Button(action: {
-                                // Set the selected Override to the chosen Preset and pass it to the Edit Sheet
-//                                selectedOverride = preset
+                                // Set the selected Temp Target to the chosen Preset and pass it to the Edit Sheet
+                                selectedTempTarget = preset
 //                                state.showOverrideEditSheet = true
                             }, label: {
                                 Label("Edit", systemImage: "pencil")
@@ -253,30 +253,58 @@ extension OverrideConfig {
         }
 
         private var currentActiveOverride: some View {
-            Section {
-                HStack {
-                    Text("\(state.activeOverrideName) is running")
+            switch state.selectedTab {
+            case .overrides:
+                Section {
+                    HStack {
+                        Text("\(state.activeOverrideName) is running")
 
-                    Spacer()
-                    Image(systemName: "square.and.pencil")
-                        .foregroundStyle(Color.blue)
+                        Spacer()
+                        Image(systemName: "square.and.pencil")
+                            .foregroundStyle(Color.blue)
+                    }
+                    .contentShape(Rectangle())
+                    .onTapGesture {
+                        Task {
+                            /// To avoid editing the Preset when a Preset-Override is running we first duplicate the Preset-Override as a non-Preset Override
+                            /// The currentActiveOverride variable in the State will update automatically via MOC notification
+                            await state.duplicateOverridePresetAndCancelPreviousOverride()
+
+                            /// selectedOverride is used for passing the chosen Override to the EditSheet so we have to set the updated currentActiveOverride to be the selectedOverride
+                            selectedOverride = state.currentActiveOverride
+
+                            /// Now we can show the Edit sheet
+                            state.showOverrideEditSheet = true
+                        }
+                    }
                 }
-                .contentShape(Rectangle())
-                .onTapGesture {
-                    Task {
-                        /// To avoid editing the Preset when a Preset-Override is running we first duplicate the Preset-Override as a non-Preset Override
-                        /// The currentActiveOverride variable in the State will update automatically via MOC notification
-                        await state.duplicateOverridePresetAndCancelPreviousOverride()
+                .listRowBackground(Color.blue.opacity(0.2))
+            case .tempTargets:
+                Section {
+                    HStack {
+                        Text("\(state.activeOverrideName) is running")
 
-                        /// selectedOverride is used for passing the chosen Override to the EditSheet so we have to set the updated currentActiveOverride to be the selectedOverride
-                        selectedOverride = state.currentActiveOverride
+                        Spacer()
+                        Image(systemName: "square.and.pencil")
+                            .foregroundStyle(Color.blue)
+                    }
+                    .contentShape(Rectangle())
+                    .onTapGesture {
+                        Task {
+                            /// To avoid editing the Preset when a Preset-Override is running we first duplicate the Preset-Override as a non-Preset Override
+                            /// The currentActiveOverride variable in the State will update automatically via MOC notification
+                            await state.duplicateOverridePresetAndCancelPreviousOverride()
+
+                            /// selectedOverride is used for passing the chosen Override to the EditSheet so we have to set the updated currentActiveOverride to be the selectedOverride
+                            selectedOverride = state.currentActiveOverride
 
-                        /// Now we can show the Edit sheet
-                        state.showOverrideEditSheet = true
+                            /// Now we can show the Edit sheet
+                            state.showOverrideEditSheet = true
+                        }
                     }
                 }
+                .listRowBackground(Color.blue.opacity(0.2))
             }
-            .listRowBackground(Color.blue.opacity(0.2))
         }
 
         private var cancelOverrideButton: some View {
@@ -353,15 +381,13 @@ extension OverrideConfig {
                     }
                     .contentShape(Rectangle())
                     .onTapGesture {
-                        // TODO: - adapt to Temp Targets
-//                        state.enactPreset(id: preset.id)
-//                        selectedPresetID = preset.id
-//                        showCheckmark.toggle()
-//
-//                        // deactivate showCheckmark after 3 seconds
-//                        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
-//                            showCheckmark = false
-//                        }
+                        Task {
+                            let objectID = preset.objectID
+                            await state.enactTempTargetPreset(withID: objectID)
+//                            state.hideModal() // is this needed???
+                            selectedTempTargetPresetID = preset.id?.uuidString
+                            // TODO: - add checkmark here when preset was selected
+                        }
                     }
 
                     Image(systemName: "xmark.circle").foregroundColor(showCheckmark && isSelected ? Color.clear : Color.secondary)