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 @@
+