TempTargetSetup.swift 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import CoreData
  2. import Foundation
  3. extension Home.StateModel {
  4. // MARK: - Temp Targets
  5. @MainActor func setupTempTargetController() {
  6. tempTargetControllerDelegate.onContentChange = { [weak self] in
  7. Task { @MainActor in
  8. self?.updateTempTargetsFromController()
  9. }
  10. }
  11. do {
  12. try tempTargetController.performFetch()
  13. updateTempTargetsFromController()
  14. } catch {
  15. debug(.default, "\(DebuggingIdentifiers.failed) Failed to perform temp target fetch: \(error)")
  16. }
  17. }
  18. @MainActor func updateTempTargetsFromController() {
  19. guard let objects = tempTargetController.fetchedObjects else { return }
  20. // The controller predicate anchors its date window at fetch time, so filter again with a fresh "now"
  21. tempTargetStored = objects.filter(\.isVisibleInChart)
  22. }
  23. // MARK: - Temp Target Runs
  24. @MainActor func setupTempTargetRunController() {
  25. tempTargetRunControllerDelegate.onContentChange = { [weak self] in
  26. Task { @MainActor in
  27. self?.updateTempTargetRunsFromController()
  28. }
  29. }
  30. do {
  31. try tempTargetRunController.performFetch()
  32. updateTempTargetRunsFromController()
  33. } catch {
  34. debug(.default, "\(DebuggingIdentifiers.failed) Failed to perform temp target run fetch: \(error)")
  35. }
  36. }
  37. @MainActor func updateTempTargetRunsFromController() {
  38. guard let objects = tempTargetRunController.fetchedObjects else { return }
  39. tempTargetRunStored = objects
  40. }
  41. // MARK: - Temp Target Actions
  42. @MainActor func cancelTempTarget(withID id: NSManagedObjectID) async {
  43. do {
  44. guard let profileToCancel = try viewContext.existingObject(with: id) as? TempTargetStored else { return }
  45. profileToCancel.enabled = false
  46. guard viewContext.hasChanges else { return }
  47. try viewContext.save()
  48. // Do not save Cancel-Temp Targets from Nightscout to RunStoredEntity
  49. if profileToCancel.duration != 0, profileToCancel.target != 0 {
  50. await saveToTempTargetRunStored(object: profileToCancel)
  51. }
  52. // We also need to update the storage for temp targets
  53. tempTargetStorage.saveTempTargetsToStorage([TempTarget.cancel(at: Date())])
  54. Foundation.NotificationCenter.default.post(name: .didUpdateTempTargetConfiguration, object: nil)
  55. } catch let error as NSError {
  56. debugPrint("\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to cancel Temp Target with error: \(error)")
  57. }
  58. }
  59. @MainActor func saveToTempTargetRunStored(object: TempTargetStored) async {
  60. let newTempTargetRunStored = TempTargetRunStored(context: viewContext)
  61. newTempTargetRunStored.id = UUID()
  62. newTempTargetRunStored.name = object.name
  63. newTempTargetRunStored.startDate = object.date ?? .distantPast
  64. newTempTargetRunStored.endDate = Date()
  65. newTempTargetRunStored.target = object.target ?? 0
  66. newTempTargetRunStored.tempTarget = object
  67. newTempTargetRunStored.isUploadedToNS = false
  68. do {
  69. guard viewContext.hasChanges else { return }
  70. try viewContext.save()
  71. } catch let error as NSError {
  72. debugPrint("\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to save Temp Target with error: \(error)")
  73. }
  74. }
  75. }