BLEDeviceSelectionView.swift 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // LoopFollow
  2. // BLEDeviceSelectionView.swift
  3. // Created by Jonas Björkert on 2025-01-13.
  4. import SwiftUI
  5. struct BLEDeviceSelectionView: View {
  6. @ObservedObject var bleManager: BLEManager
  7. var selectedFilter: BackgroundRefreshType
  8. var onSelectDevice: (BLEDevice) -> Void
  9. var body: some View {
  10. VStack {
  11. List {
  12. let filteredDevices = bleManager.devices.filter { selectedFilter.matches($0) && !isSelected($0) }
  13. if filteredDevices.isEmpty {
  14. Text("No devices found yet. They'll appear here when discovered.")
  15. .foregroundColor(.secondary)
  16. .multilineTextAlignment(.center)
  17. .padding()
  18. } else {
  19. ForEach(filteredDevices, id: \.id) { device in
  20. HStack {
  21. VStack(alignment: .leading) {
  22. Text(device.name ?? "Unknown")
  23. Text("RSSI: \(device.rssi) dBm")
  24. .foregroundColor(.secondary)
  25. .font(.footnote)
  26. if let offset = BLEManager.shared.expectedSensorFetchOffsetString(for: device) {
  27. Text("Expected bg delay: \(offset)")
  28. .foregroundColor(.secondary)
  29. .font(.footnote)
  30. }
  31. }
  32. Spacer()
  33. }
  34. .contentShape(Rectangle())
  35. .onTapGesture {
  36. onSelectDevice(device)
  37. }
  38. }
  39. }
  40. }
  41. }
  42. .onAppear {
  43. bleManager.startScanning()
  44. }
  45. .onDisappear {
  46. bleManager.stopScanning()
  47. }
  48. }
  49. private func isSelected(_ device: BLEDevice) -> Bool {
  50. guard let selectedDevice = Storage.shared.selectedBLEDevice.value else {
  51. return false
  52. }
  53. return selectedDevice.id == device.id
  54. }
  55. }