diff --git a/client/play/BonusClient.js b/client/play/BonusClient.js index 2d0c8db1d..9439022a6 100644 --- a/client/play/BonusClient.js +++ b/client/play/BonusClient.js @@ -8,13 +8,19 @@ export const BonusClientMixin = (ClientClass) => class extends ClientClass { switch (data.type) { case 'end-current-bonus': return this.endCurrentBonus(data); case 'give-bonus-answer': return this.giveBonusAnswer(data); + case 'pause': return this.pause(data); case 'reveal-leadin': return this.revealLeadin(data); case 'reveal-next-answer': return this.revealNextAnswer(data); case 'reveal-next-part': return this.revealNextPart(data); + case 'set-reading-speed': return this.setReadingSpeed(data); case 'start-bonus-answer': return this.startBonusAnswer(data); case 'start-next-bonus': return this.startNextBonus(data); case 'toggle-bonus-part': return this.toggleBonusPart(data); + case 'toggle-read-bonuses': return this.toggleReadBonuses(data); case 'toggle-three-part-bonuses': return this.toggleThreePartBonuses(data); + case 'update-question': + if (data.target) { return this.updateQuestion(data); } + return super.onmessage(message); default: return super.onmessage(message); } } @@ -31,7 +37,7 @@ export const BonusClientMixin = (ClientClass) => class extends ClientClass { } if (directive !== 'prompt') { - document.getElementById('reveal').disabled = false; + document.getElementById('reveal').disabled = !this.room.settings.readBonuses; } } @@ -54,10 +60,12 @@ export const BonusClientMixin = (ClientClass) => class extends ClientClass { } revealNextPart ({ bonusEligibleTeamId, currentPartNumber, part, value }) { - document.getElementById('reveal').disabled = !( - bonusEligibleTeamId === undefined || - bonusEligibleTeamId === this.room.players[this.USER_ID]?.teamId - ); + if (!this.room.settings.readBonuses) { + document.getElementById('reveal').disabled = !( + bonusEligibleTeamId === undefined || + bonusEligibleTeamId === this.room.players[this.USER_ID]?.teamId + ); + } const input = document.createElement('input'); input.id = `checkbox-${currentPartNumber + 1}`; @@ -93,6 +101,11 @@ export const BonusClientMixin = (ClientClass) => class extends ClientClass { startNextBonus ({ bonus, packetLength }) { this.startNextQuestion({ packetLength, question: bonus }); document.getElementById('next').textContent = 'Skip'; + const pauseButton = document.getElementById('pause'); + if (pauseButton) { + pauseButton.textContent = 'Pause'; + pauseButton.disabled = !this.room.settings.readBonuses; + } } setMode ({ mode }) { @@ -116,6 +129,46 @@ export const BonusClientMixin = (ClientClass) => class extends ClientClass { toggleThreePartBonuses ({ threePartBonuses }) { document.getElementById('toggle-three-part-bonuses').checked = threePartBonuses; } + + pause ({ paused }) { + const pauseButton = document.getElementById('pause'); + if (pauseButton) { + pauseButton.textContent = paused ? 'Resume' : 'Pause'; + } + } + + setReadingSpeed ({ readingSpeed }) { + const el = document.getElementById('reading-speed'); + if (el) { + el.value = readingSpeed; + } + const display = document.getElementById('reading-speed-display'); + if (display) { + display.textContent = readingSpeed; + } + } + + toggleReadBonuses ({ readBonuses }) { + const el = document.getElementById('toggle-read-bonuses'); + if (el) { + el.checked = readBonuses; + } + const readingSpeedSettings = document.getElementById('reading-speed-settings'); + if (readingSpeedSettings) { + readingSpeedSettings.classList.toggle('d-none', !readBonuses); + } + } + + updateQuestion ({ word, target, currentPartNumber }) { + if (target === 'leadin') { + document.getElementById('leadin').innerHTML += word + ' '; + } else { + const partEl = document.getElementById(`bonus-part-${currentPartNumber + 1}`); + if (partEl) { + partEl.querySelector('p').innerHTML += word + ' '; + } + } + } }; const BonusClient = BonusClientMixin(QuestionClient); diff --git a/client/play/bonuses/SoloBonusClient.js b/client/play/bonuses/SoloBonusClient.js index b7e458644..626054ccc 100644 --- a/client/play/bonuses/SoloBonusClient.js +++ b/client/play/bonuses/SoloBonusClient.js @@ -124,6 +124,16 @@ export default class SoloBonusClient extends BonusClient { window.localStorage.setItem('singleplayer-bonus-settings', JSON.stringify({ ...this.room.settings, version: settingsVersion })); } + setReadingSpeed ({ readingSpeed }) { + super.setReadingSpeed({ readingSpeed }); + window.localStorage.setItem('singleplayer-bonus-settings', JSON.stringify({ ...this.room.settings, version: settingsVersion })); + } + + toggleReadBonuses ({ readBonuses }) { + super.toggleReadBonuses({ readBonuses }); + window.localStorage.setItem('singleplayer-bonus-settings', JSON.stringify({ ...this.room.settings, version: settingsVersion })); + } + /** * Calculates the points per bonus and updates the display. */ diff --git a/client/play/bonuses/index.html b/client/play/bonuses/index.html index 2780751fb..1cb2628fc 100644 --- a/client/play/bonuses/index.html +++ b/client/play/bonuses/index.html @@ -169,6 +169,14 @@

+
+ + +
+
+ + +
@@ -220,6 +228,8 @@

+