AddTempTargetStateModel.swift 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import CoreData
  2. import SwiftUI
  3. extension AddTempTarget {
  4. final class StateModel: BaseStateModel<Provider> {
  5. @Injected() private var storage: TempTargetsStorage!
  6. @Injected() var apsManager: APSManager!
  7. @Published var low: Decimal = 0
  8. @Published var high: Decimal = 0
  9. @Published var duration: Decimal = 0
  10. @Published var date = Date()
  11. @Published var newPresetName = ""
  12. @Published var presets: [TempTarget] = []
  13. @Published var percentage = 100.0
  14. @Published var maxValue: Decimal = 1.2
  15. @Published var viewPercantage = false
  16. @Published var hbt: Double = 160
  17. @Published var saveSettings: Bool = false
  18. private(set) var units: GlucoseUnits = .mmolL
  19. override func subscribe() {
  20. units = settingsManager.settings.units
  21. presets = storage.presets()
  22. maxValue = settingsManager.preferences.autosensMax
  23. }
  24. func enact() {
  25. var lowTarget = low
  26. if viewPercantage {
  27. var ratio = Decimal(percentage / 100)
  28. let hB = Decimal(hbt)
  29. let c = hB - 100
  30. var target = (c / ratio) - c + 100
  31. if c * (c + target - 100) <= 0 {
  32. ratio = maxValue
  33. target = (c / ratio) - c + 100
  34. }
  35. lowTarget = target
  36. lowTarget = Decimal(round(Double(target)))
  37. saveSettings = true
  38. }
  39. var highTarget = lowTarget
  40. if units == .mmolL, !viewPercantage {
  41. lowTarget = lowTarget.asMgdL
  42. highTarget = highTarget.asMgdL
  43. }
  44. let entry = TempTarget(
  45. name: TempTarget.custom,
  46. createdAt: date,
  47. targetTop: highTarget,
  48. targetBottom: lowTarget,
  49. duration: duration,
  50. enteredBy: TempTarget.manual,
  51. reason: TempTarget.custom
  52. )
  53. storage.storeTempTargets([entry])
  54. showModal(for: nil)
  55. }
  56. func cancel() {
  57. storage.storeTempTargets([TempTarget.cancel(at: Date())])
  58. showModal(for: nil)
  59. }
  60. func save() {
  61. var lowTarget = low
  62. if viewPercantage {
  63. var ratio = Decimal(percentage / 100)
  64. let hB = Decimal(hbt)
  65. let c = hB - 100
  66. var target = (c / ratio) - c + 100
  67. if c * (c + target - 100) <= 0 {
  68. ratio = maxValue
  69. target = (c / ratio) - c + 100
  70. }
  71. lowTarget = target
  72. lowTarget = Decimal(round(Double(target)))
  73. saveSettings = true
  74. }
  75. var highTarget = lowTarget
  76. if units == .mmolL, !viewPercantage {
  77. lowTarget = lowTarget.asMgdL
  78. highTarget = highTarget.asMgdL
  79. }
  80. let entry = TempTarget(
  81. name: newPresetName.isEmpty ? TempTarget.custom : newPresetName,
  82. createdAt: Date(),
  83. targetTop: highTarget,
  84. targetBottom: lowTarget,
  85. duration: duration,
  86. enteredBy: TempTarget.manual,
  87. reason: newPresetName.isEmpty ? TempTarget.custom : newPresetName
  88. )
  89. presets.append(entry)
  90. storage.storePresets(presets)
  91. }
  92. func enactPreset(id: String) {
  93. if var preset = presets.first(where: { $0.id == id }) {
  94. preset.createdAt = Date()
  95. storage.storeTempTargets([preset])
  96. showModal(for: nil)
  97. }
  98. }
  99. func savedHBT() {}
  100. func removePreset(id: String) {
  101. presets = presets.filter { $0.id != id }
  102. storage.storePresets(presets)
  103. }
  104. }
  105. }