BolusViewModel.swift 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. @Published var amount: Decimal = 0
  10. @Published var inslinRecommended: Decimal = 0
  11. @Published var inslinRequired: Decimal = 0
  12. @Published var waitForSuggestion: Bool
  13. let waitForSuggestionInitial: Bool
  14. init(provider: Provider, resolver: Resolver, waitForSuggestion: Bool) {
  15. self.waitForSuggestion = waitForSuggestion
  16. waitForSuggestionInitial = waitForSuggestion
  17. super.init(provider: provider, resolver: resolver)
  18. }
  19. required init(provider _: Provider, resolver _: Resolver) {
  20. error(.default, "init(provider:resolver:) has not been implemented")
  21. }
  22. override func subscribe() {
  23. setupInsulinRequired()
  24. broadcaster.register(SuggestionObserver.self, observer: self)
  25. }
  26. func add() {
  27. guard amount > 0 else {
  28. showModal(for: nil)
  29. return
  30. }
  31. unlockmanager.unlock()
  32. .sink { _ in } receiveValue: {
  33. self.apsManager.enactBolus(amount: Double(self.amount), isSMB: false)
  34. self.showModal(for: nil)
  35. }
  36. .store(in: &lifetime)
  37. }
  38. func setupInsulinRequired() {
  39. DispatchQueue.main.async {
  40. self.inslinRequired = self.provider.suggestion?.insulinReq ?? 0
  41. self.inslinRecommended = self.apsManager
  42. .roundBolus(amount: max(self.inslinRequired * (self.settingsManager.settings.insulinReqFraction ?? 0.7), 0))
  43. }
  44. }
  45. }
  46. }
  47. extension Bolus.ViewModel: SuggestionObserver {
  48. func suggestionDidUpdate(_: Suggestion) {
  49. DispatchQueue.main.async {
  50. self.waitForSuggestion = false
  51. }
  52. setupInsulinRequired()
  53. }
  54. }