diff --git a/public/js/app.js b/public/js/app.js index 016e83a..61ca36f 100755 --- a/public/js/app.js +++ b/public/js/app.js @@ -6159,7 +6159,7 @@ class LevelSite extends WordRotatorBaseSite { this.wonText.style.fontSize = "0"; const db = WordRotatorDb.getInstance(); - const nextLevelJson = await db.loadNextLevel([20, 40, 60, 100, 120, 140, 160]); + const nextLevelJson = await db.loadNextLevel(LevelSite.RENDERER_TYPES); if (nextLevelJson === null) { this.startSite(EndSite); @@ -6449,7 +6449,7 @@ class LevelSite extends WordRotatorBaseSite { } } } - +LevelSite.RENDERER_TYPES = [20, 40, 60, 100, 120, 140, 160]; LevelSite.TUTORIAL = { FIRST_LEVEL: 67, SECOND_LEVEL: 15, @@ -6486,7 +6486,7 @@ class MenuSite extends WordRotatorBaseSite { level.getWonPromise().then(() => { Matomo.push(["trackEvent", "MainMenu", "levelSolved"]); - this.startSite(LevelSite); + this.startLevelSite(); }); let segment = level.getRootSegment(); @@ -6549,13 +6549,23 @@ class MenuSite extends WordRotatorBaseSite { return res; } + async startLevelSite() { + this.startSite(LevelSite, Promise.race([this.loadLevelPromise, new Promise(async resolve => { + const db = WordRotatorDb.getInstance(); + let level = await db.loadNextLevel(LevelSite.RENDERER_TYPES); + if (level !== null) { + resolve(); + } + })])); + } + async onFirstStart() { super.onFirstStart(); let playButton = this.findBy("#play-button"); playButton.addEventListener("click", () => { Matomo.push(["trackEvent", "MainMenu", "startButton"]); - this.startSite(LevelSite, this.loadLevelPromise); + this.startLevelSite(); }); let leafSegmentTemplate = this.findBy("#segment-leaf-template"); @@ -6591,10 +6601,10 @@ class MenuSite extends WordRotatorBaseSite { playMusicButton.addEventListener("change", () => { settingsManager.setSetting("play-music", playMusicButton.checked); soundManager.set({muted: !playMusicButton.checked}, SoundManager.CHANNELS.MUSIC); - if (playMusicButton.checked){ + if (playMusicButton.checked) { soundManager.play(SoundManager.CHANNELS.MUSIC); } - Matomo.push(["trackEvent", "MainMenu", "PlayMusic", "Play Music", (playMusicButton.checked)?1:0]); + Matomo.push(["trackEvent", "MainMenu", "PlayMusic", "Play Music", (playMusicButton.checked) ? 1 : 0]); }); let playSoundButton = this.findBy("#play-sound"); @@ -6602,7 +6612,7 @@ class MenuSite extends WordRotatorBaseSite { playSoundButton.addEventListener("change", () => { settingsManager.setSetting("play-sound", playSoundButton.checked); 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]); }); } @@ -6625,7 +6635,9 @@ class MenuSite extends WordRotatorBaseSite { "dateLastSync": dateLastSync })); if (!res["success"]) { - FlashMessenger.addMessage("sync-error", null, 6000); + if (await db.loadNextLevel(LevelSite.RENDERER_TYPES) === null) { + FlashMessenger.addMessage("sync-error", null, 6000); + } newLastSync = null; break; } @@ -6645,8 +6657,7 @@ class MenuSite extends WordRotatorBaseSite { let levels = await Promise.all(levelPromises); await db.saveManyLevels(levels); - if (newLastSync != null && newLastSync !== "null") - { + if (newLastSync != null && newLastSync !== "null") { localStorage.setItem("date-last-sync", newLastSync); } } diff --git a/src/module/Application/pwa/js/site/LevelSite.js b/src/module/Application/pwa/js/site/LevelSite.js index 061836a..e7468f9 100755 --- a/src/module/Application/pwa/js/site/LevelSite.js +++ b/src/module/Application/pwa/js/site/LevelSite.js @@ -150,7 +150,7 @@ export class LevelSite extends WordRotatorBaseSite { this.wonText.style.fontSize = "0"; const db = WordRotatorDb.getInstance(); - const nextLevelJson = await db.loadNextLevel([20, 40, 60, 100, 120, 140, 160]); + const nextLevelJson = await db.loadNextLevel(LevelSite.RENDERER_TYPES); if (nextLevelJson === null) { this.startSite(EndSite); @@ -440,7 +440,7 @@ export class LevelSite extends WordRotatorBaseSite { } } } - +LevelSite.RENDERER_TYPES = [20, 40, 60, 100, 120, 140, 160]; LevelSite.TUTORIAL = { FIRST_LEVEL: 67, SECOND_LEVEL: 15, diff --git a/src/module/Application/pwa/js/site/MenuSite.js b/src/module/Application/pwa/js/site/MenuSite.js index 800d1de..b604b77 100644 --- a/src/module/Application/pwa/js/site/MenuSite.js +++ b/src/module/Application/pwa/js/site/MenuSite.js @@ -24,7 +24,7 @@ export class MenuSite extends WordRotatorBaseSite { level.getWonPromise().then(() => { Matomo.push(["trackEvent", "MainMenu", "levelSolved"]); - this.startSite(LevelSite); + this.startLevelSite(); }); let segment = level.getRootSegment(); @@ -87,13 +87,23 @@ export class MenuSite extends WordRotatorBaseSite { return res; } + async startLevelSite() { + this.startSite(LevelSite, Promise.race([this.loadLevelPromise, new Promise(async resolve => { + const db = WordRotatorDb.getInstance(); + let level = await db.loadNextLevel(LevelSite.RENDERER_TYPES); + if (level !== null) { + resolve(); + } + })])); + } + async onFirstStart() { super.onFirstStart(); let playButton = this.findBy("#play-button"); playButton.addEventListener("click", () => { Matomo.push(["trackEvent", "MainMenu", "startButton"]); - this.startSite(LevelSite, this.loadLevelPromise); + this.startLevelSite(); }); let leafSegmentTemplate = this.findBy("#segment-leaf-template"); @@ -129,10 +139,10 @@ export class MenuSite extends WordRotatorBaseSite { playMusicButton.addEventListener("change", () => { settingsManager.setSetting("play-music", playMusicButton.checked); soundManager.set({muted: !playMusicButton.checked}, SoundManager.CHANNELS.MUSIC); - if (playMusicButton.checked){ + if (playMusicButton.checked) { soundManager.play(SoundManager.CHANNELS.MUSIC); } - Matomo.push(["trackEvent", "MainMenu", "PlayMusic", "Play Music", (playMusicButton.checked)?1:0]); + Matomo.push(["trackEvent", "MainMenu", "PlayMusic", "Play Music", (playMusicButton.checked) ? 1 : 0]); }); let playSoundButton = this.findBy("#play-sound"); @@ -140,7 +150,7 @@ export class MenuSite extends WordRotatorBaseSite { playSoundButton.addEventListener("change", () => { settingsManager.setSetting("play-sound", playSoundButton.checked); 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]); }); } @@ -163,7 +173,9 @@ export class MenuSite extends WordRotatorBaseSite { "dateLastSync": dateLastSync })); if (!res["success"]) { - FlashMessenger.addMessage("sync-error", null, 6000); + if (await db.loadNextLevel(LevelSite.RENDERER_TYPES) === null) { + FlashMessenger.addMessage("sync-error", null, 6000); + } newLastSync = null; break; } @@ -183,8 +195,7 @@ export class MenuSite extends WordRotatorBaseSite { let levels = await Promise.all(levelPromises); await db.saveManyLevels(levels); - if (newLastSync != null && newLastSync !== "null") - { + if (newLastSync != null && newLastSync !== "null") { localStorage.setItem("date-last-sync", newLastSync); } } diff --git a/test/test.testcafe.js b/test/test.testcafe.js index 77e925c..f0d8ba7 100644 --- a/test/test.testcafe.js +++ b/test/test.testcafe.js @@ -17,13 +17,23 @@ const replaceRandom = ClientFunction((sequence) => { async function beforeEachTest(t) { // await replaceRandom(); + await waitForMainMenu(t); } async function afterEachTest(t) { return await t.eval(() => indexedDB.deleteDatabase('wordRotator')); } -let isLocal = false; +async function waitForMainMenu(t) { + + while (!(await Selector("#play-button").exists)) { + // console.log("nextIterate"); + await t.wait(100); + } + await t.wait(2000); +} + +let isLocal = true; if (isLocal) { fixture`Play` .page`https://127.0.0.1/pwa/wordRotator/publicTest/`.beforeEach(async t => { @@ -40,7 +50,7 @@ else { password: '20luxl200' }).beforeEach(async t => { await beforeEachTest(t); - await t.wait(25000); + // await t.wait(25000); }).afterEach(async t => { await afterEachTest(t); }); @@ -78,6 +88,7 @@ const SEGMENT = { test('Play', async t => { let levelNumber = 1; + await waitForMainMenu(t); await t //Main Menu .click(Selector('#play-button')) @@ -369,6 +380,7 @@ test('Play', async t => { .expect(Selector('#site-content').childElementCount).eql(1); }); test('LoadLastLevel', async t => { + await waitForMainMenu(t); await t.click(Selector('#play-button')) .expect(Selector('.segment-parent').nth(SEGMENT.ONE).hasClass('locked')).ok() .expect(Selector('.segment-parent').nth(SEGMENT.ONE).getStyleProperty('transform')).eql("matrix(1, 0, 0, 1, 0, 0)") @@ -378,11 +390,12 @@ test('LoadLastLevel', async t => { await testLocalStorageSet("currentLevel", "{\"id\":15,\"rotations\":[0,0,270],\"locks\":[false,true,true]}"); }); test('LevelRotation', async t => { - await t + await waitForMainMenu(t); + await t.click(Selector('.segment-parent').nth(SEGMENT.THREE)) .click(Selector('.segment-parent').nth(SEGMENT.THREE)) .click(Selector('.segment-parent').nth(SEGMENT.THREE)) - .click(Selector('.segment-parent').nth(SEGMENT.THREE)) - .wait(3000) + .expect(Selector('.segment-parent').nth(SEGMENT.THREE).getStyleProperty('transform')).eql("matrix(0, -1, 1, 0, 0, 0)") + .wait(3500) .expect(Selector('.segment-parent').nth(SEGMENT.THREE).getStyleProperty('transform')).eql("matrix(0, -1, 1, 0, 0, 0)") .expect(Selector('.segment-parent').nth(SEGMENT.FOUR).getStyleProperty('transform')).eql("matrix(0, 1, -1, 0, 0, 0)") .click(Selector('.segment-parent').nth(SEGMENT.THREE)) @@ -397,7 +410,8 @@ test('LevelRotation', async t => { .click(Selector('.segment-parent').nth(SEGMENT.THREE)) .click(Selector('.segment-parent').nth(SEGMENT.THREE)) .click(Selector('.segment-parent').nth(SEGMENT.THREE)) - .wait(4000) + .expect(Selector('.segment-parent').nth(SEGMENT.THREE).getStyleProperty('transform')).eql("matrix(0, -1, 1, 0, 0, 0)") + .wait(3500) .expect(Selector('.segment-parent').nth(SEGMENT.THREE).getStyleProperty('transform')).eql("matrix(0, -1, 1, 0, 0, 0)") .expect(Selector('.segment-parent').nth(SEGMENT.FOUR).getStyleProperty('transform')).eql("matrix(0, 1, -1, 0, 0, 0)") .click(Selector('.segment-parent').nth(SEGMENT.THREE)) @@ -412,26 +426,34 @@ test('LevelRotation', async t => { await replaceRandom([0.9, 0.5]); }); test('SendUserstats', async t => { + await waitForMainMenu(t); let matomoCheck = ClientFunction(() => { - return fetch("//matomo.silas.link/index.php?module=API&method=AjaxOptOut.isTracked", { - "mode": "cors", - "credentials": "include", - }).then(res => res.text()).then(text => (new window.DOMParser()).parseFromString(text, "text/xml")).then((xml => { - let textContent = xml.firstChild.textContent; - console.log(textContent); - return (textContent === "1") - })); + return new Promise((resolve) => { + function check() { + window["_paq"].push([function () { + resolve(!this["isUserOptedOut"]()); + }]); + } + + window.addEventListener("load", () => { + check(); + }); + if (document.readyState === 'complete') { + check(); + } + }); }); await t .click(Selector(".action [data-translation-title='settings']")) .expect(Selector("#play-sound").checked).ok() .expect(Selector("#play-music").checked).ok() - .expect(Selector("#track-switch").checked).ok() - .expect(await matomoCheck()).ok() + .expect(Selector("#track-switch").checked).ok(); + let res = await matomoCheck(); + await t.expect(res).ok() .click(Selector(".switch [data-translation='track']")) .expect(Selector("#track-switch").checked).eql(false); - let res = await matomoCheck(); + res = await matomoCheck(); await t.expect(res).eql(false) .click(Selector(".switch [data-translation='track']")) .expect(Selector("#track-switch").checked).ok(); @@ -442,7 +464,7 @@ test('SendUserstats', async t => { }); test('Themes', async t => { - await testLocalStorageSet("currentTheme", "dark"); + await waitForMainMenu(t); await t .expect(Selector("body.dark").visible).ok() .click(Selector(".action [data-translation-title='settings']")) @@ -453,5 +475,5 @@ test('Themes', async t => { .expect(Selector("#theme-name").innerText).eql("GrĂ¼n") .expect(Selector("body.green").visible).ok() }).before(async t => { - testLocalStorageSet("currentTheme", "dark"); + await testLocalStorageSet("currentTheme", "dark"); }); \ No newline at end of file