From cd1ee64f6202763e8f341d6b22d59d6d27382c34 Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Wed, 28 Jul 2021 00:09:17 +0200 Subject: [PATCH] Robustify in the case of werid hashes --- Logic/Actors/SelectedFeatureHandler.ts | 85 +++++++++++++++----------- 1 file changed, 48 insertions(+), 37 deletions(-) diff --git a/Logic/Actors/SelectedFeatureHandler.ts b/Logic/Actors/SelectedFeatureHandler.ts index 3cfaa079c..bfad546e4 100644 --- a/Logic/Actors/SelectedFeatureHandler.ts +++ b/Logic/Actors/SelectedFeatureHandler.ts @@ -1,6 +1,6 @@ import {UIEventSource} from "../UIEventSource"; import FeatureSource from "../FeatureSource/FeatureSource"; -import {OsmObject, OsmObjectMeta} from "../Osm/OsmObject"; +import {OsmObject} from "../Osm/OsmObject"; import Loc from "../../Models/Loc"; import FeaturePipeline from "../FeatureSource/FeaturePipeline"; import OsmApiFeatureSource from "../FeatureSource/OsmApiFeatureSource"; @@ -13,10 +13,10 @@ export default class SelectedFeatureHandler { private readonly _hash: UIEventSource; private readonly _selectedFeature: UIEventSource; - private static readonly _no_trigger_on = ["welcome","copyright","layers","new"] + private static readonly _no_trigger_on = ["welcome", "copyright", "layers", "new"] private readonly _osmApiSource: OsmApiFeatureSource; - - constructor(hash: UIEventSource, + + constructor(hash: UIEventSource, selectedFeature: UIEventSource, featureSource: FeaturePipeline, osmApiSource: OsmApiFeatureSource) { @@ -28,24 +28,30 @@ export default class SelectedFeatureHandler { hash.addCallback(h => { if (h === undefined || h === "") { selectedFeature.setData(undefined); - }else{ + } else { self.selectFeature(); } }) - - hash.addCallbackAndRun(h => self.downloadFeature(h)) - + + hash.addCallbackAndRunD(h => { + try { + self.downloadFeature(h) + } catch (e) { + console.error("Could not download feature, probably a weird hash") + } + }) + featureSource.features.addCallback(_ => self.selectFeature()); selectedFeature.addCallback(feature => { - if(feature === undefined){ - if(SelectedFeatureHandler._no_trigger_on.indexOf(hash.data) < 0){ + if (feature === undefined) { + if (SelectedFeatureHandler._no_trigger_on.indexOf(hash.data) < 0) { hash.setData("") } } - + const h = feature?.properties?.id; - if(h !== undefined){ + if (h !== undefined) { hash.setData(h) } }) @@ -53,55 +59,60 @@ export default class SelectedFeatureHandler { this.selectFeature(); } - + // If a feature is selected via the hash, zoom there - public zoomToSelectedFeature(location: UIEventSource){ + public zoomToSelectedFeature(location: UIEventSource) { const hash = this._hash.data; - if(hash === undefined || SelectedFeatureHandler._no_trigger_on.indexOf(hash) >= 0){ + if (hash === undefined || SelectedFeatureHandler._no_trigger_on.indexOf(hash) >= 0) { return; // No valid feature selected } // We should have a valid osm-ID and zoom to it... But we wrap it in try-catch to be sure - try{ - - OsmObject.DownloadObject(hash).addCallbackAndRunD(element => { - const centerpoint = element.centerpoint(); - console.log("Zooming to location for select point: ", centerpoint) - location.data.lat = centerpoint[0] - location.data.lon = centerpoint[1] - location.ping(); - }) - }catch(e){ + try { + + OsmObject.DownloadObject(hash).addCallbackAndRunD(element => { + const centerpoint = element.centerpoint(); + console.log("Zooming to location for select point: ", centerpoint) + location.data.lat = centerpoint[0] + location.data.lon = centerpoint[1] + location.ping(); + }) + } catch (e) { console.error("Could not download OSM-object with id", hash, " - probably a weird hash") } } - - private downloadFeature(hash: string){ - if(hash === undefined || hash === ""){ + + private downloadFeature(hash: string) { + if (hash === undefined || hash === "") { return; } - if(SelectedFeatureHandler._no_trigger_on.indexOf(hash) >= 0){ + if (SelectedFeatureHandler._no_trigger_on.indexOf(hash) >= 0) { return; } - this._osmApiSource.load(hash) + try { + + this._osmApiSource.load(hash) + } catch (e) { + console.log("Could not download feature, probably a weird hash:", hash) + } } - - private selectFeature(){ + + private selectFeature() { const features = this._featureSource?.features?.data; - if(features === undefined){ + if (features === undefined) { return; } - if(this._selectedFeature.data?.properties?.id === this._hash.data){ + if (this._selectedFeature.data?.properties?.id === this._hash.data) { // Feature already selected return; } - + const hash = this._hash.data; - if(hash === undefined || hash === "" || hash === "#"){ + if (hash === undefined || hash === "" || hash === "#") { return; } for (const feature of features) { const id = feature.feature?.properties?.id; - if(id === hash){ + if (id === hash) { this._selectedFeature.setData(feature.feature); break; }