import { LitElement, html } from "lit"; import { customElement, state } from "lit/decorators.js"; import { getCosmeticsHash } from "../Cosmetics"; import { getGamesPlayed } from "../Utils"; const HELP_SEEN_KEY = "helpSeen"; const STORE_SEEN_HASH_KEY = "storeSeenHash"; @customElement("desktop-nav-bar") export class DesktopNavBar extends LitElement { @state() private _helpSeen = localStorage.getItem(HELP_SEEN_KEY) === "true"; @state() private _hasNewCosmetics = false; createRenderRoot() { return this; } connectedCallback() { super.connectedCallback(); window.addEventListener("showPage", this._onShowPage); const current = (window as any).currentPageId; if (current) { // Wait for render this.updateComplete.then(() => { this._updateActiveState(current); }); } // Check if cosmetics have changed getCosmeticsHash().then((hash: string | null) => { const seenHash = localStorage.getItem(STORE_SEEN_HASH_KEY); this._hasNewCosmetics = hash !== null && hash !== seenHash; }); } disconnectedCallback() { super.disconnectedCallback(); window.removeEventListener("showPage", this._onShowPage); } private _onShowPage = (e: Event) => { const pageId = (e as CustomEvent).detail; this._updateActiveState(pageId); }; private _updateActiveState(pageId: string) { this.querySelectorAll(".nav-menu-item").forEach((el) => { if ((el as HTMLElement).dataset.page === pageId) { el.classList.add("active"); } else { el.classList.remove("active"); } }); } private showHelpDot(): boolean { // Only show one dot at a time to prevent // overwhelming users. return getGamesPlayed() < 10 && !this._helpSeen; } private showStoreDot(): boolean { return this._hasNewCosmetics && !this.showHelpDot(); } private onHelpClick = () => { localStorage.setItem(HELP_SEEN_KEY, "true"); this._helpSeen = true; }; private onStoreClick = () => { this._hasNewCosmetics = false; getCosmeticsHash().then((hash: string | null) => { if (hash !== null) { localStorage.setItem(STORE_SEEN_HASH_KEY, hash); } }); }; render() { const currentPage = (window as any).currentPageId ?? "page-play"; if (!(window as any).currentPageId) { (window as any).currentPageId = currentPage; } return html` `; } }