Phase 6: Tournaments
Status: Active Development iOS PRs: #329 (6a), #348 (6c), #349 (6d), #350 (6d), #351 (6e), #352 (6f)
Overview
Phase 6 implements Tournament functionality for iOS, providing archers with the ability to browse, join, create, and participate in tournaments with multi-archer scoring support.
Phase 6a: Tournament List Filtering
PR: #329 | Status: Complete
Added Active/Completed tab filtering to TournamentListView:
- Segmented picker for tab selection
- Tab count badges
- Per-tab empty states
- Firebase callback pattern for production stability
- Combine-based reactive filtering
- Full TDD implementation (16 tests)
Guide: Tournament List Filtering Guide
Phase 6c: Tournament Creation
PR: #348 | Status: Complete
Tournament creation UI and Firebase integration.
Phase 6d: Multi-Archer Tournament Scoring
PRs: #349, #350 | Status: Complete
Complete multi-archer tournament scoring system:
TournamentScoringViewModelwith per-participant state managementParticipantTabsViewfor switching between archersLeaderboardViewwith archery tie-breaking rules (Score → X-count → 10-count → ID)TournamentScoringViewas main scoring interface- Firebase Firestore sync for scores and rankings
- Local Round database persistence for offline-first support
ScoringSessionProtocolconformance for unified scoring view
Guide: Multi-Archer Scoring Guide
Phase 6e: Unified ScoringView
PR: #351 | Status: Complete
ScoringSessionProtocol enabling unified scoring interface for solo, solo+guest, and tournament modes.
Phase 6f: Guest Archers
PR: #352 | Status: Complete
Guest archer functionality for tournament scoring:
GuestErrorenum with LocalizedError conformance- Guest limits:
maxGuestsPerParticipant = 2,maxTotalGuests = 10 AddGuestSheetSwiftUI form with validation- KMP shared code for guest ID generation
- Firebase Firestore integration for guest persistence
Guide: Guest Archers Guide
Architecture
TournamentListView
├── TournamentListViewModel (Combine)
│ └── TournamentRepositoryProtocol
│ ├── TournamentRepositoryBridge (Firebase)
│ │ └── TournamentParser
│ └── MockTournamentRepository (Testing)
├── Segmented Picker (Active/Completed)
└── Tournament List (filtered)
│
▼
TournamentDetailView
└── TournamentScoringView
├── TournamentScoringViewModel
│ ├── ScoringSessionProtocol
│ ├── ParticipantScoreState (per participant)
│ └── LeaderboardDisplayEntry
├── ParticipantTabsView
├── AddGuestSheet (modal)
├── Score Entry (Buttons/Target)
└── LeaderboardView (modal overlay)
Key Files
| Component | File | Phase |
|---|---|---|
| List ViewModel | ViewModels/TournamentListViewModel.swift | 6a |
| List View | TournamentListView.swift | 6a |
| Scoring ViewModel | ViewModels/TournamentScoringViewModel.swift | 6d |
| Scoring View | Views/TournamentScoring/TournamentScoringView.swift | 6d |
| Participant Tabs | Views/TournamentScoring/ParticipantTabsView.swift | 6d |
| Leaderboard | Views/TournamentScoring/LeaderboardView.swift | 6d |
| Add Guest Sheet | Views/TournamentScoring/AddGuestSheet.swift | 6f |
| Repository Bridge | DI/TournamentRepositoryBridge.swift | 6a |
| List Tests | TournamentListViewModelTests.swift | 6a |
| Scoring Tests | TournamentScoringViewModelTests.swift | 6d, 6f |
Test Coverage
| Phase | Tests | File |
|---|---|---|
| 6a | 16 | TournamentListViewModelTests.swift |
| 6d | 20+ | TournamentScoringViewModelTests.swift |
| 6f | 15 | TournamentScoringViewModelTests.swift (Guest tests) |
Platform Parity
| Feature | iOS | Android |
|---|---|---|
| List Filtering | TournamentListViewModel | TournamentListViewModel |
| Scoring | TournamentScoringViewModel | TournamentDetailsViewModel |
| Guest Limits | maxGuestsPerParticipant = 2 | AdminSettings.maxGuestsPerParticipant |
| Tie-breaking | Score → X → 10 → Ends → ID | Same |
Related Documentation
- iOS Troubleshooting - Common issues
- KMP iOS Patterns - Integration patterns
- Phase 5 Analytics - Similar patterns
- Agent Review Protocol - Code review automation
Last Updated: 2025-12-04