// storage.js - localStorage helpers const KEYS = { PLAYER_NAME: "gd_playerName", LOBBY_NAME: "gd_lobbyName", GAME_STATE: "gd_gameState", LEADERBOARD: "gd_leaderboard", }; /** * Safely write a value to localStorage. * Silently fails if storage quota is exceeded or unavailable. * @param {string} key * @param {string} value */ function setItem(key, value) { try { localStorage.setItem(key, value); } catch { console.warn(`Storage: could not write key "${key}"`); } } /** @param {string} name */ export function savePlayerName(name) { setItem(KEYS.PLAYER_NAME, name.trim()); } /** @returns {string} */ export function getPlayerName() { return localStorage.getItem(KEYS.PLAYER_NAME) || "Anonymous"; } /** @param {string} name */ export function saveLobbyName(name) { setItem(KEYS.LOBBY_NAME, name.trim()); } /** @returns {string} */ export function getLobbyName() { return localStorage.getItem(KEYS.LOBBY_NAME) || "My Lobby"; } /** * @param {{ scores: number[], totalScore: number, countries: string[] }} state */ export function saveGameState(state) { setItem(KEYS.GAME_STATE, JSON.stringify(state)); } /** * @returns {{ scores: number[], totalScore: number, countries: string[] } | null} */ export function getGameState() { try { return JSON.parse(localStorage.getItem(KEYS.GAME_STATE)) || null; } catch { return null; } } export function clearGameState() { localStorage.removeItem(KEYS.GAME_STATE); } /** * Add an entry to the local fallback leaderboard and keep the top 20. * @param {{ name: string, totalScore: number, scores: number[], date: string }} entry */ export function saveLeaderboard(entry) { const board = getLeaderboard(); board.push(entry); board.sort((a, b) => b.totalScore - a.totalScore); setItem(KEYS.LEADERBOARD, JSON.stringify(board.slice(0, 20))); } /** * @returns {{ name: string, totalScore: number, scores: number[], date: string }[]} */ export function getLeaderboard() { try { return JSON.parse(localStorage.getItem(KEYS.LEADERBOARD)) || []; } catch { return []; } } export function clearLeaderboard() { localStorage.removeItem(KEYS.LEADERBOARD); }