Replace all system colors (.secondary, Color(.secondarySystemBackground), etc.) with Theme.textPrimary/textSecondary/textMuted/cardBackground/ surfaceGlow across 13 views. Remove PostHog debug logging. Add debug settings for sample trips and hardcoded group poll preview. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
116 lines
3.4 KiB
Swift
116 lines
3.4 KiB
Swift
import SwiftUI
|
|
import SwiftData
|
|
|
|
struct StadiumVisitHistoryView: View {
|
|
let stadium: Stadium
|
|
@Environment(\.modelContext) private var modelContext
|
|
@Environment(\.dismiss) private var dismiss
|
|
|
|
@State private var visits: [StadiumVisit] = []
|
|
@State private var isLoading = true
|
|
@State private var showingAddVisit = false
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
Group {
|
|
if isLoading {
|
|
LoadingSpinner(size: .medium)
|
|
} else if visits.isEmpty {
|
|
EmptyVisitHistoryView()
|
|
} else {
|
|
VisitHistoryList(visits: visits)
|
|
}
|
|
}
|
|
.navigationTitle(stadium.name)
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
.toolbar {
|
|
ToolbarItem(placement: .cancellationAction) {
|
|
Button("Done") { dismiss() }
|
|
}
|
|
|
|
ToolbarItem(placement: .primaryAction) {
|
|
Button {
|
|
showingAddVisit = true
|
|
} label: {
|
|
Image(systemName: "plus")
|
|
}
|
|
.accessibilityLabel("Add visit to this stadium")
|
|
}
|
|
}
|
|
.sheet(isPresented: $showingAddVisit) {
|
|
StadiumVisitSheet(initialStadium: stadium)
|
|
}
|
|
}
|
|
.task {
|
|
await loadVisits()
|
|
}
|
|
}
|
|
|
|
private func loadVisits() async {
|
|
isLoading = true
|
|
defer { isLoading = false }
|
|
|
|
let stadiumId = stadium.id
|
|
let descriptor = FetchDescriptor<StadiumVisit>(
|
|
predicate: #Predicate { $0.stadiumId == stadiumId },
|
|
sortBy: [SortDescriptor(\.visitDate, order: .reverse)]
|
|
)
|
|
|
|
do {
|
|
visits = try modelContext.fetch(descriptor)
|
|
} catch {
|
|
visits = []
|
|
}
|
|
}
|
|
}
|
|
|
|
private struct VisitHistoryList: View {
|
|
@Environment(\.colorScheme) private var colorScheme
|
|
let visits: [StadiumVisit]
|
|
|
|
var body: some View {
|
|
ScrollView {
|
|
VStack(spacing: 12) {
|
|
// Visit count header
|
|
HStack {
|
|
Text("\(visits.count) Visit\(visits.count == 1 ? "" : "s")")
|
|
.font(.headline)
|
|
.foregroundStyle(Theme.textPrimary(colorScheme))
|
|
Spacer()
|
|
}
|
|
.padding(.horizontal)
|
|
|
|
// Visit cards
|
|
ForEach(visits, id: \.id) { visit in
|
|
VisitListCard(visit: visit)
|
|
.padding(.horizontal)
|
|
}
|
|
}
|
|
.padding(.vertical)
|
|
}
|
|
.background(Theme.backgroundGradient(colorScheme))
|
|
}
|
|
}
|
|
|
|
private struct EmptyVisitHistoryView: View {
|
|
@Environment(\.colorScheme) private var colorScheme
|
|
|
|
var body: some View {
|
|
VStack(spacing: 16) {
|
|
Image(systemName: "calendar.badge.plus")
|
|
.font(.largeTitle)
|
|
.foregroundStyle(Theme.textMuted(colorScheme))
|
|
|
|
Text("No visits recorded")
|
|
.font(.headline)
|
|
.foregroundStyle(Theme.textPrimary(colorScheme))
|
|
|
|
Text("Tap + to add your first visit to this stadium")
|
|
.font(.subheadline)
|
|
.foregroundStyle(Theme.textSecondary(colorScheme))
|
|
.multilineTextAlignment(.center)
|
|
}
|
|
.padding()
|
|
}
|
|
}
|