DataTableStateModel.swift 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import SwiftUI
  2. extension DataTable {
  3. final class StateModel: BaseStateModel<Provider> {
  4. @Injected() var broadcaster: Broadcaster!
  5. @Published var mode: Mode = .treatments
  6. @Published var treatments: [Treatment] = []
  7. @Published var glucose: [Glucose] = []
  8. var units: GlucoseUnits = .mmolL
  9. override func subscribe() {
  10. units = settingsManager.settings.units
  11. setupTreatments()
  12. setupGlucose()
  13. broadcaster.register(SettingsObserver.self, observer: self)
  14. broadcaster.register(PumpHistoryObserver.self, observer: self)
  15. broadcaster.register(TempTargetsObserver.self, observer: self)
  16. broadcaster.register(CarbsObserver.self, observer: self)
  17. broadcaster.register(GlucoseObserver.self, observer: self)
  18. }
  19. private func setupTreatments() {
  20. DispatchQueue.global().async {
  21. let units = self.settingsManager.settings.units
  22. let carbs = self.provider.carbs().map {
  23. Treatment(units: units, type: .carbs, date: $0.createdAt, amount: $0.carbs)
  24. }
  25. let boluses = self.provider.pumpHistory()
  26. .filter { $0.type == .bolus }
  27. .map {
  28. Treatment(units: units, type: .bolus, date: $0.timestamp, amount: $0.amount)
  29. }
  30. let tempBasals = self.provider.pumpHistory()
  31. .filter { $0.type == .tempBasal || $0.type == .tempBasalDuration }
  32. .chunks(ofCount: 2)
  33. .compactMap { chunk -> Treatment? in
  34. let chunk = Array(chunk)
  35. guard chunk.count == 2, chunk[0].type == .tempBasal,
  36. chunk[1].type == .tempBasalDuration else { return nil }
  37. return Treatment(
  38. units: units,
  39. type: .tempBasal,
  40. date: chunk[0].timestamp,
  41. amount: chunk[0].rate ?? 0,
  42. secondAmount: nil,
  43. duration: Decimal(chunk[1].durationMin ?? 0)
  44. )
  45. }
  46. let tempTargets = self.provider.tempTargets()
  47. .map {
  48. Treatment(
  49. units: units,
  50. type: .tempTarget,
  51. date: $0.createdAt,
  52. amount: $0.targetBottom ?? 0,
  53. secondAmount: $0.targetTop,
  54. duration: $0.duration
  55. )
  56. }
  57. let suspend = self.provider.pumpHistory()
  58. .filter { $0.type == .pumpSuspend }
  59. .map {
  60. Treatment(units: units, type: .suspend, date: $0.timestamp)
  61. }
  62. let resume = self.provider.pumpHistory()
  63. .filter { $0.type == .pumpResume }
  64. .map {
  65. Treatment(units: units, type: .resume, date: $0.timestamp)
  66. }
  67. DispatchQueue.main.async {
  68. self.treatments = [carbs, boluses, tempBasals, tempTargets, suspend, resume]
  69. .flatMap { $0 }
  70. .sorted { $0.date > $1.date }
  71. }
  72. }
  73. }
  74. func setupGlucose() {
  75. DispatchQueue.main.async {
  76. self.glucose = self.provider.glucose().map(Glucose.init)
  77. }
  78. }
  79. func deleteCarbs(at date: Date) {
  80. provider.deleteCarbs(at: date)
  81. }
  82. func deleteGlucose(at index: Int) {
  83. let id = glucose[index].id
  84. provider.deleteGlucose(id: id)
  85. }
  86. }
  87. }
  88. extension DataTable.StateModel:
  89. SettingsObserver,
  90. PumpHistoryObserver,
  91. TempTargetsObserver,
  92. CarbsObserver,
  93. GlucoseObserver
  94. {
  95. func settingsDidChange(_: FreeAPSSettings) {
  96. setupTreatments()
  97. }
  98. func pumpHistoryDidUpdate(_: [PumpHistoryEvent]) {
  99. setupTreatments()
  100. }
  101. func tempTargetsDidUpdate(_: [TempTarget]) {
  102. setupTreatments()
  103. }
  104. func carbsDidUpdate(_: [CarbsEntry]) {
  105. setupTreatments()
  106. }
  107. func glucoseDidUpdate(_: [BloodGlucose]) {
  108. setupGlucose()
  109. }
  110. }