- 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>
134 lines
4.5 KiB
Markdown
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
|