AddTempTargetStateModel.swift 3.8 KB

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