CGMStateModel.swift 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. @Published var cgmTransmitterDeviceAddress: String? = nil
  15. override func subscribe() {
  16. cgm = settingsManager.settings.cgm
  17. transmitterID = UserDefaults.standard.dexcomTransmitterID ?? ""
  18. currentCalendarID = storedCalendarID ?? ""
  19. calendarIDs = calendarManager.calendarIDs()
  20. cgmTransmitterDeviceAddress = UserDefaults.standard.cgmTransmitterDeviceAddress
  21. subscribeSetting(\.useCalendar, on: $createCalendarEvents) { createCalendarEvents = $0 }
  22. subscribeSetting(\.uploadGlucose, on: $uploadGlucose) { uploadGlucose = $0 }
  23. $cgm
  24. .removeDuplicates()
  25. .sink { [weak self] value in
  26. guard let self = self else { return }
  27. self.settingsManager.settings.cgm = value
  28. }
  29. .store(in: &lifetime)
  30. $createCalendarEvents
  31. .removeDuplicates()
  32. .flatMap { [weak self] ok -> AnyPublisher<Bool, Never> in
  33. guard ok, let self = self else { return Just(false).eraseToAnyPublisher() }
  34. return self.calendarManager.requestAccessIfNeeded()
  35. }
  36. .map { [weak self] ok -> [String] in
  37. guard ok, let self = self else { return [] }
  38. return self.calendarManager.calendarIDs()
  39. }
  40. .receive(on: DispatchQueue.main)
  41. .weakAssign(to: \.calendarIDs, on: self)
  42. .store(in: &lifetime)
  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. }