DataTableStateModel.swift 5.2 KB

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