PumpSettingsEditorStateModel.swift 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import Combine
  2. import SwiftUI
  3. extension PumpSettingsEditor {
  4. final class StateModel: BaseStateModel<Provider> {
  5. @Injected() private var nightscout: NightscoutManager!
  6. @Published var units: GlucoseUnits = .mgdL
  7. @Published var maxBasal: Decimal = 0.0 {
  8. didSet {
  9. checkForChanges()
  10. }
  11. }
  12. @Published var maxBolus: Decimal = 0.0 {
  13. didSet {
  14. checkForChanges()
  15. }
  16. }
  17. @Published var dia: Decimal = 0.0 {
  18. didSet {
  19. checkForChanges()
  20. }
  21. }
  22. @Published var syncInProgress = false
  23. @Published var hasChanged: Bool = false
  24. private var initialMaxBasal: Decimal = 0.0
  25. private var initialMaxBolus: Decimal = 0.0
  26. private var initialDia: Decimal = 0.0
  27. override func subscribe() {
  28. units = settingsManager.settings.units
  29. let settings = provider.settings()
  30. maxBasal = settings.maxBasal
  31. maxBolus = settings.maxBolus
  32. dia = settings.insulinActionCurve
  33. initialMaxBasal = settings.maxBasal
  34. initialMaxBolus = settings.maxBolus
  35. initialDia = settings.insulinActionCurve
  36. checkForChanges()
  37. }
  38. var unchanged: Bool {
  39. initialMaxBasal == maxBasal &&
  40. initialMaxBolus == maxBolus &&
  41. initialDia == dia
  42. }
  43. private func checkForChanges() {
  44. hasChanged = !unchanged
  45. }
  46. func save() {
  47. syncInProgress = true
  48. let settings = PumpSettings(
  49. insulinActionCurve: dia,
  50. maxBolus: maxBolus,
  51. maxBasal: maxBasal
  52. )
  53. provider.save(settings: settings)
  54. .receive(on: DispatchQueue.main)
  55. .sink { _ in
  56. let settings = self.provider.settings()
  57. self.syncInProgress = false
  58. self.maxBasal = settings.maxBasal
  59. self.maxBolus = settings.maxBolus
  60. self.dia = settings.insulinActionCurve
  61. self.initialMaxBasal = settings.maxBasal
  62. self.initialMaxBolus = settings.maxBolus
  63. self.initialDia = settings.insulinActionCurve
  64. self.checkForChanges()
  65. Task.detached(priority: .low) {
  66. debug(.nightscout, "Attempting to upload DIA to Nightscout")
  67. await self.nightscout.uploadProfiles()
  68. }
  69. } receiveValue: {}
  70. .store(in: &lifetime)
  71. }
  72. }
  73. }
  74. extension PumpSettingsEditor.StateModel: SettingsObserver {
  75. func settingsDidChange(_: FreeAPSSettings) {
  76. units = settingsManager.settings.units
  77. }
  78. }