fix: add unregister mechanism for map icon updates to prevent memory leaks during component unmount

This commit is contained in:
taDuc
2026-05-26 17:16:39 +07:00
parent 2a3193a3fa
commit cdf3323d77
3 changed files with 7 additions and 1 deletions
+2
View File
@@ -3,6 +3,7 @@ import maplibregl from "maplibre-gl";
import { MAP_MAX_ZOOM, MAP_MIN_ZOOM } from "@/uhm/lib/map/constants";
import { clampNumber, roundZoom } from "./mapUtils";
import { getBaseMapStyle } from "./useMapLayers";
import { unregisterMapFromIconUpdates } from "@/uhm/lib/map/styles/geotypeLayers";
const MAP_PROJECTION_STORAGE_KEY = "uhm:mapProjection";
@@ -79,6 +80,7 @@ export function useMapInstance() {
if (mapRef.current === map) {
mapRef.current = null;
}
unregisterMapFromIconUpdates(map);
map.remove();
};
} catch (err) {
+1 -1
View File
@@ -1,6 +1,6 @@
import maplibregl from "maplibre-gl";
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 { getMilitaryRouteLayers } from "./geotypes/military_route";
@@ -178,6 +178,10 @@ const preloadedImages: Record<string, HTMLImageElement> = {};
const loadedImageKeys = new Set<string>();
const mapsToUpdate = new Set<maplibregl.Map>();
export function unregisterMapFromIconUpdates(map: maplibregl.Map) {
mapsToUpdate.delete(map);
}
function preloadPointIcons() {
if (typeof window === "undefined" || typeof document === "undefined") return;
for (const [typeId, path] of Object.entries(POINT_GEOTYPE_ICON_PATHS)) {