sutom/ts/configurationPanel.ts

239 lines
8.1 KiB
TypeScript

import Configuration from "./entites/configuration";
import PanelManager from "./panelManager";
import Sauvegardeur from "./sauvegardeur";
import { VolumeSon } from "./entites/volumeSon";
import AudioPanel from "./audioPanel";
import { ClavierDisposition } from "./entites/clavierDisposition";
import Input from "./input";
import ThemeManager from "./themeManager";
import { Theme } from "./entites/theme";
import CopieHelper from "./copieHelper";
export default class ConfigurationPanel {
private readonly _panelManager: PanelManager;
private readonly _audioPanel: AudioPanel;
private readonly _themeManager: ThemeManager;
private readonly _configBouton: HTMLElement;
private _input: Input | undefined;
public constructor(panelManager: PanelManager, audioPanel: AudioPanel, themeManager: ThemeManager) {
this._panelManager = panelManager;
this._audioPanel = audioPanel;
this._themeManager = themeManager;
this._configBouton = document.getElementById("configuration-config-bouton") as HTMLElement;
this._configBouton.addEventListener(
"click",
(() => {
this.afficher();
}).bind(this)
);
}
public afficher(): void {
let titre = "Configuration";
let contenu = document.createElement("div");
contenu.id = "config-liste";
let config = Sauvegardeur.chargerConfig() ?? Configuration.Default;
contenu.appendChild(
this.genererConfigItem(
"Volume du son (si activé)",
[
{ value: VolumeSon.Faible.toString(), label: "Faible" },
{ value: VolumeSon.Normal.toString(), label: "Normal" },
{ value: VolumeSon.Fort.toString(), label: "Fort" },
],
(config.volumeSon ?? Configuration.Default.volumeSon).toString(),
(event: Event) => {
event.stopPropagation();
let volumeSon: VolumeSon = parseInt((event.target as HTMLSelectElement).value);
this._audioPanel.setVolumeSonore(volumeSon);
Sauvegardeur.sauvegarderConfig({
...(Sauvegardeur.chargerConfig() ?? Configuration.Default),
volumeSon,
});
}
)
);
contenu.appendChild(
this.genererConfigItem(
"Disposition du clavier",
[
{ value: ClavierDisposition.Azerty.toString(), label: "AZERTY" },
{ value: ClavierDisposition.Bépo.toString(), label: "BÉPO" },
{ value: ClavierDisposition.Qwerty.toString(), label: "QWERTY" },
{ value: ClavierDisposition.Qwertz.toString(), label: "QWERTZ" },
],
(config.disposition ?? Configuration.Default.disposition).toString(),
(event: Event) => {
event.stopPropagation();
let disposition: ClavierDisposition = parseInt((event.target as HTMLSelectElement).value);
if (this._input) this._input.dessinerClavier(disposition);
Sauvegardeur.sauvegarderConfig({
...(Sauvegardeur.chargerConfig() ?? Configuration.Default),
disposition,
});
}
)
);
contenu.appendChild(
this.genererConfigItem(
"Thème",
[
{ value: Theme.Sombre.toString(), label: "Sombre" },
{ value: Theme.Clair.toString(), label: "Clair" },
{ value: Theme.SombreAccessible.toString(), label: "Sombre (Accessible)" },
{ value: Theme.ClairAccessible.toString(), label: "Clair (Accessible)" },
],
(config.theme ?? Configuration.Default.theme).toString(),
(event: Event) => {
event.stopPropagation();
let theme: Theme = parseInt((event.target as HTMLSelectElement).value);
this._themeManager.changerCouleur(theme);
Sauvegardeur.sauvegarderConfig({
...(Sauvegardeur.chargerConfig() ?? Configuration.Default),
theme,
});
}
)
);
contenu.appendChild(
this.genererConfigItem(
"Afficher le temps sur le résumé (à la prochaine partie)",
[
{ value: false.toString(), label: "Non" },
{ value: true.toString(), label: "Oui" },
],
(config.afficherChrono ?? Configuration.Default.afficherChrono).toString(),
(event: Event) => {
event.stopPropagation();
let afficherChrono = (event.target as HTMLSelectElement).value === true.toString();
Sauvegardeur.sauvegarderConfig({
...(Sauvegardeur.chargerConfig() ?? Configuration.Default),
afficherChrono,
});
}
)
);
contenu.appendChild(
this.genererConfigItem(
"Retour haptique (si votre navigateur est compatible)",
[
{ value: false.toString(), label: "Non" },
{ value: true.toString(), label: "Oui" },
],
(config.haptique ?? Configuration.Default.haptique).toString(),
(event: Event) => {
event.stopPropagation();
let haptique = (event.target as HTMLSelectElement).value === true.toString();
Sauvegardeur.sauvegarderConfig({
...(Sauvegardeur.chargerConfig() ?? Configuration.Default),
haptique,
});
// On redessine le clavier pour la prise en compte de l'option
if (this._input) this._input.dessinerClavier(config.disposition ?? Configuration.Default.disposition);
}
)
);
if (Sauvegardeur.chargerSauvegardeStats()) contenu.appendChild(this.genererZoneExportSauvegarde());
this._panelManager.setContenuHtmlElement(titre, contenu);
this._panelManager.setClasses(["config-panel"]);
this._panelManager.afficherPanel();
}
private genererConfigItem(
nomConfig: string,
options: Array<{ value: string; label: string }>,
valeurChoisie: string,
onChange?: (event: Event) => void
): HTMLElement {
let div = document.createElement("div");
div.className = "config-item";
let label = document.createElement("label");
label.innerText = nomConfig;
div.appendChild(label);
let select = document.createElement("select");
for (let optionItem of options) {
let optionElement = document.createElement("option");
optionElement.value = optionItem.value;
optionElement.innerText = optionItem.label;
if (optionItem.value === valeurChoisie) optionElement.selected = true;
select.appendChild(optionElement);
}
if (onChange !== undefined) select.addEventListener("change", onChange);
div.appendChild(select);
return div;
}
private genererZoneExportSauvegarde(): HTMLElement {
let div = document.createElement("div");
div.id = "config-sauvegarde-area";
const titreSection = document.createElement("h3");
titreSection.innerText = "Exporter vos statistiques";
div.appendChild(titreSection);
const explication = document.createElement("p");
explication.innerText = "Pour transférer vos statistiques sur un autre navigateur, il est possible de suivre les étapes suivantes :";
div.appendChild(explication);
const listeEtape = document.createElement("ol");
const etape1 = document.createElement("li");
const etape1Texte = document.createElement("p");
etape1Texte.innerText = "Copiez ce lien à usage unique.";
etape1.appendChild(etape1Texte);
const etape1Input = document.createElement("input");
const contenuLien = Sauvegardeur.genererLien();
const lien = window.location.origin + window.location.pathname + "#" + btoa("s=" + contenuLien);
etape1Input.value = lien;
etape1Input.readOnly = true;
etape1.appendChild(etape1Input);
const etape1Bouton = CopieHelper.creerBoutonPartage("config-sauvegarde-bouton");
CopieHelper.attacheBoutonCopieLien(etape1Bouton, lien, "Lien copié dans le presse papier.");
etape1.appendChild(etape1Bouton);
listeEtape.appendChild(etape1);
const etape2 = document.createElement("li");
etape2.innerText = "Envoyez le lien vers votre autre appareil.";
listeEtape.appendChild(etape2);
const etape3 = document.createElement("li");
etape3.innerText = "Ouvrez ce lien dans votre autre navigateur.";
listeEtape.appendChild(etape3);
div.appendChild(listeEtape);
return div;
}
public setInput(input: Input): void {
this._input = input;
}
}