172 lines
6.7 KiB
TypeScript
172 lines
6.7 KiB
TypeScript
import ScrollableFullScreen from "../Base/ScrollableFullScreen"
|
|
import Translations from "../i18n/Translations"
|
|
import { OsmConnection } from "../../Logic/Osm/OsmConnection"
|
|
import Combine from "../Base/Combine"
|
|
import { SubtleButton } from "../Base/SubtleButton"
|
|
import Svg from "../../Svg"
|
|
import { VariableUiElement } from "../Base/VariableUIElement"
|
|
import Img from "../Base/Img"
|
|
import { FixedUiElement } from "../Base/FixedUiElement"
|
|
import Link from "../Base/Link"
|
|
import { UIEventSource } from "../../Logic/UIEventSource"
|
|
import Loc from "../../Models/Loc"
|
|
import BaseUIElement from "../BaseUIElement"
|
|
import Showdown from "showdown"
|
|
import LanguagePicker from "../LanguagePicker"
|
|
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"
|
|
import Constants from "../../Models/Constants"
|
|
|
|
export class ImportViewerLinks extends VariableUiElement {
|
|
constructor(osmConnection: OsmConnection) {
|
|
super(
|
|
osmConnection.userDetails.map((ud) => {
|
|
if (ud.csCount < Constants.userJourney.importHelperUnlock) {
|
|
return undefined
|
|
}
|
|
return new Combine([
|
|
new SubtleButton(undefined, Translations.t.importHelper.title, {
|
|
url: "import_helper.html",
|
|
}),
|
|
new SubtleButton(Svg.note_svg(), Translations.t.importInspector.title, {
|
|
url: "import_viewer.html",
|
|
}),
|
|
])
|
|
})
|
|
)
|
|
}
|
|
}
|
|
|
|
class UserInformationMainPanel extends Combine {
|
|
constructor(
|
|
osmConnection: OsmConnection,
|
|
locationControl: UIEventSource<Loc>,
|
|
layout: LayoutConfig,
|
|
isOpened: UIEventSource<boolean>
|
|
) {
|
|
const t = Translations.t.userinfo
|
|
const imgSize = "h-6 w-6"
|
|
const ud = osmConnection.userDetails
|
|
super([
|
|
new VariableUiElement(
|
|
ud.map((ud) => {
|
|
if (!ud?.loggedIn) {
|
|
// Not logged in
|
|
return new SubtleButton(Svg.login_svg(), "Login", { imgSize }).onClick(() =>
|
|
osmConnection.AttemptLogin()
|
|
)
|
|
}
|
|
|
|
let img: Img = Svg.person_svg()
|
|
if (ud.img !== undefined) {
|
|
img = new Img(ud.img)
|
|
}
|
|
img.SetClass("rounded-full h-12 w-12 m-4")
|
|
|
|
let description: BaseUIElement = undefined
|
|
if (ud.description) {
|
|
const editButton = new Link(
|
|
Svg.pencil_svg().SetClass("h-4 w-4"),
|
|
"https://www.openstreetmap.org/profile/edit",
|
|
true
|
|
).SetClass(
|
|
"absolute block bg-subtle rounded-full p-2 bottom-2 right-2 w-min self-end"
|
|
)
|
|
|
|
description = new Combine([
|
|
new FixedUiElement(
|
|
new Showdown.Converter().makeHtml(ud.description)
|
|
).SetClass("link-underline"),
|
|
editButton,
|
|
]).SetClass("relative w-full m-2")
|
|
} else {
|
|
description = new Combine([
|
|
t.noDescription,
|
|
new SubtleButton(Svg.pencil_svg(), t.noDescriptionCallToAction, {
|
|
imgSize,
|
|
}),
|
|
]).SetClass("w-full m-2")
|
|
}
|
|
|
|
let panToHome: BaseUIElement
|
|
if (ud.home) {
|
|
panToHome = new SubtleButton(Svg.home_svg(), t.moveToHome, {
|
|
imgSize,
|
|
}).onClick(() => {
|
|
const home = ud?.home
|
|
if (home === undefined) {
|
|
return
|
|
}
|
|
locationControl.setData({ ...home, zoom: 16 })
|
|
isOpened.setData(false)
|
|
})
|
|
}
|
|
|
|
return new Combine([
|
|
new Combine([img, description]).SetClass(
|
|
"flex border border-black rounded-md"
|
|
),
|
|
new LanguagePicker(
|
|
layout.language,
|
|
Translations.t.general.pickLanguage.Clone()
|
|
),
|
|
|
|
new SubtleButton(
|
|
Svg.envelope_svg(),
|
|
new Combine([
|
|
t.gotoInbox,
|
|
ud.unreadMessages == 0
|
|
? undefined
|
|
: t.newMessages.SetClass("alert block"),
|
|
]),
|
|
{ imgSize, url: `${ud.backend}/messages/inbox`, newTab: true }
|
|
),
|
|
new SubtleButton(Svg.gear_svg(), t.gotoSettings, {
|
|
imgSize,
|
|
url: `${ud.backend}/user/${encodeURIComponent(ud.name)}/account`,
|
|
newTab: true,
|
|
}),
|
|
panToHome,
|
|
new ImportViewerLinks(osmConnection),
|
|
new SubtleButton(Svg.logout_svg(), Translations.t.general.logout, {
|
|
imgSize,
|
|
}).onClick(() => {
|
|
osmConnection.LogOut()
|
|
}),
|
|
])
|
|
})
|
|
).SetClass("flex flex-col"),
|
|
])
|
|
}
|
|
}
|
|
|
|
export default class UserInformationPanel extends ScrollableFullScreen {
|
|
constructor(
|
|
state: {
|
|
layoutToUse: LayoutConfig
|
|
osmConnection: OsmConnection
|
|
locationControl: UIEventSource<Loc>
|
|
},
|
|
options?: {
|
|
isOpened?: UIEventSource<boolean>
|
|
}
|
|
) {
|
|
const isOpened = options?.isOpened ?? new UIEventSource<boolean>(false)
|
|
super(
|
|
() => {
|
|
return new VariableUiElement(
|
|
state.osmConnection.userDetails.map((ud) => "Welcome " + ud.name)
|
|
)
|
|
},
|
|
() => {
|
|
return new UserInformationMainPanel(
|
|
state.osmConnection,
|
|
state.locationControl,
|
|
state.layoutToUse,
|
|
isOpened
|
|
)
|
|
},
|
|
"userinfo",
|
|
isOpened
|
|
)
|
|
}
|
|
}
|