fix: add unregister mechanism for map icon updates to prevent memory leaks during component unmount
This commit is contained in:
@@ -3,6 +3,7 @@ import maplibregl from "maplibre-gl";
|
|||||||
import { MAP_MAX_ZOOM, MAP_MIN_ZOOM } from "@/uhm/lib/map/constants";
|
import { MAP_MAX_ZOOM, MAP_MIN_ZOOM } from "@/uhm/lib/map/constants";
|
||||||
import { clampNumber, roundZoom } from "./mapUtils";
|
import { clampNumber, roundZoom } from "./mapUtils";
|
||||||
import { getBaseMapStyle } from "./useMapLayers";
|
import { getBaseMapStyle } from "./useMapLayers";
|
||||||
|
import { unregisterMapFromIconUpdates } from "@/uhm/lib/map/styles/geotypeLayers";
|
||||||
|
|
||||||
const MAP_PROJECTION_STORAGE_KEY = "uhm:mapProjection";
|
const MAP_PROJECTION_STORAGE_KEY = "uhm:mapProjection";
|
||||||
|
|
||||||
@@ -79,6 +80,7 @@ export function useMapInstance() {
|
|||||||
if (mapRef.current === map) {
|
if (mapRef.current === map) {
|
||||||
mapRef.current = null;
|
mapRef.current = null;
|
||||||
}
|
}
|
||||||
|
unregisterMapFromIconUpdates(map);
|
||||||
map.remove();
|
map.remove();
|
||||||
};
|
};
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import maplibregl from "maplibre-gl";
|
import maplibregl from "maplibre-gl";
|
||||||
export const TYPE_MATCH_EXPR: maplibregl.ExpressionSpecification = ["coalesce", ["get", "type"], ["get", "entity_type_id"], ""];
|
export const TYPE_MATCH_EXPR: maplibregl.ExpressionSpecification = ["coalesce", ["get", "type"], ["get", "entity_type_id"], ""];
|
||||||
export { ensurePointGeotypeIcons } from "./shared/pointStyle";
|
export { ensurePointGeotypeIcons, unregisterMapFromIconUpdates } from "./shared/pointStyle";
|
||||||
|
|
||||||
import { getDefenseLineLayers } from "./geotypes/defense_line";
|
import { getDefenseLineLayers } from "./geotypes/defense_line";
|
||||||
import { getMilitaryRouteLayers } from "./geotypes/military_route";
|
import { getMilitaryRouteLayers } from "./geotypes/military_route";
|
||||||
|
|||||||
@@ -178,6 +178,10 @@ const preloadedImages: Record<string, HTMLImageElement> = {};
|
|||||||
const loadedImageKeys = new Set<string>();
|
const loadedImageKeys = new Set<string>();
|
||||||
const mapsToUpdate = new Set<maplibregl.Map>();
|
const mapsToUpdate = new Set<maplibregl.Map>();
|
||||||
|
|
||||||
|
export function unregisterMapFromIconUpdates(map: maplibregl.Map) {
|
||||||
|
mapsToUpdate.delete(map);
|
||||||
|
}
|
||||||
|
|
||||||
function preloadPointIcons() {
|
function preloadPointIcons() {
|
||||||
if (typeof window === "undefined" || typeof document === "undefined") return;
|
if (typeof window === "undefined" || typeof document === "undefined") return;
|
||||||
for (const [typeId, path] of Object.entries(POINT_GEOTYPE_ICON_PATHS)) {
|
for (const [typeId, path] of Object.entries(POINT_GEOTYPE_ICON_PATHS)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user