OverrideProfilesStateModel.swift 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import CoreData
  2. import SwiftUI
  3. extension OverrideProfilesConfig {
  4. final class StateModel: BaseStateModel<Provider> {
  5. @Published var percentage: Double = 100
  6. @Published var isEnabled = false
  7. @Published var _indefinite = true
  8. @Published var duration: Decimal = 0
  9. @Published var target: Decimal = 0
  10. @Published var override_target: Bool = false
  11. var units: GlucoseUnits = .mmolL
  12. override func subscribe() {
  13. units = settingsManager.settings.units
  14. }
  15. let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
  16. func saveSettings() {
  17. coredataContext.perform { [self] in
  18. let saveOverride = Override(context: self.coredataContext)
  19. saveOverride.duration = self.duration as NSDecimalNumber
  20. saveOverride.indefinite = self._indefinite
  21. saveOverride.percentage = self.percentage
  22. saveOverride.enabled = self.isEnabled
  23. saveOverride.date = Date()
  24. if override_target {
  25. if units == .mmolL {
  26. target = target.asMgdL
  27. }
  28. saveOverride.target = target as NSDecimalNumber
  29. } else { saveOverride.target = 0 }
  30. try? self.coredataContext.save()
  31. }
  32. }
  33. func savedSettings() {
  34. coredataContext.performAndWait {
  35. var overrideArray = [Override]()
  36. let requestEnabled = Override.fetchRequest() as NSFetchRequest<Override>
  37. let sortIsEnabled = NSSortDescriptor(key: "date", ascending: false)
  38. requestEnabled.sortDescriptors = [sortIsEnabled]
  39. requestEnabled.fetchLimit = 1
  40. try? overrideArray = coredataContext.fetch(requestEnabled)
  41. isEnabled = overrideArray.first?.enabled ?? false
  42. percentage = overrideArray.first?.percentage ?? 100
  43. _indefinite = overrideArray.first?.indefinite ?? true
  44. duration = (overrideArray.first?.duration ?? 0) as Decimal
  45. let overrideTarget = (overrideArray.first?.target ?? 0) as Decimal
  46. var newDuration = Double(duration)
  47. if isEnabled {
  48. let duration = overrideArray.first?.duration ?? 0
  49. let addedMinutes = Int(duration as Decimal)
  50. let date = overrideArray.first?.date ?? Date()
  51. if date.addingTimeInterval(addedMinutes.minutes.timeInterval) < Date(), !_indefinite {
  52. isEnabled = false
  53. }
  54. newDuration = Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes
  55. if overrideTarget != 0 {
  56. override_target = true
  57. target = units == .mmolL ? overrideTarget.asMmolL : overrideTarget
  58. }
  59. }
  60. if newDuration < 0 { newDuration = 0 } else { duration = Decimal(newDuration) }
  61. if !isEnabled {
  62. _indefinite = true
  63. percentage = 100
  64. duration = 0
  65. target = 0
  66. override_target = false
  67. }
  68. }
  69. }
  70. }
  71. }