DataTableStateModel.swift 3.6 KB

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