91 lines
2.1 KiB
JavaScript
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);
|
|
}
|