CGMStateModel.swift 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. uploadGlucose = settingsManager.settings.uploadGlucose
  17. transmitterID = UserDefaults.standard.dexcomTransmitterID ?? ""
  18. currentCalendarID = storedCalendarID ?? ""
  19. calendarIDs = calendarManager.calendarIDs()
  20. createCalendarEvents = settingsManager.settings.useCalendar
  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. subscribeSetting(\.uploadGlucose, on: $uploadGlucose)
  29. $createCalendarEvents
  30. .removeDuplicates()
  31. .flatMap { [weak self] ok -> AnyPublisher<Bool, Never> in
  32. guard ok, let self = self else { return Just(false).eraseToAnyPublisher() }
  33. return self.calendarManager.requestAccessIfNeeded()
  34. }
  35. .map { [weak self] ok -> [String] in
  36. guard ok, let self = self else { return [] }
  37. return self.calendarManager.calendarIDs()
  38. }
  39. .receive(on: DispatchQueue.main)
  40. .weakAssign(to: \.calendarIDs, on: self)
  41. .store(in: &lifetime)
  42. subscribeSetting(\.useCalendar, on: $createCalendarEvents)
  43. $currentCalendarID
  44. .removeDuplicates()
  45. .sink { [weak self] id in
  46. guard id.isNotEmpty else {
  47. self?.calendarManager.currentCalendarID = nil
  48. return
  49. }
  50. self?.calendarManager.currentCalendarID = id
  51. }
  52. .store(in: &lifetime)
  53. }
  54. func onChangeID() {
  55. UserDefaults.standard.dexcomTransmitterID = transmitterID
  56. }
  57. }
  58. }