57 lines
1.9 KiB
JavaScript
57 lines
1.9 KiB
JavaScript
/**
|
||
* Disclaimer als HTML-Overlay. Der Text kommt aus dem Template
|
||
* `_disclaimer_content.html` (einzige Quelle, auch für die Seite /disclaimer).
|
||
* Die Bestätigung wird in localStorage gespeichert.
|
||
* @module scenes/DisclaimerScene
|
||
*/
|
||
|
||
import { DISCLAIMER } from '../content/texts.js';
|
||
import { el, Overlay } from '../systems/Overlay.js';
|
||
|
||
export class DisclaimerScene extends Phaser.Scene {
|
||
constructor() {
|
||
super('Disclaimer');
|
||
}
|
||
|
||
/** @param {{mandatory?: boolean}} data */
|
||
create(data) {
|
||
const services = this.registry.get('services');
|
||
const context = this.registry.get('context');
|
||
const mandatory = Boolean(data?.mandatory);
|
||
|
||
const content = [];
|
||
const template = document.getElementById('disclaimer-content');
|
||
if (template instanceof HTMLTemplateElement) {
|
||
content.push(template.content.cloneNode(true));
|
||
} else {
|
||
content.push(el('p', '', DISCLAIMER.missingTemplate));
|
||
}
|
||
const link = /** @type {HTMLAnchorElement} */ (el('a', '', DISCLAIMER.openPage));
|
||
link.href = context.disclaimerUrl;
|
||
link.target = '_blank';
|
||
link.rel = 'noopener';
|
||
const linkLine = el('p');
|
||
linkLine.append(link);
|
||
content.push(linkLine);
|
||
|
||
const close = () => {
|
||
// Der Klick ist eine Nutzeraktion – guter Moment, um den Ton freizuschalten.
|
||
services.audio.unlock();
|
||
services.audio.play('ui-confirm');
|
||
services.settings.acceptDisclaimer();
|
||
this.overlay.close();
|
||
this.events.emit('disclaimer-closed');
|
||
this.scene.stop();
|
||
};
|
||
|
||
this.overlay = new Overlay({
|
||
id: 'disclaimer-overlay',
|
||
content,
|
||
buttons: [{ label: mandatory ? DISCLAIMER.accept : DISCLAIMER.close, onClick: close, testId: 'disclaimer-accept' }],
|
||
// Beim ersten Start muss aktiv bestätigt werden; Esc schließt nur den erneuten Aufruf.
|
||
onEscape: mandatory ? undefined : close,
|
||
});
|
||
this.events.once('shutdown', () => this.overlay?.element.isConnected && this.overlay.close());
|
||
}
|
||
}
|