BolusViewModel.swift 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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 { [weak self] ok in
  30. guard let self = self else { return }
  31. if !ok {
  32. self.waitForSuggestion = false
  33. self.inslinRequired = 0
  34. self.inslinRecommended = 0
  35. }
  36. }.store(in: &lifetime)
  37. }
  38. }
  39. func add() {
  40. guard amount > 0 else {
  41. showModal(for: nil)
  42. return
  43. }
  44. let maxAmount = Double(min(amount, provider.pumpSettings().maxBolus))
  45. unlockmanager.unlock()
  46. .sink { _ in } receiveValue: {
  47. self.apsManager.enactBolus(amount: maxAmount, isSMB: false)
  48. self.showModal(for: nil)
  49. }
  50. .store(in: &lifetime)
  51. }
  52. func addWithoutBolus() {
  53. guard amount > 0 else {
  54. showModal(for: nil)
  55. return
  56. }
  57. pumpHistotyStorage.storeEvents(
  58. [
  59. PumpHistoryEvent(
  60. id: UUID().uuidString,
  61. type: .bolus,
  62. timestamp: Date(),
  63. amount: amount,
  64. duration: nil,
  65. durationMin: nil,
  66. rate: nil,
  67. temp: nil,
  68. carbInput: nil
  69. )
  70. ]
  71. )
  72. showModal(for: nil)
  73. }
  74. func setupInsulinRequired() {
  75. DispatchQueue.main.async {
  76. self.inslinRequired = self.provider.suggestion?.insulinReq ?? 0
  77. self.inslinRecommended = self.apsManager
  78. .roundBolus(amount: max(self.inslinRequired * (self.settingsManager.settings.insulinReqFraction ?? 0.7), 0))
  79. }
  80. }
  81. }
  82. }
  83. extension Bolus.ViewModel: SuggestionObserver {
  84. func suggestionDidUpdate(_: Suggestion) {
  85. DispatchQueue.main.async {
  86. self.waitForSuggestion = false
  87. }
  88. setupInsulinRequired()
  89. }
  90. }