DataTableViewModel.swift 3.2 KB

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