UNPKG

@astrolinux/react-native-beacons-manager

Version:

React-Native library for detecting beacons (iOS and Android)

452 lines (405 loc) 12.1 kB
// @flow // #region imports const RN = require('react-native'); import { type BeaconRegion, type BeaconsManagerANDROID, type Parser, } from './module.types'; import { PARSER_IBEACON, PARSER_ESTIMOTE, PARSER_ALTBEACON, PARSER_EDDYSTONE_TLM, PARSER_EDDYSTONE_UID, PARSER_EDDYSTONE_URL, transmissionSupport, } from './module.types'; // #endregion // #region instanciation and constants const BeaconsManager: BeaconsManagerANDROID = RN.NativeModules.BeaconsAndroidModule; const BeaconsEventEmitter = RN.DeviceEventEmitter; const ARMA_RSSI_FILTER = BeaconsManager && BeaconsManager.ARMA_RSSI_FILTER || undefined; const RUNNING_AVG_RSSI_FILTER = BeaconsManager && BeaconsManager.RUNNING_AVG_RSSI_FILTER || undefined; // #endregion function setHardwareEqualityEnforced(flag: boolean): void { BeaconsManager.setHardwareEqualityEnforced(flag); } // #region iBeacon /** * set beacon layout for iBeacon * */ function detectIBeacons(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.addParser(PARSER_IBEACON, resolve, reject); }); } /** * same as detectIBeacons (intoduced in v1.1.0) * adds iBeacon parser to detect them * */ function addIBeaconsDetection(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.addParser(PARSER_IBEACON, resolve, reject); }); } /** * removes iBeacon parser to stop detecting them * */ function removeIBeaconsDetection(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.removeParser(PARSER_IBEACON, resolve, reject); }); } // #enregion // #region altBeacon /** * set beacon layout for alBeacon * */ function detectAltBeacons(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.addParser(PARSER_ALTBEACON, resolve, reject); }); } function addAltBeaconsDetection(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.addParser(PARSER_ALTBEACON, resolve, reject); }); } function removeAltBeaconsDetection(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.removeParser(PARSER_ALTBEACON, resolve, reject); }); } // #endregion // #region estimote /** * set beacon layout for estimote * */ function detectEstimotes(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.addParser(PARSER_ESTIMOTE, resolve, reject); }); } function addEstimotesDetection(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.addParser(PARSER_ESTIMOTE, resolve, reject); }); } function removeEstimotesDetection(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.removeParser(PARSER_ESTIMOTE, resolve, reject); }); } // #endregion // #region eddystone UID /** * set beacon layout for eddystone UID * */ function detectEddystoneUID(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.addParser(PARSER_EDDYSTONE_UID, resolve, reject); }); } /** * same as detectEddystoneUID (intoduced in v1.1.0) * adds EddystoneUID parser to detect them * */ function addEddystoneUIDDetection(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.addParser(PARSER_EDDYSTONE_UID, resolve, reject); }); } /** * removes EddystoneUID parser to stop detecting them * */ function removeEddystoneUIDDetection(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.removeParser(PARSER_EDDYSTONE_UID, resolve, reject); }); } // #endregion // #region eddystone URL /** * set beacon layout for eddystone URL * */ function detectEddystoneURL(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.addParser(PARSER_EDDYSTONE_URL, resolve, reject); }); } function addEddystoneURLDetection(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.addParser(PARSER_EDDYSTONE_URL, resolve, reject); }); } function removeEddystoneURLDetection(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.removeParser(PARSER_EDDYSTONE_URL, resolve, reject); }); } // #endregion // #region eddystone TLM /** * set beacon layout for eddystone TLM * */ function detectEddystoneTLM(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.addParser(PARSER_EDDYSTONE_TLM, resolve, reject); }); } function addEddystoneTLMDetection(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.addParser(PARSER_EDDYSTONE_TLM, resolve, reject); }); } function removeEddystoneTLMDetection(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.removeParser(PARSER_EDDYSTONE_TLM, resolve, reject); }); } // #endregion // #region custom beacon (set your parser) /** * set beacon for custom layout * */ function detectCustomBeaconLayout(parser: number): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.addParser(parser, resolve, reject); }); } function addCustomBeaconLayoutDetection(parser: number): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.addParser(parser, resolve, reject); }); } function removeCustomBeaconLayoutDetection(parser: number): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.removeParser(parser, resolve, reject); }); } // #endregion // #region add remove multiple parsers in a row function addParsersListToDetection(parsers: Array<Parser>) { return new Promise((resolve, reject) => { BeaconsManager.addParsersListToDetection(parsers, resolve, reject); }); } function removeParsersListToDetection(parsers: Array<Parser>) { return new Promise((resolve, reject) => { BeaconsManager.removeParsersListToDetection(parsers, resolve, reject); }); } // #endregion function setBackgroundScanPeriod(period: number): void { BeaconsManager.setBackgroundScanPeriod(period); } function setBackgroundBetweenScanPeriod(period: number): void { BeaconsManager.setBackgroundBetweenScanPeriod(period); } function setForegroundScanPeriod(period: number): void { BeaconsManager.setForegroundScanPeriod(period); } function setRssiFilter(filterType: number, avgModifier: number): void { BeaconsManager.setRssiFilter(filterType, avgModifier); } function getRangedRegions(): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.getRangedRegions(resolve); }); } /** * get monitored regions * * @returns {Promise<Array<BeaconRegion>>} promise resolve to an array of monitored regions */ function getMonitoredRegions(): Promise<Array<BeaconRegion>> { return new Promise((resolve, reject) => { BeaconsManager.getMonitoredRegions(resolve); }); } /** * check if beacon support transmission * * @returns {Promise<number>} promise resolve to an integer */ function checkTransmissionSupported(): Promise<number> { return new Promise((resolve, reject) => { BeaconsManager.checkTransmissionSupported(status => resolve(transmissionSupport[status]), ); }); } /** * start monitoring for a region * * @param {Object: BeaconRegion} region region to monitor (identifier + uuid -> major and minor are optional) * @returns {Promise<any>} promise resolves to void or error */ function startMonitoringForRegion(region: BeaconRegion): Promise<any> { return new Promise((resolve, reject) => { // NOTE: major and minor are optional values: if user don't assign them we have to send a null value (not undefined): BeaconsManager.startMonitoring( region.identifier, region.uuid, region.minor ? region.minor : -1, region.major ? region.major : -1, resolve, reject, ); }); } /** * stops monittorings for a region * * @param {BeaconRegion} region region (see BeaconRegion type) * @returns {Promise<any>} promise resolves to void or error */ function stopMonitoringForRegion(region: BeaconRegion): Promise<any> { return new Promise((resolve, reject) => { BeaconsManager.stopMonitoring( region.identifier, region.uuid, region.minor ? region.minor : -1, region.major ? region.major : -1, resolve, reject, ); }); } /** * start ranging a region (with optional UUID) * * @param {String | BeaconRegion} regionId if string or region: BeaconRegion object * @param {String} [beaconsUUID] optional UUID * @returns {Promise<any>} promise resolves to void or error */ function startRangingBeaconsInRegion( region: BeaconRegion | string, beaconsUUID?: string, ): Promise<any> { if (typeof region === 'object') { return new Promise((resolve, reject) => { BeaconsManager.startRanging( // $FlowIgnore region.identifier, // $FlowIgnore region.uuid, resolve, reject, ); }); } return new Promise((resolve, reject) => { BeaconsManager.startRanging(region, beaconsUUID, resolve, reject); }); } /** * Stops the range scan for beacons * * @param {String | BeaconRegion} regionId if string or region: BeaconRegion object * @param {string} beaconsUUID optional UUID within the specified region * @returns {Promise<any>} promise: resolves to void when successful */ function stopRangingBeaconsInRegion( region: BeaconRegion | string, beaconsUUID?: string, ): Promise<any> { if (typeof region === 'object') { return new Promise((resolve, reject) => { BeaconsManager.stopRanging( // $FlowIgnore region.identifier, // $FlowIgnore region.uuid, resolve, reject, ); }); } return new Promise((resolve, reject) => { // $FlowIgnore BeaconsManager.stopRanging(region, beaconsUUID, resolve, reject); }); } /** * Retrieves the state of a region asynchronously. * * @param {BeaconRegion} region region (identifier + uuid -> major and minor are optional) */ function requestStateForRegion(region: BeaconRegion): void { BeaconsManager.requestStateForRegion( region.identifier, region.uuid, region.minor ? region.minor : -1, region.major ? region.major : -1, ); } module.exports = { // parsers constants PARSER_IBEACON, PARSER_ESTIMOTE, PARSER_ALTBEACON, PARSER_EDDYSTONE_TLM, PARSER_EDDYSTONE_UID, PARSER_EDDYSTONE_URL, BeaconsEventEmitter, setHardwareEqualityEnforced, // iBeacons: detectIBeacons, addIBeaconsDetection, removeIBeaconsDetection, // alt beacons: detectAltBeacons, addAltBeaconsDetection, removeAltBeaconsDetection, // Estimotes beacon: detectEstimotes, addEstimotesDetection, removeEstimotesDetection, // Eddystone UID beacons: detectEddystoneUID, addEddystoneUIDDetection, removeEddystoneUIDDetection, // Eddystone TLM beacons: detectEddystoneTLM, addEddystoneTLMDetection, removeEddystoneTLMDetection, // Eddystone URL beacons: detectEddystoneURL, addEddystoneURLDetection, removeEddystoneURLDetection, // custom layout beacons (NOTE: create 'valid UUID' with websites like, for instance, this one: https://openuuid.net): detectCustomBeaconLayout, addCustomBeaconLayoutDetection, removeCustomBeaconLayoutDetection, addParsersListToDetection, removeParsersListToDetection, setBackgroundScanPeriod, setBackgroundBetweenScanPeriod, setForegroundScanPeriod, setRssiFilter, checkTransmissionSupported, getRangedRegions, ARMA_RSSI_FILTER, RUNNING_AVG_RSSI_FILTER, getMonitoredRegions, // common with iOS: startMonitoringForRegion, startRangingBeaconsInRegion, stopMonitoringForRegion, stopRangingBeaconsInRegion, requestStateForRegion, };