CGMRootView.swift 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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.cgmCurrent) {
  15. ForEach(state.listOfCGM) { 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.cgmCurrent.type.externalLink {
  23. Button("About this source") {
  24. UIApplication.shared.open(link, options: [:], completionHandler: nil)
  25. }
  26. }
  27. }
  28. if state.cgmCurrent.type == .plugin {
  29. Section {
  30. Button("CGM Configuration") {
  31. setupCGM.toggle()
  32. }
  33. }
  34. }
  35. if state.cgmCurrent.type == .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.cgmCurrent.type == .plugin && state.cgmCurrent.id.contains("Libre") {
  48. Section(header: Text("Calibrations")) {
  49. Text("Calibrations").navigationLink(to: .calibrations, from: self)
  50. }
  51. }
  52. Section(header: Text("Calendar")) {
  53. Toggle("Create events in calendar", isOn: $state.createCalendarEvents)
  54. if state.calendarIDs.isNotEmpty {
  55. Picker("Calendar", selection: $state.currentCalendarID) {
  56. ForEach(state.calendarIDs, id: \.self) {
  57. Text($0).tag($0)
  58. }
  59. }
  60. }
  61. }
  62. Section(header: Text("Experimental")) {
  63. Toggle("Smooth Glucose Value", isOn: $state.smoothGlucose)
  64. }
  65. }
  66. .onAppear(perform: configureView)
  67. .navigationTitle("CGM")
  68. .navigationBarTitleDisplayMode(.automatic)
  69. .sheet(isPresented: $setupCGM) {
  70. if let cgmFetchManager = state.cgmManager,
  71. let cgmManager = cgmFetchManager.cgmManager,
  72. state.cgmCurrent.type == cgmFetchManager.cgmGlucoseSourceType,
  73. state.cgmCurrent.id == cgmFetchManager.cgmGlucosePluginId
  74. {
  75. CGMSettingsView(
  76. cgmManager: cgmManager,
  77. bluetoothManager: state.provider.apsManager.bluetoothManager!,
  78. unit: state.settingsManager.settings.units,
  79. completionDelegate: state
  80. )
  81. } else {
  82. CGMSetupView(
  83. CGMType: state.cgmCurrent,
  84. bluetoothManager: state.provider.apsManager.bluetoothManager!,
  85. unit: state.settingsManager.settings.units,
  86. completionDelegate: state,
  87. setupDelegate: state,
  88. pluginCGMManager: self.state.pluginCGMManager
  89. )
  90. }
  91. }
  92. .onChange(of: setupCGM) { setupCGM in
  93. state.setupCGM = setupCGM
  94. }
  95. .onChange(of: state.setupCGM) { setupCGM in
  96. self.setupCGM = setupCGM
  97. }
  98. }
  99. }
  100. }
  101. }