PumpManagerDetailsView.swift 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. //
  2. // PumpManagerDetailsView.swift
  3. // OmniKit
  4. //
  5. // Created by Joe Moran on 9/26/23.
  6. // Copyright © 2023 LoopKit Authors. All rights reserved.
  7. //
  8. import SwiftUI
  9. import LoopKit
  10. struct PumpManagerDetailsView: View {
  11. @Environment(\.horizontalSizeClass) var horizontalSizeClass
  12. @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
  13. var toRun: ((_ completion: @escaping (_ result: String) -> Void) -> Void)?
  14. private let title = LocalizedString("Pump Manager Details", comment: "navigation title for pump manager details")
  15. private let actionString = LocalizedString("Retrieving Pump Manager Details...", comment: "button title when retrieving pump manager details")
  16. private let buttonTitle = LocalizedString("Refresh Pump Manager Details", comment: "button title to refresh pump manager details")
  17. @State private var displayString: String = ""
  18. @State private var error: Error? = nil
  19. @State private var executing: Bool = false
  20. @State private var showActivityView: Bool = false
  21. init(toRun: @escaping (_ completion: @escaping (_ result: String) -> Void) -> Void) {
  22. self.toRun = toRun
  23. }
  24. var body: some View {
  25. VStack {
  26. List {
  27. Section {
  28. let myFont = Font
  29. .system(size: 12)
  30. .monospaced()
  31. Text(self.displayString)
  32. .font(myFont)
  33. }
  34. }
  35. .toolbar {
  36. ToolbarItem(placement: .navigationBarTrailing) {
  37. Button(action: {
  38. self.showActivityView = true
  39. }) {
  40. Image(systemName: "square.and.arrow.up")
  41. }
  42. }
  43. }.sheet(isPresented: $showActivityView) {
  44. ActivityView(isPresented: $showActivityView, activityItems: [self.displayString])
  45. }
  46. VStack {
  47. Button(action: {
  48. asyncAction()
  49. }) {
  50. Text(buttonText)
  51. .actionButtonStyle(.primary)
  52. }
  53. .padding()
  54. .disabled(executing)
  55. }
  56. .padding(self.horizontalSizeClass == .regular ? .bottom : [])
  57. .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5))
  58. }
  59. .insetGroupedListStyle()
  60. .navigationTitle(title)
  61. .navigationBarTitleDisplayMode(.automatic)
  62. .onFirstAppear {
  63. asyncAction()
  64. }
  65. }
  66. private func asyncAction () {
  67. DispatchQueue.global(qos: .utility).async {
  68. executing = true
  69. self.displayString = ""
  70. toRun?() { (result) in
  71. self.displayString = result
  72. executing = false
  73. }
  74. }
  75. }
  76. private var buttonText: String {
  77. if executing {
  78. return actionString
  79. } else {
  80. return buttonTitle
  81. }
  82. }
  83. }
  84. struct PumpManagerDetailsView_Previews: PreviewProvider {
  85. static var previews: some View {
  86. let examplePumpManagerDetails: String = "## OmnipodPumpManager\n\n## RileyLinkPumpManager\nlastTimerTick: 2023-10-07 22:35:39 +0000\n\n## RileyLinkDeviceManager\n\ncentral: <CBCentralManager: 0x283d877a0>\n\nautoConnectIDs: [\"F0178BCA-967D-504A-8C3A-99E84964B459\"]\n\ntimerTickEnabled: true\n\nidleListeningState: disabled\n\n## RileyLinkDevice\n* name: JPM OrangePro\n* lastIdle: 0001-01-01 00:00:00 +0000\n* isIdleListeningPending: false\n* isTimerTickEnabled: true\n* isTimerTickNotifying: true\n* radioFirmware: Optional(subg_rfspy 2.2)\n* bleFirmware: Optional(ble_rfspy 2.0)\n* peripheralManager: <RileyLinkBLEKit.PeripheralManager: 0x28272cee0>\n* sessionQueue.operationCount: 2\n\npodComms: ## PodComms\nconfiguredDevices: [\"F0178BCA-967D-504A-8C3A-99E84964B459\"]\ndelegate: true\n\nstatusObservers.count: 2\nstatus: ## PumpManagerStatus\n* timeZone: GMT-0700 (fixed)\n* device: <<HKDevice: 0x282cd6120>, name:Omnipod, manufacturer:Insulet, model:Eros, firmware:2.10.0, software:1.0, localIdentifier:1F05DD9A>\n* pumpBatteryChargeRemaining: nil\n* basalDeliveryState: Optional(LoopKit.PumpManagerStatus.BasalDeliveryState.active(2023-10-07 22:33:48 +0000))\n* bolusState: noBolus\n* insulinType: Optional(LoopKit.InsulinType.humalog)\n* deliveryIsUncertain: false\n\npodStateObservers.count: 1\nstate: ## OmnipodPumpManagerState\n* isOnboarded: true\n* timeZone: GMT-0700 (fixed)\n* basalSchedule: BasalSchedule(entries: [OmniKit.BasalScheduleEntry(rate: 0.9, startTime: 0.0)])\n* maximumTempBasalRate: 2.0\n* scheduledExpirationReminderOffset: Optional(\"24h0m\")\n* defaultExpirationReminderOffset: 24h0m\n* lowReservoirReminderValue: 50.0\n* podAttachmentConfirmed: true\n* activeAlerts: []\n* alertsWithPendingAcknowledgment: []\n* acknowledgedTimeOffsetAlert: false\n* initialConfigurationCompleted: true\n* unstoredDoses: []\n* suspendEngageState: stable\n* bolusEngageState: stable\n* tempBasalEngageState: stable\n* lastPumpDataReportDate: Optional(2023-10-07 22:35:24 +0000)\n* isPumpDataStale: false\n* silencePod: false\n* confirmationBeeps: manualCommands\n* pairingAttemptAddress: nil\n* insulinType: Optional(LoopKit.InsulinType.humalog)\n* scheduledExpirationReminderOffset: Optional(\"24h0m\")\n* defaultExpirationReminderOffset: 24h0m\n* rileyLinkBatteryAlertLevel: nil\n* lastRileyLinkBatteryAlertDate 0001-01-01 00:00:00 +0000\n* RileyLinkConnectionManagerState: RileyLinkConnectionState(autoConnectIDs: Set([\"F0178BCA-967D-504A-8C3A-99E84964B459\"]))\n* PodState: ### PodState\n* address: 1F05DD9A\n* activatedAt: Optional(2023-10-07 22:31:21 +0000)\n* expiresAt: Optional(2023-10-10 22:30:51 +0000)\n* timeActive: 4m\n* timeActiveUpdated: Optional(2023-10-07 22:35:38 +0000)\n* setupUnitsDelivered: Optional(2.65)\n* piVersion: 2.10.0\n* pmVersion: 2.10.0\n* lot: 72353\n* tid: 3280440\n* suspendState: resumed(2023-10-07 22:33:48 +0000)\n* unacknowledgedCommand: nil\n* unfinalizedBolus: nil\n* unfinalizedTempBasal: nil\n* unfinalizedSuspend: nil\n* unfinalizedResume: Optional(Resume: 10/7/23, 3:33:48 PM Certain)\n* finalizedDoses: []\n* activeAlertsSlots: No alerts\n* messageTransportState: MessageTransportState(packetNumber: 2, messageNumber: 8)\n* setupProgress: completed\n* primeFinishTime: Optional(2023-10-07 22:33:16 +0000)\n* configuredAlerts: [OmniKit.AlertSlot.slot4LowReservoir: Low reservoir, OmniKit.AlertSlot.slot3ExpirationReminder: Expiration reminder, OmniKit.AlertSlot.slot2ShutdownImminent: Shutdown imminent, OmniKit.AlertSlot.slot7Expired: Pod expired]\n* insulinType: humalog\n* PdmRef: nil\n* Fault: nil\n\n* PreviousPodState: nil\n"
  87. NavigationView {
  88. PumpManagerDetailsView() { completion in
  89. completion(examplePumpManagerDetails)
  90. }
  91. }
  92. }
  93. }