PumpManagerDetailsView.swift 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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. private var toRun: ((_ completion: @escaping (_ result: String) -> Void) -> Void)?
  14. @State private var displayString: String = ""
  15. @State private var error: Error? = nil
  16. @State private var executing: Bool = false
  17. @State private var showActivityView: Bool = false
  18. init(toRun: @escaping (_ completion: @escaping (_ result: String) -> Void) -> Void) {
  19. self.toRun = toRun
  20. }
  21. var body: some View {
  22. VStack {
  23. List {
  24. Section {
  25. let myFont = Font
  26. .system(size: 12)
  27. .monospaced()
  28. Text(self.displayString)
  29. .font(myFont)
  30. }
  31. }
  32. .toolbar {
  33. ToolbarItem(placement: .navigationBarTrailing) {
  34. Button(action: {
  35. self.showActivityView = true
  36. }) {
  37. Image(systemName: "square.and.arrow.up")
  38. }
  39. }
  40. }.sheet(isPresented: $showActivityView) {
  41. ActivityView(isPresented: $showActivityView, activityItems: [self.displayString])
  42. }
  43. VStack {
  44. Button(action: {
  45. asyncAction()
  46. }) {
  47. Text(buttonText)
  48. .actionButtonStyle(.primary)
  49. }
  50. .padding()
  51. .disabled(executing)
  52. }
  53. .padding(self.horizontalSizeClass == .regular ? .bottom : [])
  54. .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5))
  55. }
  56. .insetGroupedListStyle()
  57. .navigationTitle(LocalizedString("Pump Manager Details", comment: "navigation title for pump manager details"))
  58. .navigationBarTitleDisplayMode(.inline)
  59. .onFirstAppear {
  60. asyncAction()
  61. }
  62. }
  63. private func asyncAction () {
  64. DispatchQueue.global(qos: .utility).async {
  65. executing = true
  66. self.displayString = ""
  67. toRun?() { (result) in
  68. self.displayString = result
  69. executing = false
  70. }
  71. }
  72. }
  73. private var buttonText: String {
  74. if executing {
  75. return LocalizedString("Retrieving Pump Manager Details...", comment: "button title when retrieving pump manager details")
  76. } else {
  77. return LocalizedString("Refresh Pump Manager Details", comment: "button title to refresh pump manager details")
  78. }
  79. }
  80. }
  81. struct PumpManagerDetailsView_Previews: PreviewProvider {
  82. static var previews: some View {
  83. 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"
  84. NavigationView {
  85. PumpManagerDetailsView() { completion in
  86. completion(examplePumpManagerDetails)
  87. }
  88. }
  89. }
  90. }