CGMRootView.swift 4.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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, .libreTransmitter].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. 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, cgmFetchManager.glucoseSource.cgmType == state.cgm {
  66. CGMSettingsView(
  67. cgmManager: cgmFetchManager.glucoseSource.cgmManager!,
  68. bluetoothManager: state.provider.apsManager.bluetoothManager!,
  69. unit: state.settingsManager.settings.units,
  70. completionDelegate: state
  71. )
  72. } else {
  73. CGMSetupView(
  74. CGMType: state.cgm,
  75. bluetoothManager: state.provider.apsManager.bluetoothManager!,
  76. unit: state.settingsManager.settings.units,
  77. completionDelegate: state,
  78. setupDelegate: state
  79. )
  80. }
  81. }
  82. .onChange(of: setupCGM) { setupCGM in
  83. state.setupCGM = setupCGM
  84. }
  85. .onChange(of: state.setupCGM) { setupCGM in
  86. self.setupCGM = setupCGM
  87. }
  88. }
  89. }
  90. }
  91. }