CGMRootView.swift 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. Section(header: Text("Calendar")) {
  48. Toggle("Create events in calendar", isOn: $state.createCalendarEvents)
  49. if state.calendarIDs.isNotEmpty {
  50. Picker("Calendar", selection: $state.currentCalendarID) {
  51. ForEach(state.calendarIDs, id: \.self) {
  52. Text($0).tag($0)
  53. }
  54. }
  55. }
  56. }
  57. Section(header: Text("Experimental")) {
  58. Toggle("Smooth Glucose Value", isOn: $state.smoothGlucose)
  59. }
  60. }
  61. .onAppear(perform: configureView)
  62. .navigationTitle("CGM")
  63. .navigationBarTitleDisplayMode(.automatic)
  64. .sheet(isPresented: $setupCGM) {
  65. if let cgmFetchManager = state.cgmManager,
  66. let cgmManager = cgmFetchManager.cgmManager,
  67. state.cgmCurrent.type == cgmFetchManager.cgmGlucoseSourceType,
  68. state.cgmCurrent.id == cgmFetchManager.cgmGlucosePluginId
  69. {
  70. CGMSettingsView(
  71. cgmManager: cgmManager,
  72. bluetoothManager: state.provider.apsManager.bluetoothManager!,
  73. unit: state.settingsManager.settings.units,
  74. completionDelegate: state
  75. )
  76. } else {
  77. CGMSetupView(
  78. CGMType: state.cgmCurrent,
  79. bluetoothManager: state.provider.apsManager.bluetoothManager!,
  80. unit: state.settingsManager.settings.units,
  81. completionDelegate: state,
  82. setupDelegate: state,
  83. pluginCGMManager: self.state.pluginCGMManager
  84. )
  85. }
  86. }
  87. .onChange(of: setupCGM) { setupCGM in
  88. state.setupCGM = setupCGM
  89. }
  90. .onChange(of: state.setupCGM) { setupCGM in
  91. self.setupCGM = setupCGM
  92. }
  93. }
  94. }
  95. }
  96. }