USB-Meter / USB Meter / Views / ChargedDevices / Components / ChargedDeviceLibraryRowView.swift
1 contributor
92 lines | 2.777kb
//
//  ChargedDeviceLibraryRowView.swift
//  USB Meter
//
//  Created by Codex on 22/04/2026.
//

import SwiftUI

struct ChargedDeviceLibraryRowView: View {
    let chargedDevice: ChargedDeviceSummary
    let isSelected: Bool

    var body: some View {
        HStack(alignment: .top, spacing: 14) {
            ChargedDeviceQRCodeView(qrIdentifier: chargedDevice.qrIdentifier, side: 58)

            VStack(alignment: .leading, spacing: 6) {
                header
                summaryText
            }
        }
        .padding(.vertical, 4)
    }

    private var header: some View {
        HStack {
            ChargedDeviceIdentityLabelView(
                chargedDevice: chargedDevice,
                iconPointSize: 17
            )
            .font(.headline)
            .foregroundColor(.primary)

            Spacer()

            if isSelected {
                Image(systemName: "checkmark.circle.fill")
                    .foregroundColor(.green)
            }
        }
    }

    @ViewBuilder
    private var summaryText: some View {
        Text(chargedDevice.identityTitle)
            .font(.caption.weight(.semibold))
            .foregroundColor(.secondary)

        if chargedDevice.isCharger {
            chargerSummaryText
        } else {
            deviceSummaryText
        }
    }

    @ViewBuilder
    private var chargerSummaryText: some View {
        if !chargedDevice.chargerObservedVoltageSelections.isEmpty {
            Text(chargedDevice.chargerObservedVoltageSelections.map { "\($0.format(decimalDigits: 1)) V" }.joined(separator: ", "))
                .font(.caption2)
                .foregroundColor(.secondary)
        } else if let chargerMaximumPowerWatts = chargedDevice.chargerMaximumPowerWatts {
            Text("Max power: \(chargerMaximumPowerWatts.format(decimalDigits: 2)) W")
                .font(.caption2)
                .foregroundColor(.secondary)
        } else {
            Text("Wireless charger")
                .font(.caption2)
                .foregroundColor(.secondary)
        }
    }

    @ViewBuilder
    private var deviceSummaryText: some View {
        Text(chargedDevice.supportedChargingModes.map(\.title).joined(separator: " + "))
            .font(.caption2)
            .foregroundColor(.secondary)

        if let capacity = chargedDevice.estimatedBatteryCapacityWh {
            Text("Estimated capacity: \(capacity.format(decimalDigits: 2)) Wh")
                .font(.caption)
                .foregroundColor(.secondary)
        }

        if let minimumCurrent = chargedDevice.minimumCurrentAmps {
            Text("Completion current: \(minimumCurrent.format(decimalDigits: 2)) A")
                .font(.caption2)
                .foregroundColor(.secondary)
        }
    }
}