Some fixes. TODO: game.mode must be analyze when score is not '*' ==> simplify Board...
[vchess.git] / client / src / utils / storage.js
index eb04078..2e7a84f 100644 (file)
@@ -1,5 +1,4 @@
 import { extractTime } from "@/utils/timeControl";
-import { shuffle } from "@/utils/alea";
 
 // TODO: show game structure
 //const newItem = [
@@ -52,8 +51,8 @@ function addGame(game, callback)
 
 // Clear current live game from localStorage
 function clear() {
-  localStorage.deleteItem("gameInfo");
-  localStorage.deleteItem("gameState");
+  localStorage.removeItem("gameInfo");
+  localStorage.removeItem("gameState");
 }
 
 // Current live game:
@@ -79,10 +78,6 @@ export const GameStorage =
   // localStorage:
   init: function(o)
   {
-    // NOTE: when >= 3 players, better use an array + shuffle for mycolor
-    const mycolor = (Math.random() < 0.5 ? "w" : "b");
-    // Shuffle players order (white then black then other colors).
-    const players = shuffle(o.players);
     // Extract times (in [milli]seconds), set clocks, store in localStorage
     const tc = extractTime(o.timeControl);
 
@@ -91,9 +86,8 @@ export const GameStorage =
     {
       gameId: o.gameId,
       vname: o.vname,
-      mycolor: mycolor,
       fenStart: o.fenStart,
-      players: players,
+      players: o.players,
       timeControl: o.timeControl,
       increment: tc.increment,
       mode: "live", //function for live games only
@@ -105,7 +99,7 @@ export const GameStorage =
       fen: o.fenStart,
       moves: [],
       clocks: [...Array(o.players.length)].fill(tc.mainTime),
-      started: [...Array(o.players.length)].fill(false),
+      initime: (o.initime ? Date.now() : undefined),
       score: "*",
     };
 
@@ -113,24 +107,31 @@ export const GameStorage =
     localStorage.setItem("gameState", JSON.stringify(gameState));
   },
 
+  getInitime: function()
+  {
+    const gameState = JSON.parse(localStorage.getItem("gameState"));
+    return gameState.initime;
+  },
+
   // localStorage:
-  // TODO: also option to takeback a move ? Is fen included in move ?
+  // TODO: also option to takeback a move ?
   // NOTE: for live games only (all on server for corr)
-  update: function(fen, moves, clocks, started, score)
+  update: function(o) //colorIdx, move, fen, addTime, initime, score
   {
     let gameState = JSON.parse(localStorage.getItem("gameState"));
-    if (!!fen)
+    if (!!o.move)
     {
-      gameState.moves = moves;
-      gameState.fen = fen;
-      gameState.clocks = clocks;
+      gameState.moves.push(o.move);
+      gameState.fen = o.fen;
+      if (!!o.addTime) //NaN if first move in game
+        gameState.clocks[o.colorIdx] += o.addTime;
     }
-    if (!!started)
-      gameState.started = started;
-    if (!!score)
-      gameState.score = score;
+    if (!!o.initime) //just a flag (true)
+      gameState.initime = Date.now();
+    if (!!o.score)
+      gameState.score = o.score;
     localStorage.setItem("gameState", JSON.stringify(gameState));
-    if (!!score && score != "*")
+    if (!!o.score && o.score != "*")
       transferToDb(); //game is over
   },
 
@@ -139,20 +140,28 @@ export const GameStorage =
   // TODO: option for remote retrieval (third arg, or just "gameRef")
   getLocal: function(gameId, callback)
   {
-    let games = [];
     dbOperation((db) => {
-      // TODO: if gameId is provided, limit search to gameId (just .get(gameId). ...)
       let objectStore = db.transaction('games').objectStore('games');
-      objectStore.openCursor().onsuccess = function(event) {
-        var cursor = event.target.result;
-        // if there is still another cursor to go, keep runing this code
-        if (cursor)
-        {
-          games.push(cursor.value);
-          cursor.continue();
+      if (!gameId) //retrieve all
+      {
+        let games = [];
+        objectStore.openCursor().onsuccess = function(event) {
+          let cursor = event.target.result;
+          // if there is still another cursor to go, keep running this code
+          if (cursor)
+          {
+            games.push(cursor.value);
+            cursor.continue();
+          }
+          else
+            callback(games);
+        }
+      }
+      else //just one game
+      {
+        objectStore.get(gameId).onsuccess = function(event) {
+          callback(event.target.result);
         }
-        else
-          callback(games);
       }
     });
   },
@@ -168,7 +177,7 @@ export const GameStorage =
           callback({}); //everything's fine
         }
         transaction.onerror = function() {
-          callback({errmsg: "deleteGame failed: " + transaction.error});
+          callback({errmsg: "game removal failed: " + transaction.error});
         };
       }
       transaction.objectStore("games").delete(gameId);