OverrideProfilesStateModel.swift 3.5 KB

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