-
Ben Eltschig authoredUnverifieda60d9cc4
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
SkribblGameContainer.js 3.11 KiB
import SkribblCanvas, {SkribblCanvasOverlay} from "./SkribblCanvas.js";
import SkribblChat from "./SkribblChat.js";
import SkribblClient from "./SkribblClient.js";
import SkribblPlayerList from "./SkribblPlayerList.js";
/**
* Custom element `<skribbl-game-container>` for an actual ongoing skribbl game, that is, a container for the chat, canvas, playerlist etc.
* @todo ui to show how much time is left
* @todo add space between underscores, to make counting letters easier
*/
export default class SkribblGameContainer extends HTMLElement {
/**
* @param {SkribblClient} client
*/
constructor(client){
super();
this.attachShadow({mode:"open"});
this.shadowRoot.innerHTML = `
<style>
:host {
display: block;
--inner-margin: 5px;
}
#header{
display: flex;
background: #ffffff;
border-radius: 10px 10px 5px 5px;
padding: 5px 10px 5px 10px;
font-size: 1.25em;
font-wheight: bold;
margin-bottom: var(--inner-margin);
}
#word {
flex-grow: 1;
text-align: center;
}
#body {
display: flex;
}
skribbl-player-list {
width: 150px;
flex-shrink: 1;
flex-grow: 0;
}
skribbl-canvas {
width: 250px;
flex-shrink: 1;
flex-grow: 1;
margin-left: var(--inner-margin);
margin-right: var(--inner-margin);
}
skribbl-chat {
width: 300px;
flex-shrink: 1;
flex-grow: 0;
}
</style>
<div id="header">
<span id="rounds"></span>
<span id="word">Word: ____________ ____</span>
</div>
<div id="body"></div>
`;
this._client = client;
this._rounds = this.shadowRoot.getElementById("rounds");
this._word = this.shadowRoot.getElementById("word");
this._body = this.shadowRoot.getElementById("body");
this._playerList = new SkribblPlayerList(client,{compact:true});
this._canvas = new SkribblCanvas();
this._chat = new SkribblChat(client);
this._body.append(this._playerList,this._canvas,this._chat);
/** @param {import("./SkribblClient.js").GameState} state */
this._onStateChangeCallback = state=>{
if (state.hasGameStarted){
this._rounds.textContent = `Round ${state.round}/${state.rounds}`;
if (state.word===null){
this._canvas.overlay = new SkribblCanvasOverlay(`${state.players[state.drawingPlayer].name} is choosing a word.`);
}else if(Array.isArray(state.word)){
let overlay = new SkribblCanvasOverlay();
overlay.innerHTML = "Choose a word to draw:<br>";
state.word.forEach((word,index)=>{
let button = document.createElement("button");
button.textContent = word;
button.addEventListener("click",e=>{
this._client.chooseWord(index);
button.disabled = true;
});
overlay.appendChild(button);
});
this._canvas.overlay = overlay;
}else{
this._canvas.overlay = null;
this._word.textContent = state.word;
}
}
}
}
connectedCallback(){
this._client.onStateChange(this._onStateChangeCallback);
}
disconnectedCallback(){
this._client.removeOnStateChangeCallback(this._onStateChangeCallback);
}
}
customElements.define("skribbl-game-container",SkribblGameContainer);