/** * — privacy settings dropdown for rMaps. * Dispatches 'precision-change' and 'ghost-toggle' CustomEvents. */ import type { PrecisionLevel, PrivacySettings } from "./map-sync"; const PRECISION_LABELS: Record = { exact: "Exact", building: "~50m (Building)", area: "~500m (Area)", approximate: "~5km (Approximate)", }; class MapPrivacyPanel extends HTMLElement { private _settings: PrivacySettings = { precision: "exact", ghostMode: false }; static get observedAttributes() { return ["precision", "ghost"]; } get settings(): PrivacySettings { return this._settings; } set settings(v: PrivacySettings) { this._settings = v; this.render(); } attributeChangedCallback() { this._settings.precision = (this.getAttribute("precision") as PrecisionLevel) || "exact"; this._settings.ghostMode = this.getAttribute("ghost") === "true"; this.render(); } connectedCallback() { this.render(); } private render() { this.innerHTML = `
Privacy Settings
Ghost mode hides your location from all participants and stops GPS tracking.
`; this.querySelector("#precision-select")?.addEventListener("change", (e) => { this._settings.precision = (e.target as HTMLSelectElement).value as PrecisionLevel; this.dispatchEvent(new CustomEvent("precision-change", { detail: this._settings.precision, bubbles: true, composed: true })); }); this.querySelector("#ghost-toggle")?.addEventListener("change", () => { this._settings.ghostMode = !this._settings.ghostMode; this.dispatchEvent(new CustomEvent("ghost-toggle", { detail: this._settings.ghostMode, bubbles: true, composed: true })); }); } } customElements.define("map-privacy-panel", MapPrivacyPanel); export { MapPrivacyPanel };