| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- import Foundation
- import CoreData
- extension TrioRemoteControl {
- @MainActor func handleTempTargetCommand(_ pushMessage: PushMessage) async {
- guard let targetValue = pushMessage.target,
- let durationValue = pushMessage.duration
- else {
- await logError("Command rejected: temp target data is incomplete or invalid.", pushMessage: pushMessage)
- return
- }
- let durationInMinutes = Int(durationValue)
- let pushMessageDate = Date(timeIntervalSince1970: pushMessage.timestamp)
- let tempTarget = TempTarget(
- name: TempTarget.custom,
- createdAt: pushMessageDate,
- targetTop: Decimal(targetValue),
- targetBottom: Decimal(targetValue),
- duration: Decimal(durationInMinutes),
- enteredBy: TempTarget.local,
- reason: TempTarget.custom,
- isPreset: false,
- enabled: true,
- halfBasalTarget: settings.preferences.halfBasalExerciseTarget
- )
- await tempTargetsStorage.storeTempTarget(tempTarget: tempTarget)
- tempTargetsStorage.saveTempTargetsToStorage([tempTarget])
-
- debug(
- .remoteControl,
- "Remote command processed successfully. \(pushMessage.humanReadableDescription())"
- )
- }
- @MainActor func cancelTempTarget(_ pushMessage: PushMessage) async {
- debug(.remoteControl, "Cancelling temp target.")
- await disableAllActiveTempTargets()
- debug(
- .remoteControl,
- "Remote command processed successfully. \(pushMessage.humanReadableDescription())"
- )
- }
-
- @MainActor func disableAllActiveTempTargets() async {
- let ids = await tempTargetsStorage.loadLatestTempTargetConfigurations(fetchLimit: 0)
- let didPostNotification = await viewContext.perform { () -> Bool in
- do {
- let results = try ids.compactMap { id in
- try self.viewContext.existingObject(with: id) as? TempTargetStored
- }
- guard !results.isEmpty else {
- Task {
- await self.logError("Command rejected: no active temp target to cancel.")
- }
- return false
- }
- for canceledTempTarget in results where canceledTempTarget.enabled {
- let newTempTargetRunStored = TempTargetRunStored(context: self.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
-
- canceledTempTarget.enabled = false
- canceledTempTarget.isUploadedToNS = false
- }
- if self.viewContext.hasChanges {
- try self.viewContext.save()
- Foundation.NotificationCenter.default.post(name: .willUpdateTempTargetConfiguration, object: nil)
-
- // Update the storage so oref can pick up cancellation
- self.tempTargetsStorage.saveTempTargetsToStorage([TempTarget.cancel(at: Date().addingTimeInterval(-1))])
- return true
- } else {
- return false
- }
- } catch {
- debugPrint(
- "\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to disable active TempTargets with error: \(error.localizedDescription)"
- )
- return false
- }
- }
-
- if didPostNotification {
- await awaitNotification(.didUpdateTempTargetConfiguration)
- }
- }
- }
|