BolusStateModel.swift 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 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 = false
  14. var waitForSuggestionInitial: Bool = false
  15. override func subscribe() {
  16. setupInsulinRequired()
  17. broadcaster.register(SuggestionObserver.self, observer: self)
  18. if waitForSuggestionInitial {
  19. apsManager.determineBasal()
  20. .receive(on: DispatchQueue.main)
  21. .sink { [weak self] ok in
  22. guard let self = self else { return }
  23. if !ok {
  24. self.waitForSuggestion = false
  25. self.inslinRequired = 0
  26. self.inslinRecommended = 0
  27. }
  28. }.store(in: &lifetime)
  29. }
  30. }
  31. func add() {
  32. guard amount > 0 else {
  33. showModal(for: nil)
  34. return
  35. }
  36. let maxAmount = Double(min(amount, provider.pumpSettings().maxBolus))
  37. unlockmanager.unlock()
  38. .sink { _ in } receiveValue: { [weak self] _ in
  39. guard let self = self else { return }
  40. self.apsManager.enactBolus(amount: maxAmount, isSMB: false)
  41. self.showModal(for: nil)
  42. }
  43. .store(in: &lifetime)
  44. }
  45. func addWithoutBolus() {
  46. guard amount > 0 else {
  47. showModal(for: nil)
  48. return
  49. }
  50. pumpHistotyStorage.storeEvents(
  51. [
  52. PumpHistoryEvent(
  53. id: UUID().uuidString,
  54. type: .bolus,
  55. timestamp: Date(),
  56. amount: amount,
  57. duration: nil,
  58. durationMin: nil,
  59. rate: nil,
  60. temp: nil,
  61. carbInput: nil
  62. )
  63. ]
  64. )
  65. showModal(for: nil)
  66. }
  67. func setupInsulinRequired() {
  68. DispatchQueue.main.async {
  69. self.inslinRequired = self.provider.suggestion?.insulinReq ?? 0
  70. self.inslinRecommended = self.apsManager
  71. .roundBolus(amount: max(self.inslinRequired * self.settingsManager.settings.insulinReqFraction, 0))
  72. }
  73. }
  74. }
  75. }
  76. extension Bolus.StateModel: SuggestionObserver {
  77. func suggestionDidUpdate(_: Suggestion) {
  78. DispatchQueue.main.async {
  79. self.waitForSuggestion = false
  80. }
  81. setupInsulinRequired()
  82. }
  83. }