import { EventEmitter } from '@unimodules/core';
class GeocoderError extends Error {
constructor() {
super('Geocoder service is not available for this device.');
this.code = 'E_NO_GEOCODER';
}
}
const emitter = new EventEmitter({});
function positionToJSON(position) {
if (!position)
return null;
const { coords = {}, timestamp } = position;
return {
coords: {
latitude: coords.latitude,
longitude: coords.longitude,
altitude: coords.altitude,
accuracy: coords.accuracy,
altitudeAccuracy: coords.altitudeAccuracy,
heading: coords.heading,
speed: coords.speed,
},
timestamp,
};
}
export default {
get name() {
return 'ExpoLocation';
},
async getProviderStatusAsync() {
return {
locationServicesEnabled: 'geolocation' in navigator,
};
},
async getCurrentPositionAsync(options) {
return new Promise((resolve, reject) => navigator.geolocation.getCurrentPosition(position => resolve(positionToJSON(position)), reject, options));
},
async removeWatchAsync(watchId) {
navigator.geolocation.clearWatch(watchId);
},
async watchDeviceHeading(headingId) {
console.warn('Location.watchDeviceHeading: is not supported on web');
},
async hasServicesEnabledAsync() {
return 'geolocation' in navigator;
},
async geocodeAsync() {
throw new GeocoderError();
},
async reverseGeocodeAsync() {
throw new GeocoderError();
},
async watchPositionImplAsync(watchId, options) {
return new Promise(resolve => {
// @ts-ignore
watchId = global.navigator.geolocation.watchPosition(location => {
emitter.emit('Expo.locationChanged', { watchId, location: positionToJSON(location) });
}, null, options);
resolve(watchId);
});
},
async requestPermissionsAsync() {
return new Promise(resolve => {
navigator.geolocation.getCurrentPosition(() => resolve({ status: 'granted' }), ({ code }) => {
if (code === 1 /* PERMISSION_DENIED */) {
resolve({ status: 'denied' });
}
else {
resolve({ status: 'undetermined' });
}
});
});
},
};
//# sourceMappingURL=ExpoLocation.web.js.map