| 
									
										
										
										
											2023-12-21 17:36:43 +01:00
										 |  |  | <script lang="ts"> | 
					
						
							|  |  |  |   import { Store } from "../../Logic/UIEventSource" | 
					
						
							|  |  |  |   import { GeoOperations } from "../../Logic/GeoOperations" | 
					
						
							|  |  |  |   import ThemeViewState from "../../Models/ThemeViewState" | 
					
						
							|  |  |  |   import Tr from "../Base/Tr.svelte" | 
					
						
							|  |  |  |   import Translations from "../i18n/Translations" | 
					
						
							| 
									
										
										
										
											2023-12-24 05:01:10 +01:00
										 |  |  |   import { Orientation } from "../../Sensors/Orientation" | 
					
						
							|  |  |  |   import { Translation } from "../i18n/Translation" | 
					
						
							|  |  |  |   import Constants from "../../Models/Constants" | 
					
						
							| 
									
										
										
										
											2023-12-21 17:36:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /** | 
					
						
							|  |  |  |    * Indicates how far away the viewport center is from the current user location | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   export let state: ThemeViewState | 
					
						
							|  |  |  |   const t = Translations.t.general.visualFeedback | 
					
						
							| 
									
										
										
										
											2023-12-24 05:01:10 +01:00
										 |  |  |   const relativeDir = t.directionsRelative | 
					
						
							| 
									
										
										
										
											2023-12-21 17:36:43 +01:00
										 |  |  |   let map = state.mapProperties | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let currentLocation = state.geolocation.geolocationState.currentGPSLocation | 
					
						
							| 
									
										
										
										
											2023-12-30 15:24:30 +01:00
										 |  |  |   let distanceToCurrentLocation: Store<{ | 
					
						
							|  |  |  |     distance: string | 
					
						
							|  |  |  |     distanceInMeters: number | 
					
						
							|  |  |  |     bearing: number | 
					
						
							|  |  |  |   }> = map.location.mapD( | 
					
						
							|  |  |  |     ({ lon, lat }) => { | 
					
						
							| 
									
										
										
										
											2024-02-26 14:12:30 +01:00
										 |  |  |       const current = currentLocation?.data | 
					
						
							| 
									
										
										
										
											2023-12-30 15:24:30 +01:00
										 |  |  |       if (!current) { | 
					
						
							|  |  |  |         return undefined | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       const gps: [number, number] = [current.longitude, current.latitude] | 
					
						
							|  |  |  |       const mapCenter: [number, number] = [lon, lat] | 
					
						
							|  |  |  |       const distanceInMeters = Math.round(GeoOperations.distanceBetween(gps, mapCenter)) | 
					
						
							|  |  |  |       const distance = GeoOperations.distanceToHuman(distanceInMeters) | 
					
						
							|  |  |  |       const bearing = Math.round(GeoOperations.bearing(gps, mapCenter)) | 
					
						
							|  |  |  |       const bearingDirection = GeoOperations.bearingToHuman(bearing) | 
					
						
							|  |  |  |       return { distance, bearing, distanceInMeters, bearingDirection } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     [currentLocation] | 
					
						
							|  |  |  |   ) | 
					
						
							| 
									
										
										
										
											2023-12-24 05:01:10 +01:00
										 |  |  |   let hasCompass = Orientation.singleton.gotMeasurement | 
					
						
							|  |  |  |   let compass = Orientation.singleton.alpha | 
					
						
							| 
									
										
										
										
											2023-12-30 15:24:30 +01:00
										 |  |  |   let relativeBearing: Store<{ distance: string; bearing: Translation }> = compass.mapD( | 
					
						
							|  |  |  |     (compass) => { | 
					
						
							| 
									
										
										
										
											2024-02-26 14:12:30 +01:00
										 |  |  |       if(!distanceToCurrentLocation.data){ | 
					
						
							|  |  |  |         return undefined | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2023-12-30 15:24:30 +01:00
										 |  |  |       const bearing: Translation = | 
					
						
							|  |  |  |         relativeDir[ | 
					
						
							|  |  |  |           GeoOperations.bearingToHumanRelative(distanceToCurrentLocation.data.bearing - compass) | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |       return { bearing, distance: distanceToCurrentLocation.data.distance } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     [distanceToCurrentLocation] | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  |   let viewportCenterDetails = Translations.DynamicSubstitute( | 
					
						
							|  |  |  |     t.viewportCenterDetails, | 
					
						
							|  |  |  |     relativeBearing | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  |   let viewportCenterDetailsAbsolute = Translations.DynamicSubstitute( | 
					
						
							|  |  |  |     t.viewportCenterDetails, | 
					
						
							|  |  |  |     distanceToCurrentLocation.mapD(({ distance, bearing }) => { | 
					
						
							|  |  |  |       return { distance, bearing: t.directionsAbsolute[GeoOperations.bearingToHuman(bearing)] } | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |   ) | 
					
						
							| 
									
										
										
										
											2023-12-21 17:36:43 +01:00
										 |  |  | </script> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | {#if $currentLocation !== undefined} | 
					
						
							| 
									
										
										
										
											2023-12-24 05:01:10 +01:00
										 |  |  |   {#if $distanceToCurrentLocation.distanceInMeters < Constants.viewportCenterCloseToGpsCutoff} | 
					
						
							| 
									
										
										
										
											2023-12-21 17:36:43 +01:00
										 |  |  |     <Tr t={t.viewportCenterCloseToGps} /> | 
					
						
							| 
									
										
										
										
											2023-12-24 05:01:10 +01:00
										 |  |  |   {:else if $hasCompass} | 
					
						
							|  |  |  |     {$viewportCenterDetails} | 
					
						
							| 
									
										
										
										
											2023-12-21 17:36:43 +01:00
										 |  |  |   {:else} | 
					
						
							| 
									
										
										
										
											2023-12-24 05:01:10 +01:00
										 |  |  |     {$viewportCenterDetailsAbsolute} | 
					
						
							| 
									
										
										
										
											2023-12-21 17:36:43 +01:00
										 |  |  |   {/if} | 
					
						
							|  |  |  | {/if} |