AddTempTargetStateModel.swift 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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 halfBasal: Decimal = 160
  16. @Published var viewPercantage = false
  17. private(set) var units: GlucoseUnits = .mmolL
  18. override func subscribe() {
  19. units = settingsManager.settings.units
  20. presets = storage.presets()
  21. maxValue = settingsManager.preferences.autosensMax
  22. halfBasal = settingsManager.preferences.halfBasalExerciseTarget
  23. }
  24. func enact() {
  25. var lowTarget = low
  26. if viewPercantage {
  27. var ratio = Decimal(percentage / 100)
  28. let hB = halfBasal
  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. }
  37. var highTarget = lowTarget
  38. if units == .mmolL {
  39. lowTarget = lowTarget.asMgdL
  40. highTarget = highTarget.asMgdL
  41. }
  42. let entry = TempTarget(
  43. name: TempTarget.custom,
  44. createdAt: date,
  45. targetTop: highTarget,
  46. targetBottom: lowTarget,
  47. duration: duration,
  48. enteredBy: TempTarget.manual,
  49. reason: TempTarget.custom
  50. )
  51. storage.storeTempTargets([entry])
  52. showModal(for: nil)
  53. }
  54. func cancel() {
  55. storage.storeTempTargets([TempTarget.cancel(at: Date())])
  56. showModal(for: nil)
  57. }
  58. func save() {
  59. var lowTarget = low
  60. if viewPercantage {
  61. var ratio = Decimal(percentage / 100)
  62. let hB = halfBasal
  63. let c = hB - 100
  64. var target = (c / ratio) - c + 100
  65. if c * (c + target - 100) <= 0 {
  66. ratio = maxValue
  67. target = (c / ratio) - c + 100
  68. }
  69. lowTarget = target
  70. }
  71. var highTarget = lowTarget
  72. if units == .mmolL, !viewPercantage {
  73. lowTarget = lowTarget.asMgdL
  74. highTarget = highTarget.asMgdL
  75. }
  76. let entry = TempTarget(
  77. name: newPresetName.isEmpty ? TempTarget.custom : newPresetName,
  78. createdAt: Date(),
  79. targetTop: highTarget,
  80. targetBottom: lowTarget,
  81. duration: duration,
  82. enteredBy: TempTarget.manual,
  83. reason: newPresetName.isEmpty ? TempTarget.custom : newPresetName
  84. )
  85. presets.append(entry)
  86. storage.storePresets(presets)
  87. }
  88. func enactPreset(id: String) {
  89. if var preset = presets.first(where: { $0.id == id }) {
  90. preset.createdAt = Date()
  91. storage.storeTempTargets([preset])
  92. showModal(for: nil)
  93. }
  94. }
  95. func removePreset(id: String) {
  96. presets = presets.filter { $0.id != id }
  97. storage.storePresets(presets)
  98. }
  99. }
  100. }