/** * — QR code share modal for rMaps rooms. * Dispatches 'modal-close' on dismiss. * Set `url` property before appending to DOM. */ class MapShareModal extends HTMLElement { private _url = ""; private _room = ""; set url(v: string) { this._url = v; } set room(v: string) { this._room = v; } connectedCallback() { this.render(); } private esc(s: string): string { const d = document.createElement("div"); d.textContent = s || ""; return d.innerHTML; } private close() { this.dispatchEvent(new CustomEvent("modal-close", { bubbles: true, composed: true })); this.remove(); } private async render() { this.style.cssText = `position:fixed;inset:0;z-index:100;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,0.6);backdrop-filter:blur(4px);`; this.innerHTML = `
Share Room
Generating QR code...
${this.esc(this._url)}
`; // QR code try { const QRCode = await import("qrcode"); const dataUrl = await QRCode.toDataURL(this._url, { width: 200, margin: 2, color: { dark: "#000000", light: "#ffffff" } }); const qr = this.querySelector("#s-qr"); if (qr) qr.innerHTML = `QR Code`; } catch { const qr = this.querySelector("#s-qr"); if (qr) qr.innerHTML = `
QR code unavailable
`; } // Events this.querySelector("#s-close")?.addEventListener("click", () => this.close()); this.addEventListener("click", (e) => { if (e.target === this) this.close(); }); this.querySelector("#s-copy")?.addEventListener("click", () => { navigator.clipboard.writeText(this._url).then(() => { const btn = this.querySelector("#s-copy"); if (btn) { btn.textContent = "\u2713 Copied!"; setTimeout(() => { btn.textContent = "\u{1F4CB} Copy Link"; }, 2000); } }); }); this.querySelector("#s-share")?.addEventListener("click", () => { if (navigator.share) { navigator.share({ title: `rMaps: ${this._room}`, url: this._url }).catch(() => {}); } else { navigator.clipboard.writeText(this._url).then(() => { const btn = this.querySelector("#s-share"); if (btn) { btn.textContent = "\u2713 Copied!"; setTimeout(() => { btn.textContent = "\u{1F4E4} Share"; }, 2000); } }); } }); } } customElements.define("map-share-modal", MapShareModal); export { MapShareModal };