# PWA Frontend Integration for Fantasy Draft Games ## Auth flow (index.html) 1. **Dual-mode form:** Registration + Login toggled by `isLoginMode` boolean 2. **On success:** Store token in `localStorage.getItem('shark_token')`, user in `localStorage.setItem('shark_user')` 3. **Post-auth:** `GET /api/leagues` — branch by count: - 0 leagues → show create/join UI - 1 league → auto-redirect `draft-room.html?league_id=X` - Multiple → show league picker 4. **Auth guard** on every protected page: `if (!getToken()) window.location.href = 'index.html'` 5. **Register response:** `{user_id, token, display_name}` — backend must pass `display_name` from request ## League management (index.html) - **Create:** `POST /api/leagues {name}` → returns `{id, invite_code}` - **Join:** `POST /api/leagues/join {invite_code}` → returns `{league_id, league_name}` - **Redirect after create/join:** `window.location.href = 'draft-room.html?league_id=' + result.id` ## Draft room (draft-room.html) ### League picker overlay - GET `/api/leagues` on load - If no `league_id` URL param, show overlay with league cards - On select: `history.replaceState(null, '', '?league_id=' + id)` + `loadAll()` ### Data loading ```javascript async function loadAll() { const [league, board, scores, regions] = await Promise.all([ apiCall('/api/leagues/' + leagueId), apiCall('/api/leagues/' + leagueId + '/draft'), apiCall('/api/leagues/' + leagueId + '/scores'), apiCall('/api/regions'), ]); renderAll(); } ``` ### Draft board tabs - **Draft tab:** Region cards grid + status bar (round/turn info) - **Team tab:** User's drafted regions + cumulative points - **Leaderboard tab:** Ranked user list with scores - **League info tab:** Invite code (copyable), member list, start draft (commissioner only) ### Card states - Available: teal border, "DRAFT" button - Your pick: amber glow border + "⭐ YOUR PICK" - Taken: grayed out, "Drafted by [player]" - WAITING (draft not started): dimmed, "WAITING" label ### Pitfalls - **`league_id` from URL vs API:** After creating a league, the API returns `result.id`, not `result.league_id`. Use `result.id` in redirect URL. - **`.hidden` CSS class:** Every standalone page MUST define `.hidden { display: none !important; }` in its own `