1 contributor
//
// SidebarPowerbanksSectionView.swift
// USB Meter
//
import SwiftUI
struct SidebarPowerbanksSectionView: View {
let title: String
let powerbanks: [PowerbankSummary]
let emptyStateText: String
let tint: Color
let isExpanded: Bool
let onToggle: () -> Void
let onAdd: () -> Void
var body: some View {
Section(header: headerView) {
if isExpanded {
ForEach(powerbanks) { powerbank in
NavigationLink(destination: PowerbankDetailView(powerbankID: powerbank.id)) {
PowerbankSidebarCardView(powerbank: powerbank)
}
.buttonStyle(.plain)
.transition(.opacity.combined(with: .move(edge: .top)))
}
if powerbanks.isEmpty {
Text(emptyStateText)
.font(.caption)
.foregroundColor(.secondary)
.padding(.vertical, 6)
.transition(.opacity)
}
}
}
}
private var headerView: some View {
HStack(alignment: .firstTextBaseline, spacing: 10) {
Button(action: onToggle) {
HStack(alignment: .firstTextBaseline, spacing: 4) {
Image(systemName: "chevron.right")
.font(.caption.weight(.semibold))
.foregroundColor(.secondary)
.rotationEffect(.degrees(isExpanded ? 90 : 0))
.animation(.easeInOut(duration: 0.22), value: isExpanded)
Text(title)
.font(.headline)
}
}
.buttonStyle(.plain)
Spacer()
Button(action: onAdd) {
Image(systemName: "plus.circle.fill")
.font(.body.weight(.semibold))
.foregroundColor(tint)
}
.buttonStyle(.plain)
Text("\(powerbanks.count)")
.font(.caption.weight(.bold))
.padding(.horizontal, 10)
.padding(.vertical, 6)
.meterCard(tint: tint, fillOpacity: 0.18, strokeOpacity: 0.24, cornerRadius: 999)
}
}
}