| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- // LoopFollow
- // DataAvailabilityView.swift
- import SwiftUI
- struct DataAvailabilityView: View {
- let availability: DataAvailabilityInfo
- var compact: Bool = false
- var body: some View {
- if compact {
- compactView
- } else {
- fullView
- }
- }
- private var compactView: some View {
- HStack(spacing: 8) {
- Image(systemName: statusIcon)
- .font(.caption)
- .foregroundColor(statusColor)
- Text(availability.displayText)
- .font(.caption)
- .foregroundColor(.secondary)
- Text(availability.dataQuality.description)
- .font(.caption)
- .fontWeight(.medium)
- .foregroundColor(statusColor)
- }
- .padding(.horizontal, 12)
- .padding(.vertical, 6)
- .background(backgroundColor.opacity(0.5))
- .cornerRadius(8)
- }
- private var fullView: some View {
- VStack(alignment: .leading, spacing: 8) {
- HStack {
- Image(systemName: statusIcon)
- .foregroundColor(statusColor)
- VStack(alignment: .leading, spacing: 2) {
- Text("Data Availability")
- .font(.caption)
- .foregroundColor(.secondary)
- Text(availability.displayText)
- .font(.subheadline)
- .fontWeight(.medium)
- }
- Spacer()
- VStack(alignment: .trailing, spacing: 2) {
- Text(availability.dataQuality.description)
- .font(.caption)
- .fontWeight(.semibold)
- .foregroundColor(statusColor)
- if availability.missingIntervals > 0 {
- Text("\(availability.missingIntervals) gaps")
- .font(.caption2)
- .foregroundColor(.secondary)
- }
- }
- }
- .padding()
- .background(backgroundColor)
- .cornerRadius(12)
- }
- }
- private var statusIcon: String {
- switch availability.dataQuality {
- case .excellent:
- return "checkmark.circle.fill"
- case .good:
- return "checkmark.circle"
- case .fair:
- return "exclamationmark.triangle"
- case .poor:
- return "xmark.circle"
- }
- }
- private var statusColor: Color {
- switch availability.dataQuality {
- case .excellent:
- return .green
- case .good:
- return .blue
- case .fair:
- return .orange
- case .poor:
- return .red
- }
- }
- private var backgroundColor: Color {
- switch availability.dataQuality {
- case .excellent:
- return Color.green.opacity(0.1)
- case .good:
- return Color.blue.opacity(0.1)
- case .fair:
- return Color.orange.opacity(0.1)
- case .poor:
- return Color.red.opacity(0.1)
- }
- }
- }
|