AddTempTargetStateModel.swift 3.3 KB

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