USB-Meter / USB Meter / Views / Sidebar / SidebarList / Sections / SidebarUSBMetersSectionView.swift
1 contributor
81 lines | 2.694kb
//
//  SidebarUSBMetersSectionView.swift
//  USB Meter
//

import SwiftUI
import CoreBluetooth

struct SidebarUSBMetersSectionView: View {
    let meters: [AppData.MeterSummary]
    let managerState: CBManagerState
    let hasLiveMeters: Bool
    let scanStartedAt: Date?
    let now: Date
    let noDevicesHelpDelay: TimeInterval

    var body: some View {
        Section(header: usbSectionHeader) {
            if meters.isEmpty {
                Text(devicesEmptyStateText)
                    .font(.footnote)
                    .foregroundColor(.secondary)
                    .frame(maxWidth: .infinity, alignment: .leading)
                    .padding(18)
                    .meterCard(
                        tint: isWaitingForFirstDiscovery ? .blue : .secondary,
                        fillOpacity: 0.14,
                        strokeOpacity: 0.20
                    )
            } else {
                ForEach(meters) { meterSummary in
                    if let meter = meterSummary.meter {
                        NavigationLink(destination: MeterView().environmentObject(meter)) {
                            MeterRowView()
                                .environmentObject(meter)
                        }
                        .buttonStyle(.plain)
                    } else {
                        NavigationLink(destination: MeterDetailView(meterSummary: meterSummary)) {
                            MeterCardView(meterSummary: meterSummary)
                        }
                        .buttonStyle(.plain)
                    }
                }
            }
        }
    }

    private var isWaitingForFirstDiscovery: Bool {
        guard managerState == .poweredOn else {
            return false
        }
        guard hasLiveMeters == false else {
            return false
        }
        guard let scanStartedAt else {
            return false
        }
        return now.timeIntervalSince(scanStartedAt) < noDevicesHelpDelay
    }

    private var devicesEmptyStateText: String {
        if isWaitingForFirstDiscovery {
            return "Scanning for nearby supported meters..."
        }
        return "No meters yet. Nearby supported meters will appear here and remain available after they disappear."
    }

    private var usbSectionHeader: some View {
        HStack {
            Text("USB Meters")
                .font(.headline)
            Spacer()
            Text("\(meters.count)")
                .font(.caption.weight(.bold))
                .padding(.horizontal, 10)
                .padding(.vertical, 6)
                .meterCard(tint: .blue, fillOpacity: 0.18, strokeOpacity: 0.24, cornerRadius: 999)
        }
    }
}