BolusViewModel.swift 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import SwiftUI
  2. import Swinject
  3. extension Bolus {
  4. class ViewModel<Provider>: BaseViewModel<Provider>, ObservableObject where Provider: BolusProvider {
  5. @Injected() var unlockmanager: UnlockManager!
  6. @Injected() var apsManager: APSManager!
  7. @Injected() var broadcaster: Broadcaster!
  8. @Injected() var settingsManager: SettingsManager!
  9. @Injected() var pumpHistotyStorage: PumpHistoryStorage!
  10. @Published var amount: Decimal = 0
  11. @Published var inslinRecommended: Decimal = 0
  12. @Published var inslinRequired: Decimal = 0
  13. @Published var waitForSuggestion: Bool
  14. let waitForSuggestionInitial: Bool
  15. init(provider: Provider, resolver: Resolver, waitForSuggestion: Bool) {
  16. self.waitForSuggestion = waitForSuggestion
  17. waitForSuggestionInitial = waitForSuggestion
  18. super.init(provider: provider, resolver: resolver)
  19. }
  20. required init(provider _: Provider, resolver _: Resolver) {
  21. error(.default, "init(provider:resolver:) has not been implemented")
  22. }
  23. override func subscribe() {
  24. setupInsulinRequired()
  25. broadcaster.register(SuggestionObserver.self, observer: self)
  26. if waitForSuggestionInitial {
  27. apsManager.determineBasal()
  28. .receive(on: DispatchQueue.main)
  29. .sink { ok in
  30. if !ok {
  31. self.waitForSuggestion = false
  32. self.inslinRequired = 0
  33. self.inslinRecommended = 0
  34. }
  35. }.store(in: &lifetime)
  36. }
  37. }
  38. func add() {
  39. guard amount > 0 else {
  40. showModal(for: nil)
  41. return
  42. }
  43. let maxAmount = Double(min(amount, provider.pumpSettings().maxBolus))
  44. unlockmanager.unlock()
  45. .sink { _ in } receiveValue: {
  46. self.apsManager.enactBolus(amount: maxAmount, isSMB: false)
  47. self.showModal(for: nil)
  48. }
  49. .store(in: &lifetime)
  50. }
  51. func addWithoutBolus() {
  52. guard amount > 0 else {
  53. showModal(for: nil)
  54. return
  55. }
  56. pumpHistotyStorage.storeEvents(
  57. [
  58. PumpHistoryEvent(
  59. id: UUID().uuidString,
  60. type: .bolus,
  61. timestamp: Date(),
  62. amount: amount,
  63. duration: nil,
  64. durationMin: nil,
  65. rate: nil,
  66. temp: nil,
  67. carbInput: nil
  68. )
  69. ]
  70. )
  71. showModal(for: nil)
  72. }
  73. func setupInsulinRequired() {
  74. DispatchQueue.main.async {
  75. self.inslinRequired = self.provider.suggestion?.insulinReq ?? 0
  76. self.inslinRecommended = self.apsManager
  77. .roundBolus(amount: max(self.inslinRequired * (self.settingsManager.settings.insulinReqFraction ?? 0.7), 0))
  78. }
  79. }
  80. }
  81. }
  82. extension Bolus.ViewModel: SuggestionObserver {
  83. func suggestionDidUpdate(_: Suggestion) {
  84. DispatchQueue.main.async {
  85. self.waitForSuggestion = false
  86. }
  87. setupInsulinRequired()
  88. }
  89. }