AutotuneConfigStateModel.swift 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import Combine
  2. import SwiftUI
  3. extension AutotuneConfig {
  4. final class StateModel: BaseStateModel<Provider> {
  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 { [weak self] use -> AnyPublisher<Bool, Never> in
  26. guard let self = self else {
  27. return Just(false).eraseToAnyPublisher()
  28. }
  29. self.settingsManager.settings.useAutotune = use
  30. return self.apsManager.makeProfiles()
  31. }
  32. .cancellable()
  33. .store(in: &lifetime)
  34. }
  35. func run() {
  36. provider.runAutotune()
  37. .receive(on: DispatchQueue.main)
  38. .flatMap { [weak self] result -> AnyPublisher<Bool, Never> in
  39. guard let self = self else {
  40. return Just(false).eraseToAnyPublisher()
  41. }
  42. self.autotune = result
  43. return self.apsManager.makeProfiles()
  44. }
  45. .sink { [weak self] _ in
  46. self?.lastAutotuneDate = Date()
  47. }.store(in: &lifetime)
  48. }
  49. func delete() {
  50. provider.deleteAutotune()
  51. autotune = nil
  52. apsManager.makeProfiles()
  53. .cancellable()
  54. .store(in: &lifetime)
  55. }
  56. }
  57. }