Fix 'moveToLocation' for bounded themes, add test
This commit is contained in:
parent
d8d2689fa8
commit
c8e013f30e
1 changed files with 64 additions and 13 deletions
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue