AutosensSettingsStateModel.swift 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import CoreData
  2. import Observation
  3. import SwiftUI
  4. extension AutosensSettings {
  5. @Observable final class StateModel: BaseStateModel<Provider> {
  6. @ObservationIgnored @Injected() var settings: SettingsManager!
  7. @ObservationIgnored @Injected() var storage: FileStorage!
  8. @ObservationIgnored @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. var autosensMax: Decimal = 1.2
  15. var autosensMin: Decimal = 0.7
  16. var rewindResetsAutosens: Bool = true
  17. var preferences: Preferences {
  18. settingsManager.preferences
  19. }
  20. override func subscribe() {
  21. units = settingsManager.settings.units
  22. autosensMax = settings.preferences.autosensMax
  23. autosensMin = settings.preferences.autosensMin
  24. rewindResetsAutosens = settings.preferences.rewindResetsAutosens
  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. }