diff --git a/assets/js/map.ts b/assets/js/map.ts index ada52d9..73e1815 100644 --- a/assets/js/map.ts +++ b/assets/js/map.ts @@ -603,7 +603,12 @@ let MapAPRSMap = { }); // Check element dimensions after zoom - setTimeout(() => { + const dimensionCheckTimeout = setTimeout(() => { + // Check if map still exists and not destroyed + if (!self.map || self.isDestroyed) { + return; + } + const afterRect = self.el.getBoundingClientRect(); if (afterRect.width === 0 || afterRect.height === 0) { @@ -611,9 +616,17 @@ let MapAPRSMap = { // Try to restore dimensions self.el.style.width = "100vw"; self.el.style.height = "100vh"; - self.map.invalidateSize(); + if (self.map) { + self.map.invalidateSize(); + } } }, 1000); + + // Store timeout for cleanup + if (!self.cleanupTimeouts) { + self.cleanupTimeouts = []; + } + self.cleanupTimeouts.push(dimensionCheckTimeout); } }, 100); } catch (error) { @@ -1620,6 +1633,14 @@ let MapAPRSMap = { self.programmaticMoveTimeout = undefined; } + // Clear any dimension check timeouts + if (self.cleanupTimeouts !== undefined) { + self.cleanupTimeouts.forEach((timeout: number) => { + clearTimeout(timeout); + }); + self.cleanupTimeouts = []; + } + // Remove popup navigation event listener if (self.popupNavigationHandler) { document.removeEventListener('click', self.popupNavigationHandler); diff --git a/assets/js/types/map.d.ts b/assets/js/types/map.d.ts index a6e2eab..8df971a 100644 --- a/assets/js/types/map.d.ts +++ b/assets/js/types/map.d.ts @@ -34,6 +34,7 @@ export interface LiveViewHookContext { rfPathLines?: Array; // Array of Leaflet polylines and markers for RF path visualization trailLayer?: LayerGroup; markerClusterGroup?: MarkerClusterGroup; + cleanupTimeouts?: ReturnType[]; } export interface MarkerData {