AddTempTargetViewModel.swift 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import SwiftUI
  2. extension AddTempTarget {
  3. class ViewModel<Provider>: BaseViewModel<Provider>, ObservableObject where Provider: AddTempTargetProvider {
  4. @Injected() private var storage: TempTargetsStorage!
  5. @Injected() private var settingsManager: SettingsManager!
  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. private(set) var units: GlucoseUnits = .mmolL
  14. override func subscribe() {
  15. units = settingsManager.settings.units
  16. presets = storage.presets()
  17. }
  18. func enact() {
  19. var lowTarget = low
  20. var highTarget = high
  21. highTarget = max(highTarget, lowTarget)
  22. if units == .mmolL {
  23. lowTarget = lowTarget.asMgdL
  24. highTarget = highTarget.asMgdL
  25. }
  26. let entry = TempTarget(
  27. name: TempTarget.custom,
  28. createdAt: date,
  29. targetTop: highTarget,
  30. targetBottom: lowTarget,
  31. duration: duration,
  32. enteredBy: TempTarget.manual,
  33. reason: TempTarget.custom
  34. )
  35. storage.storeTempTargets([entry])
  36. apsManager.determineBasal().sink { _ in }.store(in: &lifetime)
  37. showModal(for: nil)
  38. }
  39. func cancel() {
  40. let entry = TempTarget(
  41. name: TempTarget.cancel,
  42. createdAt: Date(),
  43. targetTop: 0,
  44. targetBottom: 0,
  45. duration: 0,
  46. enteredBy: TempTarget.manual,
  47. reason: TempTarget.cancel
  48. )
  49. storage.storeTempTargets([entry])
  50. apsManager.determineBasal().sink { _ in }.store(in: &lifetime)
  51. showModal(for: nil)
  52. }
  53. func save() {
  54. var lowTarget = low
  55. var highTarget = high
  56. highTarget = max(highTarget, lowTarget)
  57. if units == .mmolL {
  58. lowTarget = lowTarget.asMgdL
  59. highTarget = highTarget.asMgdL
  60. }
  61. let entry = TempTarget(
  62. name: newPresetName.isEmpty ? TempTarget.custom : newPresetName,
  63. createdAt: Date(),
  64. targetTop: highTarget,
  65. targetBottom: lowTarget,
  66. duration: duration,
  67. enteredBy: TempTarget.manual,
  68. reason: newPresetName.isEmpty ? TempTarget.custom : newPresetName
  69. )
  70. presets.append(entry)
  71. storage.storePresets(presets)
  72. }
  73. func enactPreset(id: String) {
  74. if var preset = presets.first(where: { $0.id == id }) {
  75. preset.createdAt = Date()
  76. storage.storeTempTargets([preset])
  77. apsManager.determineBasal().sink { _ in }.store(in: &lifetime)
  78. showModal(for: nil)
  79. }
  80. }
  81. func removePreset(id: String) {
  82. presets = presets.filter { $0.id != id }
  83. storage.storePresets(presets)
  84. }
  85. }
  86. }