USB-Meter / USB Meter / Views / Sidebar / PowerbankSidebarCardView.swift
1 contributor
69 lines | 1.953kb
//
//  PowerbankSidebarCardView.swift
//  USB Meter
//

import SwiftUI

struct PowerbankSidebarCardView: View {
    let powerbank: PowerbankSummary

    var body: some View {
        HStack(alignment: .top, spacing: 12) {
            ChargedDeviceQRCodeView(qrIdentifier: powerbank.qrIdentifier, side: 54)

            VStack(alignment: .leading, spacing: 6) {
                header
                Text(powerbank.identityTitle)
                    .font(.caption.weight(.semibold))
                    .foregroundColor(.secondary)
                details
            }
        }
        .padding(.vertical, 4)
    }

    private var header: some View {
        HStack {
            Label(powerbank.name, systemImage: powerbank.identitySymbolName)
                .font(.headline)

            if powerbank.openSession != nil {
                Spacer()
                Text("Live")
                    .font(.caption.weight(.bold))
                    .foregroundColor(.green)
            }
        }
    }

    @ViewBuilder
    private var details: some View {
        Text(reportingSummary)
            .font(.caption2)
            .foregroundColor(.secondary)

        if let capacityWh = powerbank.apparentCapacityWh ?? powerbank.estimatedBatteryCapacityWh {
            Text("Capacity: \(capacityWh.format(decimalDigits: 2)) Wh")
                .font(.caption2)
                .foregroundColor(.secondary)
        } else {
            Text("Capacity: learning")
                .font(.caption2)
                .foregroundColor(.secondary)
        }
    }

    private var reportingSummary: String {
        switch powerbank.batteryLevelReporting {
        case .percent:
            return "Battery: 0–100%"
        case .bars:
            return "Battery: \(powerbank.batteryBarsCount) bars"
        case .fullOnly:
            return "Battery: full-only LED"
        case .none:
            return "Battery: not reported"
        }
    }
}