Skip to content
Snippets Groups Projects
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);