UnitsLimitsSettingsStateModel.swift 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. @Published var units: GlucoseUnits = .mgdL
  8. @Published var unitsIndex = 0 // index 0 is mg/dl
  9. @Published var maxBolus: Decimal = 10
  10. @Published var maxBasal: Decimal = 2
  11. @Published var maxIOB: Decimal = 0
  12. @Published var maxCOB: Decimal = 120
  13. @Published var hasChanged: Bool = false
  14. var preferences: Preferences {
  15. settingsManager.preferences
  16. }
  17. var pumpSettings: PumpSettings {
  18. provider.settings()
  19. }
  20. override func subscribe() {
  21. units = settingsManager.settings.units
  22. subscribeSetting(\.units, on: $unitsIndex.map { $0 == 0 ? GlucoseUnits.mgdL : .mmolL }) {
  23. unitsIndex = $0 == .mgdL ? 0 : 1
  24. }
  25. maxBasal = pumpSettings.maxBasal
  26. maxBolus = pumpSettings.maxBolus
  27. maxIOB = settings.preferences.maxIOB
  28. maxCOB = settings.preferences.maxCOB
  29. }
  30. var isPumpSettingUnchanged: Bool {
  31. pumpSettings.maxBasal == maxBasal &&
  32. pumpSettings.maxBolus == maxBolus
  33. }
  34. var isSettingUnchanged: Bool {
  35. preferences.maxIOB == maxIOB &&
  36. preferences.maxCOB == maxCOB
  37. }
  38. func saveIfChanged() {
  39. if !isSettingUnchanged {
  40. var newSettings = storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self) ?? Preferences()
  41. newSettings.maxIOB = maxIOB
  42. newSettings.maxCOB = maxCOB
  43. newSettings.timestamp = Date()
  44. storage.save(newSettings, as: OpenAPS.Settings.preferences)
  45. }
  46. if !isPumpSettingUnchanged {
  47. let settings = PumpSettings(
  48. insulinActionCurve: pumpSettings.insulinActionCurve,
  49. maxBolus: maxBolus,
  50. maxBasal: maxBasal
  51. )
  52. provider.save(settings: settings)
  53. .receive(on: DispatchQueue.main)
  54. .sink { _ in
  55. let settings = self.provider.settings()
  56. self.maxBasal = settings.maxBasal
  57. self.maxBolus = settings.maxBolus
  58. } receiveValue: {}
  59. .store(in: &lifetime)
  60. }
  61. }
  62. }
  63. }
  64. extension UnitsLimitsSettings.StateModel: SettingsObserver {
  65. func settingsDidChange(_: FreeAPSSettings) {
  66. units = settingsManager.settings.units
  67. }
  68. }