CGMRootView.swift 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import LoopKitUI
  2. import SwiftUI
  3. import Swinject
  4. extension CGM {
  5. struct RootView: BaseView {
  6. let resolver: Resolver
  7. @StateObject var state = StateModel()
  8. @State private var setupCGM = false
  9. // @AppStorage(UserDefaults.BTKey.cgmTransmitterDeviceAddress.rawValue) private var cgmTransmitterDeviceAddress: String? = nil
  10. var body: some View {
  11. NavigationView {
  12. Form {
  13. Section(header: Text("CGM")) {
  14. Picker("Type", selection: $state.cgm) {
  15. ForEach(CGMType.allCases) { type in
  16. VStack(alignment: .leading) {
  17. Text(type.displayName)
  18. Text(type.subtitle).font(.caption).foregroundColor(.secondary)
  19. }.tag(type)
  20. }
  21. }
  22. if let link = state.cgm.externalLink {
  23. Button("About this source") {
  24. UIApplication.shared.open(link, options: [:], completionHandler: nil)
  25. }
  26. }
  27. }
  28. if [.dexcomG5, .dexcomG6, .dexcomG7].contains(state.cgm) {
  29. Section {
  30. Button("CGM Configuration") {
  31. setupCGM.toggle()
  32. }
  33. }
  34. }
  35. if state.cgm == .xdrip {
  36. Section(header: Text("Heartbeat")) {
  37. VStack(alignment: .leading) {
  38. if let cgmTransmitterDeviceAddress = state.cgmTransmitterDeviceAddress {
  39. Text("CGM address :")
  40. Text(cgmTransmitterDeviceAddress)
  41. } else {
  42. Text("CGM is not used as heartbeat.")
  43. }
  44. }
  45. }
  46. }
  47. if state.cgm == .libreTransmitter {
  48. Button("Configure Libre Transmitter") {
  49. state.showModal(for: .libreConfig)
  50. }
  51. Text("Calibrations").navigationLink(to: .calibrations, from: self)
  52. }
  53. Section(header: Text("Calendar")) {
  54. Toggle("Create Events in Calendar", isOn: $state.createCalendarEvents)
  55. if state.calendarIDs.isNotEmpty {
  56. Picker("Calendar", selection: $state.currentCalendarID) {
  57. ForEach(state.calendarIDs, id: \.self) {
  58. Text($0).tag($0)
  59. }
  60. }
  61. Toggle("Display Emojis as Labels", isOn: $state.displayCalendarEmojis)
  62. Toggle("Display IOB and COB", isOn: $state.displayCalendarIOBandCOB)
  63. } else if state.createCalendarEvents {
  64. if #available(iOS 17.0, *) {
  65. Text(
  66. "If you are not seeing calendars to choose here, please go to Settings -> iAPS -> Calendars and change permissions to \"Full Access\""
  67. ).font(.footnote)
  68. Button("Open Settings") {
  69. // Get the settings URL and open it
  70. if let url = URL(string: UIApplication.openSettingsURLString) {
  71. UIApplication.shared.open(url)
  72. }
  73. }
  74. }
  75. }
  76. }
  77. Section(header: Text("Experimental")) {
  78. Toggle("Smooth Glucose Value", isOn: $state.smoothGlucose)
  79. }
  80. }
  81. .onAppear(perform: configureView)
  82. .navigationTitle("CGM")
  83. .navigationBarTitleDisplayMode(.automatic)
  84. .sheet(isPresented: $setupCGM) {
  85. if let cgmFetchManager = state.cgmManager, cgmFetchManager.glucoseSource.cgmType == state.cgm {
  86. CGMSettingsView(
  87. cgmManager: cgmFetchManager.glucoseSource.cgmManager!,
  88. bluetoothManager: state.provider.apsManager.bluetoothManager!,
  89. unit: state.settingsManager.settings.units,
  90. completionDelegate: state
  91. )
  92. } else {
  93. CGMSetupView(
  94. CGMType: state.cgm,
  95. bluetoothManager: state.provider.apsManager.bluetoothManager!,
  96. unit: state.settingsManager.settings.units,
  97. completionDelegate: state,
  98. setupDelegate: state
  99. )
  100. }
  101. }
  102. .onChange(of: setupCGM) { setupCGM in
  103. state.setupCGM = setupCGM
  104. }
  105. .onChange(of: state.setupCGM) { setupCGM in
  106. self.setupCGM = setupCGM
  107. }
  108. }
  109. }
  110. }
  111. }