X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Futils%2FgameStorage.js;h=453388edaaa602d20ef48cd3bec58ffd1642d37f;hb=6808d7a16ec1e761c6a2dffec2281c96953e4d89;hp=031f62f563688eee48b57c6dc6d14109d4b53860;hpb=fd7aea36b8da702df87be3ed055f9a1f59c9f4da;p=vchess.git diff --git a/client/src/utils/gameStorage.js b/client/src/utils/gameStorage.js index 031f62f5..453388ed 100644 --- a/client/src/utils/gameStorage.js +++ b/client/src/utils/gameStorage.js @@ -1,10 +1,10 @@ // Game object: { // // Static informations: -// gameId: string +// id: string // vname: string, // fenStart: string, // players: array of sid+id+name, -// timeControl: string, +// cadence: string, // increment: integer (seconds), // mode: string ("live" or "corr") // imported: boolean (optional, default false) @@ -17,17 +17,17 @@ // } import { ajax } from "@/utils/ajax"; +import { store } from "@/store"; -function dbOperation(callback) -{ +function dbOperation(callback) { let db = null; let DBOpenRequest = window.indexedDB.open("vchess", 4); DBOpenRequest.onerror = function(event) { - alert("Database error: " + event.target.errorCode); + alert(store.state.tr["Database error:"] + " " + event.target.errorCode); }; - DBOpenRequest.onsuccess = function(event) { + DBOpenRequest.onsuccess = function() { db = DBOpenRequest.result; callback(db); db.close(); @@ -36,28 +36,32 @@ function dbOperation(callback) DBOpenRequest.onupgradeneeded = function(event) { let db = event.target.result; db.onerror = function(event) { - alert("Error while loading database: " + event.target.errorCode); + alert( + store.state.tr["Error while loading database:"] + + " " + + event.target.errorCode + ); }; // Create objectStore for vchess->games - let objectStore = db.createObjectStore("games", { keyPath: "gameId" }); + let objectStore = db.createObjectStore("games", { keyPath: "id" }); objectStore.createIndex("score", "score"); //to search by game result - } + }; } -export const GameStorage = -{ +export const GameStorage = { // Optional callback to get error status - add: function(game, callback) - { - dbOperation((db) => { + add: function(game, callback) { + dbOperation(db => { let transaction = db.transaction("games", "readwrite"); - if (callback) - { + if (callback) { transaction.oncomplete = function() { callback({}); //everything's fine - } + }; transaction.onerror = function() { - callback({errmsg: "addGame failed: " + transaction.error}); + callback({ + errmsg: + store.state.tr["Game retrieval failed:"] + " " + transaction.error + }); }; } let objectStore = transaction.objectStore("games"); @@ -66,73 +70,82 @@ 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, nextIdx, move, fen, addTime, score - { - 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; - game.clocks[obj.colorIdx] += obj.addTime; - game.initime[obj.nextIdx] = Date.now(); + // 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 } - if (!!obj.score) - game.score = obj.score; - objectStore.put(game); //save updated data - } - }); + }); + } else { + // live + dbOperation(db => { + let objectStore = db + .transaction("games", "readwrite") + .objectStore("games"); + objectStore.get(gameId).onsuccess = function(event) { + const 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...) - getAll: function(callback) - { - dbOperation((db) => { - let objectStore = db.transaction('games').objectStore('games'); + getAll: function(callback) { + dbOperation(db => { + let objectStore = db.transaction("games").objectStore("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) - { + if (cursor) { games.push(cursor.value); cursor.continue(); - } - else - callback(games); - } + } else callback(games); + }; }); }, // Retrieve any game from its identifiers (locally or on server) // NOTE: need callback because result is obtained asynchronously - get: function(gameId, callback) - { + 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); + 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((db) => { - let objectStore = db.transaction('games').objectStore('games'); + } //local game + else { + 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'); + getCurrent: function(callback) { + dbOperation(db => { + let objectStore = db.transaction("games").objectStore("games"); objectStore.get("*").onsuccess = function(event) { callback(event.target.result); }; @@ -140,20 +153,21 @@ export const GameStorage = }, // Delete a game in indexedDB - remove: function(gameId, callback) - { - dbOperation((db) => { + remove: function(gameId, callback) { + dbOperation(db => { let transaction = db.transaction(["games"], "readwrite"); - if (callback) - { + if (callback) { transaction.oncomplete = function() { callback({}); //everything's fine - } + }; transaction.onerror = function() { - callback({errmsg: "removeGame failed: " + transaction.error}); + callback({ + errmsg: + store.state.tr["Game removal failed:"] + " " + transaction.error + }); }; } transaction.objectStore("games").delete(gameId); }); - }, + } };