AutotuneConfigViewModel.swift 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import Combine
  2. import SwiftUI
  3. extension AutotuneConfig {
  4. class ViewModel<Provider>: BaseViewModel<Provider>, ObservableObject where Provider: AutotuneConfigProvider {
  5. @Injected() var settingsManager: SettingsManager!
  6. @Injected() var apsManager: APSManager!
  7. @Published var useAutotune = false
  8. @Published var autotune: Autotune?
  9. private(set) var units: GlucoseUnits = .mmolL
  10. @Published var publishedDate = Date()
  11. @Persisted(key: "lastAutotuneDate") private var lastAutotuneDate = Date() {
  12. didSet {
  13. DispatchQueue.main.async {
  14. self.publishedDate = self.lastAutotuneDate
  15. }
  16. }
  17. }
  18. override func subscribe() {
  19. autotune = provider.autotune
  20. units = settingsManager.settings.units
  21. useAutotune = settingsManager.settings.useAutotune
  22. publishedDate = lastAutotuneDate
  23. $useAutotune
  24. .removeDuplicates()
  25. .flatMap { use -> AnyPublisher<Bool, Never> in
  26. self.settingsManager.settings.useAutotune = use
  27. return self.apsManager.makeProfiles()
  28. }
  29. .cancellable()
  30. .store(in: &lifetime)
  31. }
  32. func run() {
  33. provider.runAutotune()
  34. .receive(on: DispatchQueue.main)
  35. .flatMap { result -> AnyPublisher<Bool, Never> in
  36. self.autotune = result
  37. return self.apsManager.makeProfiles()
  38. }
  39. .sink { _ in
  40. self.lastAutotuneDate = Date()
  41. }.store(in: &lifetime)
  42. }
  43. func delete() {
  44. provider.deleteAutotune()
  45. autotune = nil
  46. apsManager.makeProfiles()
  47. .cancellable()
  48. .store(in: &lifetime)
  49. }
  50. }
  51. }