import { Store, UIEventSource } from "../UIEventSource" import { Utils } from "../../Utils" import { AvailableRasterLayers, RasterLayerPolygon, RasterLayerUtils, } from "../../Models/RasterLayers" /** * When a user pans around on the map, they might pan out of the range of the current background raster layer. * This actor will then quickly select a (best) raster layer of the same category which is available */ export default class BackgroundLayerResetter { constructor( currentBackgroundLayer: UIEventSource, availableLayers: Store ) { if (Utils.runningFromConsole) { return } // Change the baseLayer back to OSM if we go out of the current range of the layer availableLayers.addCallbackAndRunD((availableLayers) => { // We only check on move/on change of the availableLayers const currentBgPolygon: RasterLayerPolygon | undefined = currentBackgroundLayer.data if (availableLayers.findIndex((available) => currentBgPolygon == available) >= 0) { // Still available! return } // Oops, we panned out of range for this layer! // What is the 'best' map of the same category which is available? const availableInSameCat = RasterLayerUtils.SelectBestLayerAccordingTo( availableLayers, currentBgPolygon?.properties?.category ?? "osmbasedmap" ) console.log("Selecting a different layer:", availableInSameCat.properties.id) currentBackgroundLayer.setData(availableInSameCat ?? AvailableRasterLayers.osmCarto) }) } }