AutosensSettingsStateModel.swift 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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 = 1
  12. @Published 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. private func setupDeterminationsArray() {
  32. Task {
  33. do {
  34. let ids = try await determinationStorage.fetchLastDeterminationObjectID(
  35. predicate: NSPredicate.enactedDetermination
  36. )
  37. await updateDeterminationsArray(with: ids)
  38. } catch {
  39. debug(
  40. .default,
  41. "\(DebuggingIdentifiers.failed) Error fetching determination IDs: \(error)"
  42. )
  43. }
  44. }
  45. }
  46. @MainActor private func updateDeterminationsArray(with IDs: [NSManagedObjectID]) {
  47. do {
  48. let objects = try IDs.compactMap { id in
  49. try viewContext.existingObject(with: id) as? OrefDetermination
  50. }
  51. determinationsFromPersistence = objects
  52. } catch {
  53. debugPrint(
  54. "Home State: \(#function) \(DebuggingIdentifiers.failed) error while updating the glucose array: \(error)"
  55. )
  56. }
  57. }
  58. }
  59. }
  60. extension AutosensSettings.StateModel: SettingsObserver {
  61. func settingsDidChange(_: TrioSettings) {
  62. units = settingsManager.settings.units
  63. }
  64. }