2023-09-28 23:50:27 +02:00
|
|
|
<script lang="ts">
|
2023-12-19 22:08:00 +01:00
|
|
|
/**
|
|
|
|
* Shows an 'upload'-button which will start the upload for this feature
|
|
|
|
*/
|
2023-09-25 02:13:24 +02:00
|
|
|
|
2023-12-19 22:08:00 +01:00
|
|
|
import type { SpecialVisualizationState } from "../SpecialVisualization"
|
2024-10-12 13:36:10 +02:00
|
|
|
import { UIEventSource } from "../../Logic/UIEventSource"
|
|
|
|
import type { OsmTags } from "../../Models/OsmFeature"
|
2023-12-19 22:08:00 +01:00
|
|
|
import LoginToggle from "../Base/LoginToggle.svelte"
|
|
|
|
import Translations from "../i18n/Translations"
|
|
|
|
import Tr from "../Base/Tr.svelte"
|
|
|
|
import UploadingImageCounter from "./UploadingImageCounter.svelte"
|
|
|
|
import FileSelector from "../Base/FileSelector.svelte"
|
|
|
|
import LoginButton from "../Base/LoginButton.svelte"
|
2024-05-28 01:25:43 +02:00
|
|
|
import { Translation } from "../i18n/Translation"
|
2024-06-18 03:33:11 +02:00
|
|
|
import Camera from "@babeard/svelte-heroicons/solid/Camera"
|
2024-09-28 02:44:03 +02:00
|
|
|
import LayerConfig from "../../Models/ThemeConfig/LayerConfig"
|
|
|
|
import NoteCommentElement from "../Popup/Notes/NoteCommentElement"
|
2024-10-29 23:53:58 +01:00
|
|
|
import type { Feature } from "geojson"
|
2023-09-25 02:13:24 +02:00
|
|
|
|
2023-12-19 22:08:00 +01:00
|
|
|
export let state: SpecialVisualizationState
|
2023-09-25 02:13:24 +02:00
|
|
|
|
2023-12-19 23:02:02 +01:00
|
|
|
export let tags: UIEventSource<OsmTags>
|
2023-12-19 22:08:00 +01:00
|
|
|
export let targetKey: string = undefined
|
2024-09-28 02:44:03 +02:00
|
|
|
export let layer: LayerConfig
|
2024-10-12 13:36:10 +02:00
|
|
|
export let noBlur: boolean = false
|
2024-10-29 23:53:58 +01:00
|
|
|
export let feature: Feature = undefined
|
2023-12-19 22:08:00 +01:00
|
|
|
/**
|
|
|
|
* Image to show in the button
|
|
|
|
* NOT the image to upload!
|
|
|
|
*/
|
|
|
|
export let image: string = undefined
|
|
|
|
if (image === "") {
|
|
|
|
image = undefined
|
|
|
|
}
|
|
|
|
export let labelText: string = undefined
|
|
|
|
const t = Translations.t.image
|
2023-09-25 02:13:24 +02:00
|
|
|
|
2024-05-28 01:25:43 +02:00
|
|
|
let errors = new UIEventSource<Translation[]>([])
|
|
|
|
|
2024-09-28 02:44:03 +02:00
|
|
|
async function handleFiles(files: FileList) {
|
2024-05-28 01:25:43 +02:00
|
|
|
const errs = []
|
2023-12-19 22:08:00 +01:00
|
|
|
for (let i = 0; i < files.length; i++) {
|
|
|
|
const file = files.item(i)
|
|
|
|
console.log("Got file", file.name)
|
|
|
|
try {
|
2024-05-28 01:25:43 +02:00
|
|
|
const canBeUploaded = state?.imageUploadManager?.canBeUploaded(file)
|
|
|
|
if (canBeUploaded !== true) {
|
|
|
|
errs.push(canBeUploaded.error)
|
|
|
|
continue
|
|
|
|
}
|
2024-09-28 02:44:03 +02:00
|
|
|
|
2024-10-12 13:36:10 +02:00
|
|
|
if (layer?.id === "note") {
|
2024-10-19 14:44:55 +02:00
|
|
|
const uploadResult = await state?.imageUploadManager.uploadImageWithLicense(
|
|
|
|
tags.data.id,
|
2024-09-28 12:01:10 +02:00
|
|
|
state.osmConnection.userDetails.data?.name ?? "Anonymous",
|
2024-10-19 14:44:55 +02:00
|
|
|
file,
|
|
|
|
"image",
|
2024-10-29 23:53:58 +01:00
|
|
|
noBlur,
|
2024-11-14 02:21:10 +01:00
|
|
|
feature
|
2024-10-19 14:44:55 +02:00
|
|
|
)
|
2024-10-12 13:36:10 +02:00
|
|
|
if (!uploadResult) {
|
2024-09-28 02:44:03 +02:00
|
|
|
return
|
|
|
|
}
|
|
|
|
const url = uploadResult.absoluteUrl
|
2024-09-28 12:01:10 +02:00
|
|
|
await state.osmConnection.addCommentToNote(tags.data.id, url)
|
2024-09-28 02:44:03 +02:00
|
|
|
NoteCommentElement.addCommentTo(url, <UIEventSource<any>>tags, {
|
2024-10-19 14:44:55 +02:00
|
|
|
osmConnection: state.osmConnection,
|
2024-09-28 02:44:03 +02:00
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2024-10-15 16:54:09 +02:00
|
|
|
await state?.imageUploadManager?.uploadImageAndApply(file, tags, targetKey, noBlur)
|
2023-12-19 22:08:00 +01:00
|
|
|
} catch (e) {
|
2024-09-28 12:01:10 +02:00
|
|
|
console.error(e)
|
|
|
|
state.reportError(e, "Could not upload image")
|
2023-12-19 22:08:00 +01:00
|
|
|
}
|
2023-09-25 02:13:24 +02:00
|
|
|
}
|
2024-05-28 01:25:43 +02:00
|
|
|
errors.setData(errs)
|
2023-12-19 22:08:00 +01:00
|
|
|
}
|
2024-11-08 12:49:56 +01:00
|
|
|
|
2024-11-08 20:05:04 +01:00
|
|
|
let maintenanceBusy = false
|
2023-09-25 02:13:24 +02:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<LoginToggle {state}>
|
2023-12-19 23:02:02 +01:00
|
|
|
<LoginButton clss="small w-full" osmConnection={state.osmConnection} slot="not-logged-in">
|
2023-12-04 15:02:42 +01:00
|
|
|
<Tr t={Translations.t.image.pleaseLogin} />
|
|
|
|
</LoginButton>
|
2024-11-08 12:49:56 +01:00
|
|
|
{#if maintenanceBusy}
|
|
|
|
<div class="alert">
|
|
|
|
Due to maintenance, uploading images is currently not possible. Sorry about this!
|
|
|
|
</div>
|
|
|
|
{:else}
|
|
|
|
<div class="my-4 flex flex-col">
|
|
|
|
<UploadingImageCounter {state} {tags} />
|
|
|
|
{#each $errors as error}
|
|
|
|
<Tr t={error} cls="alert" />
|
|
|
|
{/each}
|
|
|
|
<FileSelector
|
2024-11-25 12:03:26 +01:00
|
|
|
accept=".jpg,.jpeg"
|
2024-11-08 12:49:56 +01:00
|
|
|
cls="button border-2 flex flex-col"
|
|
|
|
multiple={true}
|
|
|
|
on:submit={(e) => handleFiles(e.detail)}
|
|
|
|
>
|
|
|
|
<div class="flex w-full items-center justify-center text-2xl">
|
|
|
|
{#if image !== undefined}
|
|
|
|
<img src={image} aria-hidden="true" />
|
|
|
|
{:else}
|
|
|
|
<Camera class="h-12 w-12 p-1" aria-hidden="true" />
|
|
|
|
{/if}
|
|
|
|
{#if labelText}
|
|
|
|
{labelText}
|
|
|
|
{:else}
|
|
|
|
<div class="flex flex-col">
|
|
|
|
<Tr t={t.addPicture} />
|
|
|
|
{#if noBlur}
|
2024-11-14 02:21:10 +01:00
|
|
|
<span class="subtle text-sm">
|
|
|
|
<Tr t={t.upload.noBlur} />
|
|
|
|
</span>
|
2024-11-08 12:49:56 +01:00
|
|
|
{/if}
|
|
|
|
</div>
|
|
|
|
{/if}
|
|
|
|
</div>
|
|
|
|
</FileSelector>
|
2024-11-25 12:03:26 +01:00
|
|
|
<FileSelector
|
|
|
|
accept={undefined}
|
|
|
|
cls="subtle as-link flex justify-center md:hidden"
|
|
|
|
multiple={true}
|
|
|
|
on:submit={(e) => handleFiles(e.detail)}
|
|
|
|
>
|
|
|
|
Use the file selector dialog
|
|
|
|
</FileSelector>
|
2024-11-08 12:49:56 +01:00
|
|
|
<div class="subtle text-xs italic">
|
|
|
|
<Tr t={Translations.t.general.attribution.panoramaxLicenseCCBYSA} />
|
|
|
|
<span class="mx-1">—</span>
|
|
|
|
<Tr t={t.respectPrivacy} />
|
2023-09-25 02:13:24 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
2024-11-08 12:49:56 +01:00
|
|
|
{/if}
|
2023-09-25 02:13:24 +02:00
|
|
|
</LoginToggle>
|