CalendarEventSettingsStateModel.swift 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import Combine
  2. import SwiftUI
  3. extension CalendarEventSettings {
  4. final class StateModel: BaseStateModel<Provider> {
  5. @Injected() var settings: SettingsManager!
  6. @Injected() var storage: FileStorage!
  7. @Injected() var calendarManager: CalendarManager!
  8. @Published var units: GlucoseUnits = .mgdL
  9. @Published var useCalendar = false
  10. @Published var displayCalendarIOBandCOB = false
  11. @Published var displayCalendarEmojis = 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. units = settingsManager.settings.units
  17. currentCalendarID = storedCalendarID ?? ""
  18. calendarIDs = calendarManager.calendarIDs()
  19. subscribeSetting(\.useCalendar, on: $useCalendar) { useCalendar = $0 }
  20. subscribeSetting(\.displayCalendarIOBandCOB, on: $displayCalendarIOBandCOB) { displayCalendarIOBandCOB = $0 }
  21. subscribeSetting(\.displayCalendarEmojis, on: $displayCalendarEmojis) { displayCalendarEmojis = $0 }
  22. observeCreateCalendarEvents()
  23. observeCurrentCalendarID()
  24. }
  25. private func observeCreateCalendarEvents() {
  26. Task {
  27. for await ok in $useCalendar.removeDuplicates().values {
  28. guard ok else { continue }
  29. let accessGranted = await calendarManager.requestAccessIfNeeded()
  30. if accessGranted {
  31. let ids = calendarManager.calendarIDs()
  32. await MainActor.run {
  33. self.calendarIDs = ids
  34. }
  35. }
  36. }
  37. }
  38. }
  39. private func observeCurrentCalendarID() {
  40. Task {
  41. for await id in $currentCalendarID.removeDuplicates().values {
  42. if id.isEmpty {
  43. calendarManager.currentCalendarID = nil
  44. } else {
  45. calendarManager.currentCalendarID = id
  46. }
  47. }
  48. }
  49. }
  50. }
  51. }
  52. extension CalendarEventSettings.StateModel: SettingsObserver {
  53. func settingsDidChange(_: FreeAPSSettings) {
  54. units = settingsManager.settings.units
  55. }
  56. }