UnitsLimitsSettingsStateModel.swift 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import Combine
  2. import SwiftUI
  3. extension UnitsLimitsSettings {
  4. final class StateModel: BaseStateModel<Provider> {
  5. @Injected() var settings: SettingsManager!
  6. @Injected() var storage: FileStorage!
  7. @Injected() private var tidepoolManager: TidepoolManager!
  8. @Published var units: GlucoseUnits = .mgdL
  9. @Published var unitsIndex = 0 // index 0 is mg/dl
  10. @Published var maxBolus: Decimal = 10
  11. @Published var maxBasal: Decimal = 2
  12. @Published var maxIOB: Decimal = 0
  13. @Published var maxCOB: Decimal = 120
  14. @Published var hasChanged: Bool = false
  15. @Published var threshold_setting: Decimal = 60
  16. var preferences: Preferences {
  17. settingsManager.preferences
  18. }
  19. var pumpSettings: PumpSettings {
  20. provider.settings()
  21. }
  22. override func subscribe() {
  23. units = settingsManager.settings.units
  24. subscribeSetting(\.units, on: $unitsIndex.map { $0 == 0 ? GlucoseUnits.mgdL : .mmolL }) {
  25. unitsIndex = $0 == .mgdL ? 0 : 1
  26. }
  27. subscribePreferencesSetting(\.maxIOB, on: $maxIOB) { maxIOB = $0 }
  28. subscribePreferencesSetting(\.maxCOB, on: $maxCOB) { maxCOB = $0 }
  29. subscribePreferencesSetting(\.threshold_setting, on: $threshold_setting) { threshold_setting = $0 }
  30. maxBasal = pumpSettings.maxBasal
  31. maxBolus = pumpSettings.maxBolus
  32. }
  33. var isPumpSettingUnchanged: Bool {
  34. pumpSettings.maxBasal == maxBasal &&
  35. pumpSettings.maxBolus == maxBolus
  36. }
  37. func saveIfChanged() {
  38. if !isPumpSettingUnchanged {
  39. let settings = PumpSettings(
  40. insulinActionCurve: pumpSettings.insulinActionCurve,
  41. maxBolus: maxBolus,
  42. maxBasal: maxBasal
  43. )
  44. provider.save(settings: settings)
  45. .receive(on: DispatchQueue.main)
  46. .sink { _ in
  47. let settings = self.provider.settings()
  48. self.maxBasal = settings.maxBasal
  49. self.maxBolus = settings.maxBolus
  50. Task.detached(priority: .low) {
  51. await self.tidepoolManager.uploadSettings()
  52. }
  53. } receiveValue: {}
  54. .store(in: &lifetime)
  55. }
  56. }
  57. }
  58. }
  59. extension UnitsLimitsSettings.StateModel: SettingsObserver {
  60. func settingsDidChange(_: TrioSettings) {
  61. units = settingsManager.settings.units
  62. }
  63. }