Fix clocks update
[vchess.git] / client / src / utils / gameStorage.js
index 94c1c30..2ccb494 100644 (file)
 //   fen: string,
 //   moves: array of Move objects,
 //   clocks: array of integers,
-//   initime: integer (when clock start running),
+//   initime: array of integers (when clock start running),
 //   score: string (several options; '*' == running),
 // }
 
+import { ajax } from "@/utils/ajax";
+
 function dbOperation(callback)
 {
   let db = null;
@@ -37,13 +39,15 @@ function dbOperation(callback)
       alert("Error while loading database: " + event.target.errorCode);
     };
     // Create objectStore for vchess->games
-    db.createObjectStore("games", { keyPath: "gameId" });
+    let objectStore = db.createObjectStore("games", { keyPath: "gameId" });
+    objectStore.createIndex("score", "score"); //to search by game result
   }
 }
 
 export const GameStorage =
 {
   // Optional callback to get error status
+  // TODO: this func called from Hall seems to not work now...
   add: function(game, callback)
   {
     dbOperation((db) => {
@@ -64,55 +68,72 @@ export const GameStorage =
 
   // TODO: also option to takeback a move ?
   // NOTE: for live games only (all on server for corr)
-  update: function(gameId, obj) //colorIdx, move, fen, addTime, initime, score
+  update: function(gameId, obj) //move, fen, clocks, score, initime, ...
   {
     dbOperation((db) => {
       let objectStore = db.transaction("games", "readwrite").objectStore("games");
       objectStore.get(gameId).onsuccess = function(event) {
         const game = event.target.result;
-        if (!!obj.move)
-        {
-          game.moves.push(obj.move);
-          game.fen = obj.fen;
-          if (!!obj.addTime) //NaN if first move in game
-            game.clocks[obj.colorIdx] += obj.addTime;
-        }
-        if (!!obj.initime) //just a flag (true)
-          game.initime = Date.now();
-        if (!!obj.score)
-          game.score = obj.score;
+        Object.keys(obj).forEach(k => {
+          if (k == "move")
+            game.moves.push(obj[k]);
+          else
+            game[k] = obj[k];
+        });
         objectStore.put(game); //save updated data
       }
     });
   },
 
-  // Retrieve any live game from its identifiers (locally, running or not)
-  // NOTE: need callback because result is obtained asynchronously
-  get: function(gameId, callback)
+  // Retrieve all local games (running, completed, imported...)
+  getAll: function(callback)
   {
     dbOperation((db) => {
       let objectStore = db.transaction('games').objectStore('games');
-      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);
+      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
-      {
+    });
+  },
+
+  // Retrieve any game from its identifiers (locally or on server)
+  // NOTE: need callback because result is obtained asynchronously
+  get: function(gameId, callback)
+  {
+    // corr games identifiers are integers
+    if (Number.isInteger(gameId) || !isNaN(parseInt(gameId)))
+    {
+      ajax("/games", "GET", {gid:gameId}, res => {
+        callback(res.game);
+      });
+    }
+    else //local game
+    {
+      dbOperation((db) => {
+        let objectStore = db.transaction('games').objectStore('games');
         objectStore.get(gameId).onsuccess = function(event) {
           callback(event.target.result);
         }
-      }
+      });
+    }
+  },
+
+  getCurrent: function(callback)
+  {
+    dbOperation((db) => {
+      let objectStore = db.transaction('games').objectStore('games');
+      objectStore.get("*").onsuccess = function(event) {
+        callback(event.target.result);
+      };
     });
   },