react-native/Libraries/GeoLocation/GeoLocation.js

99 lines
2.5 KiB
JavaScript
Raw Normal View History

/**
* Copyright 2004-present Facebook. All Rights Reserved.
*
* @providesModule GeoLocation
*/
'use strict';
var RCTDeviceEventEmitter = require('RCTDeviceEventEmitter');
var RCTLocationObserver = require('NativeModules').RKLocationObserver;
var invariant = require('invariant');
var logError = require('logError');
var warning = require('warning');
var subscriptions = [];
var updatesEnabled = false;
var ensureObserving = function() {
if (!updatesEnabled) {
RCTLocationObserver.startObserving();
updatesEnabled = true;
}
};
/**
* /!\ ATTENTION /!\
* You need to add NSLocationWhenInUseUsageDescription key
* in Info.plist to enable geolocation, otherwise it's going
* to *fail silently*!
* \!/ \!/
*
* GeoLocation follows the MDN specification:
* https://developer.mozilla.org/en-US/docs/Web/API/Geolocation
*/
class GeoLocation {
static getCurrentPosition(geo_success, geo_error, geo_options) {
invariant(
typeof geo_success === 'function',
'Must provide a valid geo_success callback.'
);
if (geo_options) {
warning('geo_options are not yet supported.');
}
ensureObserving();
RCTLocationObserver.getCurrentPosition(
geo_success,
geo_error || logError
);
}
static watchPosition(callback) {
ensureObserving();
var watchID = subscriptions.length;
subscriptions.push(
RCTDeviceEventEmitter.addListener(
'geoLocationDidChange',
callback
)
);
return watchID;
}
static clearWatch(watchID) {
var sub = subscriptions[watchID];
if (!sub) {
// Silently exit when the watchID is invalid or already cleared
// This is consistent with timers
return;
}
sub.remove();
subscriptions[watchID] = undefined;
var noWatchers = true;
for (var ii = 0; ii < subscriptions.length; ii++) {
if (subscriptions[ii]) {
noWatchers = false; // still valid subscriptions
}
}
if (noWatchers) {
GeoLocation.stopObserving();
}
}
static stopObserving() {
if (updatesEnabled) {
RCTLocationObserver.stopObserving();
updatesEnabled = false;
for (var ii = 0; ii < subscriptions.length; ii++) {
if (subscriptions[ii]) {
warning('Called stopObserving with existing subscriptions.');
subscriptions[ii].remove();
}
}
subscriptions = [];
} else {
warning('Tried to stop observing when not observing.');
}
}
}
module.exports = GeoLocation;