MIF_E31221222/sigap-website/app/_utils/map/layer-visibility.ts

59 lines
1.5 KiB
TypeScript

import type mapboxgl from "mapbox-gl"
/**
* Manages visibility for map layers in a consistent way
*
* @param map The mapbox map instance
* @param layerIds Array of layer IDs to manage
* @param isVisible Boolean indicating if layers should be visible
* @param onCleanup Optional callback function to execute during cleanup
* @returns A cleanup function to remove listeners
*/
export function manageLayerVisibility(
map: mapboxgl.Map | null | undefined,
layerIds: string[],
isVisible: boolean,
onCleanup?: () => void
): () => void {
if (!map) return () => { }
// Check if map is loaded, if not wait for it
if (!map.isStyleLoaded()) {
const setupOnLoad = () => {
updateLayersVisibility(map, layerIds, isVisible)
}
map.once('load', setupOnLoad)
return () => {
map.off('load', setupOnLoad)
if (onCleanup) onCleanup()
}
}
// Map is loaded, update visibility directly
updateLayersVisibility(map, layerIds, isVisible)
return () => {
if (onCleanup) onCleanup()
}
}
/**
* Updates visibility for specified layers
*/
function updateLayersVisibility(
map: mapboxgl.Map,
layerIds: string[],
isVisible: boolean
): void {
layerIds.forEach(layerId => {
if (map.getLayer(layerId)) {
map.setLayoutProperty(
layerId,
"visibility",
isVisible ? "visible" : "none"
)
}
})
}