X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Futils%2FgameStorage.js;h=59efb43af88338a05e523ef7d6f112d50194a256;hb=c292ebb2a014646005b01e27253c162f1d639387;hp=2e78994286cbb19cdb795b8ca6880e6b04cd92f5;hpb=dcff8e82dd8bbc285d9c2d5d5e3b361a9ecfa9ac;p=vchess.git diff --git a/client/src/utils/gameStorage.js b/client/src/utils/gameStorage.js index 2e789942..59efb43a 100644 --- a/client/src/utils/gameStorage.js +++ b/client/src/utils/gameStorage.js @@ -15,7 +15,6 @@ // score: string (several options; '*' == running), // } -import { ajax } from "@/utils/ajax"; import { store } from "@/store"; function dbOperation(callback) { @@ -44,7 +43,7 @@ export const GameStorage = { // Optional callback to get error status add: function(game, callback) { dbOperation((err,db) => { - if (err) { + if (!!err) { callback("error"); return; } @@ -52,47 +51,35 @@ export const GameStorage = { transaction.oncomplete = function() { callback(); //everything's fine }; + transaction.onerror = function(err) { + callback(err); //duplicate key error (most likely) + }; let objectStore = transaction.objectStore("games"); objectStore.add(game); }); }, - // TODO: also option to takeback a move ? // obj: chat, move, fen, clocks, score[Msg], initime, ... update: function(gameId, obj) { - if (Number.isInteger(gameId) || !isNaN(parseInt(gameId))) { - // corr: only move, fen and score - ajax("/games", "PUT", { - gid: gameId, - newObj: { - // Some fields may be undefined: - chat: obj.chat, - move: obj.move, - fen: obj.fen, - score: obj.score, - scoreMsg: obj.scoreMsg, - drawOffer: obj.drawOffer + // live + dbOperation((err,db) => { + let objectStore = db + .transaction("games", "readwrite") + .objectStore("games"); + objectStore.get(gameId).onsuccess = function(event) { + // Ignoring error silently: shouldn't happen now. TODO? + if (event.target.result) { + let game = event.target.result; + // Hidden tabs are delayed, to prevent multi-updates: + if (obj.moveIdx < game.moves.length) return; + Object.keys(obj).forEach(k => { + if (k == "move") game.moves.push(obj[k]); + else game[k] = obj[k]; + }); + objectStore.put(game); //save updated data } - }); - } else { - // live - dbOperation((err,db) => { - let objectStore = db - .transaction("games", "readwrite") - .objectStore("games"); - objectStore.get(gameId).onsuccess = function(event) { - // Ignoring error silently: shouldn't happen now. TODO? - if (event.target.result) { - let game = event.target.result; - 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 all local games (running, completed, imported...) @@ -122,26 +109,14 @@ export const GameStorage = { // 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 => { - let game = res.game; - game.moves.forEach(m => { - m.squares = JSON.parse(m.squares); - }); - callback(game); - }); - } - else { - // Local game - dbOperation((err,db) => { - let objectStore = db.transaction("games").objectStore("games"); - objectStore.get(gameId).onsuccess = function(event) { - if (event.target.result) - callback(event.target.result); - }; - }); - } + // Local game + dbOperation((err,db) => { + let objectStore = db.transaction("games").objectStore("games"); + objectStore.get(gameId).onsuccess = function(event) { + if (event.target.result) + callback(event.target.result); + }; + }); }, // Delete a game in indexedDB @@ -150,7 +125,7 @@ export const GameStorage = { if (!err) { let transaction = db.transaction(["games"], "readwrite"); transaction.oncomplete = function() { - callback({}); //everything's fine + callback(); //everything's fine }; transaction.objectStore("games").delete(gameId); }