CGMStateModel.swift 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import Combine
  2. import SwiftUI
  3. extension CGM {
  4. final class StateModel: BaseStateModel<Provider> {
  5. @Injected() var libreSource: LibreTransmitterSource!
  6. @Injected() var calendarManager: CalendarManager!
  7. @Published var cgm: CGMType = .nightscout
  8. @Published var transmitterID = ""
  9. @Published var uploadGlucose = false
  10. @Published var createCalendarEvents = false
  11. @Published var calendarIDs: [String] = []
  12. @Published var currentCalendarID: String = ""
  13. @Persisted(key: "CalendarManager.currentCalendarID") var storedCalendarID: String? = nil
  14. override func subscribe() {
  15. cgm = settingsManager.settings.cgm
  16. transmitterID = UserDefaults.standard.dexcomTransmitterID ?? ""
  17. currentCalendarID = storedCalendarID ?? ""
  18. calendarIDs = calendarManager.calendarIDs()
  19. subscribeSetting(\.useCalendar, on: $createCalendarEvents) { createCalendarEvents = $0 }
  20. subscribeSetting(\.uploadGlucose, on: $uploadGlucose) { uploadGlucose = $0 }
  21. $cgm
  22. .removeDuplicates()
  23. .sink { [weak self] value in
  24. guard let self = self else { return }
  25. self.settingsManager.settings.cgm = value
  26. }
  27. .store(in: &lifetime)
  28. $createCalendarEvents
  29. .removeDuplicates()
  30. .flatMap { [weak self] ok -> AnyPublisher<Bool, Never> in
  31. guard ok, let self = self else { return Just(false).eraseToAnyPublisher() }
  32. return self.calendarManager.requestAccessIfNeeded()
  33. }
  34. .map { [weak self] ok -> [String] in
  35. guard ok, let self = self else { return [] }
  36. return self.calendarManager.calendarIDs()
  37. }
  38. .receive(on: DispatchQueue.main)
  39. .weakAssign(to: \.calendarIDs, on: self)
  40. .store(in: &lifetime)
  41. $currentCalendarID
  42. .removeDuplicates()
  43. .sink { [weak self] id in
  44. guard id.isNotEmpty else {
  45. self?.calendarManager.currentCalendarID = nil
  46. return
  47. }
  48. self?.calendarManager.currentCalendarID = id
  49. }
  50. .store(in: &lifetime)
  51. }
  52. func onChangeID() {
  53. UserDefaults.standard.dexcomTransmitterID = transmitterID
  54. }
  55. }
  56. }