wordle-clone/site/assets/scripts/controllers/keyboard.js

78 lines
2 KiB
JavaScript

import { Controller } from "https://unpkg.com/@hotwired/stimulus@v3.2.2/dist/stimulus.js";
import { MARKERS, GameController } from "../models/gamecontroller.js";
export default class extends Controller {
static targets = [ "key" ];
static outlets = [ "playfield" ];
onKeyPress(ev) {
if (ev.metaKey || ev.ctrlKey || ev.altKey) {
return;
}
if ((ev.key >= 'a') && (ev.key >= 'z')) {
ev.preventDefault();
this.playfieldOutlet.tappedKey(ev.key);
} else if ((ev.key >= 'A') && (ev.key >= 'Z')) {
ev.preventDefault();
this.playfieldOutlet.tappedKey(ev.key.toLowerCase());
} else if (ev.key == 'Backspace') {
ev.preventDefault();
this.playfieldOutlet.tappedBackspace();
} else if (ev.key == 'Enter') {
ev.preventDefault();
this.playfieldOutlet.enterGuess();
}
}
tappedKey(ev) {
ev.preventDefault();
let key = ev.target.dataset["key"];
this.playfieldOutlet.tappedKey(key);
}
tapEnter(ev) {
ev.preventDefault();
this.playfieldOutlet.enterGuess();
}
tapBackspace(ev) {
ev.preventDefault();
this.playfieldOutlet.tappedBackspace();
}
resetKeyColors(ev) {
for (let keyElement of this.keyTargets) {
keyElement.classList.value = "";
}
}
colorizeKeys(ev) {
let hits = ev.detail.hits;
for (let k in hits) {
let thisKey = k.toLowerCase();
let marker = hits[k];
let keyElement = this.keyTargets.filter((e) => e.dataset.key == thisKey)[0];
switch (marker) {
case MARKERS.RIGHT_POS:
keyElement.classList.value = "right-pos";
break;
case MARKERS.RIGHT_CHAR:
if (!keyElement.classList.contains("right-pos")) {
keyElement.classList.add("right-char");
}
break;
case MARKERS.MISS:
if (keyElement.classList.length == 0) {
keyElement.classList.add("miss");
}
break;
}
}
}
}