import { html } from "lit"; import { customElement, query, state } from "lit/decorators.js"; import { BaseModal } from "./components/BaseModal"; import "./components/leaderboard/LeaderboardClanTable"; import type { LeaderboardClanTable } from "./components/leaderboard/LeaderboardClanTable"; import "./components/leaderboard/LeaderboardPlayerList"; import type { LeaderboardPlayerList } from "./components/leaderboard/LeaderboardPlayerList"; import "./components/leaderboard/LeaderboardTabs"; import { modalHeader } from "./components/ui/ModalHeader"; import { translateText } from "./Utils"; @customElement("leaderboard-modal") export class LeaderboardModal extends BaseModal { @state() private activeTab: "players" | "clans" = "players"; @state() private clanDateRange: { start: string; end: string } | null = null; @query("leaderboard-player-list") private playerList?: LeaderboardPlayerList; @query("leaderboard-clan-table") private clanTable?: LeaderboardClanTable; private loadToken = 0; protected onOpen(): void { this.loadActiveTabData(); } private loadActiveTabData() { const token = ++this.loadToken; const run = async () => { if (token !== this.loadToken) return; if (this.activeTab === "players") { await this.playerList?.ensureLoaded(); if (token !== this.loadToken) return; this.playerList?.handleTabActivated(); } else { await this.clanTable?.ensureLoaded(); } queueMicrotask(() => { if (token !== this.loadToken) return; if (this.activeTab === "players") void this.clanTable?.ensureLoaded(); else void this.playerList?.ensureLoaded(); }); }; void (async () => { if (!(this.activeTab === "players" ? this.playerList : this.clanTable)) { await this.updateComplete; } await run(); })(); } private handleTabChange(tab: "clans" | "players") { this.activeTab = tab; this.loadActiveTabData(); } private handleClanDateRangeChange( event: CustomEvent<{ start: string; end: string }>, ) { this.clanDateRange = event.detail; } render() { let dateRange = html``; if (this.clanDateRange) { const start = new Date(this.clanDateRange.start).toLocaleDateString(); const end = new Date(this.clanDateRange.end).toLocaleDateString(); dateRange = html`(${start} - ${end})`; } const refreshTime = html`(${translateText("leaderboard_modal.refresh_time")})`; const content = html`
${modalHeader({ titleContent: html`
${translateText("leaderboard_modal.title")} ${this.activeTab === "clans" ? dateRange : ""} ${this.activeTab === "players" ? refreshTime : ""}
`, onBack: () => this.close(), ariaLabel: translateText("common.close"), })}
) => this.handleTabChange(event.detail)} >
, ) => this.handleClanDateRangeChange(event)} >
`; if (this.inline) return content; return html` ${content} `; } }