import { LitElement, html } from "lit";
import { customElement, property, state } from "lit/decorators.js";
import { FlagName } from "../core/Schemas";
import {
FLAG_KEY,
USER_SETTINGS_CHANGED_EVENT,
UserSettings,
} from "../core/game/UserSettings";
import { resolveFlagUrl } from "./Cosmetics";
import { translateText } from "./Utils";
@customElement("flag-input")
export class FlagInput extends LitElement {
@state() public flag: string = "";
@property({ type: Boolean, attribute: "show-select-label" })
public showSelectLabel: boolean = false;
private isDefaultFlagValue(flag: string): boolean {
return !flag || flag === "xx" || flag === "country:xx";
}
private updateFlag = (e: CustomEvent) => {
const val = e.detail ?? "";
const parsed = FlagName.safeParse(val);
if (!parsed.success) {
console.warn(`error parsing flag ${val}, ${parsed.error}`);
}
if (this.flag !== val) {
this.flag = val;
}
};
private onInputClick(e: Event) {
e.preventDefault();
e.stopPropagation();
this.dispatchEvent(
new CustomEvent("flag-input-click", {
bubbles: true,
composed: true,
}),
);
}
connectedCallback() {
super.connectedCallback();
this.flag = new UserSettings().getFlag() ?? "";
window.addEventListener(
`${USER_SETTINGS_CHANGED_EVENT}:${FLAG_KEY}`,
this.updateFlag as EventListener,
);
}
disconnectedCallback() {
super.disconnectedCallback();
window.removeEventListener(
`${USER_SETTINGS_CHANGED_EVENT}:${FLAG_KEY}`,
this.updateFlag as EventListener,
);
}
createRenderRoot() {
return this;
}
render() {
const isDefaultFlag = this.isDefaultFlagValue(this.flag);
const showSelect = this.showSelectLabel && isDefaultFlag;
const buttonTitle = showSelect
? translateText("flag_input.title")
: translateText("flag_input.button_title");
return html`
`;
}
async updated() {
const preview = this.renderRoot.querySelector(
"#flag-preview",
) as HTMLElement;
if (!preview) return;
if (this.isDefaultFlagValue(this.flag)) {
preview.innerHTML = "";
return;
}
preview.innerHTML = "";
const url = await resolveFlagUrl(this.flag);
if (!url) return;
const img = document.createElement("img");
img.src = url;
img.className = "w-full h-full object-cover pointer-events-none";
img.draggable = false;
preview.appendChild(img);
}
}