import Combine from "../Base/Combine" import { OsmConnection } from "../../Logic/Osm/OsmConnection" import { Store, UIEventSource } from "../../Logic/UIEventSource" import { BBox } from "../../Logic/BBox" import Translations from "../i18n/Translations" import { VariableUiElement } from "../Base/VariableUIElement" import Toggle from "../Input/Toggle" import { SubtleButton } from "../Base/SubtleButton" import Svg from "../../Svg" import { Utils } from "../../Utils" import Constants from "../../Models/Constants" export class OpenJosm extends Combine { constructor(osmConnection: OsmConnection, bounds: Store, iconStyle?: string) { const t = Translations.t.general.attribution const josmState = new UIEventSource(undefined) // Reset after 15s josmState.stabilized(15000).addCallbackD((_) => josmState.setData(undefined)) const stateIndication = new VariableUiElement( josmState.map((state) => { if (state === undefined) { return undefined } state = state.toUpperCase() if (state === "OK") { return t.josmOpened.SetClass("thanks") } return t.josmNotOpened.SetClass("alert") }) ) const toggle = new Toggle( new SubtleButton(Svg.josm_logo_svg().SetStyle(iconStyle), t.editJosm) .onClick(() => { const bbox = bounds.data if (bbox === undefined) { return } const top = bbox.getNorth() const bottom = bbox.getSouth() const right = bbox.getEast() const left = bbox.getWest() const josmLink = `http://127.0.0.1:8111/load_and_zoom?left=${left}&right=${right}&top=${top}&bottom=${bottom}` Utils.download(josmLink) .then((answer) => josmState.setData(answer.replace(/\n/g, "").trim())) .catch((_) => josmState.setData("ERROR")) }) .SetClass("w-full"), undefined, osmConnection.userDetails.map( (ud) => ud.loggedIn && ud.csCount >= Constants.userJourney.historyLinkVisible ) ) super([stateIndication, toggle]) } }