2026-06-01 08:40:23 +02:00

91 lines
2.1 KiB
JavaScript

// 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);
}