forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			96 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import ImportFlow, {ImportFlowArguments} from "./ImportFlow";
 | 
						|
import {SpecialVisualizationState} from "../../SpecialVisualization";
 | 
						|
import {Store, UIEventSource} from "../../../Logic/UIEventSource";
 | 
						|
import {OsmObject, OsmWay} from "../../../Logic/Osm/OsmObject";
 | 
						|
import CreateNewNodeAction from "../../../Logic/Osm/Actions/CreateNewNodeAction";
 | 
						|
import {Feature, Point} from "geojson";
 | 
						|
import Maproulette from "../../../Logic/Maproulette";
 | 
						|
import {GeoOperations} from "../../../Logic/GeoOperations";
 | 
						|
import {Tag} from "../../../Logic/Tags/Tag";
 | 
						|
 | 
						|
export interface PointImportFlowArguments extends ImportFlowArguments {
 | 
						|
    max_snap_distance?: string
 | 
						|
    snap_onto_layers?: string
 | 
						|
    icon?: string
 | 
						|
    targetLayer: string
 | 
						|
    note_id?: string
 | 
						|
    maproulette_id?: string
 | 
						|
}
 | 
						|
 | 
						|
export class PointImportFlowState extends ImportFlow<PointImportFlowArguments> {
 | 
						|
    public readonly startCoordinate: [number, number]
 | 
						|
    private readonly _originalFeature: Feature<Point>;
 | 
						|
 | 
						|
    constructor(state: SpecialVisualizationState, originalFeature: Feature<Point>, args: PointImportFlowArguments, tagsToApply: Store<Tag[]>, originalFeatureTags: UIEventSource<Record<string, string>>) {
 | 
						|
        super(state, args, tagsToApply, originalFeatureTags);
 | 
						|
        this._originalFeature = originalFeature;
 | 
						|
        this.startCoordinate = GeoOperations.centerpointCoordinates(originalFeature)
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Creates a new point on OSM, closes (if applicable) the OSM-note or the MapRoulette-challenge
 | 
						|
     *
 | 
						|
     * Gives back the id of the newly created element
 | 
						|
     */
 | 
						|
 | 
						|
    async onConfirm(
 | 
						|
        location: { lat: number; lon: number },
 | 
						|
        snapOntoWayId: string
 | 
						|
    ): Promise<string> {
 | 
						|
        const tags = this.tagsToApply.data
 | 
						|
        const originalFeatureTags = this._originalFeatureTags
 | 
						|
        originalFeatureTags.data["_imported"] = "yes"
 | 
						|
        originalFeatureTags.ping() // will set isImported as per its definition
 | 
						|
        let snapOnto: OsmObject | "deleted" = undefined
 | 
						|
        if (snapOntoWayId !== undefined) {
 | 
						|
            snapOnto = await this.state.osmObjectDownloader.DownloadObjectAsync(snapOntoWayId)
 | 
						|
        }
 | 
						|
        if (snapOnto === "deleted") {
 | 
						|
            snapOnto = undefined
 | 
						|
        }
 | 
						|
        let specialMotivation = undefined
 | 
						|
 | 
						|
        let note_id = this.args.note_id
 | 
						|
        if (note_id !== undefined && isNaN(Number(note_id))) {
 | 
						|
            note_id = originalFeatureTags.data[this.args.note_id]
 | 
						|
            specialMotivation = "source: https://osm.org/note/" + note_id
 | 
						|
        }
 | 
						|
 | 
						|
        const newElementAction = new CreateNewNodeAction(tags, location.lat, location.lon, {
 | 
						|
            theme: this.state.layout.id,
 | 
						|
            changeType: "import",
 | 
						|
            snapOnto: <OsmWay>snapOnto,
 | 
						|
            specialMotivation: specialMotivation,
 | 
						|
        })
 | 
						|
 | 
						|
        await this.state.changes.applyAction(newElementAction)
 | 
						|
        this.state.selectedElement.setData(
 | 
						|
            this.state.indexedFeatures.featuresById.data.get(newElementAction.newElementId)
 | 
						|
        )
 | 
						|
 | 
						|
        if (note_id !== undefined) {
 | 
						|
            await this.state.osmConnection.closeNote(note_id, "imported")
 | 
						|
            originalFeatureTags.data["closed_at"] = new Date().toISOString()
 | 
						|
            originalFeatureTags.ping()
 | 
						|
        }
 | 
						|
 | 
						|
        let maproulette_id = originalFeatureTags.data[this.args.maproulette_id]
 | 
						|
        if (maproulette_id !== undefined) {
 | 
						|
            if (this.state.featureSwitchIsTesting.data) {
 | 
						|
                console.log(
 | 
						|
                    "Not marking maproulette task " +
 | 
						|
                    maproulette_id +
 | 
						|
                    " as fixed, because we are in testing mode"
 | 
						|
                )
 | 
						|
            } else {
 | 
						|
                console.log("Marking maproulette task as fixed")
 | 
						|
                await Maproulette.singleton.closeTask(Number(maproulette_id))
 | 
						|
                originalFeatureTags.data["mr_taskStatus"] = "Fixed"
 | 
						|
                originalFeatureTags.ping()
 | 
						|
            }
 | 
						|
        }
 | 
						|
        this.state.mapProperties.location.setData(location)
 | 
						|
        return newElementAction.newElementId
 | 
						|
    }
 | 
						|
 | 
						|
}
 |