one
Version:
One is a React framework for web, iOS, and Android apps.
134 lines (133 loc) • 4.89 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all) __defProp(target, name, {
get: all[name],
enumerable: true
});
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: () => from[key],
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var location_exports = {};
__export(location_exports, { Location: () => Location });
module.exports = __toCommonJS(location_exports);
var import_unavailable = require("./unavailable.cjs");
var import_validateCallback = require("../validateCallback.cjs");
var import_validation = require("./validation.cjs");
let permission = "notDetermined";
let observing;
function observe() {
return observing ??= (async () => {
if (!navigator.permissions) return;
try {
const status = await navigator.permissions.query({ name: "geolocation" });
const update = () => {
permission = status.state === "granted" ? "whenInUse" : status.state === "denied" ? "denied" : "notDetermined";
};
update();
status.addEventListener("change", update);
} catch {}
})();
}
function position(value) {
permission = "whenInUse";
const c = value.coords;
return {
latitude: c.latitude,
longitude: c.longitude,
accuracy: c.accuracy,
altitude: c.altitude ?? 0,
altitudeAccuracy: c.altitudeAccuracy ?? -1,
course: c.heading ?? -1,
speed: c.speed ?? -1,
timestamp: value.timestamp
};
}
function failure(error) {
if (error.code === 1) permission = "denied";
return Object.assign(new Error(error.message), { code: error.code === 1 ? "E_LOCATION_PERMISSION" : "E_LOCATION_UNAVAILABLE" });
}
async function current() {
if (typeof window === "undefined" || !navigator.geolocation) return import_unavailable.Location.getCurrentPosition();
await observe();
return new Promise((resolve, reject) => navigator.geolocation.getCurrentPosition((value) => resolve(position(value)), (error) => reject(failure(error)), {
enableHighAccuracy: true,
maximumAge: 3e4,
timeout: 1e4
}));
}
const Location = Object.freeze({
getPermissionStatus: () => {
if (typeof window === "undefined" || !navigator.geolocation) return "denied";
void observe();
return permission;
},
requestWhenInUsePermission: async () => {
if (typeof window === "undefined" || !navigator.geolocation) return "denied";
try {
await current();
} catch (error) {
if (error.code !== "E_LOCATION_PERMISSION") throw error;
}
return permission;
},
getCurrentPosition: current,
watchPosition: (onPosition, onError, options = {}) => {
if (typeof window === "undefined") return import_unavailable.Location.watchPosition(onPosition, onError, options);
(0, import_validateCallback.validateCallback)(onPosition, "Location.watchPosition: onPosition must be a function");
(0, import_validateCallback.validateCallback)(onError, "Location.watchPosition: onError must be a function");
if (options.background || !navigator.geolocation) {
onError(Object.assign(new Error("Location.watchPosition: background location is unavailable on web"), { code: "E_LOCATION_UNAVAILABLE" }));
return () => {};
}
void observe();
let active = true;
const id = navigator.geolocation.watchPosition((value) => {
if (active) onPosition(position(value));
}, (error) => {
if (active) onError(failure(error));
}, {
enableHighAccuracy: true,
maximumAge: 3e4,
timeout: 1e4
});
return () => {
active = false;
navigator.geolocation.clearWatch(id);
};
},
geocodeAddress: import_unavailable.Location.geocodeAddress,
reverseGeocode: import_unavailable.Location.reverseGeocode,
requestAlwaysAuthorization: () => Promise.resolve("denied"),
startMonitoring: (region) => {
(0, import_validation.assertRegion)(region, "startMonitoring");
return Promise.resolve();
},
stopMonitoring: (identifier) => {
(0, import_validation.assertIdentifier)(identifier, "stopMonitoring");
return Promise.resolve();
},
monitoredRegions: () => [],
requestState: (identifier) => {
(0, import_validation.assertIdentifier)(identifier, "requestState");
return Promise.resolve("unknown");
},
addDidEnterRegionListener: (listener) => {
(0, import_validation.assertRegionListener)(listener, "addDidEnterRegionListener");
return { remove: () => {} };
},
addDidExitRegionListener: (listener) => {
(0, import_validation.assertRegionListener)(listener, "addDidExitRegionListener");
return { remove: () => {} };
}
});