forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			151 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import Toggle from "../Input/Toggle"
 | 
						|
import { RadioButton } from "../Input/RadioButton"
 | 
						|
import { FixedInputElement } from "../Input/FixedInputElement"
 | 
						|
import Combine from "../Base/Combine"
 | 
						|
import Translations from "../i18n/Translations"
 | 
						|
import { TextField } from "../Input/TextField"
 | 
						|
import { Store, UIEventSource } from "../../Logic/UIEventSource"
 | 
						|
import Title from "../Base/Title"
 | 
						|
import { SubtleButton } from "../Base/SubtleButton"
 | 
						|
import Svg from "../../Svg"
 | 
						|
import { OsmConnection } from "../../Logic/Osm/OsmConnection"
 | 
						|
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"
 | 
						|
import { Translation } from "../i18n/Translation"
 | 
						|
import { LoginToggle } from "../Popup/LoginButton"
 | 
						|
 | 
						|
export default class UploadTraceToOsmUI extends LoginToggle {
 | 
						|
    constructor(
 | 
						|
        trace: (title: string) => string,
 | 
						|
        state: {
 | 
						|
            layoutToUse: LayoutConfig
 | 
						|
            osmConnection: OsmConnection
 | 
						|
            readonly featureSwitchUserbadge: Store<boolean>
 | 
						|
        },
 | 
						|
        options?: {
 | 
						|
            whenUploaded?: () => void | Promise<void>
 | 
						|
        }
 | 
						|
    ) {
 | 
						|
        const t = Translations.t.general.uploadGpx
 | 
						|
        const uploadFinished = new UIEventSource(false)
 | 
						|
        const traceVisibilities: {
 | 
						|
            key: "private" | "public"
 | 
						|
            name: Translation
 | 
						|
            docs: Translation
 | 
						|
        }[] = [
 | 
						|
            {
 | 
						|
                key: "private",
 | 
						|
                ...t.modes.private,
 | 
						|
            },
 | 
						|
            {
 | 
						|
                key: "public",
 | 
						|
                ...t.modes.public,
 | 
						|
            },
 | 
						|
        ]
 | 
						|
 | 
						|
        const dropdown = new RadioButton<"private" | "public">(
 | 
						|
            traceVisibilities.map(
 | 
						|
                (tv) =>
 | 
						|
                    new FixedInputElement<"private" | "public">(
 | 
						|
                        new Combine([
 | 
						|
                            Translations.W(tv.name).SetClass("font-bold"),
 | 
						|
                            tv.docs,
 | 
						|
                        ]).SetClass("flex flex-col"),
 | 
						|
                        tv.key
 | 
						|
                    )
 | 
						|
            ),
 | 
						|
            {
 | 
						|
                value: <any>state?.osmConnection?.GetPreference("gps.trace.visibility"),
 | 
						|
            }
 | 
						|
        )
 | 
						|
        const description = new TextField({
 | 
						|
            placeholder: t.meta.descriptionPlaceHolder,
 | 
						|
        })
 | 
						|
        const title = new TextField({
 | 
						|
            placeholder: t.meta.titlePlaceholder,
 | 
						|
        })
 | 
						|
        const clicked = new UIEventSource<boolean>(false)
 | 
						|
 | 
						|
        const confirmPanel = new Combine([
 | 
						|
            new Title(t.title),
 | 
						|
            t.intro0,
 | 
						|
            t.intro1,
 | 
						|
 | 
						|
            t.choosePermission,
 | 
						|
            dropdown,
 | 
						|
            new Title(t.meta.title, 4),
 | 
						|
            t.meta.intro,
 | 
						|
            title,
 | 
						|
            t.meta.descriptionIntro,
 | 
						|
            description,
 | 
						|
            new Combine([
 | 
						|
                new SubtleButton(Svg.close_svg(), Translations.t.general.cancel)
 | 
						|
                    .onClick(() => {
 | 
						|
                        clicked.setData(false)
 | 
						|
                    })
 | 
						|
                    .SetClass(""),
 | 
						|
                new SubtleButton(Svg.upload_svg(), t.confirm).OnClickWithLoading(
 | 
						|
                    t.uploading,
 | 
						|
                    async () => {
 | 
						|
                        const titleStr = UploadTraceToOsmUI.createDefault(
 | 
						|
                            title.GetValue().data,
 | 
						|
                            "Track with mapcomplete"
 | 
						|
                        )
 | 
						|
                        const descriptionStr = UploadTraceToOsmUI.createDefault(
 | 
						|
                            description.GetValue().data,
 | 
						|
                            "Track created with MapComplete with theme " + state?.layoutToUse?.id
 | 
						|
                        )
 | 
						|
                        await state?.osmConnection?.uploadGpxTrack(trace(title.GetValue().data), {
 | 
						|
                            visibility: dropdown.GetValue().data,
 | 
						|
                            description: descriptionStr,
 | 
						|
                            filename: titleStr + ".gpx",
 | 
						|
                            labels: ["MapComplete", state?.layoutToUse?.id],
 | 
						|
                        })
 | 
						|
 | 
						|
                        if (options?.whenUploaded !== undefined) {
 | 
						|
                            await options.whenUploaded()
 | 
						|
                        }
 | 
						|
                        uploadFinished.setData(true)
 | 
						|
                    }
 | 
						|
                ),
 | 
						|
            ]).SetClass("flex flex-wrap flex-wrap-reverse justify-between items-stretch"),
 | 
						|
        ]).SetClass("flex flex-col p-4 rounded border-2 m-2 border-subtle")
 | 
						|
 | 
						|
        super(
 | 
						|
            new Toggle(
 | 
						|
                new Toggle(
 | 
						|
                    new Combine([
 | 
						|
                        Svg.confirm_svg().SetClass("w-12 h-12 mr-2"),
 | 
						|
                        t.uploadFinished,
 | 
						|
                    ]).SetClass("flex p-2 rounded-xl border-2 subtle-border items-center"),
 | 
						|
                    new Toggle(
 | 
						|
                        confirmPanel,
 | 
						|
                        new SubtleButton(Svg.upload_svg(), t.title).onClick(() =>
 | 
						|
                            clicked.setData(true)
 | 
						|
                        ),
 | 
						|
                        clicked
 | 
						|
                    ),
 | 
						|
                    uploadFinished
 | 
						|
                ),
 | 
						|
                new Combine([
 | 
						|
                    Svg.invalid_ui().SetClass("w-8 h-8 m-2"),
 | 
						|
                    t.gpxServiceOffline.SetClass("p-2"),
 | 
						|
                ]).SetClass("flex border alert items-center"),
 | 
						|
                state.osmConnection.gpxServiceIsOnline.map(
 | 
						|
                    (serviceState) => serviceState === "online"
 | 
						|
                )
 | 
						|
            ),
 | 
						|
            undefined,
 | 
						|
            state
 | 
						|
        )
 | 
						|
    }
 | 
						|
 | 
						|
    private static createDefault(s: string, defaultValue: string) {
 | 
						|
        if (defaultValue.length < 1) {
 | 
						|
            throw "Default value should have some characters"
 | 
						|
        }
 | 
						|
        if (s === undefined || s === null || s === "") {
 | 
						|
            return defaultValue
 | 
						|
        }
 | 
						|
        return s
 | 
						|
    }
 | 
						|
}
 |