export class ConnectionStatus extends HTMLElement { connectedCallback() { this.loggingInDialog = this.querySelector("dialog[name='logging-in-dialog']"); this.loggingInThrobber = this.loggingInDialog.querySelector("rkgk-throbber"); // This is a progress dialog and shouldn't be closed. this.loggingInDialog.addEventListener("cancel", (event) => event.preventDefault()); this.errorDialog = this.querySelector("dialog[name='error-dialog']"); this.errorText = this.errorDialog.querySelector("[name='error-text']"); this.errorRefresh = this.errorDialog.querySelector("button[name='refresh']"); // If this appears then something broke, and therefore the app can't continue normally. this.errorDialog.addEventListener("cancel", (event) => event.preventDefault()); this.errorRefresh.addEventListener("click", () => { window.location.reload(); }); this.disconnectedDialog = this.querySelector("dialog[name='disconnected-dialog']"); this.reconnectDuration = this.disconnectedDialog.querySelector( "[name='reconnect-duration']", ); // If this appears then we can't let the user use the app, because we're disconnected. this.disconnectedDialog.addEventListener("cancel", (event) => event.preventDefault()); } showLoggingIn() { this.loggingInDialog.showModal(); } hideLoggingIn() { this.loggingInDialog.close(); } showError(error) { this.errorDialog.showModal(); if (error instanceof Error) { if (error.stack != null && error.stack != "") { this.errorText.textContent = `${error.toString()}\n\n${error.stack}`; } else { this.errorText.textContent = error.toString(); } } } async showDisconnected(duration) { this.disconnectedDialog.showModal(); let updateDuration = (remaining) => { let seconds = Math.floor(remaining / 1000); this.reconnectDuration.textContent = `${seconds} ${seconds == 1 ? "second" : "seconds"}`; }; let remaining = duration; updateDuration(remaining); while (remaining > 0) { let delay = Math.min(1000, remaining); remaining -= delay; updateDuration(remaining); await new Promise((resolve) => setTimeout(resolve, delay)); } } } customElements.define("rkgk-connection-status", ConnectionStatus);