MapComplete/UI/Popup/LoginButton.ts

52 lines
1.6 KiB
TypeScript

import { SubtleButton } from "../Base/SubtleButton"
import BaseUIElement from "../BaseUIElement"
import Svg from "../../Svg"
import { OsmConnection } from "../../Logic/Osm/OsmConnection"
import Toggle from "../Input/Toggle"
import { VariableUiElement } from "../Base/VariableUIElement"
import Loading from "../Base/Loading"
import Translations from "../i18n/Translations"
class LoginButton extends SubtleButton {
constructor(
text: BaseUIElement | string,
state: {
osmConnection: OsmConnection
},
icon?: BaseUIElement | string
) {
super(icon ?? Svg.osm_logo_ui(), text)
this.onClick(() => {
state.osmConnection.AttemptLogin()
})
}
}
export class LoginToggle extends VariableUiElement {
constructor(
el: BaseUIElement,
text: BaseUIElement | string,
state: {
osmConnection: OsmConnection
}
) {
const loading = new Loading("Trying to log in...")
const login = new LoginButton(text, state)
super(
state.osmConnection.loadingStatus.map((osmConnectionState) => {
if (osmConnectionState === "loading") {
return loading
}
if (osmConnectionState === "not-attempted") {
return login
}
if (osmConnectionState === "logged-in") {
return el
}
// Error!
return new LoginButton(Translations.t.general.loginFailed, state, Svg.invalid_svg())
})
)
}
}