| 
									
										
										
										
											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"; | 
					
						
							|  |  |  | import {UIEventSource} from "../../Logic/UIEventSource"; | 
					
						
							|  |  |  | import {Utils} from "../../Utils"; | 
					
						
							| 
									
										
										
										
											2021-06-10 01:36:20 +02:00
										 |  |  | import Toggle from "../Input/Toggle"; | 
					
						
							| 
									
										
										
										
											2021-01-04 04:06:21 +01:00
										 |  |  | 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"; | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-10 14:05:26 +02:00
										 |  |  |         const optionCheckboxes: BaseUIElement[] = [] | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |         const optionParts: (UIEventSource<string>)[] = []; | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-15 03:10:44 +01:00
										 |  |  |         function check() { | 
					
						
							|  |  |  |             return Svg.checkmark_svg().SetStyle("width: 1.5em; display:inline-block;"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         function nocheck() { | 
					
						
							|  |  |  |             return Svg.no_checkmark_svg().SetStyle("width: 1.5em; display: inline-block;"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-10 01:36:20 +02:00
										 |  |  |         const includeLocation = new Toggle( | 
					
						
							| 
									
										
										
										
											2021-06-13 15:04:55 +02:00
										 |  |  |             new Combine([check(), tr.fsIncludeCurrentLocation.Clone()]), | 
					
						
							|  |  |  |             new Combine([nocheck(), tr.fsIncludeCurrentLocation.Clone()]), | 
					
						
							| 
									
										
										
										
											2021-06-10 14:05:26 +02:00
										 |  |  |             new UIEventSource<boolean>(true) | 
					
						
							| 
									
										
										
										
											2021-06-14 02:39:23 +02:00
										 |  |  |         ).ToggleOnClick() | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |         optionParts.push(includeLocation.isEnabled.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; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, [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 ?? ""}); | 
					
						
							|  |  |  |         })); | 
					
						
							|  |  |  |         const includeCurrentBackground = new Toggle( | 
					
						
							|  |  |  |             new Combine([check(), currentBackground]), | 
					
						
							|  |  |  |             new Combine([nocheck(), currentBackground]), | 
					
						
							|  |  |  |             new UIEventSource<boolean>(true) | 
					
						
							|  |  |  |         ).ToggleOnClick() | 
					
						
							|  |  |  |         optionCheckboxes.push(includeCurrentBackground); | 
					
						
							|  |  |  |         optionParts.push(includeCurrentBackground.isEnabled.map((includeBG) => { | 
					
						
							|  |  |  |             if (includeBG) { | 
					
						
							|  |  |  |                 return "background=" + currentLayer.data.id | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 return null | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, [currentLayer])); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-08 02:16:42 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         const includeLayerChoices = new Toggle( | 
					
						
							|  |  |  |             new Combine([check(), tr.fsIncludeCurrentLayers.Clone()]), | 
					
						
							|  |  |  |             new Combine([nocheck(), tr.fsIncludeCurrentLayers.Clone()]), | 
					
						
							|  |  |  |             new UIEventSource<boolean>(true) | 
					
						
							|  |  |  |         ).ToggleOnClick() | 
					
						
							|  |  |  |         optionCheckboxes.push(includeLayerChoices); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         optionParts.push(includeLayerChoices.isEnabled.map((includeLayerSelection) => { | 
					
						
							|  |  |  |             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) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-10 01:36:20 +02:00
										 |  |  |             const checkbox = new Toggle( | 
					
						
							| 
									
										
										
										
											2021-06-13 15:04:55 +02:00
										 |  |  |                 new Combine([check(), Translations.W(swtch.human.Clone())]), | 
					
						
							|  |  |  |                 new Combine([nocheck(), Translations.W(swtch.human.Clone())]), | 
					
						
							| 
									
										
										
										
											2021-06-10 14:05:26 +02:00
										 |  |  |                 new UIEventSource<boolean>(!swtch.reverse) | 
					
						
							| 
									
										
										
										
											2021-06-14 02:39:23 +02:00
										 |  |  |             ).ToggleOnClick(); | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |             optionCheckboxes.push(checkbox); | 
					
						
							|  |  |  |             optionParts.push(checkbox.isEnabled.map((isEn) => { | 
					
						
							|  |  |  |                 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` | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             })) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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("/")); | 
					
						
							|  |  |  |             let literalText = `https://${host}${path}/${layout.id.toLowerCase()}` | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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) { | 
					
						
							| 
									
										
										
										
											2021-10-30 01:05:38 +02:00
										 |  |  |                 return literalText; | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-10-30 01:05:38 +02:00
										 |  |  |             return literalText + "?" + parts.join("&"); | 
					
						
							| 
									
										
										
										
											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 = { | 
					
						
							| 
									
										
										
										
											2021-06-10 14:05:26 +02:00
										 |  |  |                 title: Translations.W(layout.title)?.ConstructElement().innerText ?? "", | 
					
						
							|  |  |  |                 text: Translations.W(layout.description)?.ConstructElement().innerText ?? "", | 
					
						
							|  |  |  |                 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(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |         super([ | 
					
						
							| 
									
										
										
										
											2021-06-13 15:04:55 +02:00
										 |  |  |             tr.intro.Clone(), | 
					
						
							|  |  |  |             link, | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |             new VariableUiElement(linkStatus), | 
					
						
							| 
									
										
										
										
											2021-06-13 15:04:55 +02:00
										 |  |  |             tr.addToHomeScreen.Clone(), | 
					
						
							|  |  |  |             tr.embedIntro.Clone(), | 
					
						
							|  |  |  |             options, | 
					
						
							|  |  |  |             iframeCode, | 
					
						
							|  |  |  |         ]) | 
					
						
							|  |  |  |         this.SetClass("flex flex-col link-underline") | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |