| 
									
										
										
										
											2021-01-04 04:06:21 +01:00
										 |  |  | import {VariableUiElement} from "../Base/VariableUIElement"; | 
					
						
							|  |  |  | import {Translation} from "../i18n/Translation"; | 
					
						
							|  |  |  | import Svg from "../../Svg"; | 
					
						
							|  |  |  | import Combine from "../Base/Combine"; | 
					
						
							| 
									
										
										
										
											2022-06-05 02:24:14 +02:00
										 |  |  | import {Store, UIEventSource} from "../../Logic/UIEventSource"; | 
					
						
							| 
									
										
										
										
											2021-01-04 04:06:21 +01:00
										 |  |  | import {Utils} from "../../Utils"; | 
					
						
							|  |  |  | import Translations from "../i18n/Translations"; | 
					
						
							| 
									
										
										
										
											2021-06-10 14:05:26 +02:00
										 |  |  | import BaseUIElement from "../BaseUIElement"; | 
					
						
							| 
									
										
										
										
											2021-08-07 23:11:34 +02:00
										 |  |  | import LayerConfig from "../../Models/ThemeConfig/LayerConfig"; | 
					
						
							| 
									
										
										
										
											2021-11-03 00:44:53 +01:00
										 |  |  | import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; | 
					
						
							|  |  |  | import Loc from "../../Models/Loc"; | 
					
						
							|  |  |  | import BaseLayer from "../../Models/BaseLayer"; | 
					
						
							|  |  |  | import FilteredLayer from "../../Models/FilteredLayer"; | 
					
						
							| 
									
										
										
										
											2022-03-31 03:30:20 +02:00
										 |  |  | import {InputElement} from "../Input/InputElement"; | 
					
						
							| 
									
										
										
										
											2022-06-05 02:24:14 +02:00
										 |  |  | import {CheckBox} from "../Input/Checkboxes"; | 
					
						
							| 
									
										
										
										
											2022-04-18 02:39:30 +02:00
										 |  |  | import {SubtleButton} from "../Base/SubtleButton"; | 
					
						
							|  |  |  | import LZString from "lz-string"; | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-13 15:04:55 +02:00
										 |  |  | export default class ShareScreen extends Combine { | 
					
						
							| 
									
										
										
										
											2020-08-31 13:25:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     constructor(state: { layoutToUse: LayoutConfig, locationControl: UIEventSource<Loc>, backgroundLayer: UIEventSource<BaseLayer>, filteredLayers: UIEventSource<FilteredLayer[]> }) { | 
					
						
							| 
									
										
										
										
											2021-10-30 01:05:38 +02:00
										 |  |  |         const layout = state?.layoutToUse; | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |         const tr = Translations.t.general.sharescreen; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-31 03:30:20 +02:00
										 |  |  |         const optionCheckboxes: InputElement<boolean>[] = [] | 
					
						
							| 
									
										
										
										
											2022-06-05 02:24:14 +02:00
										 |  |  |         const optionParts: (Store<string>)[] = []; | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-31 03:30:20 +02:00
										 |  |  |         const includeLocation = new CheckBox(tr.fsIncludeCurrentLocation, true) | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |         optionCheckboxes.push(includeLocation); | 
					
						
							| 
									
										
										
										
											2020-08-31 13:25:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-30 01:05:38 +02:00
										 |  |  |         const currentLocation = state.locationControl; | 
					
						
							| 
									
										
										
										
											2020-08-08 02:16:42 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-31 03:30:20 +02:00
										 |  |  |         optionParts.push(includeLocation.GetValue().map((includeL) => { | 
					
						
							| 
									
										
										
										
											2020-08-31 13:25:13 +02:00
										 |  |  |             if (currentLocation === undefined) { | 
					
						
							|  |  |  |                 return null; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |             if (includeL) { | 
					
						
							| 
									
										
										
										
											2021-06-14 17:28:11 +02:00
										 |  |  |                 return [["z", currentLocation.data?.zoom], ["lat", currentLocation.data?.lat], ["lon", currentLocation.data?.lon]] | 
					
						
							|  |  |  |                     .filter(p => p[1] !== undefined) | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |                     .map(p => p[0] + "=" + p[1]) | 
					
						
							| 
									
										
										
										
											2021-06-14 17:28:11 +02:00
										 |  |  |                     .join("&") | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |             } else { | 
					
						
							|  |  |  |                 return null; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2022-04-18 02:39:30 +02:00
										 |  |  |             | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |         }, [currentLocation])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |         function fLayerToParam(flayer: { isDisplayed: UIEventSource<boolean>, layerDef: LayerConfig }) { | 
					
						
							| 
									
										
										
										
											2020-08-31 13:25:13 +02:00
										 |  |  |             if (flayer.isDisplayed.data) { | 
					
						
							|  |  |  |                 return null; // Being displayed is the default
 | 
					
						
							| 
									
										
										
										
											2020-08-08 02:16:42 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-08-31 13:25:13 +02:00
										 |  |  |             return "layer-" + flayer.layerDef.id + "=" + flayer.isDisplayed.data | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-08-08 02:16:42 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         const currentLayer: UIEventSource<{ id: string, name: string, layer: any }> = state.backgroundLayer; | 
					
						
							|  |  |  |         const currentBackground = new VariableUiElement(currentLayer.map(layer => { | 
					
						
							|  |  |  |             return tr.fsIncludeCurrentBackgroundMap.Subs({name: layer?.name ?? ""}); | 
					
						
							|  |  |  |         })); | 
					
						
							| 
									
										
										
										
											2022-03-31 03:30:20 +02:00
										 |  |  |         const includeCurrentBackground = new CheckBox(currentBackground, true) | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         optionCheckboxes.push(includeCurrentBackground); | 
					
						
							| 
									
										
										
										
											2022-03-31 03:30:20 +02:00
										 |  |  |         optionParts.push(includeCurrentBackground.GetValue().map((includeBG) => { | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |             if (includeBG) { | 
					
						
							|  |  |  |                 return "background=" + currentLayer.data.id | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 return null | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, [currentLayer])); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-08 02:16:42 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-31 03:30:20 +02:00
										 |  |  |         const includeLayerChoices = new CheckBox(tr.fsIncludeCurrentLayers, true) | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         optionCheckboxes.push(includeLayerChoices); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-31 03:30:20 +02:00
										 |  |  |         optionParts.push(includeLayerChoices.GetValue().map((includeLayerSelection) => { | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |             if (includeLayerSelection) { | 
					
						
							|  |  |  |                 return Utils.NoNull(state.filteredLayers.data.map(fLayerToParam)).join("&") | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 return null | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, state.filteredLayers.data.map((flayer) => flayer.isDisplayed))); | 
					
						
							| 
									
										
										
										
											2020-08-31 13:25:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-08 02:16:42 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-27 01:03:58 +02:00
										 |  |  |         const switches = [ | 
					
						
							| 
									
										
										
										
											2020-08-31 13:25:13 +02:00
										 |  |  |             {urlName: "fs-userbadge", human: tr.fsUserbadge}, | 
					
						
							|  |  |  |             {urlName: "fs-search", human: tr.fsSearch}, | 
					
						
							|  |  |  |             {urlName: "fs-welcome-message", human: tr.fsWelcomeMessage}, | 
					
						
							|  |  |  |             {urlName: "fs-layers", human: tr.fsLayers}, | 
					
						
							|  |  |  |             {urlName: "layer-control-toggle", human: tr.fsLayerControlToggle, reverse: true}, | 
					
						
							|  |  |  |             {urlName: "fs-add-new", human: tr.fsAddNew}, | 
					
						
							|  |  |  |             {urlName: "fs-geolocation", human: tr.fsGeolocation}, | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |         ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for (const swtch of switches) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-31 03:30:20 +02:00
										 |  |  |             const checkbox =new CheckBox(Translations.W(swtch.human), !swtch.reverse) | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |             optionCheckboxes.push(checkbox); | 
					
						
							| 
									
										
										
										
											2022-03-31 03:30:20 +02:00
										 |  |  |             optionParts.push(checkbox.GetValue().map((isEn) => { | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |                 if (isEn) { | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |                     if (swtch.reverse) { | 
					
						
							|  |  |  |                         return `${swtch.urlName}=true` | 
					
						
							| 
									
										
										
										
											2020-08-22 13:02:31 +02:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |                     return null; | 
					
						
							|  |  |  |                 } else { | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |                     if (swtch.reverse) { | 
					
						
							| 
									
										
										
										
											2020-08-22 13:02:31 +02:00
										 |  |  |                         return null; | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |                     return `${swtch.urlName}=false` | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             })) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-18 02:39:30 +02:00
										 |  |  |         if(layout.definitionRaw !== undefined){ | 
					
						
							|  |  |  |             optionParts.push(new UIEventSource("userlayout="+(layout.definedAtUrl ?? layout.id))) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-13 15:04:55 +02:00
										 |  |  |         const options = new Combine(optionCheckboxes).SetClass("flex flex-col") | 
					
						
							| 
									
										
										
										
											2020-08-31 13:25:13 +02:00
										 |  |  |         const url = (currentLocation ?? new UIEventSource(undefined)).map(() => { | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-13 20:20:18 +01:00
										 |  |  |             const host = window.location.host; | 
					
						
							| 
									
										
										
										
											2021-01-06 01:11:07 +01:00
										 |  |  |             let path = window.location.pathname; | 
					
						
							|  |  |  |             path = path.substr(0, path.lastIndexOf("/")); | 
					
						
							| 
									
										
										
										
											2022-04-18 02:39:30 +02:00
										 |  |  |             let id = layout.id.toLowerCase() | 
					
						
							|  |  |  |             if(layout.definitionRaw !== undefined){ | 
					
						
							|  |  |  |                 id="theme.html" | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             let literalText = `https://${host}${path}/${id}` | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-18 02:39:30 +02:00
										 |  |  |             let hash = "" | 
					
						
							|  |  |  |             if(layout.definedAtUrl === undefined && layout.definitionRaw !== undefined){ | 
					
						
							|  |  |  |                hash = "#"+ LZString.compressToBase64( Utils.MinifyJSON(layout.definitionRaw)) | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-08-26 20:11:43 +02:00
										 |  |  |             const parts = Utils.NoEmpty(Utils.NoNull(optionParts.map((eventSource) => eventSource.data))); | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |             if (parts.length === 0) { | 
					
						
							| 
									
										
										
										
											2022-04-18 02:39:30 +02:00
										 |  |  |                 return literalText + hash; | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2022-04-18 02:39:30 +02:00
										 |  |  |             return literalText + "?" + parts.join("&") + hash; | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |         }, optionParts); | 
					
						
							| 
									
										
										
										
											2020-08-31 13:25:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-13 15:04:55 +02:00
										 |  |  |         const iframeCode = new VariableUiElement( | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |             url.map((url) => { | 
					
						
							|  |  |  |                 return `<span class='literal-code iframe-code-block'>
 | 
					
						
							| 
									
										
										
										
											2021-10-30 01:05:38 +02:00
										 |  |  |                          <iframe src="${url}" allow="geolocation" width="100%" height="100%" style="min-width: 250px; min-height: 250px" title="${layout.title?.txt ?? "MapComplete"} with MapComplete"></iframe>  | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |                     </span>`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-13 15:04:55 +02:00
										 |  |  |         const linkStatus = new UIEventSource<string | Translation>(""); | 
					
						
							|  |  |  |         const link = new VariableUiElement( | 
					
						
							|  |  |  |             url.map((url) => `<input type="text" value=" ${url}" id="code-link--copyable" style="width:90%">`) | 
					
						
							| 
									
										
										
										
											2020-08-26 20:11:43 +02:00
										 |  |  |         ).onClick(async () => { | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             const shareData = { | 
					
						
							| 
									
										
										
										
											2022-06-28 03:21:18 +02:00
										 |  |  |                 title: Translations.W(layout.title)?.ConstructElement().textContent ?? "", | 
					
						
							|  |  |  |                 text: Translations.W(layout.description)?.ConstructElement().textContent ?? "", | 
					
						
							| 
									
										
										
										
											2021-06-10 14:05:26 +02:00
										 |  |  |                 url: url.data, | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             function rejected() { | 
					
						
							| 
									
										
										
										
											2020-08-30 01:13:18 +02:00
										 |  |  |                 const copyText = document.getElementById("code-link--copyable"); | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 // @ts-ignore
 | 
					
						
							|  |  |  |                 copyText.select(); | 
					
						
							|  |  |  |                 // @ts-ignore
 | 
					
						
							|  |  |  |                 copyText.setSelectionRange(0, 99999); /*For mobile devices*/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 document.execCommand("copy"); | 
					
						
							| 
									
										
										
										
											2021-06-13 15:04:55 +02:00
										 |  |  |                 const copied = tr.copiedToClipboard.Clone(); | 
					
						
							| 
									
										
										
										
											2020-08-27 01:03:58 +02:00
										 |  |  |                 copied.SetClass("thanks") | 
					
						
							| 
									
										
										
										
											2021-06-13 15:04:55 +02:00
										 |  |  |                 linkStatus.setData(copied); | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             try { | 
					
						
							|  |  |  |                 navigator.share(shareData) | 
					
						
							|  |  |  |                     .then(() => { | 
					
						
							| 
									
										
										
										
											2021-06-13 15:04:55 +02:00
										 |  |  |                         const thx = tr.thanksForSharing.Clone(); | 
					
						
							| 
									
										
										
										
											2020-08-27 01:03:58 +02:00
										 |  |  |                         thx.SetClass("thanks"); | 
					
						
							| 
									
										
										
										
											2021-06-13 15:04:55 +02:00
										 |  |  |                         linkStatus.setData(thx); | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |                     }, rejected) | 
					
						
							|  |  |  |                     .catch(rejected) | 
					
						
							|  |  |  |             } catch (err) { | 
					
						
							|  |  |  |                 rejected(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-18 02:39:30 +02:00
										 |  |  |          | 
					
						
							|  |  |  |         let downloadThemeConfig: BaseUIElement = undefined; | 
					
						
							|  |  |  |         if(layout.definitionRaw !== undefined){ | 
					
						
							|  |  |  |             downloadThemeConfig = new SubtleButton(Svg.download_svg(), new Combine([ | 
					
						
							|  |  |  |                 tr.downloadCustomTheme, | 
					
						
							|  |  |  |                 tr.downloadCustomThemeHelp.SetClass("subtle") | 
					
						
							|  |  |  |             ]).onClick(() => { | 
					
						
							|  |  |  |                 Utils.offerContentsAsDownloadableFile(layout.definitionRaw, layout.id+".mapcomplete-theme-definition.json", { | 
					
						
							|  |  |  |                     mimetype:"application/json" | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |                 .SetClass("flex flex-col")) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |         super([ | 
					
						
							| 
									
										
										
										
											2022-04-18 02:39:30 +02:00
										 |  |  |             tr.intro, | 
					
						
							| 
									
										
										
										
											2021-06-13 15:04:55 +02:00
										 |  |  |             link, | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |             new VariableUiElement(linkStatus), | 
					
						
							| 
									
										
										
										
											2022-04-18 02:39:30 +02:00
										 |  |  |             downloadThemeConfig, | 
					
						
							|  |  |  |             tr.addToHomeScreen, | 
					
						
							|  |  |  |             tr.embedIntro, | 
					
						
							| 
									
										
										
										
											2021-06-13 15:04:55 +02:00
										 |  |  |             options, | 
					
						
							|  |  |  |             iframeCode, | 
					
						
							|  |  |  |         ]) | 
					
						
							|  |  |  |         this.SetClass("flex flex-col link-underline") | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |