Pass dependencies explicitly, decrease dependency on legacy State.state

This commit is contained in:
Pieter Vander Vennet 2021-12-05 05:20:33 +01:00
parent 76c84b3972
commit 4f403c4bfc
4 changed files with 20 additions and 17 deletions

View file

@ -1,17 +1,19 @@
import FeatureSource from "../FeatureSource"; import FeatureSource from "../FeatureSource";
import {UIEventSource} from "../../UIEventSource"; import {UIEventSource} from "../../UIEventSource";
import State from "../../../State"; import State from "../../../State";
import ElementsState from "../../State/ElementsState";
import {ElementStorage} from "../../ElementStorage";
export default class RegisteringAllFromFeatureSourceActor { export default class RegisteringAllFromFeatureSourceActor {
public readonly features: UIEventSource<{ feature: any; freshness: Date }[]>; public readonly features: UIEventSource<{ feature: any; freshness: Date }[]>;
public readonly name; public readonly name;
constructor(source: FeatureSource) { constructor(source: FeatureSource, allElements: ElementStorage) {
this.features = source.features; this.features = source.features;
this.name = "RegisteringSource of " + source.name; this.name = "RegisteringSource of " + source.name;
this.features.addCallbackAndRunD(features => { this.features.addCallbackAndRunD(features => {
for (const feature of features) { for (const feature of features) {
State.state.allElements.addOrGetElement(feature.feature) allElements.addOrGetElement(feature.feature)
} }
}) })
} }

View file

@ -23,6 +23,7 @@ import {Tiles} from "../../Models/TileRange";
import TileFreshnessCalculator from "./TileFreshnessCalculator"; import TileFreshnessCalculator from "./TileFreshnessCalculator";
import FullNodeDatabaseSource from "./TiledFeatureSource/FullNodeDatabaseSource"; import FullNodeDatabaseSource from "./TiledFeatureSource/FullNodeDatabaseSource";
import MapState from "../State/MapState"; import MapState from "../State/MapState";
import {ElementStorage} from "../ElementStorage";
/** /**
@ -160,7 +161,7 @@ export default class FeaturePipeline {
state.currentBounds, state.locationControl, state.currentBounds, state.locationControl,
(tileIndex, freshness) => self.freshnesses.get(id).addTileLoad(tileIndex, freshness), (tileIndex, freshness) => self.freshnesses.get(id).addTileLoad(tileIndex, freshness),
(tile) => { (tile) => {
new RegisteringAllFromFeatureSourceActor(tile) new RegisteringAllFromFeatureSourceActor(tile, state.allElements)
hierarchy.registerTile(tile); hierarchy.registerTile(tile);
tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile)) tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile))
} }
@ -180,13 +181,13 @@ export default class FeaturePipeline {
minZoomLevel: this.osmSourceZoomLevel, minZoomLevel: this.osmSourceZoomLevel,
dontEnforceMinZoom: true, dontEnforceMinZoom: true,
registerTile: (tile) => { registerTile: (tile) => {
new RegisteringAllFromFeatureSourceActor(tile) new RegisteringAllFromFeatureSourceActor(tile, state.allElements)
perLayerHierarchy.get(id).registerTile(tile) perLayerHierarchy.get(id).registerTile(tile)
tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile)) tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile))
} }
}) })
} else { } else {
new RegisteringAllFromFeatureSourceActor(src) new RegisteringAllFromFeatureSourceActor(src, state.allElements)
perLayerHierarchy.get(id).registerTile(src) perLayerHierarchy.get(id).registerTile(src)
src.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(src)) src.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(src))
} }
@ -194,7 +195,7 @@ export default class FeaturePipeline {
new DynamicGeoJsonTileSource( new DynamicGeoJsonTileSource(
filteredLayer, filteredLayer,
tile => { tile => {
new RegisteringAllFromFeatureSourceActor(tile) new RegisteringAllFromFeatureSourceActor(tile, state.allElements)
perLayerHierarchy.get(id).registerTile(tile) perLayerHierarchy.get(id).registerTile(tile)
tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile)) tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile))
}, },
@ -208,7 +209,7 @@ export default class FeaturePipeline {
isActive: useOsmApi, isActive: useOsmApi,
neededTiles: neededTilesFromOsm, neededTiles: neededTilesFromOsm,
handleTile: tile => { handleTile: tile => {
new RegisteringAllFromFeatureSourceActor(tile) new RegisteringAllFromFeatureSourceActor(tile, state.allElements)
if (tile.layer.layerDef.maxAgeOfCache > 0) { if (tile.layer.layerDef.maxAgeOfCache > 0) {
const saver = self.localStorageSavers.get(tile.layer.layerDef.id) const saver = self.localStorageSavers.get(tile.layer.layerDef.id)
if(saver === undefined){ if(saver === undefined){
@ -240,7 +241,7 @@ export default class FeaturePipeline {
const fullNodeDb = new FullNodeDatabaseSource( const fullNodeDb = new FullNodeDatabaseSource(
state.filteredLayers.data.filter(l => l.layerDef.id === "type_node")[0], state.filteredLayers.data.filter(l => l.layerDef.id === "type_node")[0],
tile => { tile => {
new RegisteringAllFromFeatureSourceActor(tile) new RegisteringAllFromFeatureSourceActor(tile, state.allElements)
perLayerHierarchy.get(tile.layer.layerDef.id).registerTile(tile) perLayerHierarchy.get(tile.layer.layerDef.id).registerTile(tile)
tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile)) tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile))
}) })
@ -273,8 +274,8 @@ export default class FeaturePipeline {
// Also load points/lines that are newly added. // Also load points/lines that are newly added.
const newGeometry = new NewGeometryFromChangesFeatureSource(state.changes) const newGeometry = new NewGeometryFromChangesFeatureSource(state.changes, state.osmConnection._oauth_config.url)
new RegisteringAllFromFeatureSourceActor(newGeometry) new RegisteringAllFromFeatureSourceActor(newGeometry, state.allElements)
// A NewGeometryFromChangesFeatureSource does not split per layer, so we do this next // A NewGeometryFromChangesFeatureSource does not split per layer, so we do this next
new PerLayerFeatureSourceSplitter(state.filteredLayers, new PerLayerFeatureSourceSplitter(state.filteredLayers,
(perLayer) => { (perLayer) => {
@ -386,6 +387,7 @@ export default class FeaturePipeline {
} }
private initOverpassUpdater(state: { private initOverpassUpdater(state: {
allElements: ElementStorage;
layoutToUse: LayoutConfig, layoutToUse: LayoutConfig,
currentBounds: UIEventSource<BBox>, currentBounds: UIEventSource<BBox>,
locationControl: UIEventSource<Loc>, locationControl: UIEventSource<Loc>,
@ -434,7 +436,7 @@ export default class FeaturePipeline {
// Register everything in the state' 'AllElements' // Register everything in the state' 'AllElements'
new RegisteringAllFromFeatureSourceActor(updater) new RegisteringAllFromFeatureSourceActor(updater, state.allElements)
return updater; return updater;
} }

View file

@ -3,7 +3,6 @@ import {OsmNode, OsmRelation, OsmWay} from "../../Osm/OsmObject";
import FeatureSource from "../FeatureSource"; import FeatureSource from "../FeatureSource";
import {UIEventSource} from "../../UIEventSource"; import {UIEventSource} from "../../UIEventSource";
import {ChangeDescription} from "../../Osm/Actions/ChangeDescription"; import {ChangeDescription} from "../../Osm/Actions/ChangeDescription";
import State from "../../../State";
export class NewGeometryFromChangesFeatureSource implements FeatureSource { export class NewGeometryFromChangesFeatureSource implements FeatureSource {
// This class name truly puts the 'Java' into 'Javascript' // This class name truly puts the 'Java' into 'Javascript'
@ -14,7 +13,7 @@ export class NewGeometryFromChangesFeatureSource implements FeatureSource {
public readonly features: UIEventSource<{ feature: any; freshness: Date }[]> = new UIEventSource<{ feature: any; freshness: Date }[]>([]); public readonly features: UIEventSource<{ feature: any; freshness: Date }[]> = new UIEventSource<{ feature: any; freshness: Date }[]>([]);
public readonly name: string = "newFeatures"; public readonly name: string = "newFeatures";
constructor(changes: Changes) { constructor(changes: Changes, backendUrl: string) {
const seenChanges = new Set<ChangeDescription>(); const seenChanges = new Set<ChangeDescription>();
const features = this.features.data; const features = this.features.data;
@ -55,7 +54,7 @@ export class NewGeometryFromChangesFeatureSource implements FeatureSource {
} }
tags["id"] = change.type + "/" + change.id tags["id"] = change.type + "/" + change.id
tags["_backend"] = State.state.osmConnection._oauth_config.url tags["_backend"] = backendUrl
switch (change.type) { switch (change.type) {
case "node": case "node":

View file

@ -105,7 +105,7 @@ export default class MetaTagging {
} }
public static createFunctionsForFeature(calculatedTags: [string, string][]): ((feature: any) => void)[] { public static createFunctionsForFeature(layerId: string, calculatedTags: [string, string][]): ((feature: any) => void)[] {
const functions: ((feature: any) => void)[] = []; const functions: ((feature: any) => void)[] = [];
for (const entry of calculatedTags) { for (const entry of calculatedTags) {
const key = entry[0] const key = entry[0]
@ -139,7 +139,7 @@ export default class MetaTagging {
return result; return result;
} catch (e) { } catch (e) {
if (MetaTagging.errorPrintCount < MetaTagging.stopErrorOutputAt) { if (MetaTagging.errorPrintCount < MetaTagging.stopErrorOutputAt) {
console.warn("Could not calculate a calculated tag defined by " + code + " due to " + e + ". This is code defined in the theme. Are you the theme creator? Doublecheck your code. Note that the metatags might not be stable on new features", e, e.stack) console.warn("Could not calculate a calculated tag for key "+key+" defined by " + code + " (in layer"+layerId+") due to \n" + e + "\n. Are you the theme creator? Doublecheck your code. Note that the metatags might not be stable on new features", e, e.stack)
MetaTagging.errorPrintCount++; MetaTagging.errorPrintCount++;
if (MetaTagging.errorPrintCount == MetaTagging.stopErrorOutputAt) { if (MetaTagging.errorPrintCount == MetaTagging.stopErrorOutputAt) {
console.error("Got ", MetaTagging.stopErrorOutputAt, " errors calculating this metatagging - stopping output now") console.error("Got ", MetaTagging.stopErrorOutputAt, " errors calculating this metatagging - stopping output now")
@ -173,7 +173,7 @@ export default class MetaTagging {
} }
try { try {
const functions = MetaTagging.createFunctionsForFeature(calculatedTags) const functions = MetaTagging.createFunctionsForFeature(layer.id, calculatedTags)
ExtraFunctions.FullPatchFeature(params, feature); ExtraFunctions.FullPatchFeature(params, feature);