all repos — emchess @ main

src/util/storage.ts (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
import type { SetId } from "../board/pieces";

export interface Prefs {
  pieceSet: SetId;
  theme: "paper" | "crt";
  sound: boolean;
  reactions: boolean;
  coords: boolean;
  personality: string;
  side: "w" | "b" | "random";
  clock: string;
  clockBase: number; // custom base, seconds
  clockInc: number; // custom increment, seconds
  threats: boolean;
  blunder: boolean;
}

const DEFAULTS: Prefs = {
  pieceSet: "kingdom",
  theme: "paper",
  sound: true,
  reactions: false,
  coords: true,
  personality: "beginner",
  side: "w",
  clock: "none",
  clockBase: 300,
  clockInc: 0,
  threats: false,
  blunder: false,
};

const PREFS_KEY = "emchess.prefs";
const SAVE_KEY = "emchess.save";

export function loadPrefs(): Prefs {
  try {
    const raw = localStorage.getItem(PREFS_KEY);
    if (!raw) return { ...DEFAULTS };
    return { ...DEFAULTS, ...JSON.parse(raw) };
  } catch {
    return { ...DEFAULTS };
  }
}

export function savePrefs(prefs: Prefs) {
  try {
    localStorage.setItem(PREFS_KEY, JSON.stringify(prefs));
  } catch {
    /* private mode, no storage — the game still works, it just won't remember. */
  }
}

export interface SavedGame {
  pgn: string;
  side: "w" | "b";
  personality: string;
  savedAt: number;
}

export function saveGame(game: SavedGame) {
  try {
    localStorage.setItem(SAVE_KEY, JSON.stringify(game));
  } catch {
    /* ignore */
  }
}

export function loadGame(): SavedGame | null {
  try {
    const raw = localStorage.getItem(SAVE_KEY);
    return raw ? (JSON.parse(raw) as SavedGame) : null;
  } catch {
    return null;
  }
}

export function clearGame() {
  try {
    localStorage.removeItem(SAVE_KEY);
  } catch {
    /* ignore */
  }
}