AutosensSettingsStateModel.swift 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import CoreData
  2. import Observation
  3. import SwiftUI
  4. extension AutosensSettings {
  5. final class StateModel: BaseStateModel<Provider> {
  6. @Injected() var settings: SettingsManager!
  7. @Injected() var storage: FileStorage!
  8. @Injected() var determinationStorage: DeterminationStorage!
  9. var units: GlucoseUnits = .mgdL
  10. private(set) var autosensISF: Decimal?
  11. private(set) var autosensRatio: Decimal = 0
  12. var determinationsFromPersistence: [OrefDetermination] = []
  13. let viewContext = CoreDataStack.shared.persistentContainer.viewContext
  14. @Published var autosensMax: Decimal = 1.2
  15. @Published var autosensMin: Decimal = 0.7
  16. @Published var rewindResetsAutosens: Bool = true
  17. var preferences: Preferences {
  18. settingsManager.preferences
  19. }
  20. override func subscribe() {
  21. units = settingsManager.settings.units
  22. subscribePreferencesSetting(\.autosensMax, on: $autosensMax) { autosensMax = $0 }
  23. subscribePreferencesSetting(\.autosensMin, on: $autosensMin) { autosensMin = $0 }
  24. subscribePreferencesSetting(\.rewindResetsAutosens, on: $rewindResetsAutosens) { rewindResetsAutosens = $0 }
  25. if let newISF = provider.autosense.newisf {
  26. autosensISF = newISF
  27. }
  28. autosensRatio = provider.autosense.ratio
  29. setupDeterminationsArray()
  30. }
  31. var isSettingUnchanged: Bool {
  32. preferences.autosensMax == autosensMax &&
  33. preferences.autosensMin == autosensMin &&
  34. preferences.rewindResetsAutosens == rewindResetsAutosens
  35. }
  36. func saveIfChanged() {
  37. if !isSettingUnchanged {
  38. var newSettings = storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self) ?? Preferences()
  39. newSettings.autosensMax = autosensMax
  40. newSettings.autosensMin = autosensMin
  41. newSettings.rewindResetsAutosens = rewindResetsAutosens
  42. newSettings.timestamp = Date()
  43. storage.save(newSettings, as: OpenAPS.Settings.preferences)
  44. }
  45. }
  46. private func setupDeterminationsArray() {
  47. Task {
  48. let ids = await determinationStorage.fetchLastDeterminationObjectID(
  49. predicate: NSPredicate.enactedDetermination
  50. )
  51. await updateDeterminationsArray(with: ids)
  52. }
  53. }
  54. @MainActor private func updateDeterminationsArray(with IDs: [NSManagedObjectID]) {
  55. do {
  56. let objects = try IDs.compactMap { id in
  57. try viewContext.existingObject(with: id) as? OrefDetermination
  58. }
  59. determinationsFromPersistence = objects
  60. } catch {
  61. debugPrint(
  62. "Home State: \(#function) \(DebuggingIdentifiers.failed) error while updating the glucose array: \(error.localizedDescription)"
  63. )
  64. }
  65. }
  66. }
  67. }
  68. extension AutosensSettings.StateModel: SettingsObserver {
  69. func settingsDidChange(_: FreeAPSSettings) {
  70. units = settingsManager.settings.units
  71. }
  72. }