forked from MapComplete/MapComplete
		
	Pass dependencies explicitly, decrease dependency on legacy State.state
This commit is contained in:
		
							parent
							
								
									76c84b3972
								
							
						
					
					
						commit
						4f403c4bfc
					
				
					 4 changed files with 20 additions and 17 deletions
				
			
		| 
						 | 
					@ -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)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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":
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue