BolusStateModel.swift 3.0 KB

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