AutotuneConfigStateModel.swift 2.2 KB

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