import ViewMode, { ViewModeArgs } from "../view_mode.js"; import L from "leaflet"; import type { LatLng, Map } from "leaflet"; const TPL = /*html*/`
`; interface MapData { view?: { center?: LatLng | [number, number]; zoom?: number; }; } const DEFAULT_COORDINATES: [number, number] = [3.878638227135724, 446.6630455551659]; const DEFAULT_ZOOM = 2; export default class GeoView extends ViewMode { private $root: JQuery; private $container!: JQuery; private map?: Map; constructor(args: ViewModeArgs) { super(args, "geoMap"); this.$root = $(TPL); this.$container = this.$root.find(".geo-map-container"); args.$parent.append(this.$root); } async renderList() { this.renderMap(); return this.$root; } async renderMap() { const map = L.map(this.$container[0], { worldCopyJump: true }); L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", { attribution: '© OpenStreetMap contributors', detectRetina: true }).addTo(map); this.map = map; this.#onMapInitialized(); } async #onMapInitialized() { this.#restoreViewportAndZoom(); } async #restoreViewportAndZoom() { const map = this.map; if (!map) { return; } const parsedContent = await this.viewStorage.restore(); // Restore viewport position & zoom const center = parsedContent?.view?.center ?? DEFAULT_COORDINATES; const zoom = parsedContent?.view?.zoom ?? DEFAULT_ZOOM; map.setView(center, zoom); } get isFullHeight(): boolean { return true; } }