UNPKG

one

Version:

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

115 lines (112 loc) • 3.83 kB
import { Location as Location$1 } from "./unavailable.mjs"; import { validateCallback } from "../validateCallback.mjs"; import { assertIdentifier, assertRegion, assertRegionListener } from "./validation.mjs"; 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 Location$1.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 Location$1.watchPosition(onPosition, onError, options); validateCallback(onPosition, "Location.watchPosition: onPosition must be a function"); 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: Location$1.geocodeAddress, reverseGeocode: Location$1.reverseGeocode, requestAlwaysAuthorization: () => Promise.resolve("denied"), startMonitoring: (region) => { assertRegion(region, "startMonitoring"); return Promise.resolve(); }, stopMonitoring: (identifier) => { assertIdentifier(identifier, "stopMonitoring"); return Promise.resolve(); }, monitoredRegions: () => [], requestState: (identifier) => { assertIdentifier(identifier, "requestState"); return Promise.resolve("unknown"); }, addDidEnterRegionListener: (listener) => { assertRegionListener(listener, "addDidEnterRegionListener"); return { remove: () => {} }; }, addDidExitRegionListener: (listener) => { assertRegionListener(listener, "addDidExitRegionListener"); return { remove: () => {} }; } }); export { Location }; //# sourceMappingURL=index.mjs.map