forked from MapComplete/MapComplete
		
	Do not zoom to location if it is out of the map bounds
This commit is contained in:
		
							parent
							
								
									8aa830f15e
								
							
						
					
					
						commit
						6763c682ab
					
				
					 2 changed files with 59 additions and 40 deletions
				
			
		|  | @ -5,6 +5,7 @@ import {Utils} from "../../Utils"; | |||
| import Svg from "../../Svg"; | ||||
| import Img from "../../UI/Base/Img"; | ||||
| import {LocalStorageSource} from "../Web/LocalStorageSource"; | ||||
| import LayoutConfig from "../../Customizations/JSON/LayoutConfig"; | ||||
| 
 | ||||
| export default class GeoLocationHandler extends UIElement { | ||||
| 
 | ||||
|  | @ -49,12 +50,15 @@ export default class GeoLocationHandler extends UIElement { | |||
|      * @private | ||||
|      */ | ||||
|     private readonly _previousLocationGrant: UIEventSource<string> = LocalStorageSource.Get("geolocation-permissions"); | ||||
|     private readonly _layoutToUse: UIEventSource<LayoutConfig>; | ||||
| 
 | ||||
|     constructor(currentGPSLocation: UIEventSource<{ latlng: any; accuracy: number }>, | ||||
|                 leafletMap: UIEventSource<L.Map>) { | ||||
|                 leafletMap: UIEventSource<L.Map>, | ||||
|                 layoutToUse: UIEventSource<LayoutConfig>) { | ||||
|         super(undefined); | ||||
|         this._currentGPSLocation = currentGPSLocation; | ||||
|         this._leafletMap = leafletMap; | ||||
|         this._layoutToUse = layoutToUse; | ||||
|         this._hasLocation = currentGPSLocation.map((location) => location !== undefined); | ||||
|         this.dumbMode = false; | ||||
|         const self = this; | ||||
|  | @ -90,11 +94,11 @@ export default class GeoLocationHandler extends UIElement { | |||
| 
 | ||||
|         const self = this; | ||||
|         htmlElement.onclick = function () { | ||||
|             self.StartGeolocating(19); | ||||
|             self.StartGeolocating(); | ||||
|         } | ||||
| 
 | ||||
|         htmlElement.oncontextmenu = function (e) { | ||||
|             self.StartGeolocating(15); | ||||
|             self.StartGeolocating(); | ||||
|             e.preventDefault(); | ||||
|             return false; | ||||
|         } | ||||
|  | @ -133,9 +137,24 @@ export default class GeoLocationHandler extends UIElement { | |||
|             const timeSinceRequest = (new Date().getTime() - (self._lastUserRequest?.getTime() ?? 0)) / 1000; | ||||
|             if (timeSinceRequest < 30) { | ||||
|                 self._lastUserRequest = undefined; | ||||
|                 this._leafletMap.data.setView( | ||||
|                     this._currentGPSLocation.data.latlng, this._leafletMap.data.getZoom() | ||||
|                 ); | ||||
| 
 | ||||
|                 // We use the layout location
 | ||||
|                 const b = this._layoutToUse.data.lockLocation | ||||
|                 let inRange = true; | ||||
|                 if(b){ | ||||
|                     if(b!== true){ | ||||
|                         // B is an array with our locklocation
 | ||||
|                         inRange = b[0][0] <= location.latlng[0] && location.latlng[0] <= b[1][0] && | ||||
|                             b[0][1] <= location.latlng[1] && location.latlng[1] <= b[1][1]; | ||||
|                     } | ||||
|                 } | ||||
|                 if (!inRange) { | ||||
|                     console.log("Not zooming to GPS location: out of bounds", b, location.latlng) | ||||
|                 } else { | ||||
|                     this._leafletMap.data.setView( | ||||
|                         location.latlng, this._leafletMap.data.getZoom() | ||||
|                     ); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             let color = "#1111cc"; | ||||
|  | @ -166,7 +185,7 @@ export default class GeoLocationHandler extends UIElement { | |||
|                 ?.then(function (status) { | ||||
|                     console.log("Geolocation is already", status) | ||||
|                     if (status.state === "granted") { | ||||
|                         self.StartGeolocating(19, false); | ||||
|                         self.StartGeolocating(false); | ||||
|                     } | ||||
|                     self._permission.setData(status.state); | ||||
|                     status.onchange = function () { | ||||
|  | @ -179,7 +198,7 @@ export default class GeoLocationHandler extends UIElement { | |||
|         } | ||||
|         if (this._previousLocationGrant.data === "granted") { | ||||
|             this._previousLocationGrant.setData(""); | ||||
|             self.StartGeolocating(); | ||||
|             self.StartGeolocating(false); | ||||
|         } | ||||
| 
 | ||||
|         this.HideOnEmpty(true); | ||||
|  | @ -207,7 +226,7 @@ export default class GeoLocationHandler extends UIElement { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private StartGeolocating(zoomlevel = 19, zoomToGPS = true) { | ||||
|     private StartGeolocating(zoomToGPS = true) { | ||||
|         const self = this; | ||||
|         console.log("Starting geolocation") | ||||
| 
 | ||||
|  | @ -217,9 +236,7 @@ export default class GeoLocationHandler extends UIElement { | |||
|             return ""; | ||||
|         } | ||||
|         if (this._currentGPSLocation.data !== undefined) { | ||||
|             this._leafletMap.data.setView( | ||||
|                 this._currentGPSLocation.data.latlng, zoomlevel | ||||
|             ); | ||||
|             this._currentGPSLocation.ping() | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue