CGMStateModel.swift 3.0 KB

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