diff --git a/src/client/FlagInput.ts b/src/client/FlagInput.ts index 08d7cad13..8ae13ca77 100644 --- a/src/client/FlagInput.ts +++ b/src/client/FlagInput.ts @@ -68,8 +68,21 @@ export class FlagInput extends LitElement { super.connectedCallback(); this.flag = this.getStoredFlag(); this.dispatchFlagEvent(); + window.addEventListener("keydown", this.handleKeyDown); } + disconnectedCallback() { + window.removeEventListener("keydown", this.handleKeyDown); + super.disconnectedCallback(); + } + + private handleKeyDown = (e: KeyboardEvent) => { + if (e.code === "Escape") { + e.preventDefault(); + this.showModal = false; + } + }; + createRenderRoot() { return this; } diff --git a/src/client/HelpModal.ts b/src/client/HelpModal.ts index 92fd6e31a..97e74be6d 100644 --- a/src/client/HelpModal.ts +++ b/src/client/HelpModal.ts @@ -15,6 +15,23 @@ export class HelpModal extends LitElement { return this; } + connectedCallback() { + super.connectedCallback(); + window.addEventListener("keydown", this.handleKeyDown); + } + + disconnectedCallback() { + window.removeEventListener("keydown", this.handleKeyDown); + super.disconnectedCallback(); + } + + private handleKeyDown = (e: KeyboardEvent) => { + if (e.code === "Escape") { + e.preventDefault(); + this.close(); + } + }; + render() { return html` { + if (e.code === "Escape") { + e.preventDefault(); + this.close(); + } + }; + render() { return html` diff --git a/src/client/JoinPrivateLobbyModal.ts b/src/client/JoinPrivateLobbyModal.ts index 3640bb220..1b631be87 100644 --- a/src/client/JoinPrivateLobbyModal.ts +++ b/src/client/JoinPrivateLobbyModal.ts @@ -20,6 +20,23 @@ export class JoinPrivateLobbyModal extends LitElement { private playersInterval: NodeJS.Timeout | null = null; + connectedCallback() { + super.connectedCallback(); + window.addEventListener("keydown", this.handleKeyDown); + } + + disconnectedCallback() { + window.removeEventListener("keydown", this.handleKeyDown); + super.disconnectedCallback(); + } + + private handleKeyDown = (e: KeyboardEvent) => { + if (e.code === "Escape") { + e.preventDefault(); + this.close(); + } + }; + render() { return html` diff --git a/src/client/LanguageModal.ts b/src/client/LanguageModal.ts index b75173e16..41dcc5c97 100644 --- a/src/client/LanguageModal.ts +++ b/src/client/LanguageModal.ts @@ -31,11 +31,24 @@ export class LanguageModal extends LitElement { } } + connectedCallback() { + super.connectedCallback(); + window.addEventListener("keydown", this.handleKeyDown); + } + disconnectedCallback() { super.disconnectedCallback(); + window.removeEventListener("keydown", this.handleKeyDown); document.body.style.overflow = "auto"; } + private handleKeyDown = (e: KeyboardEvent) => { + if (e.code === "Escape") { + e.preventDefault(); + this.close(); + } + }; + private selectLanguage = (lang: string) => { this.dispatchEvent( new CustomEvent("language-selected", { diff --git a/src/client/NewsModal.ts b/src/client/NewsModal.ts index d3924e655..308c9be75 100644 --- a/src/client/NewsModal.ts +++ b/src/client/NewsModal.ts @@ -13,6 +13,23 @@ export class NewsModal extends LitElement { close: () => void; }; + connectedCallback() { + super.connectedCallback(); + window.addEventListener("keydown", this.handleKeyDown); + } + + disconnectedCallback() { + window.removeEventListener("keydown", this.handleKeyDown); + super.disconnectedCallback(); + } + + private handleKeyDown = (e: KeyboardEvent) => { + if (e.code === "Escape") { + e.preventDefault(); + this.close(); + } + }; + @property({ type: String }) markdown = "Loading..."; private initialized: boolean = false; diff --git a/src/client/SinglePlayerModal.ts b/src/client/SinglePlayerModal.ts index 69f5b23cf..d819a0ccf 100644 --- a/src/client/SinglePlayerModal.ts +++ b/src/client/SinglePlayerModal.ts @@ -47,6 +47,23 @@ export class SinglePlayerModal extends LitElement { private userSettings: UserSettings = new UserSettings(); + connectedCallback() { + super.connectedCallback(); + window.addEventListener("keydown", this.handleKeyDown); + } + + disconnectedCallback() { + window.removeEventListener("keydown", this.handleKeyDown); + super.disconnectedCallback(); + } + + private handleKeyDown = (e: KeyboardEvent) => { + if (e.code === "Escape") { + e.preventDefault(); + this.close(); + } + }; + render() { return html` diff --git a/src/client/TerritoryPatternsModal.ts b/src/client/TerritoryPatternsModal.ts index 24226c0f9..e116ea486 100644 --- a/src/client/TerritoryPatternsModal.ts +++ b/src/client/TerritoryPatternsModal.ts @@ -45,6 +45,7 @@ export class TerritoryPatternsModal extends LitElement { connectedCallback() { super.connectedCallback(); + window.addEventListener("keydown", this.handleKeyDown); this.selectedPattern = this.userSettings.getSelectedPattern(); this.updateComplete.then(() => { const containers = this.renderRoot.querySelectorAll(".preview-container"); @@ -59,6 +60,7 @@ export class TerritoryPatternsModal extends LitElement { } disconnectedCallback() { + window.removeEventListener("keydown", this.handleKeyDown); super.disconnectedCallback(); } @@ -69,6 +71,11 @@ export class TerritoryPatternsModal extends LitElement { } private handleKeyDown = (e: KeyboardEvent) => { + if (e.code === "Escape") { + e.preventDefault(); + this.close(); + } + const key = e.key.toLowerCase(); const nextSequence = [...this.keySequence, key].slice(-5); this.keySequence = nextSequence; diff --git a/src/client/UserSettingModal.ts b/src/client/UserSettingModal.ts index 70fe27834..70782e83a 100644 --- a/src/client/UserSettingModal.ts +++ b/src/client/UserSettingModal.ts @@ -51,6 +51,11 @@ export class UserSettingModal extends LitElement { private handleKeyDown = (e: KeyboardEvent) => { if (!this.modalEl?.isModalOpen || this.showEasterEggSettings) return; + if (e.code === "Escape") { + e.preventDefault(); + this.close(); + } + const key = e.key.toLowerCase(); const nextSequence = [...this.keySequence, key].slice(-4); this.keySequence = nextSequence; diff --git a/src/client/graphics/GameRenderer.ts b/src/client/graphics/GameRenderer.ts index 442d4d0ea..3a089f33e 100644 --- a/src/client/graphics/GameRenderer.ts +++ b/src/client/graphics/GameRenderer.ts @@ -173,7 +173,7 @@ export function createRenderer( console.error("player panel not found"); } playerPanel.g = game; - playerPanel.eventBus = eventBus; + playerPanel.initEventBus(eventBus); playerPanel.emojiTable = emojiTable; playerPanel.uiState = uiState; @@ -182,8 +182,7 @@ export function createRenderer( console.error("chat modal not found"); } chatModal.g = game; - chatModal.eventBus = eventBus; - chatModal.initEventBus(); + chatModal.initEventBus(eventBus); const multiTabModal = document.querySelector( "multi-tab-modal", diff --git a/src/client/graphics/layers/ChatModal.ts b/src/client/graphics/layers/ChatModal.ts index a8fe2e862..64023e66f 100644 --- a/src/client/graphics/layers/ChatModal.ts +++ b/src/client/graphics/layers/ChatModal.ts @@ -173,8 +173,9 @@ export class ChatModal extends LitElement { `; } - initEventBus() { - this.eventBus.on(CloseViewEvent, (e) => { + initEventBus(eventBus: EventBus) { + this.eventBus = eventBus; + eventBus.on(CloseViewEvent, (e) => { if (!this.hidden) { this.close(); } diff --git a/src/client/graphics/layers/PlayerPanel.ts b/src/client/graphics/layers/PlayerPanel.ts index 7d78a2a20..93b9e8cc5 100644 --- a/src/client/graphics/layers/PlayerPanel.ts +++ b/src/client/graphics/layers/PlayerPanel.ts @@ -164,9 +164,17 @@ export class PlayerPanel extends LitElement implements Layer { private ctModal: ChatModal; + initEventBus(eventBus: EventBus) { + this.eventBus = eventBus; + eventBus.on(CloseViewEvent, (e) => { + if (!this.hidden) { + this.hide(); + } + }); + } + init() { this.eventBus.on(MouseUpEvent, () => this.hide()); - this.eventBus.on(CloseViewEvent, (e) => { this.hide(); });