UNPKG

one

Version:

One is a React framework for web, iOS, and Android apps.

134 lines (133 loc) • 4.89 kB
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: () => {} }; } });