forked from MapComplete/MapComplete
		
	Fixes to the geolocation flow
This commit is contained in:
		
							parent
							
								
									b0bbae2ce6
								
							
						
					
					
						commit
						bd5e9903bd
					
				
					 3 changed files with 18 additions and 7 deletions
				
			
		| 
						 | 
					@ -8,6 +8,7 @@ import { UIEventSource } from "../UIEventSource"
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * The geolocation-handler takes a map-location and a geolocation state.
 | 
					 * The geolocation-handler takes a map-location and a geolocation state.
 | 
				
			||||||
 * It'll move the map as appropriate given the state of the geolocation-API
 | 
					 * It'll move the map as appropriate given the state of the geolocation-API
 | 
				
			||||||
 | 
					 * It will also copy the geolocation into the appropriate FeatureSource to display on the map
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export default class GeoLocationHandler {
 | 
					export default class GeoLocationHandler {
 | 
				
			||||||
    public readonly geolocationState: GeoLocationState
 | 
					    public readonly geolocationState: GeoLocationState
 | 
				
			||||||
| 
						 | 
					@ -117,7 +118,11 @@ export default class GeoLocationHandler {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private CopyGeolocationIntoMapstate() {
 | 
					    private CopyGeolocationIntoMapstate() {
 | 
				
			||||||
        const state = this._state
 | 
					        const state = this._state
 | 
				
			||||||
        this.geolocationState.currentGPSLocation.addCallbackAndRunD((location) => {
 | 
					        this.geolocationState.currentGPSLocation.addCallbackAndRun((location) => {
 | 
				
			||||||
 | 
					            if (location === undefined) {
 | 
				
			||||||
 | 
					                state.currentUserLocation?.features?.setData([])
 | 
				
			||||||
 | 
					                return
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            const feature = {
 | 
					            const feature = {
 | 
				
			||||||
                type: "Feature",
 | 
					                type: "Feature",
 | 
				
			||||||
                properties: <GeoLocationPointProperties>{
 | 
					                properties: <GeoLocationPointProperties>{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,7 +57,6 @@ export class GeoLocationState {
 | 
				
			||||||
            if (state === "granted") {
 | 
					            if (state === "granted") {
 | 
				
			||||||
                self._previousLocationGrant.setData("true")
 | 
					                self._previousLocationGrant.setData("true")
 | 
				
			||||||
                self._grantedThisSession.setData(true)
 | 
					                self._grantedThisSession.setData(true)
 | 
				
			||||||
                await self.startWatching()
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (state === "prompt" && self._grantedThisSession.data) {
 | 
					            if (state === "prompt" && self._grantedThisSession.data) {
 | 
				
			||||||
                // This is _really_ weird: we had a grant earlier, but it's 'prompt' now?
 | 
					                // This is _really_ weird: we had a grant earlier, but it's 'prompt' now?
 | 
				
			||||||
| 
						 | 
					@ -65,6 +64,7 @@ export class GeoLocationState {
 | 
				
			||||||
                //   self.permission.setData("denied")
 | 
					                //   self.permission.setData("denied")
 | 
				
			||||||
                self._previousLocationGrant.setData("false")
 | 
					                self._previousLocationGrant.setData("false")
 | 
				
			||||||
                self.permission.setData("denied")
 | 
					                self.permission.setData("denied")
 | 
				
			||||||
 | 
					                self.currentGPSLocation.setData(undefined)
 | 
				
			||||||
                console.warn("Detected a downgrade in permissions!")
 | 
					                console.warn("Detected a downgrade in permissions!")
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (state === "denied") {
 | 
					            if (state === "denied") {
 | 
				
			||||||
| 
						 | 
					@ -72,6 +72,7 @@ export class GeoLocationState {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        console.log("Previous location grant:", this._previousLocationGrant.data)
 | 
				
			||||||
        if (this._previousLocationGrant.data === "true") {
 | 
					        if (this._previousLocationGrant.data === "true") {
 | 
				
			||||||
            // A previous visit successfully granted permission. Chance is high that we are allowed to use it again!
 | 
					            // A previous visit successfully granted permission. Chance is high that we are allowed to use it again!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -80,6 +81,7 @@ export class GeoLocationState {
 | 
				
			||||||
            console.log("Requesting access to GPS as this was previously granted")
 | 
					            console.log("Requesting access to GPS as this was previously granted")
 | 
				
			||||||
            this.requestPermission()
 | 
					            this.requestPermission()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        window["geolocation_state"] = this
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
| 
						 | 
					@ -91,6 +93,7 @@ export class GeoLocationState {
 | 
				
			||||||
        navigator.geolocation.watchPosition(
 | 
					        navigator.geolocation.watchPosition(
 | 
				
			||||||
            function (position) {
 | 
					            function (position) {
 | 
				
			||||||
                self.currentGPSLocation.setData(position.coords)
 | 
					                self.currentGPSLocation.setData(position.coords)
 | 
				
			||||||
 | 
					                self._previousLocationGrant.setData("true")
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            function () {
 | 
					            function () {
 | 
				
			||||||
                console.warn("Could not get location with navigator.geolocation")
 | 
					                console.warn("Could not get location with navigator.geolocation")
 | 
				
			||||||
| 
						 | 
					@ -121,12 +124,13 @@ export class GeoLocationState {
 | 
				
			||||||
            navigator?.permissions
 | 
					            navigator?.permissions
 | 
				
			||||||
                ?.query({ name: "geolocation" })
 | 
					                ?.query({ name: "geolocation" })
 | 
				
			||||||
                .then((status) => {
 | 
					                .then((status) => {
 | 
				
			||||||
                    console.log("Geolocation permission is ", status.state)
 | 
					                    console.log("Status update: received geolocation permission is ", status.state)
 | 
				
			||||||
                    this.permission.setData(status.state)
 | 
					                    this.permission.setData(status.state)
 | 
				
			||||||
                    const self = this
 | 
					                    const self = this
 | 
				
			||||||
                    status.onchange = function () {
 | 
					                    status.onchange = function () {
 | 
				
			||||||
                        self.permission.setData(status.state)
 | 
					                        self.permission.setData(status.state)
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					                    this.permission.setData("requested")
 | 
				
			||||||
                    // We _must_ call 'startWatching', as that is the actual trigger for the popup...
 | 
					                    // We _must_ call 'startWatching', as that is the actual trigger for the popup...
 | 
				
			||||||
                    self.startWatching()
 | 
					                    self.startWatching()
 | 
				
			||||||
                })
 | 
					                })
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,10 +28,10 @@ export class GeolocationControl extends VariableUiElement {
 | 
				
			||||||
                        return Svg.location_locked_svg()
 | 
					                        return Svg.location_locked_svg()
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if (permission === "prompt") {
 | 
					                    if (geolocationState.currentGPSLocation.data === undefined) {
 | 
				
			||||||
                        return Svg.location_empty_svg()
 | 
					                        if (permission === "prompt") {
 | 
				
			||||||
                    }
 | 
					                            return Svg.location_empty_svg()
 | 
				
			||||||
                    if (geolocationState.currentGPSLocation === undefined) {
 | 
					                        }
 | 
				
			||||||
                        // Position not yet found, but permission is either requested or granted: we spin to indicate activity
 | 
					                        // Position not yet found, but permission is either requested or granted: we spin to indicate activity
 | 
				
			||||||
                        const icon = !geolocationHandler.mapHasMoved.data
 | 
					                        const icon = !geolocationHandler.mapHasMoved.data
 | 
				
			||||||
                            ? Svg.location_svg()
 | 
					                            ? Svg.location_svg()
 | 
				
			||||||
| 
						 | 
					@ -41,6 +41,8 @@ export class GeolocationControl extends VariableUiElement {
 | 
				
			||||||
                            .SetStyle("animation: spin 4s linear infinite;")
 | 
					                            .SetStyle("animation: spin 4s linear infinite;")
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // We have a location, so we show a dot in the center
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if (
 | 
					                    if (
 | 
				
			||||||
                        lastClickWithinThreeSecs.data &&
 | 
					                        lastClickWithinThreeSecs.data &&
 | 
				
			||||||
                        geolocationState.permission.data === "granted"
 | 
					                        geolocationState.permission.data === "granted"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue