| 
									
										
										
										
											2022-06-05 02:24:14 +02:00
										 |  |  | import {Store, UIEventSource} from "../../Logic/UIEventSource"; | 
					
						
							| 
									
										
										
										
											2020-10-14 12:15:09 +02:00
										 |  |  | import Combine from "../Base/Combine"; | 
					
						
							|  |  |  | import Translations from "../i18n/Translations"; | 
					
						
							| 
									
										
										
										
											2020-11-06 04:02:53 +01:00
										 |  |  | import Svg from "../../Svg"; | 
					
						
							| 
									
										
										
										
											2021-03-29 00:41:53 +02:00
										 |  |  | import {Tag} from "../../Logic/Tags/Tag"; | 
					
						
							| 
									
										
										
										
											2021-06-10 01:36:20 +02:00
										 |  |  | import BaseUIElement from "../BaseUIElement"; | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  | import LicensePicker from "../BigComponents/LicensePicker"; | 
					
						
							|  |  |  | import Toggle from "../Input/Toggle"; | 
					
						
							| 
									
										
										
										
											2021-06-12 02:58:32 +02:00
										 |  |  | import FileSelectorButton from "../Input/FileSelectorButton"; | 
					
						
							| 
									
										
										
										
											2021-06-22 14:21:32 +02:00
										 |  |  | import ImgurUploader from "../../Logic/ImageProviders/ImgurUploader"; | 
					
						
							| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  | import ChangeTagAction from "../../Logic/Osm/Actions/ChangeTagAction"; | 
					
						
							| 
									
										
										
										
											2021-08-07 23:11:34 +02:00
										 |  |  | import LayerConfig from "../../Models/ThemeConfig/LayerConfig"; | 
					
						
							| 
									
										
										
										
											2021-10-08 04:33:39 +02:00
										 |  |  | import {FixedUiElement} from "../Base/FixedUiElement"; | 
					
						
							| 
									
										
										
										
											2021-10-20 00:19:03 +02:00
										 |  |  | import {VariableUiElement} from "../Base/VariableUIElement"; | 
					
						
							| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  | import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; | 
					
						
							|  |  |  | import {OsmConnection} from "../../Logic/Osm/OsmConnection"; | 
					
						
							|  |  |  | import {Changes} from "../../Logic/Osm/Changes"; | 
					
						
							| 
									
										
										
										
											2022-04-19 23:48:27 +02:00
										 |  |  | import Loading from "../Base/Loading"; | 
					
						
							| 
									
										
										
										
											2020-06-25 03:39:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-14 19:21:33 +02:00
										 |  |  | export class ImageUploadFlow extends Toggle { | 
					
						
							| 
									
										
										
										
											2020-10-14 12:15:09 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-20 00:34:26 +02:00
										 |  |  |     private static readonly uploadCountsPerId = new Map<string, UIEventSource<number>>() | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-05 02:24:14 +02:00
										 |  |  |     constructor(tagsSource: Store<any>, | 
					
						
							| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  |                 state: { | 
					
						
							|  |  |  |                     osmConnection: OsmConnection; | 
					
						
							|  |  |  |                     layoutToUse: LayoutConfig; | 
					
						
							|  |  |  |                     changes: Changes, | 
					
						
							| 
									
										
										
										
											2022-06-05 02:24:14 +02:00
										 |  |  |                     featureSwitchUserbadge: Store<boolean>; | 
					
						
							| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 imagePrefix: string = "image", text: string = undefined) { | 
					
						
							| 
									
										
										
										
											2021-10-20 00:34:26 +02:00
										 |  |  |         const perId = ImageUploadFlow.uploadCountsPerId | 
					
						
							|  |  |  |         const id = tagsSource.data.id | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         if (!perId.has(id)) { | 
					
						
							| 
									
										
										
										
											2021-10-20 00:34:26 +02:00
										 |  |  |             perId.set(id, new UIEventSource<number>(0)) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         const uploadedCount = perId.get(id) | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  |         const uploader = new ImgurUploader(url => { | 
					
						
							|  |  |  |             // A file was uploaded - we add it to the tags of the object
 | 
					
						
							| 
									
										
										
										
											2020-09-11 19:14:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  |             const tags = tagsSource.data | 
					
						
							|  |  |  |             let key = imagePrefix | 
					
						
							|  |  |  |             if (tags[imagePrefix] !== undefined) { | 
					
						
							|  |  |  |                 let freeIndex = 0; | 
					
						
							|  |  |  |                 while (tags[imagePrefix + ":" + freeIndex] !== undefined) { | 
					
						
							|  |  |  |                     freeIndex++; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 key = imagePrefix + ":" + freeIndex; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             console.log("Adding image:" + key, url); | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |             uploadedCount.data++ | 
					
						
							| 
									
										
										
										
											2021-10-20 00:19:03 +02:00
										 |  |  |             uploadedCount.ping() | 
					
						
							| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  |             Promise.resolve(state.changes | 
					
						
							| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  |                 .applyAction(new ChangeTagAction( | 
					
						
							| 
									
										
										
										
											2021-10-06 02:36:58 +02:00
										 |  |  |                     tags.id, new Tag(key, url), tagsSource.data, | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         changeType: "add-image", | 
					
						
							| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  |                         theme: state.layoutToUse.id | 
					
						
							| 
									
										
										
										
											2021-10-06 02:36:58 +02:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2021-09-29 01:12:29 +02:00
										 |  |  |                 ))) | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  |         }) | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  |         const licensePicker = new LicensePicker(state) | 
					
						
							| 
									
										
										
										
											2022-01-08 17:44:23 +01:00
										 |  |  |         const explanations = LicensePicker.LicenseExplanations() | 
					
						
							|  |  |  |         const chosenLicense = new VariableUiElement(licensePicker.GetValue().map(license => explanations.get(license))) | 
					
						
							| 
									
										
										
										
											2020-06-25 03:39:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-30 11:30:04 +02:00
										 |  |  |         const t = Translations.t.image; | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         let labelContent: BaseUIElement | 
					
						
							|  |  |  |         if (text === undefined) { | 
					
						
							|  |  |  |             labelContent = Translations.t.image.addPicture.Clone().SetClass("block align-middle mt-1 ml-3 text-4xl ") | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             labelContent = new FixedUiElement(text).SetClass("block align-middle mt-1 ml-3 text-2xl ") | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-09-11 19:14:32 +02:00
										 |  |  |         const label = new Combine([ | 
					
						
							| 
									
										
										
										
											2021-10-08 04:33:39 +02:00
										 |  |  |             Svg.camera_plus_ui().SetClass("block w-12 h-12 p-1 text-4xl "), | 
					
						
							|  |  |  |             labelContent | 
					
						
							| 
									
										
										
										
											2022-02-01 04:14:54 +01:00
										 |  |  |         ]).SetClass("p-2 border-4 border-detail rounded-full font-bold h-full align-middle w-full flex justify-center") | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  |         const fileSelector = new FileSelectorButton(label) | 
					
						
							|  |  |  |         fileSelector.GetValue().addCallback(filelist => { | 
					
						
							| 
									
										
										
										
											2021-10-09 23:51:04 +02:00
										 |  |  |             if (filelist === undefined || filelist.length === 0) { | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-06-25 03:39:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-09 23:51:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             for (var i = 0; i < filelist.length; i++) { | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |                 const sizeInBytes = filelist[i].size | 
					
						
							| 
									
										
										
										
											2021-10-09 23:51:04 +02:00
										 |  |  |                 console.log(filelist[i].name + " has a size of " + sizeInBytes + " Bytes"); | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |                 if (sizeInBytes > uploader.maxFileSizeInMegabytes * 1000000) { | 
					
						
							| 
									
										
										
										
											2021-10-09 23:51:04 +02:00
										 |  |  |                     alert(Translations.t.image.toBig.Subs({ | 
					
						
							|  |  |  |                         actual_size: (Math.floor(sizeInBytes / 1000000)) + "MB", | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |                         max_size: uploader.maxFileSizeInMegabytes + "MB" | 
					
						
							| 
									
										
										
										
											2021-10-09 23:51:04 +02:00
										 |  |  |                     }).txt) | 
					
						
							|  |  |  |                     return; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  |             console.log("Received images from the user, starting upload") | 
					
						
							| 
									
										
										
										
											2021-06-15 16:18:58 +02:00
										 |  |  |             const license = licensePicker.GetValue()?.data ?? "CC0" | 
					
						
							| 
									
										
										
										
											2020-10-14 12:15:09 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-14 19:21:33 +02:00
										 |  |  |             const tags = tagsSource.data; | 
					
						
							| 
									
										
										
										
											2020-10-14 12:15:09 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  |             const layout = state?.layoutToUse | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  |             let matchingLayer: LayerConfig = undefined | 
					
						
							| 
									
										
										
										
											2021-06-14 19:21:33 +02:00
										 |  |  |             for (const layer of layout?.layers ?? []) { | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  |                 if (layer.source.osmTags.matchesProperties(tags)) { | 
					
						
							|  |  |  |                     matchingLayer = layer; | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2020-10-14 12:15:09 +02:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-28 03:21:18 +02:00
										 |  |  |             const title = matchingLayer?.title?.GetRenderValue(tags)?.Subs(tags)?.ConstructElement()?.textContent ?? tags.name ?? "https//osm.org/"+tags.id; | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  |             const description = [ | 
					
						
							| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  |                 "author:" + state.osmConnection.userDetails.data.name, | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  |                 "license:" + license, | 
					
						
							|  |  |  |                 "osmid:" + tags.id, | 
					
						
							|  |  |  |             ].join("\n"); | 
					
						
							| 
									
										
										
										
											2020-07-27 13:04:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  |             uploader.uploadMany(title, description, filelist) | 
					
						
							| 
									
										
										
										
											2020-06-28 00:06:23 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const uploadFlow: BaseUIElement = new Combine([ | 
					
						
							| 
									
										
										
										
											2021-10-20 00:19:03 +02:00
										 |  |  |             new VariableUiElement(uploader.queue.map(q => q.length).map(l => { | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |                 if (l == 0) { | 
					
						
							| 
									
										
										
										
											2021-10-20 00:19:03 +02:00
										 |  |  |                     return undefined; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |                 if (l == 1) { | 
					
						
							|  |  |  |                     return t.uploadingPicture.Clone().SetClass("alert") | 
					
						
							|  |  |  |                 } else { | 
					
						
							| 
									
										
										
										
											2021-10-20 00:19:03 +02:00
										 |  |  |                     return t.uploadingMultiple.Subs({count: "" + l}).SetClass("alert") | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             })), | 
					
						
							|  |  |  |             new VariableUiElement(uploader.failed.map(q => q.length).map(l => { | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |                 if (l == 0) { | 
					
						
							| 
									
										
										
										
											2021-10-20 00:19:03 +02:00
										 |  |  |                     return undefined | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2022-04-19 23:43:28 +02:00
										 |  |  |                 return new Loading(t.uploadFailed).SetClass("alert"); | 
					
						
							| 
									
										
										
										
											2021-10-20 00:19:03 +02:00
										 |  |  |             })), | 
					
						
							|  |  |  |             new VariableUiElement(uploadedCount.map(l => { | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |                 if (l == 0) { | 
					
						
							|  |  |  |                     return undefined; | 
					
						
							| 
									
										
										
										
											2021-10-20 00:19:03 +02:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |                 if (l == 1) { | 
					
						
							| 
									
										
										
										
											2022-04-19 23:43:28 +02:00
										 |  |  |                     return t.uploadDone.Clone().SetClass("thanks block"); | 
					
						
							| 
									
										
										
										
											2021-10-20 00:34:26 +02:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2022-04-19 23:43:28 +02:00
										 |  |  |                 return t.uploadMultipleDone.Subs({count: l}).SetClass("thanks block") | 
					
						
							| 
									
										
										
										
											2021-10-20 00:19:03 +02:00
										 |  |  |             })), | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  |             fileSelector, | 
					
						
							| 
									
										
										
										
											2021-06-14 19:21:33 +02:00
										 |  |  |             Translations.t.image.respectPrivacy.Clone().SetStyle("font-size:small;"), | 
					
						
							| 
									
										
										
										
											2022-01-08 17:44:23 +01:00
										 |  |  |             licensePicker, | 
					
						
							|  |  |  |             chosenLicense.SetClass("subtle text-sm") | 
					
						
							| 
									
										
										
										
											2021-06-14 19:21:33 +02:00
										 |  |  |         ]).SetClass("flex flex-col image-upload-flow mt-4 mb-8 text-center") | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const pleaseLoginButton = t.pleaseLogin.Clone() | 
					
						
							| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  |             .onClick(() => state.osmConnection.AttemptLogin()) | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  |             .SetClass("login-button-friendly"); | 
					
						
							| 
									
										
										
										
											2021-06-14 19:21:33 +02:00
										 |  |  |         super( | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  |             new Toggle( | 
					
						
							|  |  |  |                 /*We can show the actual upload button!*/ | 
					
						
							|  |  |  |                 uploadFlow, | 
					
						
							|  |  |  |                 /* User not logged in*/ pleaseLoginButton, | 
					
						
							| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  |                 state?.osmConnection?.isLoggedIn | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  |             ), | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |             undefined /* Nothing as the user badge is disabled*/, | 
					
						
							| 
									
										
										
										
											2022-04-28 00:32:15 +02:00
										 |  |  |             state?.featureSwitchUserbadge | 
					
						
							| 
									
										
										
										
											2021-06-11 22:51:45 +02:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-25 03:39:31 +02:00
										 |  |  | } |