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 { public readonly startCoordinate: [number, number] private readonly _originalFeature: Feature; constructor(state: SpecialVisualizationState, originalFeature: Feature, args: PointImportFlowArguments, tagsToApply: Store, originalFeatureTags: UIEventSource>) { 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 { 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: 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 } }