forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			167 lines
		
	
	
	
		
			6.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
	
		
			6.5 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>
 | 
						|
    }) {
 | 
						|
        const 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
 | 
						|
        )
 | 
						|
    }
 | 
						|
}
 |