import Combine import SwiftUI extension CGM { final class StateModel: BaseStateModel { @Injected() var libreSource: LibreTransmitterSource! @Injected() var calendarManager: CalendarManager! @Published var cgm: CGMType = .nightscout @Published var transmitterID = "" @Published var uploadGlucose = false @Published var createCalendarEvents = false @Published var calendarIDs: [String] = [] @Published var currentCalendarID: String = "" @Persisted(key: "CalendarManager.currentCalendarID") var storedCalendarID: String? = nil override func subscribe() { cgm = settingsManager.settings.cgm transmitterID = UserDefaults.standard.dexcomTransmitterID ?? "" currentCalendarID = storedCalendarID ?? "" calendarIDs = calendarManager.calendarIDs() subscribeSetting(\.useCalendar, on: $createCalendarEvents) { createCalendarEvents = $0 } subscribeSetting(\.uploadGlucose, on: $uploadGlucose) { uploadGlucose = $0 } $cgm .removeDuplicates() .sink { [weak self] value in guard let self = self else { return } self.settingsManager.settings.cgm = value } .store(in: &lifetime) $createCalendarEvents .removeDuplicates() .flatMap { [weak self] ok -> AnyPublisher in guard ok, let self = self else { return Just(false).eraseToAnyPublisher() } return self.calendarManager.requestAccessIfNeeded() } .map { [weak self] ok -> [String] in guard ok, let self = self else { return [] } return self.calendarManager.calendarIDs() } .receive(on: DispatchQueue.main) .weakAssign(to: \.calendarIDs, on: self) .store(in: &lifetime) $currentCalendarID .removeDuplicates() .sink { [weak self] id in guard id.isNotEmpty else { self?.calendarManager.currentCalendarID = nil return } self?.calendarManager.currentCalendarID = id } .store(in: &lifetime) } func onChangeID() { UserDefaults.standard.dexcomTransmitterID = transmitterID } } }