perf: optimize Progress tab with O(1) lookups and loading state

Replace O(n) linear searches with dictionary lookups in ProgressViewModel
and ProgressTabView. Add loading spinner while data loads.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-02-09 17:38:59 -06:00
parent 213d2bae53
commit 1c57c47041
2 changed files with 61 additions and 45 deletions

View File

@@ -16,7 +16,7 @@ final class ProgressViewModel {
// MARK: - State
var selectedSport: Sport = .mlb
var isLoading = false
var isLoading = true
var error: Error?
var errorMessage: String?
@@ -42,10 +42,8 @@ final class ProgressViewModel {
visits
.filter { $0.sportEnum == selectedSport }
.compactMap { visit -> String? in
// Match visit's canonical stadium ID to a stadium
stadiums.first { stadium in
stadium.id == visit.stadiumId
}?.id
// O(1) dictionary lookup via DataProvider
dataProvider.stadium(for: visit.stadiumId)?.id
}
)
@@ -120,7 +118,7 @@ final class ProgressViewModel {
.sorted { $0.visitDate > $1.visitDate }
.prefix(10)
.compactMap { visit -> VisitSummary? in
guard let stadium = stadiums.first(where: { $0.id == visit.stadiumId }),
guard let stadium = dataProvider.stadium(for: visit.stadiumId),
let sport = visit.sportEnum else {
return nil
}