AddTempTargetStateModel.swift 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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 lowTarget = Decimal(diff + multiplier) / (Decimal(percentage) / 100)
  26. let highTarget = lowTarget
  27. let entry = TempTarget(
  28. name: TempTarget.custom,
  29. createdAt: date,
  30. targetTop: highTarget,
  31. targetBottom: lowTarget,
  32. duration: duration,
  33. enteredBy: TempTarget.manual,
  34. reason: TempTarget.custom
  35. )
  36. storage.storeTempTargets([entry])
  37. showModal(for: nil)
  38. }
  39. func cancel() {
  40. storage.storeTempTargets([TempTarget.cancel(at: Date())])
  41. showModal(for: nil)
  42. }
  43. func save() {
  44. let lowTarget = Decimal(60 + 40 * (percentage / 100)) / (Decimal(percentage) / 100)
  45. let highTarget = lowTarget
  46. let entry = TempTarget(
  47. name: newPresetName.isEmpty ? TempTarget.custom : newPresetName,
  48. createdAt: Date(),
  49. targetTop: highTarget,
  50. targetBottom: lowTarget,
  51. duration: duration,
  52. enteredBy: TempTarget.manual,
  53. reason: newPresetName.isEmpty ? TempTarget.custom : newPresetName
  54. )
  55. presets.append(entry)
  56. storage.storePresets(presets)
  57. }
  58. func enactPreset(id: String) {
  59. if var preset = presets.first(where: { $0.id == id }) {
  60. preset.createdAt = Date()
  61. storage.storeTempTargets([preset])
  62. showModal(for: nil)
  63. }
  64. }
  65. func removePreset(id: String) {
  66. presets = presets.filter { $0.id != id }
  67. storage.storePresets(presets)
  68. }
  69. }
  70. }