new version

This commit is contained in:
silas 2018-11-04 23:36:18 +01:00
parent 612aa8168f
commit 71bde38da4
9 changed files with 123 additions and 7733 deletions

1
.idea/wordRotator.iml generated
View File

@ -3,7 +3,6 @@
<component name="NewModuleRootManager"> <component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/module/Application/src" isTestSource="false" packagePrefix="Application\" /> <sourceFolder url="file://$MODULE_DIR$/src/module/Application/src" isTestSource="false" packagePrefix="Application\" />
<sourceFolder url="file://$MODULE_DIR$/src/module/Application/pwa/public" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/public/js" /> <excludeFolder url="file://$MODULE_DIR$/public/js" />
<excludeFolder url="file://$MODULE_DIR$/publicTest" /> <excludeFolder url="file://$MODULE_DIR$/publicTest" />
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/event-manager" /> <excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/event-manager" />

View File

@ -1,4 +1,4 @@
#!/usr/bin/env bash #!/usr/bin/env bash
cd $(dirname "$0")/.. cd $(dirname "$0")/..
npm run build npm run build 1

File diff suppressed because one or more lines are too long

View File

@ -3403,16 +3403,41 @@ class GapiHandler {
} }
class MyDb { class MyDb {
constructor(dbName, version, indexedDB) { constructor(dbName, version) {
indexedDB = indexedDB || window["myIndexedDB"] || window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.shimIndexedDB; this.queryPromise = new Promise(async (resolve, reject) => {
console.log("MyDB", indexedDB); let indexedDB = null;
this._conn = indexedDB.open(dbName, version); if (window["sqlite"]){
indexedDB = new Promise(sqliteResolve => {
function testSqlLiteResolve(){
if (window["sqliteIndexedDB"]){
sqliteResolve(window["sqliteIndexedDB"]);
}
else {
setTimeout(testSqlLiteResolve, 200);
}
console.log("t");
}
testSqlLiteResolve();
});
}
else {
indexedDB = Promise.resolve(window["myIndexedDB"] || window["indexedDB"] || window["mozIndexedDB"]|| window["webkitIndexedDB"]|| window["msIndexedDB"] || window["shimIndexedDB"]);
}
console.log("indexeddb 1");
this.indexeddb = (await indexedDB);
console.log("indexeddb 2");
this._conn = this.indexeddb.open(dbName, version);
let myDB = this; let myDB = this;
this._conn.onupgradeneeded = function (upgradeEvent) { this._conn.onupgradeneeded = function (upgradeEvent) {
myDB.upgrade(myDB._conn.result, upgradeEvent.oldVersion, upgradeEvent.newVersion, upgradeEvent); try {
}; myDB.upgrade(myDB._conn.result, upgradeEvent.oldVersion, upgradeEvent.newVersion, upgradeEvent);
this.queryPromise = new Promise(function (resolve) { }
catch(e){
reject(e);
throw e;
}
};
myDB._conn.onsuccess = function (e) { myDB._conn.onsuccess = function (e) {
myDB._db = myDB._conn.result; myDB._db = myDB._conn.result;
resolve(e); resolve(e);
@ -3446,7 +3471,6 @@ class MyDb {
transactionMode = "readonly"; transactionMode = "readonly";
} }
return this.openTransaction(name, transactionMode, function (t) { return this.openTransaction(name, transactionMode, function (t) {
console.log("openStore", name, t);
callback(t.objectStore(name)); callback(t.objectStore(name));
}); });
} }
@ -3491,13 +3515,10 @@ class MyDb {
load(key, objectStore) { load(key, objectStore) {
let self = this; let self = this;
return new Promise( (resolve, reject) => { return new Promise((resolve, reject) => {
console.log("load 1");
self.openStore(objectStore, function (store) { self.openStore(objectStore, function (store) {
console.log("load 2");
let request = store.get(key); let request = store.get(key);
request.onsuccess = function (e) { request.onsuccess = function (e) {
console.log("load 3");
resolve(e.currentTarget.result); resolve(e.currentTarget.result);
}; };
request.onerror = function (e) { request.onerror = function (e) {
@ -3513,11 +3534,10 @@ class MyDb {
}); });
}); });
} }
loadAll(objectStore, query, count) loadAll(objectStore, query, count) {
{
let self = this; let self = this;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
self.openStore(objectStore, function (store) { self.openStore(objectStore, function (store) {
let request = store.getAll(query, count); let request = store.getAll(query, count);
request.onsuccess = function (e) { request.onsuccess = function (e) {
@ -3647,13 +3667,13 @@ class MyDb {
}); });
} }
removeAll(objectStore){ removeAll(objectStore) {
return new Promise((resolve) => { return new Promise((resolve) => {
this.openStore(objectStore, "readwrite", (store) => { this.openStore(objectStore, "readwrite", (store) => {
let req = store.clear(); let req = store.clear();
req.onerror = (e) => { req.onerror = (e) => {
throw { throw {
"type":"indexed-db-index-error", "type": "indexed-db-index-error",
"event": e "event": e
} }
}; };

View File

@ -29,12 +29,12 @@ export class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
} }
}); });
this.findBy("#reset-levels").addEventListener("click", () => { this.findBy("#reset-levels").addEventListener("click", async () => {
localStorage.removeItem("currentLevel"); localStorage.removeItem("currentLevel");
localStorage.removeItem("date-last-sync"); localStorage.removeItem("date-last-sync");
localStorage.removeItem("levelCounter"); localStorage.removeItem("levelCounter");
localStorage.removeItem("tutorial-step"); localStorage.removeItem("tutorial-step");
WordRotatorDb.getInstance().removeAll(WordRotatorDb.OBJECT_STORE.LEVEL); (await WordRotatorDb.getInstance()).removeAll(WordRotatorDb.OBJECT_STORE.LEVEL);
}); });
if (location.hostname.includes("beta") || location.hostname.includes("127.0.0.1")) { if (location.hostname.includes("beta") || location.hostname.includes("127.0.0.1")) {

View File

@ -2,19 +2,21 @@ import {Helper, MyDb} from "../../../../js/lib/pwa-lib";
export class WordRotatorDb extends MyDb { export class WordRotatorDb extends MyDb {
static getInstance() { static async getInstance() {
if (Helper.isNull(WordRotatorDb.instance)) { if (Helper.isNull(WordRotatorDb.instance)) {
WordRotatorDb.instance = new WordRotatorDb(); WordRotatorDb.instance = new WordRotatorDb();
} }
await WordRotatorDb.instance.queryPromise;
return WordRotatorDb.instance; return WordRotatorDb.instance;
} }
constructor() { constructor() {
super("wordRotator", 3); super("wordRotator", 4);
} }
upgrade(db, oldVersion, newVersion, e) { upgrade(db, oldVersion, newVersion, e) {
console.log("upgrading!"); console.log("upgrading!");
if (Helper.isNull(oldVersion) || oldVersion < 1 && newVersion >= 1) { if (Helper.isNull(oldVersion) || oldVersion < 1 && newVersion >= 1) {
let levelObjectStore = db.createObjectStore(WordRotatorDb.OBJECT_STORE.LEVEL, {"keyPath": "id"}); let levelObjectStore = db.createObjectStore(WordRotatorDb.OBJECT_STORE.LEVEL, {"keyPath": "id"});
} }
@ -22,10 +24,15 @@ export class WordRotatorDb extends MyDb {
let levelObjectStore = e.target.transaction.objectStore(WordRotatorDb.OBJECT_STORE.LEVEL); let levelObjectStore = e.target.transaction.objectStore(WordRotatorDb.OBJECT_STORE.LEVEL);
levelObjectStore.createIndex("played", ["deleted", "played", "difficulty", "id"], {"unique": false}); levelObjectStore.createIndex("played", ["deleted", "played", "difficulty", "id"], {"unique": false});
} }
// xhklsfdbnk = 42;
if (Helper.isNull(oldVersion) || oldVersion < 3 && newVersion >= 3) { if (Helper.isNull(oldVersion) || oldVersion < 3 && newVersion >= 3) {
let levelObjectStore = e.target.transaction.objectStore(WordRotatorDb.OBJECT_STORE.LEVEL); let levelObjectStore = e.target.transaction.objectStore(WordRotatorDb.OBJECT_STORE.LEVEL);
levelObjectStore.createIndex("difficulty", "difficulty", {"unique": false}); levelObjectStore.createIndex("difficulty", "difficulty", {"unique": false});
} }
if (Helper.isNull(oldVersion) || oldVersion < 3 && newVersion >= 4) {
let levelObjectStore = db.createObjectStore(WordRotatorDb.OBJECT_STORE.SYSTEM_VARS, {"keyPath": "name"});
}
}; };
async saveManyLevels(levels) { async saveManyLevels(levels) {
@ -35,7 +42,7 @@ export class WordRotatorDb extends MyDb {
} }
async loadLevel(levelId) { async loadLevel(levelId) {
console.log("load Level", levelId); // console.log("load Level", levelId);
return this.load(levelId, WordRotatorDb.OBJECT_STORE.LEVEL); return this.load(levelId, WordRotatorDb.OBJECT_STORE.LEVEL);
} }
@ -71,12 +78,21 @@ export class WordRotatorDb extends MyDb {
return await this.saveObj(level, WordRotatorDb.OBJECT_STORE.LEVEL); return await this.saveObj(level, WordRotatorDb.OBJECT_STORE.LEVEL);
} }
async countLevels(){ async loadDateLastSync(){
let dateLastSync = await this.load("date-last-sync", WordRotatorDb.OBJECT_STORE.SYSTEM_VARS);
if (dateLastSync){
return dateLastSync["value"];
}
return null;
}
async saveDateLastSync(value){
return await this.saveObj({"name": "date-last-sync", "value":value}, WordRotatorDb.OBJECT_STORE.SYSTEM_VARS)
} }
} }
WordRotatorDb.OBJECT_STORE = { WordRotatorDb.OBJECT_STORE = {
LEVEL: "level", LEVEL: "level",
SYSTEM_VARS:"vars"
}; };
WordRotatorDb.instance = null; WordRotatorDb.instance = null;

View File

@ -105,7 +105,7 @@ export class LevelSite extends WordRotatorBaseSite {
if (Helper.isNotNull(currentLevelInfo)) { if (Helper.isNotNull(currentLevelInfo)) {
currentLevelInfo = JSON.parse(currentLevelInfo); currentLevelInfo = JSON.parse(currentLevelInfo);
const db = WordRotatorDb.getInstance(); const db = await WordRotatorDb.getInstance();
const levelJson = await db.loadLevel(currentLevelInfo["id"]); const levelJson = await db.loadLevel(currentLevelInfo["id"]);
if (levelJson === null) { if (levelJson === null) {
@ -144,18 +144,23 @@ export class LevelSite extends WordRotatorBaseSite {
return this.nextLevel(); return this.nextLevel();
} }
startEndSite(){
this.startSite(EndSite);
this.finish();
}
async nextLevel() { async nextLevel() {
try { try {
this._siteContent.classList.remove('won'); this._siteContent.classList.remove('won');
this.wonText.style.fontSize = "0"; this.wonText.style.fontSize = "0";
const db = WordRotatorDb.getInstance(); const db = await WordRotatorDb.getInstance();
const nextLevelJson = await db.loadNextLevel(LevelSite.RENDERER_TYPES); const nextLevelJson = await db.loadNextLevel(LevelSite.RENDERER_TYPES);
console.log("nextLevelJson", nextLevelJson); console.log("nextLevelJson", nextLevelJson);
if (nextLevelJson === null) { if (nextLevelJson === null) {
this.startSite(EndSite); this.startEndSite();
this.finish();
return; return;
} }
const level = LevelHelper.inflateLevel(nextLevelJson, this.templateContainer); const level = LevelHelper.inflateLevel(nextLevelJson, this.templateContainer);
@ -193,6 +198,7 @@ export class LevelSite extends WordRotatorBaseSite {
catch (e) { catch (e) {
console.log("Fehler!"); console.log("Fehler!");
console.error(e); console.error(e);
this.startEndSite();
} }
} }
@ -225,7 +231,7 @@ export class LevelSite extends WordRotatorBaseSite {
async levelWon(level) { async levelWon(level) {
try { try {
const db = WordRotatorDb.getInstance(); const db = await WordRotatorDb.getInstance();
const savePromise = db.saveLevelPlayed(level.getId()); const savePromise = db.saveLevelPlayed(level.getId());
this.levelCounter++; this.levelCounter++;

View File

@ -99,7 +99,7 @@ export class MenuSite extends WordRotatorBaseSite {
async startLevelSite() { async startLevelSite() {
SoundManager.getInstance().resumeContext(); SoundManager.getInstance().resumeContext();
this.startSite(LevelSite, Promise.race([this.loadLevelPromise, new Promise(async resolve => { this.startSite(LevelSite, Promise.race([this.loadLevelPromise, new Promise(async resolve => {
const db = WordRotatorDb.getInstance(); const db = await WordRotatorDb.getInstance();
let level = await db.loadNextLevel(LevelSite.RENDERER_TYPES); let level = await db.loadNextLevel(LevelSite.RENDERER_TYPES);
if (level !== null) { if (level !== null) {
resolve(); resolve();
@ -147,7 +147,7 @@ export class MenuSite extends WordRotatorBaseSite {
let playMusicButton = this.findBy("#play-music"); let playMusicButton = this.findBy("#play-music");
playMusicButton.checked = (settingsManager.getSetting("play-music", "1") === "1"); playMusicButton.checked = (settingsManager.getSetting("play-music", "1") === "1");
playMusicButton.addEventListener("change", () => { playMusicButton.addEventListener("change", () => {
settingsManager.setSetting("play-music", (playMusicButton.checked)?"1":"0"); settingsManager.setSetting("play-music", (playMusicButton.checked) ? "1" : "0");
soundManager.set({muted: !playMusicButton.checked}, SoundManager.CHANNELS.MUSIC); soundManager.set({muted: !playMusicButton.checked}, SoundManager.CHANNELS.MUSIC);
if (playMusicButton.checked) { if (playMusicButton.checked) {
soundManager.play(SoundManager.CHANNELS.MUSIC); soundManager.play(SoundManager.CHANNELS.MUSIC);
@ -158,7 +158,7 @@ export class MenuSite extends WordRotatorBaseSite {
let playSoundButton = this.findBy("#play-sound"); let playSoundButton = this.findBy("#play-sound");
playSoundButton.checked = (settingsManager.getSetting("play-sound", "1") === "1"); playSoundButton.checked = (settingsManager.getSetting("play-sound", "1") === "1");
playSoundButton.addEventListener("change", () => { playSoundButton.addEventListener("change", () => {
settingsManager.setSetting("play-sound", (playSoundButton.checked)?"1":"0"); settingsManager.setSetting("play-sound", (playSoundButton.checked) ? "1" : "0");
soundManager.set({muted: !playSoundButton.checked}, SoundManager.CHANNELS.SOUND); soundManager.set({muted: !playSoundButton.checked}, SoundManager.CHANNELS.SOUND);
Matomo.push(["trackEvent", "MainMenu", "PlaySound", "Play Sound", (playSoundButton.checked) ? 1 : 0]); Matomo.push(["trackEvent", "MainMenu", "PlaySound", "Play Sound", (playSoundButton.checked) ? 1 : 0]);
}); });
@ -176,45 +176,53 @@ export class MenuSite extends WordRotatorBaseSite {
} }
async loadLevels() { async loadLevels() {
const dateLastSync = Helper.nonNull(localStorage.getItem("date-last-sync"), 0); try {
const db = WordRotatorDb.getInstance(); const db = await WordRotatorDb.getInstance();
const dateLastSync = Helper.nonNull(await db.loadDateLastSync(), 0);
// const dateLastSync = Helper.nonNull(localStorage.getItem("date-last-sync"), 0);
// let numberLevels = db.countLevels(); // let numberLevels = db.countLevels();
let newLastSync = null; let newLastSync = null;
let maxRuns = 1; let maxRuns = 1;
let levelPromises = []; let levelPromises = [];
for (let run = 0; run < maxRuns; run++) { for (let run = 0; run < maxRuns; run++) {
let res = await DataManager.load("wordRotator/levels" + DataManager.buildQuery({ let res = await DataManager.load("wordRotator/levels" + DataManager.buildQuery({
"currentRun": run, "currentRun": run,
"dateLastSync": dateLastSync "dateLastSync": dateLastSync
}));
if (!res["success"]) {
if (await db.loadNextLevel(LevelSite.RENDERER_TYPES) === null) {
FlashMessenger.addMessage("sync-error", null, 6000);
}
newLastSync = null;
break;
}
res = res["result"];
newLastSync = Helper.nonNull(newLastSync, res["currentSyncDate"]);
maxRuns = res["maxRuns"];
let levels = res["levels"];
for (let i = 0; i < levels.length; i++) {
let currentLevel = levels[i];
levelPromises.push(db.loadLevel(levels[i]["id"]).then(level => {
currentLevel["played"] = (Helper.nonNull(Helper.nonNull(level, {}).played, false));
console.log("currentLevel", currentLevel);
return currentLevel;
})); }));
if (!res["success"]) {
if (await db.loadNextLevel(LevelSite.RENDERER_TYPES) === null) {
FlashMessenger.addMessage("sync-error", null, 6000);
}
newLastSync = null;
break;
}
res = res["result"];
newLastSync = Helper.nonNull(newLastSync, res["currentSyncDate"]);
maxRuns = res["maxRuns"];
let levels = res["levels"];
for (let i = 0; i < levels.length; i++) {
let currentLevel = levels[i];
levelPromises.push(db.loadLevel(levels[i]["id"]).then(level => {
currentLevel["played"] = (Helper.nonNull(Helper.nonNull(level, {}).played, false));
return currentLevel;
}));
}
}
let levels = await Promise.all(levelPromises);
await db.saveManyLevels(levels);
if (newLastSync != null && newLastSync !== "null") {
localStorage.setItem("date-last-sync", newLastSync);
db.saveDateLastSync(newLastSync);
} }
} }
let levels = await Promise.all(levelPromises); catch(e){
console.log("levels to save", levels); // if (await db.loadNextLevel(LevelSite.RENDERER_TYPES) === null) {
await db.saveManyLevels(levels); FlashMessenger.addMessage("sync-error", null, 6000);
// }
if (newLastSync != null && newLastSync !== "null") { console.error(e);
localStorage.setItem("date-last-sync", newLastSync);
} }
} }
} }

View File

@ -353,8 +353,8 @@ test('Play', async t => {
.click(Selector('.segment-parent').nth(SEGMENT.SIXTEEN)) .click(Selector('.segment-parent').nth(SEGMENT.SIXTEEN))
.click(Selector('.segment-parent').nth(SEGMENT.FOURTEEN)) .click(Selector('.segment-parent').nth(SEGMENT.FOURTEEN))
.click(Selector('.segment-parent').nth(SEGMENT.NINETEEN)) .click(Selector('.segment-parent').nth(SEGMENT.NINETEEN))
.click(Selector('.segment-parent').nth(SEGMENT.TWENTYONE)) .click(Selector('.segment-parent').nth(SEGMENT.TWENTYONE)).debug()
.drag(Selector('.segment-parent').nth(SEGMENT.TEN).find('div').withText('P'), dragDimen, -3, { .drag(Selector('.segment-parent').nth(SEGMENT.TEN), dragDimen, -3, {
offsetX: 10, offsetX: 10,
offsetY: 10 offsetY: 10
}) })