OverrideProfilesStateModel.swift 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. let units = settingsManager.settings.units
  14. self.units = 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.date = Date()
  25. saveOverride.target = units == .mmolL ? target.asMgdL as NSDecimalNumber : target as NSDecimalNumber
  26. try? self.coredataContext.save()
  27. }
  28. }
  29. func savedSettings() {
  30. coredataContext.performAndWait {
  31. var overrideArray = [Override]()
  32. let requestEnabled = Override.fetchRequest() as NSFetchRequest<Override>
  33. let sortIsEnabled = NSSortDescriptor(key: "date", ascending: false)
  34. requestEnabled.sortDescriptors = [sortIsEnabled]
  35. requestEnabled.fetchLimit = 1
  36. try? overrideArray = coredataContext.fetch(requestEnabled)
  37. isEnabled = overrideArray.first?.enabled ?? false
  38. percentage = overrideArray.first?.percentage ?? 100
  39. _indefinite = overrideArray.first?.indefinite ?? true
  40. duration = (overrideArray.first?.duration ?? 0) as Decimal
  41. let overrideTarget = (overrideArray.first?.target ?? 0) as Decimal
  42. var newDuration = Double(duration)
  43. if isEnabled {
  44. let duration = overrideArray.first?.duration ?? 0
  45. let addedMinutes = Int(duration as Decimal)
  46. let date = overrideArray.first?.date ?? Date()
  47. if date.addingTimeInterval(addedMinutes.minutes.timeInterval) < Date(), !_indefinite {
  48. isEnabled = false
  49. }
  50. newDuration = Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes
  51. if (overrideArray.first?.target ?? 0) != 0 {
  52. override_target = true
  53. target = units == .mgdL ? overrideTarget : overrideTarget.asMmolL
  54. }
  55. }
  56. if newDuration < 0 { newDuration = 0 } else { duration = Decimal(newDuration) }
  57. if !isEnabled {
  58. _indefinite = true
  59. percentage = 100
  60. duration = 0
  61. target = 0
  62. override_target = false
  63. }
  64. }
  65. }
  66. }
  67. }