diff --git a/src/dashboard.html b/src/dashboard.html
index 9255969..b66f332 100644
--- a/src/dashboard.html
+++ b/src/dashboard.html
@@ -531,6 +531,10 @@ h2 { font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.05em;
Chemistry
Loading…
+
+
All Squads
+
Loading…
+
@@ -1138,15 +1142,23 @@ async function submitMatch() {
});
const outcome = gf > ga ? 'Win' : gf === ga ? 'Draw' : 'Loss';
const outcomeColor = gf > ga ? '#3fb950' : gf === ga ? '#8b949e' : '#f85149';
+ const levelUps = r.level_ups || [];
+ const levelUpHtml = levelUps.map(ev =>
+ `⬆ Level ${ev.new_level}! +${(ev.coins_granted||0).toLocaleString()} coins${ev.pack_granted ? ' + ' + ev.pack_granted : ''}
`
+ ).join('');
el('match-result-display').innerHTML = `
${outcome} ${gf}–${ga}
+${(r.coins_awarded || 0).toLocaleString()} coins · +${r.xp_awarded || 0} XP
- ${(r.objectives_triggered || []).length ? `
Objectives: ${r.objectives_triggered.join(', ')}` : ''}
- ${r.season ? `
Season pts: ${r.season.season_points}` : ''}
+ ${(r.objectives_updated || []).length ? `
Objectives: ${r.objectives_updated.join(', ')}` : ''}
+ ${r.season_end ? `
Season ended: Division ${r.season_end.new_division ?? '—'}` : ''}
+ ${levelUpHtml}
`;
+ if (levelUps.length) {
+ showToast(`Level Up! You are now level ${levelUps[levelUps.length - 1].new_level}`);
+ }
api('GET', '/club').then(c => { el('hdr-coins').textContent = (c.coins ?? 0).toLocaleString() + ' coins'; }).catch(() => {});
await loadMatchHistory();
} catch (e) { showToast(e.message, true); }
@@ -1480,12 +1492,15 @@ async function loadSettings() {
api('GET', '/profile'),
api('GET', '/settings'),
]);
- const xpForNext = 1000;
- const xpPct = Math.min(100, Math.round(((profile.xp || 0) % xpForNext) / xpForNext * 100));
+ const xpForNext = profile.xp_for_next_level || 1000;
+ const xpEarned = xpForNext - (profile.xp_to_next_level || 0);
+ const xpPct = Math.min(100, Math.round((xpEarned / xpForNext) * 100));
el('profile-card').innerHTML = `
Username${profile.username || '—'}
Level${profile.level ?? 1}
- XP${(profile.xp || 0).toLocaleString()}
+ XP${(profile.xp || 0).toLocaleString()}
+ ${(profile.xp_to_next_level || 0).toLocaleString()} to next level
+
Profile ID: ${profile.id}
`;
@@ -1563,6 +1578,35 @@ async function loadSquad() {
el('squad-grid').innerHTML = `${e.message}
`;
el('squad-chemistry').innerHTML = '';
}
+ await loadSquadList();
+}
+
+async function loadSquadList() {
+ try {
+ const data = await api('GET', '/squads');
+ const squads = data.squads || [];
+ if (!squads.length) {
+ el('squad-list').innerHTML = 'No squads saved yet.';
+ return;
+ }
+ el('squad-list').innerHTML = squads.map(s => `
+
+ ${s.name}
+ ${s.formation}
+
+
`).join('');
+ } catch (e) { el('squad-list').innerHTML = `${e.message}
`; }
+}
+
+async function deleteSquad(squadId, btn) {
+ if (!confirm('Delete this squad?')) return;
+ btn.disabled = true;
+ try {
+ await api('DELETE', `/squads/${squadId}`);
+ showToast('Squad deleted');
+ loadSquad();
+ } catch (e) { showToast(e.message, true); btn.disabled = false; }
}
// ── Squad Builder ────────────────────────────────────────────────────────────