import Combine import SwiftUI extension AutotuneConfig { final class StateModel: BaseStateModel { @Injected() var apsManager: APSManager! @Published var useAutotune = false @Published var onlyAutotuneBasals = false @Published var autotune: Autotune? private(set) var units: GlucoseUnits = .mmolL @Published var publishedDate = Date() @Persisted(key: "lastAutotuneDate") private var lastAutotuneDate = Date() { didSet { DispatchQueue.main.async { self.publishedDate = self.lastAutotuneDate } } } override func subscribe() { autotune = provider.autotune units = settingsManager.settings.units useAutotune = settingsManager.settings.useAutotune publishedDate = lastAutotuneDate subscribeSetting(\.onlyAutotuneBasals, on: $onlyAutotuneBasals) { onlyAutotuneBasals = $0 } $useAutotune .removeDuplicates() .flatMap { [weak self] use -> AnyPublisher in guard let self = self else { return Just(false).eraseToAnyPublisher() } self.settingsManager.settings.useAutotune = use return self.apsManager.makeProfiles() } .cancellable() .store(in: &lifetime) } func run() { provider.runAutotune() .receive(on: DispatchQueue.main) .flatMap { [weak self] result -> AnyPublisher in guard let self = self else { return Just(false).eraseToAnyPublisher() } self.autotune = result return self.apsManager.makeProfiles() } .sink { [weak self] _ in self?.lastAutotuneDate = Date() }.store(in: &lifetime) } func delete() { provider.deleteAutotune() autotune = nil apsManager.makeProfiles() .cancellable() .store(in: &lifetime) } } }