2021-09-18 02:31:45 +02:00
|
|
|
import BaseUIElement from "../BaseUIElement";
|
|
|
|
import {SubtleButton} from "../Base/SubtleButton";
|
|
|
|
import {UIEventSource} from "../../Logic/UIEventSource";
|
|
|
|
import Combine from "../Base/Combine";
|
|
|
|
import {VariableUiElement} from "../Base/VariableUIElement";
|
|
|
|
import Translations from "../i18n/Translations";
|
|
|
|
import State from "../../State";
|
|
|
|
import Constants from "../../Models/Constants";
|
|
|
|
import Toggle from "../Input/Toggle";
|
|
|
|
import CreateNewNodeAction from "../../Logic/Osm/Actions/CreateNewNodeAction";
|
|
|
|
import {Tag} from "../../Logic/Tags/Tag";
|
2021-10-08 15:11:20 +02:00
|
|
|
import Loading from "../Base/Loading";
|
2021-09-18 02:31:45 +02:00
|
|
|
|
|
|
|
export default class ImportButton extends Toggle {
|
|
|
|
constructor(imageUrl: string | BaseUIElement, message: string | BaseUIElement,
|
|
|
|
originalTags: UIEventSource<any>,
|
2021-10-08 15:11:20 +02:00
|
|
|
newTags: UIEventSource<Tag[]>,
|
|
|
|
lat: number, lon: number,
|
|
|
|
minZoom: number,
|
|
|
|
state: {
|
|
|
|
locationControl: UIEventSource<{ zoom: number }>
|
|
|
|
}) {
|
2021-09-18 02:31:45 +02:00
|
|
|
const t = Translations.t.general.add;
|
|
|
|
const isImported = originalTags.map(tags => tags._imported === "yes")
|
|
|
|
const appliedTags = new Toggle(
|
|
|
|
new VariableUiElement(
|
|
|
|
newTags.map(tgs => {
|
|
|
|
const parts = []
|
|
|
|
for (const tag of tgs) {
|
|
|
|
parts.push(tag.key + "=" + tag.value)
|
|
|
|
}
|
|
|
|
const txt = parts.join(" & ")
|
|
|
|
return t.presetInfo.Subs({tags: txt}).SetClass("subtle")
|
|
|
|
})), undefined,
|
|
|
|
State.state.osmConnection.userDetails.map(ud => ud.csCount >= Constants.userJourney.tagsVisibleAt)
|
|
|
|
)
|
|
|
|
const button = new SubtleButton(imageUrl, message)
|
|
|
|
|
2021-10-08 15:11:20 +02:00
|
|
|
minZoom = Math.max(16, minZoom ?? 19)
|
2021-09-18 02:31:45 +02:00
|
|
|
|
2021-09-29 01:12:29 +02:00
|
|
|
button.onClick(async () => {
|
2021-09-18 02:31:45 +02:00
|
|
|
if (isImported.data) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
originalTags.data["_imported"] = "yes"
|
|
|
|
originalTags.ping() // will set isImported as per its definition
|
2021-10-04 03:12:42 +02:00
|
|
|
const newElementAction = new CreateNewNodeAction(newTags.data, lat, lon, {
|
|
|
|
theme: State.state.layoutToUse.id,
|
|
|
|
changeType: "import"
|
|
|
|
})
|
2021-09-29 01:12:29 +02:00
|
|
|
await State.state.changes.applyAction(newElementAction)
|
2021-09-18 02:31:45 +02:00
|
|
|
State.state.selectedElement.setData(State.state.allElements.ContainingFeatures.get(
|
|
|
|
newElementAction.newElementId
|
|
|
|
))
|
|
|
|
console.log("Did set selected element to", State.state.allElements.ContainingFeatures.get(
|
|
|
|
newElementAction.newElementId
|
|
|
|
))
|
|
|
|
|
|
|
|
|
|
|
|
})
|
|
|
|
|
2021-10-08 15:11:20 +02:00
|
|
|
const withLoadingCheck = new Toggle(new Toggle(
|
|
|
|
new Loading(t.stillLoading.Clone()),
|
2021-09-18 02:31:45 +02:00
|
|
|
new Combine([button, appliedTags]).SetClass("flex flex-col"),
|
2021-09-21 02:10:42 +02:00
|
|
|
State.state.featurePipeline.runningQuery
|
2021-10-08 15:11:20 +02:00
|
|
|
),t.zoomInFurther.Clone(),
|
|
|
|
state.locationControl.map(l => l.zoom >= minZoom)
|
|
|
|
)
|
2021-10-06 14:14:41 +02:00
|
|
|
const importButton = new Toggle(t.hasBeenImported, withLoadingCheck, isImported)
|
|
|
|
|
|
|
|
const pleaseLoginButton =
|
|
|
|
new Toggle(t.pleaseLogin.Clone()
|
|
|
|
.onClick(() => State.state.osmConnection.AttemptLogin())
|
|
|
|
.SetClass("login-button-friendly"),
|
|
|
|
undefined,
|
|
|
|
State.state.featureSwitchUserbadge)
|
|
|
|
|
|
|
|
|
|
|
|
super(importButton,
|
|
|
|
pleaseLoginButton,
|
|
|
|
State.state.osmConnection.isLoggedIn
|
|
|
|
)
|
2021-09-18 02:31:45 +02:00
|
|
|
}
|
|
|
|
}
|