Files
Sportstime/docs/plans/2026-01-12-progress-tracking-enhancements-design.md
Trey t 3530b31cca docs: add 3 feature enhancement design plans
- Trip Planning Enhancements: progressive reveal single-screen wizard
- Progress Tracking Enhancements: multiple visits, games history, zoomable map
- Polish Enhancements: grouped sorting, 100+ planning tips

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-12 19:07:46 -06:00

134 lines
4.5 KiB
Markdown

# Progress Tracking Enhancements Design
**Date:** 2026-01-12
**Status:** Draft
**Scope:** High-level overview for scoping/prioritization
## Goal
Enhance the stadium bucket list experience with richer visit tracking, a dedicated games history view, and an interactive map.
## Features
1. **Multiple visits per stadium** - Track and display each visit separately
2. **View all games attended** - New screen with chronological list, filterable by year/sport
3. **Zoomable map** - Enable pinch-to-zoom and pan on the progress map
## Current State
- `StadiumVisit` model already supports multiple visits per stadium (data is there)
- UI shows most recent visit, doesn't surface visit history well
- `ProgressMapView` has interactions disabled (`interactionModes: []`)
- No dedicated "all games attended" view exists
## Feature Details
### 1. Multiple Visits Per Stadium
The `StadiumVisit` model already stores multiple visits. UI changes needed:
| Component | Change |
|-----------|--------|
| `VisitDetailView` | Show list of all visits for that stadium, not just most recent |
| `StadiumVisitSheet` | "Add Another Visit" button when stadium already has visits |
| Stadium cards | Show visit count badge ("3 visits") |
**UI Flow:**
- Tapping a visited stadium shows a list of visit cards
- Each visit card is expandable to show game details, photos, notes
- "Add Visit" button at bottom of visit list
### 2. View All Games Attended (GamesHistoryView)
New screen accessible from Progress tab:
**Header:** "X Games Attended" with sport filter chips
**Layout:**
- Grouped by year (2026, 2025, 2024...) with sticky section headers
- Each row: Date, teams (vs format), stadium, score, sport icon
- Tapping a row opens the visit detail
**Filters:**
- Sport: Multi-select chips at top (MLB, NBA, NHL, NFL)
- Year: Scroll-based (no separate picker needed)
**Empty State:** "No games recorded yet. Add your first visit!"
**Access Points:**
- Button in Progress tab header
- "See All" link in recent visits section
### 3. Zoomable Map
| Current | New |
|---------|-----|
| `interactionModes: []` | `interactionModes: [.zoom, .pan]` |
| Fixed US region | Remembers last position |
| Tap shows name label only | Tap zooms to stadium + shows detail card |
**Additional UI:**
- "Reset View" floating button (bottom-right corner)
- Appears after user pans or zooms away from default view
- Tapping resets to full continental US view
**Zoom-to-Stadium Behavior:**
- Tapping a pin animates map to that stadium
- Uses ~0.01 lat/lon span (city level zoom)
- Shows stadium detail card below map
## File Structure
```
Features/Progress/Views/
├── ProgressMapView.swift # MODIFY - enable interactions, add reset button
├── VisitDetailView.swift # MODIFY - show all visits as list
├── StadiumVisitSheet.swift # MODIFY - "Add Another Visit" flow
├── GamesHistoryView.swift # NEW - all games attended screen
├── GamesHistoryRow.swift # NEW - single game row component
└── VisitListCard.swift # NEW - compact visit card for lists
```
## Key Decisions
| Decision | Choice | Rationale |
|----------|--------|-----------|
| Games history access | Header button + "See All" link | Multiple entry points for discoverability |
| Year grouping | Sticky section headers | Standard iOS pattern, easy to scan |
| Map zoom on tap | Animate to 0.01 span | City-level detail without losing context |
| Reset button visibility | Show only after pan/zoom | Don't clutter UI when at default view |
| Visit count badge | Orange circle with number | Consistent with app theme |
| Default sort | Most recent first | Users care about recent visits |
## Data Changes
No model changes needed:
- `StadiumVisit` already supports multiple visits per stadium
- `ProgressViewModel` already has `visits` array
Add computed property to `ProgressViewModel`:
```swift
var allVisitsByYear: [Int: [VisitSummary]] {
Dictionary(grouping: allVisits) { Calendar.current.component(.year, from: $0.visitDate) }
}
```
## Not Included (YAGNI)
- Export games history to CSV
- Share individual visit cards to social media
- Map clustering for dense stadium areas (revisit if performance issues)
- Search within games history (filter chips should suffice)
## Dependencies
- None - uses existing models and data providers
## Testing Considerations
- Test multiple visits for same stadium (add, view, edit)
- Test games history with various filter combinations
- Test map zoom/pan performance with all stadiums loaded
- Test reset button appears/disappears correctly
- Test empty states for new users