Fix 'moveToLocation' for bounded themes, add test

This commit is contained in:
pietervdvn 2022-03-28 21:56:25 +02:00
parent d8d2689fa8
commit c8e013f30e

View file

@ -5,6 +5,7 @@ import {VariableUiElement} from "../../UI/Base/VariableUIElement";
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
import {QueryParameters} from "../Web/QueryParameters"; import {QueryParameters} from "../Web/QueryParameters";
import FeatureSource from "../FeatureSource/FeatureSource"; import FeatureSource from "../FeatureSource/FeatureSource";
import {BBox} from "../BBox";
export interface GeoLocationPointProperties { export interface GeoLocationPointProperties {
id: "gps", id: "gps",
@ -20,7 +21,7 @@ export interface GeoLocationPointProperties {
export default class GeoLocationHandler extends VariableUiElement { export default class GeoLocationHandler extends VariableUiElement {
private readonly currentLocation: FeatureSource private readonly currentLocation?: FeatureSource
/** /**
* Wether or not the geolocation is active, aka the user requested the current location * Wether or not the geolocation is active, aka the user requested the current location
@ -71,7 +72,7 @@ export default class GeoLocationHandler extends VariableUiElement {
constructor( constructor(
state: { state: {
selectedElement: UIEventSource<any>; selectedElement: UIEventSource<any>;
currentUserLocation: FeatureSource, currentUserLocation?: FeatureSource,
leafletMap: UIEventSource<any>, leafletMap: UIEventSource<any>,
layoutToUse: LayoutConfig, layoutToUse: LayoutConfig,
featureSwitchGeolocation: UIEventSource<boolean> featureSwitchGeolocation: UIEventSource<boolean>
@ -217,14 +218,14 @@ export default class GeoLocationHandler extends VariableUiElement {
} }
} }
self.currentLocation.features.setData([{feature, freshness: new Date()}]) self.currentLocation?.features?.setData([{feature, freshness: new Date()}])
const timeSinceRequest = const timeSinceRequest =
(new Date().getTime() - (self._lastUserRequest?.getTime() ?? 0)) / 1000; (new Date().getTime() - (self._lastUserRequest?.getTime() ?? 0)) / 1000;
if (timeSinceRequest < 30) { if (timeSinceRequest < 30) {
self.MoveToCurrentLoction(16); self.MoveToCurrentLocation(16);
} else if (self._isLocked.data) { } else if (self._isLocked.data) {
self.MoveToCurrentLoction(); self.MoveToCurrentLocation();
} }
}); });
@ -235,9 +236,13 @@ export default class GeoLocationHandler extends VariableUiElement {
const self = this; const self = this;
if (self._isActive.data) { if (self._isActive.data) {
self.MoveToCurrentLoction(16); self.MoveToCurrentLocation(16);
return; return;
} }
if(typeof navigator === "undefined"){
return
}
try { try {
navigator?.permissions navigator?.permissions
@ -264,7 +269,57 @@ export default class GeoLocationHandler extends VariableUiElement {
} }
} }
private MoveToCurrentLoction(targetZoom?: number) { /**
* Moves to the currently loaded location.
*
* // Should move to any location
* let resultingLocation = undefined
* let resultingzoom = 1
* const state = {
* selectedElement: new UIEventSource<any>(undefined);
* currentUserLocation: undefined ,
* leafletMap: new UIEventSource<any>({getZoom: () => resultingzoom; setView: (loc, zoom) => {resultingLocation = loc; resultingzoom = zoom}),
* layoutToUse: new LayoutConfig(<any>{
* id: 'test',
* title: {"en":"test"}
* description: "A testing theme",
* layers: []
* }),
* featureSwitchGeolocation : new UIEventSource<boolean>(true)
* }
* const handler = new GeoLocationHandler(state)
* handler._currentGPSLocation.setData(<any> {latitude : 51.3, longitude: 4.1})
* handler.MoveToCurrentLocation()
* resultingLocation // => [51.3, 4.1]
* handler._currentGPSLocation.setData(<any> {latitude : 60, longitude: 60) // out of bounds
* handler.MoveToCurrentLocation()
* resultingLocation // => [60, 60]
*
* // should refuse to move if out of bounds
* let resultingLocation = undefined
* let resultingzoom = 1
* const state = {
* selectedElement: new UIEventSource<any>(undefined);
* currentUserLocation: undefined ,
* leafletMap: new UIEventSource<any>({getZoom: () => resultingzoom; setView: (loc, zoom) => {resultingLocation = loc; resultingzoom = zoom}),
* layoutToUse: new LayoutConfig(<any>{
* id: 'test',
* title: {"en":"test"}
* "lockLocation": [ [ 2.1, 50.4], [6.4, 51.54 ]],
* description: "A testing theme",
* layers: []
* }),
* featureSwitchGeolocation : new UIEventSource<boolean>(true)
* }
* const handler = new GeoLocationHandler(state)
* handler._currentGPSLocation.setData(<any> {latitude : 51.3, longitude: 4.1})
* handler.MoveToCurrentLocation()
* resultingLocation // => [51.3, 4.1]
* handler._currentGPSLocation.setData(<any> {latitude : 60, longitude: 60) // out of bounds
* handler.MoveToCurrentLocation()
* resultingLocation // => [51.3, 4.1]
*/
private MoveToCurrentLocation(targetZoom?: number) {
const location = this._currentGPSLocation.data; const location = this._currentGPSLocation.data;
this._lastUserRequest = undefined; this._lastUserRequest = undefined;
@ -282,11 +337,7 @@ export default class GeoLocationHandler extends VariableUiElement {
if (b) { if (b) {
if (b !== true) { if (b !== true) {
// B is an array with our locklocation // B is an array with our locklocation
inRange = inRange = new BBox(b).contains([location.longitude, location.latitude])
b[0][0] <= location.latitude &&
location.latitude <= b[1][0] &&
b[0][1] <= location.longitude &&
location.longitude <= b[1][1];
} }
} }
if (!inRange) { if (!inRange) {
@ -312,7 +363,7 @@ export default class GeoLocationHandler extends VariableUiElement {
return ""; return "";
} }
if (this._currentGPSLocation.data !== undefined) { if (this._currentGPSLocation.data !== undefined) {
this.MoveToCurrentLoction(16); this.MoveToCurrentLocation(16);
} }
if (self._isActive.data) { if (self._isActive.data) {