one
Version:
One is a React framework for web, iOS, and Android apps.
115 lines (112 loc) • 3.83 kB
JavaScript
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