BolusViewModel.swift 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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().sink { _ in }.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: {
  38. self.apsManager.enactBolus(amount: maxAmount, isSMB: false)
  39. self.showModal(for: nil)
  40. }
  41. .store(in: &lifetime)
  42. }
  43. func addWithoutBolus() {
  44. guard amount > 0 else {
  45. showModal(for: nil)
  46. return
  47. }
  48. pumpHistotyStorage.storeEvents(
  49. [
  50. PumpHistoryEvent(
  51. id: UUID().uuidString,
  52. type: .bolus,
  53. timestamp: Date(),
  54. amount: amount,
  55. duration: nil,
  56. durationMin: nil,
  57. rate: nil,
  58. temp: nil,
  59. carbInput: nil
  60. )
  61. ]
  62. )
  63. showModal(for: nil)
  64. }
  65. func setupInsulinRequired() {
  66. DispatchQueue.main.async {
  67. self.inslinRequired = self.provider.suggestion?.insulinReq ?? 0
  68. self.inslinRecommended = self.apsManager
  69. .roundBolus(amount: max(self.inslinRequired * (self.settingsManager.settings.insulinReqFraction ?? 0.7), 0))
  70. }
  71. }
  72. }
  73. }
  74. extension Bolus.ViewModel: SuggestionObserver {
  75. func suggestionDidUpdate(_: Suggestion) {
  76. DispatchQueue.main.async {
  77. self.waitForSuggestion = false
  78. }
  79. setupInsulinRequired()
  80. }
  81. }