CGMRootView.swift 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. }
  62. }
  63. Section(header: Text("Other")) {
  64. Toggle("Upload glucose to Nightscout", isOn: $state.uploadGlucose)
  65. }
  66. Section(header: Text("Experimental")) {
  67. Toggle("Smooth Glucose Value", isOn: $state.smoothGlucose)
  68. }
  69. }
  70. .onAppear(perform: configureView)
  71. .navigationTitle("CGM")
  72. .navigationBarTitleDisplayMode(.automatic)
  73. .sheet(isPresented: $setupCGM) {
  74. if let cgmFetchManager = state.cgmManager, cgmFetchManager.glucoseSource.cgmType == state.cgm {
  75. CGMSettingsView(
  76. cgmManager: cgmFetchManager.glucoseSource.cgmManager!,
  77. bluetoothManager: state.provider.apsManager.bluetoothManager!,
  78. unit: state.settingsManager.settings.units,
  79. completionDelegate: state
  80. )
  81. } else {
  82. CGMSetupView(
  83. CGMType: state.cgm,
  84. bluetoothManager: state.provider.apsManager.bluetoothManager!,
  85. unit: state.settingsManager.settings.units,
  86. completionDelegate: state,
  87. setupDelegate: state
  88. )
  89. }
  90. }
  91. .onChange(of: setupCGM) { setupCGM in
  92. state.setupCGM = setupCGM
  93. }
  94. .onChange(of: state.setupCGM) { setupCGM in
  95. self.setupCGM = setupCGM
  96. }
  97. }
  98. }
  99. }
  100. }