expo-beacon 0.10.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -260,6 +260,7 @@ function BeaconScreen() {
260
260
  | `pairedBeacons` / `pairedEddystones` | Reactive lists of paired devices. |
261
261
  | `inRange` | Paired beacons currently in range, derived live from enter/exit/distance/timeout events (`InRangeBeacon[]`). |
262
262
  | `isMonitoring` | Whether background monitoring is active. |
263
+ | `isEventLoggingEnabled` | Whether SQLite event logging is enabled (kept in sync by the logging actions). |
263
264
  | `refreshPaired()` | Re-read the paired lists from native. |
264
265
  | `pairBeacon()` / `unpairBeacon()` | Pair / unpair an iBeacon, then refresh. |
265
266
  | `pairEddystone()` / `unpairEddystone()` | Pair / unpair an Eddystone, then refresh. |
@@ -267,6 +268,13 @@ function BeaconScreen() {
267
268
  | `startContinuousScan()` / `stopContinuousScan()` | Live scan; results arrive via `onBeaconFound` / `onEddystoneFound`. |
268
269
  | `cancelScan()` | Cancel an in-progress one-shot scan. |
269
270
  | `startMonitoring()` / `stopMonitoring()` | Start / stop background monitoring. |
271
+ | `getMonitoringConfig()` | Read the current monitoring config + active-state snapshot. |
272
+ | `getMonitoredDeviceState()` / `getMonitoredDeviceStates()` | Native state snapshot for one / all paired devices. |
273
+ | `setNotificationConfig()` | Persist notification configuration for monitoring sessions. |
274
+ | `enableEventLogging()` / `disableEventLogging()` | Toggle SQLite logging (updates `isEventLoggingEnabled`). |
275
+ | `getEventLogs()` / `clearEventLogs()` / `destroyEventLogs()` | Read / clear / drop the persisted event log. |
276
+ | `setApiEndpoint()` / `getApiEndpoint()` | Configure / read the native event-forwarding endpoint. |
277
+ | `isBatteryOptimizationExempt()` / `requestBatteryOptimizationExemption()` | Check / request Android battery-optimization exemption. |
270
278
  | `requestPermissions()` | Request the permissions needed for scanning / monitoring. |
271
279
 
272
280
  `inRange` reflects **monitored (paired)** beacons only. Continuous-scan results
@@ -1,4 +1,4 @@
1
- import type { BeaconDistanceEvent, BeaconErrorEvent, BeaconRegionEvent, BeaconScanResult, BeaconTimeoutEvent, EddystoneDistanceEvent, EddystoneRegionEvent, EddystoneScanResult, EddystoneTimeoutEvent, MonitoringOptions, PairedBeacon, PairedEddystone } from "../ExpoBeacon.types";
1
+ import type { BeaconDistanceEvent, BeaconErrorEvent, BeaconRegionEvent, BeaconScanResult, BeaconTimeoutEvent, EddystoneDistanceEvent, EddystoneRegionEvent, EddystoneScanResult, EddystoneTimeoutEvent, EventLogEntry, EventLogQueryOptions, MonitoredDeviceState, MonitoringConfig, MonitoringOptions, NotificationConfig, PairedBeacon, PairedEddystone } from "../ExpoBeacon.types";
2
2
  /**
3
3
  * A monitored beacon that is currently within range, as tracked by
4
4
  * {@link useBeacon} from live enter / exit / distance / timeout events.
@@ -62,6 +62,8 @@ export interface UseBeaconResult {
62
62
  inRange: InRangeBeacon[];
63
63
  /** Whether background region monitoring is currently active. */
64
64
  isMonitoring: boolean;
65
+ /** Whether SQLite event logging is currently enabled. */
66
+ isEventLoggingEnabled: boolean;
65
67
  /** Re-read paired beacons from the native store. */
66
68
  refreshPaired: () => void;
67
69
  pairBeacon: (identifier: string, uuid: string, major: number, minor: number, name?: string, timeoutSeconds?: number) => void;
@@ -79,6 +81,36 @@ export interface UseBeaconResult {
79
81
  stopContinuousScan: () => void;
80
82
  startMonitoring: (options?: MonitoringOptions | number) => Promise<void>;
81
83
  stopMonitoring: () => Promise<void>;
84
+ /** Read the current monitoring configuration and active-state snapshot. */
85
+ getMonitoringConfig: () => MonitoringConfig;
86
+ /** State snapshot for one paired device, or `null` when the identifier is unknown. */
87
+ getMonitoredDeviceState: (identifier: string) => MonitoredDeviceState | null;
88
+ /** State snapshot for all paired devices. */
89
+ getMonitoredDeviceStates: () => MonitoredDeviceState[];
90
+ /** Persist notification configuration applied to subsequent monitoring sessions. */
91
+ setNotificationConfig: (config: NotificationConfig) => void;
92
+ /** Enable SQLite event logging (updates `isEventLoggingEnabled`). */
93
+ enableEventLogging: () => void;
94
+ /** Disable SQLite event logging (updates `isEventLoggingEnabled`). */
95
+ disableEventLogging: () => void;
96
+ /** Retrieve logged events, optionally filtered. */
97
+ getEventLogs: (options?: EventLogQueryOptions) => EventLogEntry[];
98
+ /** Delete all logged events (keeps logging enabled). */
99
+ clearEventLogs: () => void;
100
+ /** Delete the event-log database and disable logging. */
101
+ destroyEventLogs: () => void;
102
+ /** Configure a native API endpoint for background event forwarding. */
103
+ setApiEndpoint: (url: string, apiKey?: string, id?: string) => void;
104
+ /** Read the current API forwarding configuration. */
105
+ getApiEndpoint: () => {
106
+ url: string | null;
107
+ apiKey: string | null;
108
+ id: string | null;
109
+ };
110
+ /** Whether the app is exempt from Android battery optimizations (always `true` on iOS / web). */
111
+ isBatteryOptimizationExempt: () => boolean;
112
+ /** Request exemption from Android battery optimizations (opens the system dialog). */
113
+ requestBatteryOptimizationExemption: () => Promise<boolean>;
82
114
  /** Request the platform permissions needed for scanning and monitoring. */
83
115
  requestPermissions: () => Promise<boolean>;
84
116
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useBeacon.d.ts","sourceRoot":"","sources":["../../src/hooks/useBeacon.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useBeacon.d.ts","sourceRoot":"","sources":["../../src/hooks/useBeacon.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@ export function useBeacon(options = {}) {
22
22
  const [pairedBeacons, setPairedBeacons] = useState([]);
23
23
  const [pairedEddystones, setPairedEddystones] = useState([]);
24
24
  const [isMonitoring, setIsMonitoring] = useState(false);
25
+ const [isEventLoggingEnabled, setIsEventLoggingEnabled] = useState(false);
25
26
  const [inRangeMap, setInRangeMap] = useState({});
26
27
  const refreshPaired = useCallback(() => {
27
28
  setPairedBeacons(ExpoBeacon.getPairedBeacons());
@@ -42,6 +43,12 @@ export function useBeacon(options = {}) {
42
43
  catch {
43
44
  /* unsupported platform */
44
45
  }
46
+ try {
47
+ setIsEventLoggingEnabled(ExpoBeacon.isEventLoggingEnabled());
48
+ }
49
+ catch {
50
+ /* unsupported platform */
51
+ }
45
52
  if (handlers.current.track === false)
46
53
  return;
47
54
  try {
@@ -200,6 +207,28 @@ export function useBeacon(options = {}) {
200
207
  await ExpoBeacon.stopMonitoring();
201
208
  setIsMonitoring(false);
202
209
  }, []);
210
+ const getMonitoringConfig = useCallback(() => ExpoBeacon.getMonitoringConfig(), []);
211
+ const getMonitoredDeviceState = useCallback((identifier) => ExpoBeacon.getMonitoredDeviceState(identifier), []);
212
+ const getMonitoredDeviceStates = useCallback(() => ExpoBeacon.getMonitoredDeviceStates(), []);
213
+ const setNotificationConfig = useCallback((config) => ExpoBeacon.setNotificationConfig(config), []);
214
+ const enableEventLogging = useCallback(() => {
215
+ ExpoBeacon.enableEventLogging();
216
+ setIsEventLoggingEnabled(true);
217
+ }, []);
218
+ const disableEventLogging = useCallback(() => {
219
+ ExpoBeacon.disableEventLogging();
220
+ setIsEventLoggingEnabled(false);
221
+ }, []);
222
+ const getEventLogs = useCallback((opts) => ExpoBeacon.getEventLogs(opts), []);
223
+ const clearEventLogs = useCallback(() => ExpoBeacon.clearEventLogs(), []);
224
+ const destroyEventLogs = useCallback(() => {
225
+ ExpoBeacon.destroyEventLogs();
226
+ setIsEventLoggingEnabled(false);
227
+ }, []);
228
+ const setApiEndpoint = useCallback((url, apiKey, id) => ExpoBeacon.setApiEndpoint(url, apiKey, id), []);
229
+ const getApiEndpoint = useCallback(() => ExpoBeacon.getApiEndpoint(), []);
230
+ const isBatteryOptimizationExempt = useCallback(() => ExpoBeacon.isBatteryOptimizationExempt(), []);
231
+ const requestBatteryOptimizationExemption = useCallback(() => ExpoBeacon.requestBatteryOptimizationExemption(), []);
203
232
  const requestPermissions = useCallback(() => ExpoBeacon.requestPermissionsAsync(), []);
204
233
  const inRange = useMemo(() => Object.values(inRangeMap), [inRangeMap]);
205
234
  return {
@@ -207,6 +236,7 @@ export function useBeacon(options = {}) {
207
236
  pairedEddystones,
208
237
  inRange,
209
238
  isMonitoring,
239
+ isEventLoggingEnabled,
210
240
  refreshPaired,
211
241
  pairBeacon,
212
242
  unpairBeacon,
@@ -219,6 +249,19 @@ export function useBeacon(options = {}) {
219
249
  stopContinuousScan,
220
250
  startMonitoring,
221
251
  stopMonitoring,
252
+ getMonitoringConfig,
253
+ getMonitoredDeviceState,
254
+ getMonitoredDeviceStates,
255
+ setNotificationConfig,
256
+ enableEventLogging,
257
+ disableEventLogging,
258
+ getEventLogs,
259
+ clearEventLogs,
260
+ destroyEventLogs,
261
+ setApiEndpoint,
262
+ getApiEndpoint,
263
+ isBatteryOptimizationExempt,
264
+ requestBatteryOptimizationExemption,
222
265
  requestPermissions,
223
266
  };
224
267
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useBeacon.js","sourceRoot":"","sources":["../../src/hooks/useBeacon.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport ExpoBeacon from \"../ExpoBeaconModule.js\";\nimport type {\n BeaconDistanceEvent,\n BeaconErrorEvent,\n BeaconRegionEvent,\n BeaconScanResult,\n BeaconTimeoutEvent,\n EddystoneDistanceEvent,\n EddystoneRegionEvent,\n EddystoneScanResult,\n EddystoneTimeoutEvent,\n MonitoringOptions,\n PairedBeacon,\n PairedEddystone,\n} from \"../ExpoBeacon.types\";\n\n/**\n * A monitored beacon that is currently within range, as tracked by\n * {@link useBeacon} from live enter / exit / distance / timeout events.\n */\nexport type InRangeBeacon =\n | {\n kind: \"ibeacon\";\n identifier: string;\n uuid: string;\n major: number;\n minor: number;\n /** Latest measured distance in metres (-1 when unavailable). */\n distance: number;\n /** Latest RSSI in dBm, when reported by the event. */\n rssi?: number;\n /** Epoch ms of the most recent reading for this beacon. */\n lastSeen: number;\n }\n | {\n kind: \"eddystone\";\n identifier: string;\n namespace: string;\n instance: string;\n /** Latest measured distance in metres (-1 when unavailable). */\n distance: number;\n /** Latest RSSI in dBm, when reported by the event. */\n rssi?: number;\n /** Epoch ms of the most recent reading for this beacon. */\n lastSeen: number;\n };\n\nexport interface UseBeaconOptions {\n onBeaconEnter?: (event: BeaconRegionEvent) => void;\n onBeaconExit?: (event: BeaconRegionEvent) => void;\n onBeaconDistance?: (event: BeaconDistanceEvent) => void;\n onBeaconTimeout?: (event: BeaconTimeoutEvent) => void;\n /** Fired for each iBeacon seen during a continuous scan (see `startContinuousScan`). */\n onBeaconFound?: (event: BeaconScanResult) => void;\n onEddystoneEnter?: (event: EddystoneRegionEvent) => void;\n onEddystoneExit?: (event: EddystoneRegionEvent) => void;\n onEddystoneDistance?: (event: EddystoneDistanceEvent) => void;\n onEddystoneTimeout?: (event: EddystoneTimeoutEvent) => void;\n /** Fired for each Eddystone seen during a continuous scan (see `startContinuousScan`). */\n onEddystoneFound?: (event: EddystoneScanResult) => void;\n /** Fired on native monitoring / ranging failures. */\n onError?: (event: BeaconErrorEvent) => void;\n /**\n * Maintain the reactive `inRange` list from monitoring events. Set to `false`\n * if you only want the event callbacks above. Default: `true`.\n */\n track?: boolean;\n}\n\nexport interface UseBeaconResult {\n /** Paired iBeacons, refreshed by the pairing actions and `refreshPaired`. */\n pairedBeacons: PairedBeacon[];\n /** Paired Eddystone beacons. */\n pairedEddystones: PairedEddystone[];\n /**\n * Paired beacons currently within range, derived live from monitoring\n * enter / exit / distance / timeout events (empty when `track` is `false`).\n * Continuous-scan \"found\" events are delivered via the `onBeaconFound` /\n * `onEddystoneFound` callbacks instead — they carry no paired identifier.\n */\n inRange: InRangeBeacon[];\n /** Whether background region monitoring is currently active. */\n isMonitoring: boolean;\n\n /** Re-read paired beacons from the native store. */\n refreshPaired: () => void;\n pairBeacon: (\n identifier: string,\n uuid: string,\n major: number,\n minor: number,\n name?: string,\n timeoutSeconds?: number,\n ) => void;\n unpairBeacon: (identifier: string) => void;\n pairEddystone: (\n identifier: string,\n namespace: string,\n instance: string,\n name?: string,\n timeoutSeconds?: number,\n ) => void;\n unpairEddystone: (identifier: string) => void;\n\n /** One-shot iBeacon scan; resolves with discovered beacons. */\n scanForBeacons: (\n uuids?: string[],\n scanDuration?: number,\n ) => Promise<BeaconScanResult[]>;\n /** One-shot Eddystone scan; resolves with discovered beacons. */\n scanForEddystones: (scanDuration?: number) => Promise<EddystoneScanResult[]>;\n /** Cancel any in-progress one-shot scan. */\n cancelScan: () => void;\n /** Start a continuous scan; results stream via `onBeaconFound` / `onEddystoneFound`. */\n startContinuousScan: () => void;\n stopContinuousScan: () => void;\n\n startMonitoring: (options?: MonitoringOptions | number) => Promise<void>;\n stopMonitoring: () => Promise<void>;\n\n /** Request the platform permissions needed for scanning and monitoring. */\n requestPermissions: () => Promise<boolean>;\n}\n\n/**\n * Manage iBeacon / Eddystone scanning and background monitoring.\n *\n * Subscribes to the native beacon events for the lifetime of the component,\n * keeps `pairedBeacons`, `inRange`, and `isMonitoring` in sync, and exposes\n * stable action wrappers. Event callbacks passed in `options` are always\n * invoked with the latest values without re-subscribing.\n *\n * ```tsx\n * const { inRange, isMonitoring, startMonitoring } = useBeacon({\n * onBeaconEnter: (e) => console.log(\"entered\", e.identifier),\n * });\n * ```\n */\nexport function useBeacon(options: UseBeaconOptions = {}): UseBeaconResult {\n // Hold the latest callbacks/flags in a ref so the subscription effect can run\n // once on mount yet always call the current handlers.\n const handlers = useRef(options);\n handlers.current = options;\n\n const [pairedBeacons, setPairedBeacons] = useState<PairedBeacon[]>([]);\n const [pairedEddystones, setPairedEddystones] = useState<PairedEddystone[]>(\n [],\n );\n const [isMonitoring, setIsMonitoring] = useState(false);\n const [inRangeMap, setInRangeMap] = useState<Record<string, InRangeBeacon>>(\n {},\n );\n\n const refreshPaired = useCallback(() => {\n setPairedBeacons(ExpoBeacon.getPairedBeacons());\n setPairedEddystones(ExpoBeacon.getPairedEddystones());\n }, []);\n\n // Seed reactive state from the native snapshot on mount. Wrapped in try/catch\n // because the web stub throws for these getters (unsupported platform).\n useEffect(() => {\n try {\n refreshPaired();\n } catch {\n /* unsupported platform */\n }\n try {\n setIsMonitoring(ExpoBeacon.getMonitoringConfig().isMonitoring);\n } catch {\n /* unsupported platform */\n }\n if (handlers.current.track === false) return;\n try {\n const now = Date.now();\n const seed: Record<string, InRangeBeacon> = {};\n for (const s of ExpoBeacon.getMonitoredDeviceStates()) {\n if (s.state !== \"entered\") continue;\n seed[s.identifier] =\n s.kind === \"ibeacon\"\n ? {\n kind: \"ibeacon\",\n identifier: s.identifier,\n uuid: s.uuid,\n major: s.major,\n minor: s.minor,\n distance: s.distance ?? -1,\n lastSeen: now,\n }\n : {\n kind: \"eddystone\",\n identifier: s.identifier,\n namespace: s.namespace,\n instance: s.instance,\n distance: s.distance ?? -1,\n lastSeen: now,\n };\n }\n setInRangeMap(seed);\n } catch {\n /* unsupported platform */\n }\n }, [refreshPaired]);\n\n // Subscribe to all beacon events once; route to inRange state + callbacks.\n useEffect(() => {\n const tracking = () => handlers.current.track !== false;\n\n const upsertIBeacon = (e: {\n identifier: string;\n uuid: string;\n major: number;\n minor: number;\n distance: number;\n rssi?: number;\n }) => {\n if (!tracking()) return;\n setInRangeMap((m) => ({\n ...m,\n [e.identifier]: {\n kind: \"ibeacon\",\n identifier: e.identifier,\n uuid: e.uuid,\n major: e.major,\n minor: e.minor,\n distance: e.distance,\n rssi: e.rssi,\n lastSeen: Date.now(),\n },\n }));\n };\n const upsertEddystone = (e: {\n identifier: string;\n namespace: string;\n instance: string;\n distance: number;\n rssi?: number;\n }) => {\n if (!tracking()) return;\n setInRangeMap((m) => ({\n ...m,\n [e.identifier]: {\n kind: \"eddystone\",\n identifier: e.identifier,\n namespace: e.namespace,\n instance: e.instance,\n distance: e.distance,\n rssi: e.rssi,\n lastSeen: Date.now(),\n },\n }));\n };\n const remove = (identifier: string) => {\n if (!tracking()) return;\n setInRangeMap((m) => {\n if (!(identifier in m)) return m;\n const next = { ...m };\n delete next[identifier];\n return next;\n });\n };\n\n const subs = [\n ExpoBeacon.addListener(\"onBeaconEnter\", (e) => {\n upsertIBeacon(e);\n handlers.current.onBeaconEnter?.(e);\n }),\n ExpoBeacon.addListener(\"onBeaconDistance\", (e) => {\n upsertIBeacon(e);\n handlers.current.onBeaconDistance?.(e);\n }),\n ExpoBeacon.addListener(\"onBeaconExit\", (e) => {\n remove(e.identifier);\n handlers.current.onBeaconExit?.(e);\n }),\n ExpoBeacon.addListener(\"onBeaconTimeout\", (e) => {\n remove(e.identifier);\n handlers.current.onBeaconTimeout?.(e);\n }),\n ExpoBeacon.addListener(\"onEddystoneEnter\", (e) => {\n upsertEddystone(e);\n handlers.current.onEddystoneEnter?.(e);\n }),\n ExpoBeacon.addListener(\"onEddystoneDistance\", (e) => {\n upsertEddystone(e);\n handlers.current.onEddystoneDistance?.(e);\n }),\n ExpoBeacon.addListener(\"onEddystoneExit\", (e) => {\n remove(e.identifier);\n handlers.current.onEddystoneExit?.(e);\n }),\n ExpoBeacon.addListener(\"onEddystoneTimeout\", (e) => {\n remove(e.identifier);\n handlers.current.onEddystoneTimeout?.(e);\n }),\n ExpoBeacon.addListener(\"onBeaconFound\", (e) => {\n handlers.current.onBeaconFound?.(e);\n }),\n ExpoBeacon.addListener(\"onEddystoneFound\", (e) => {\n handlers.current.onEddystoneFound?.(e);\n }),\n ExpoBeacon.addListener(\"onBeaconError\", (e) => {\n handlers.current.onError?.(e);\n }),\n ];\n\n return () => {\n for (const sub of subs) sub.remove();\n };\n }, []);\n\n const pairBeacon = useCallback<UseBeaconResult[\"pairBeacon\"]>(\n (identifier, uuid, major, minor, name, timeoutSeconds) => {\n ExpoBeacon.pairBeacon(identifier, uuid, major, minor, name, timeoutSeconds);\n refreshPaired();\n },\n [refreshPaired],\n );\n const unpairBeacon = useCallback(\n (identifier: string) => {\n ExpoBeacon.unpairBeacon(identifier);\n refreshPaired();\n },\n [refreshPaired],\n );\n const pairEddystone = useCallback<UseBeaconResult[\"pairEddystone\"]>(\n (identifier, namespace, instance, name, timeoutSeconds) => {\n ExpoBeacon.pairEddystone(identifier, namespace, instance, name, timeoutSeconds);\n refreshPaired();\n },\n [refreshPaired],\n );\n const unpairEddystone = useCallback(\n (identifier: string) => {\n ExpoBeacon.unpairEddystone(identifier);\n refreshPaired();\n },\n [refreshPaired],\n );\n\n const scanForBeacons = useCallback(\n (uuids?: string[], scanDuration?: number) =>\n ExpoBeacon.scanForBeaconsAsync(uuids, scanDuration),\n [],\n );\n const scanForEddystones = useCallback(\n (scanDuration?: number) => ExpoBeacon.scanForEddystonesAsync(scanDuration),\n [],\n );\n const cancelScan = useCallback(() => ExpoBeacon.cancelScan(), []);\n const startContinuousScan = useCallback(\n () => ExpoBeacon.startContinuousScan(),\n [],\n );\n const stopContinuousScan = useCallback(\n () => ExpoBeacon.stopContinuousScan(),\n [],\n );\n\n const startMonitoring = useCallback(\n async (opts?: MonitoringOptions | number) => {\n await ExpoBeacon.startMonitoring(opts);\n setIsMonitoring(true);\n },\n [],\n );\n const stopMonitoring = useCallback(async () => {\n await ExpoBeacon.stopMonitoring();\n setIsMonitoring(false);\n }, []);\n\n const requestPermissions = useCallback(\n () => ExpoBeacon.requestPermissionsAsync(),\n [],\n );\n\n const inRange = useMemo(() => Object.values(inRangeMap), [inRangeMap]);\n\n return {\n pairedBeacons,\n pairedEddystones,\n inRange,\n isMonitoring,\n refreshPaired,\n pairBeacon,\n unpairBeacon,\n pairEddystone,\n unpairEddystone,\n scanForBeacons,\n scanForEddystones,\n cancelScan,\n startContinuousScan,\n stopContinuousScan,\n startMonitoring,\n stopMonitoring,\n requestPermissions,\n };\n}\n"]}
1
+ {"version":3,"file":"useBeacon.js","sourceRoot":"","sources":["../../src/hooks/useBeacon.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport ExpoBeacon from \"../ExpoBeaconModule.js\";\nimport type {\n BeaconDistanceEvent,\n BeaconErrorEvent,\n BeaconRegionEvent,\n BeaconScanResult,\n BeaconTimeoutEvent,\n EddystoneDistanceEvent,\n EddystoneRegionEvent,\n EddystoneScanResult,\n EddystoneTimeoutEvent,\n EventLogEntry,\n EventLogQueryOptions,\n MonitoredDeviceState,\n MonitoringConfig,\n MonitoringOptions,\n NotificationConfig,\n PairedBeacon,\n PairedEddystone,\n} from \"../ExpoBeacon.types\";\n\n/**\n * A monitored beacon that is currently within range, as tracked by\n * {@link useBeacon} from live enter / exit / distance / timeout events.\n */\nexport type InRangeBeacon =\n | {\n kind: \"ibeacon\";\n identifier: string;\n uuid: string;\n major: number;\n minor: number;\n /** Latest measured distance in metres (-1 when unavailable). */\n distance: number;\n /** Latest RSSI in dBm, when reported by the event. */\n rssi?: number;\n /** Epoch ms of the most recent reading for this beacon. */\n lastSeen: number;\n }\n | {\n kind: \"eddystone\";\n identifier: string;\n namespace: string;\n instance: string;\n /** Latest measured distance in metres (-1 when unavailable). */\n distance: number;\n /** Latest RSSI in dBm, when reported by the event. */\n rssi?: number;\n /** Epoch ms of the most recent reading for this beacon. */\n lastSeen: number;\n };\n\nexport interface UseBeaconOptions {\n onBeaconEnter?: (event: BeaconRegionEvent) => void;\n onBeaconExit?: (event: BeaconRegionEvent) => void;\n onBeaconDistance?: (event: BeaconDistanceEvent) => void;\n onBeaconTimeout?: (event: BeaconTimeoutEvent) => void;\n /** Fired for each iBeacon seen during a continuous scan (see `startContinuousScan`). */\n onBeaconFound?: (event: BeaconScanResult) => void;\n onEddystoneEnter?: (event: EddystoneRegionEvent) => void;\n onEddystoneExit?: (event: EddystoneRegionEvent) => void;\n onEddystoneDistance?: (event: EddystoneDistanceEvent) => void;\n onEddystoneTimeout?: (event: EddystoneTimeoutEvent) => void;\n /** Fired for each Eddystone seen during a continuous scan (see `startContinuousScan`). */\n onEddystoneFound?: (event: EddystoneScanResult) => void;\n /** Fired on native monitoring / ranging failures. */\n onError?: (event: BeaconErrorEvent) => void;\n /**\n * Maintain the reactive `inRange` list from monitoring events. Set to `false`\n * if you only want the event callbacks above. Default: `true`.\n */\n track?: boolean;\n}\n\nexport interface UseBeaconResult {\n /** Paired iBeacons, refreshed by the pairing actions and `refreshPaired`. */\n pairedBeacons: PairedBeacon[];\n /** Paired Eddystone beacons. */\n pairedEddystones: PairedEddystone[];\n /**\n * Paired beacons currently within range, derived live from monitoring\n * enter / exit / distance / timeout events (empty when `track` is `false`).\n * Continuous-scan \"found\" events are delivered via the `onBeaconFound` /\n * `onEddystoneFound` callbacks instead — they carry no paired identifier.\n */\n inRange: InRangeBeacon[];\n /** Whether background region monitoring is currently active. */\n isMonitoring: boolean;\n /** Whether SQLite event logging is currently enabled. */\n isEventLoggingEnabled: boolean;\n\n /** Re-read paired beacons from the native store. */\n refreshPaired: () => void;\n pairBeacon: (\n identifier: string,\n uuid: string,\n major: number,\n minor: number,\n name?: string,\n timeoutSeconds?: number,\n ) => void;\n unpairBeacon: (identifier: string) => void;\n pairEddystone: (\n identifier: string,\n namespace: string,\n instance: string,\n name?: string,\n timeoutSeconds?: number,\n ) => void;\n unpairEddystone: (identifier: string) => void;\n\n /** One-shot iBeacon scan; resolves with discovered beacons. */\n scanForBeacons: (\n uuids?: string[],\n scanDuration?: number,\n ) => Promise<BeaconScanResult[]>;\n /** One-shot Eddystone scan; resolves with discovered beacons. */\n scanForEddystones: (scanDuration?: number) => Promise<EddystoneScanResult[]>;\n /** Cancel any in-progress one-shot scan. */\n cancelScan: () => void;\n /** Start a continuous scan; results stream via `onBeaconFound` / `onEddystoneFound`. */\n startContinuousScan: () => void;\n stopContinuousScan: () => void;\n\n startMonitoring: (options?: MonitoringOptions | number) => Promise<void>;\n stopMonitoring: () => Promise<void>;\n /** Read the current monitoring configuration and active-state snapshot. */\n getMonitoringConfig: () => MonitoringConfig;\n /** State snapshot for one paired device, or `null` when the identifier is unknown. */\n getMonitoredDeviceState: (identifier: string) => MonitoredDeviceState | null;\n /** State snapshot for all paired devices. */\n getMonitoredDeviceStates: () => MonitoredDeviceState[];\n\n /** Persist notification configuration applied to subsequent monitoring sessions. */\n setNotificationConfig: (config: NotificationConfig) => void;\n\n /** Enable SQLite event logging (updates `isEventLoggingEnabled`). */\n enableEventLogging: () => void;\n /** Disable SQLite event logging (updates `isEventLoggingEnabled`). */\n disableEventLogging: () => void;\n /** Retrieve logged events, optionally filtered. */\n getEventLogs: (options?: EventLogQueryOptions) => EventLogEntry[];\n /** Delete all logged events (keeps logging enabled). */\n clearEventLogs: () => void;\n /** Delete the event-log database and disable logging. */\n destroyEventLogs: () => void;\n\n /** Configure a native API endpoint for background event forwarding. */\n setApiEndpoint: (url: string, apiKey?: string, id?: string) => void;\n /** Read the current API forwarding configuration. */\n getApiEndpoint: () => {\n url: string | null;\n apiKey: string | null;\n id: string | null;\n };\n\n /** Whether the app is exempt from Android battery optimizations (always `true` on iOS / web). */\n isBatteryOptimizationExempt: () => boolean;\n /** Request exemption from Android battery optimizations (opens the system dialog). */\n requestBatteryOptimizationExemption: () => Promise<boolean>;\n\n /** Request the platform permissions needed for scanning and monitoring. */\n requestPermissions: () => Promise<boolean>;\n}\n\n/**\n * Manage iBeacon / Eddystone scanning and background monitoring.\n *\n * Subscribes to the native beacon events for the lifetime of the component,\n * keeps `pairedBeacons`, `inRange`, and `isMonitoring` in sync, and exposes\n * stable action wrappers. Event callbacks passed in `options` are always\n * invoked with the latest values without re-subscribing.\n *\n * ```tsx\n * const { inRange, isMonitoring, startMonitoring } = useBeacon({\n * onBeaconEnter: (e) => console.log(\"entered\", e.identifier),\n * });\n * ```\n */\nexport function useBeacon(options: UseBeaconOptions = {}): UseBeaconResult {\n // Hold the latest callbacks/flags in a ref so the subscription effect can run\n // once on mount yet always call the current handlers.\n const handlers = useRef(options);\n handlers.current = options;\n\n const [pairedBeacons, setPairedBeacons] = useState<PairedBeacon[]>([]);\n const [pairedEddystones, setPairedEddystones] = useState<PairedEddystone[]>(\n [],\n );\n const [isMonitoring, setIsMonitoring] = useState(false);\n const [isEventLoggingEnabled, setIsEventLoggingEnabled] = useState(false);\n const [inRangeMap, setInRangeMap] = useState<Record<string, InRangeBeacon>>(\n {},\n );\n\n const refreshPaired = useCallback(() => {\n setPairedBeacons(ExpoBeacon.getPairedBeacons());\n setPairedEddystones(ExpoBeacon.getPairedEddystones());\n }, []);\n\n // Seed reactive state from the native snapshot on mount. Wrapped in try/catch\n // because the web stub throws for these getters (unsupported platform).\n useEffect(() => {\n try {\n refreshPaired();\n } catch {\n /* unsupported platform */\n }\n try {\n setIsMonitoring(ExpoBeacon.getMonitoringConfig().isMonitoring);\n } catch {\n /* unsupported platform */\n }\n try {\n setIsEventLoggingEnabled(ExpoBeacon.isEventLoggingEnabled());\n } catch {\n /* unsupported platform */\n }\n if (handlers.current.track === false) return;\n try {\n const now = Date.now();\n const seed: Record<string, InRangeBeacon> = {};\n for (const s of ExpoBeacon.getMonitoredDeviceStates()) {\n if (s.state !== \"entered\") continue;\n seed[s.identifier] =\n s.kind === \"ibeacon\"\n ? {\n kind: \"ibeacon\",\n identifier: s.identifier,\n uuid: s.uuid,\n major: s.major,\n minor: s.minor,\n distance: s.distance ?? -1,\n lastSeen: now,\n }\n : {\n kind: \"eddystone\",\n identifier: s.identifier,\n namespace: s.namespace,\n instance: s.instance,\n distance: s.distance ?? -1,\n lastSeen: now,\n };\n }\n setInRangeMap(seed);\n } catch {\n /* unsupported platform */\n }\n }, [refreshPaired]);\n\n // Subscribe to all beacon events once; route to inRange state + callbacks.\n useEffect(() => {\n const tracking = () => handlers.current.track !== false;\n\n const upsertIBeacon = (e: {\n identifier: string;\n uuid: string;\n major: number;\n minor: number;\n distance: number;\n rssi?: number;\n }) => {\n if (!tracking()) return;\n setInRangeMap((m) => ({\n ...m,\n [e.identifier]: {\n kind: \"ibeacon\",\n identifier: e.identifier,\n uuid: e.uuid,\n major: e.major,\n minor: e.minor,\n distance: e.distance,\n rssi: e.rssi,\n lastSeen: Date.now(),\n },\n }));\n };\n const upsertEddystone = (e: {\n identifier: string;\n namespace: string;\n instance: string;\n distance: number;\n rssi?: number;\n }) => {\n if (!tracking()) return;\n setInRangeMap((m) => ({\n ...m,\n [e.identifier]: {\n kind: \"eddystone\",\n identifier: e.identifier,\n namespace: e.namespace,\n instance: e.instance,\n distance: e.distance,\n rssi: e.rssi,\n lastSeen: Date.now(),\n },\n }));\n };\n const remove = (identifier: string) => {\n if (!tracking()) return;\n setInRangeMap((m) => {\n if (!(identifier in m)) return m;\n const next = { ...m };\n delete next[identifier];\n return next;\n });\n };\n\n const subs = [\n ExpoBeacon.addListener(\"onBeaconEnter\", (e) => {\n upsertIBeacon(e);\n handlers.current.onBeaconEnter?.(e);\n }),\n ExpoBeacon.addListener(\"onBeaconDistance\", (e) => {\n upsertIBeacon(e);\n handlers.current.onBeaconDistance?.(e);\n }),\n ExpoBeacon.addListener(\"onBeaconExit\", (e) => {\n remove(e.identifier);\n handlers.current.onBeaconExit?.(e);\n }),\n ExpoBeacon.addListener(\"onBeaconTimeout\", (e) => {\n remove(e.identifier);\n handlers.current.onBeaconTimeout?.(e);\n }),\n ExpoBeacon.addListener(\"onEddystoneEnter\", (e) => {\n upsertEddystone(e);\n handlers.current.onEddystoneEnter?.(e);\n }),\n ExpoBeacon.addListener(\"onEddystoneDistance\", (e) => {\n upsertEddystone(e);\n handlers.current.onEddystoneDistance?.(e);\n }),\n ExpoBeacon.addListener(\"onEddystoneExit\", (e) => {\n remove(e.identifier);\n handlers.current.onEddystoneExit?.(e);\n }),\n ExpoBeacon.addListener(\"onEddystoneTimeout\", (e) => {\n remove(e.identifier);\n handlers.current.onEddystoneTimeout?.(e);\n }),\n ExpoBeacon.addListener(\"onBeaconFound\", (e) => {\n handlers.current.onBeaconFound?.(e);\n }),\n ExpoBeacon.addListener(\"onEddystoneFound\", (e) => {\n handlers.current.onEddystoneFound?.(e);\n }),\n ExpoBeacon.addListener(\"onBeaconError\", (e) => {\n handlers.current.onError?.(e);\n }),\n ];\n\n return () => {\n for (const sub of subs) sub.remove();\n };\n }, []);\n\n const pairBeacon = useCallback<UseBeaconResult[\"pairBeacon\"]>(\n (identifier, uuid, major, minor, name, timeoutSeconds) => {\n ExpoBeacon.pairBeacon(identifier, uuid, major, minor, name, timeoutSeconds);\n refreshPaired();\n },\n [refreshPaired],\n );\n const unpairBeacon = useCallback(\n (identifier: string) => {\n ExpoBeacon.unpairBeacon(identifier);\n refreshPaired();\n },\n [refreshPaired],\n );\n const pairEddystone = useCallback<UseBeaconResult[\"pairEddystone\"]>(\n (identifier, namespace, instance, name, timeoutSeconds) => {\n ExpoBeacon.pairEddystone(identifier, namespace, instance, name, timeoutSeconds);\n refreshPaired();\n },\n [refreshPaired],\n );\n const unpairEddystone = useCallback(\n (identifier: string) => {\n ExpoBeacon.unpairEddystone(identifier);\n refreshPaired();\n },\n [refreshPaired],\n );\n\n const scanForBeacons = useCallback(\n (uuids?: string[], scanDuration?: number) =>\n ExpoBeacon.scanForBeaconsAsync(uuids, scanDuration),\n [],\n );\n const scanForEddystones = useCallback(\n (scanDuration?: number) => ExpoBeacon.scanForEddystonesAsync(scanDuration),\n [],\n );\n const cancelScan = useCallback(() => ExpoBeacon.cancelScan(), []);\n const startContinuousScan = useCallback(\n () => ExpoBeacon.startContinuousScan(),\n [],\n );\n const stopContinuousScan = useCallback(\n () => ExpoBeacon.stopContinuousScan(),\n [],\n );\n\n const startMonitoring = useCallback(\n async (opts?: MonitoringOptions | number) => {\n await ExpoBeacon.startMonitoring(opts);\n setIsMonitoring(true);\n },\n [],\n );\n const stopMonitoring = useCallback(async () => {\n await ExpoBeacon.stopMonitoring();\n setIsMonitoring(false);\n }, []);\n const getMonitoringConfig = useCallback(\n () => ExpoBeacon.getMonitoringConfig(),\n [],\n );\n const getMonitoredDeviceState = useCallback(\n (identifier: string) => ExpoBeacon.getMonitoredDeviceState(identifier),\n [],\n );\n const getMonitoredDeviceStates = useCallback(\n () => ExpoBeacon.getMonitoredDeviceStates(),\n [],\n );\n\n const setNotificationConfig = useCallback(\n (config: NotificationConfig) => ExpoBeacon.setNotificationConfig(config),\n [],\n );\n\n const enableEventLogging = useCallback(() => {\n ExpoBeacon.enableEventLogging();\n setIsEventLoggingEnabled(true);\n }, []);\n const disableEventLogging = useCallback(() => {\n ExpoBeacon.disableEventLogging();\n setIsEventLoggingEnabled(false);\n }, []);\n const getEventLogs = useCallback(\n (opts?: EventLogQueryOptions) => ExpoBeacon.getEventLogs(opts),\n [],\n );\n const clearEventLogs = useCallback(() => ExpoBeacon.clearEventLogs(), []);\n const destroyEventLogs = useCallback(() => {\n ExpoBeacon.destroyEventLogs();\n setIsEventLoggingEnabled(false);\n }, []);\n\n const setApiEndpoint = useCallback(\n (url: string, apiKey?: string, id?: string) =>\n ExpoBeacon.setApiEndpoint(url, apiKey, id),\n [],\n );\n const getApiEndpoint = useCallback(() => ExpoBeacon.getApiEndpoint(), []);\n\n const isBatteryOptimizationExempt = useCallback(\n () => ExpoBeacon.isBatteryOptimizationExempt(),\n [],\n );\n const requestBatteryOptimizationExemption = useCallback(\n () => ExpoBeacon.requestBatteryOptimizationExemption(),\n [],\n );\n\n const requestPermissions = useCallback(\n () => ExpoBeacon.requestPermissionsAsync(),\n [],\n );\n\n const inRange = useMemo(() => Object.values(inRangeMap), [inRangeMap]);\n\n return {\n pairedBeacons,\n pairedEddystones,\n inRange,\n isMonitoring,\n isEventLoggingEnabled,\n refreshPaired,\n pairBeacon,\n unpairBeacon,\n pairEddystone,\n unpairEddystone,\n scanForBeacons,\n scanForEddystones,\n cancelScan,\n startContinuousScan,\n stopContinuousScan,\n startMonitoring,\n stopMonitoring,\n getMonitoringConfig,\n getMonitoredDeviceState,\n getMonitoredDeviceStates,\n setNotificationConfig,\n enableEventLogging,\n disableEventLogging,\n getEventLogs,\n clearEventLogs,\n destroyEventLogs,\n setApiEndpoint,\n getApiEndpoint,\n isBatteryOptimizationExempt,\n requestBatteryOptimizationExemption,\n requestPermissions,\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-beacon",
3
- "version": "0.10.0",
3
+ "version": "0.10.1",
4
4
  "description": "Expo module for scanning, pairing, and monitoring iBeacons on Android and iOS",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -11,7 +11,12 @@ import type {
11
11
  EddystoneRegionEvent,
12
12
  EddystoneScanResult,
13
13
  EddystoneTimeoutEvent,
14
+ EventLogEntry,
15
+ EventLogQueryOptions,
16
+ MonitoredDeviceState,
17
+ MonitoringConfig,
14
18
  MonitoringOptions,
19
+ NotificationConfig,
15
20
  PairedBeacon,
16
21
  PairedEddystone,
17
22
  } from "../ExpoBeacon.types";
@@ -83,6 +88,8 @@ export interface UseBeaconResult {
83
88
  inRange: InRangeBeacon[];
84
89
  /** Whether background region monitoring is currently active. */
85
90
  isMonitoring: boolean;
91
+ /** Whether SQLite event logging is currently enabled. */
92
+ isEventLoggingEnabled: boolean;
86
93
 
87
94
  /** Re-read paired beacons from the native store. */
88
95
  refreshPaired: () => void;
@@ -119,6 +126,40 @@ export interface UseBeaconResult {
119
126
 
120
127
  startMonitoring: (options?: MonitoringOptions | number) => Promise<void>;
121
128
  stopMonitoring: () => Promise<void>;
129
+ /** Read the current monitoring configuration and active-state snapshot. */
130
+ getMonitoringConfig: () => MonitoringConfig;
131
+ /** State snapshot for one paired device, or `null` when the identifier is unknown. */
132
+ getMonitoredDeviceState: (identifier: string) => MonitoredDeviceState | null;
133
+ /** State snapshot for all paired devices. */
134
+ getMonitoredDeviceStates: () => MonitoredDeviceState[];
135
+
136
+ /** Persist notification configuration applied to subsequent monitoring sessions. */
137
+ setNotificationConfig: (config: NotificationConfig) => void;
138
+
139
+ /** Enable SQLite event logging (updates `isEventLoggingEnabled`). */
140
+ enableEventLogging: () => void;
141
+ /** Disable SQLite event logging (updates `isEventLoggingEnabled`). */
142
+ disableEventLogging: () => void;
143
+ /** Retrieve logged events, optionally filtered. */
144
+ getEventLogs: (options?: EventLogQueryOptions) => EventLogEntry[];
145
+ /** Delete all logged events (keeps logging enabled). */
146
+ clearEventLogs: () => void;
147
+ /** Delete the event-log database and disable logging. */
148
+ destroyEventLogs: () => void;
149
+
150
+ /** Configure a native API endpoint for background event forwarding. */
151
+ setApiEndpoint: (url: string, apiKey?: string, id?: string) => void;
152
+ /** Read the current API forwarding configuration. */
153
+ getApiEndpoint: () => {
154
+ url: string | null;
155
+ apiKey: string | null;
156
+ id: string | null;
157
+ };
158
+
159
+ /** Whether the app is exempt from Android battery optimizations (always `true` on iOS / web). */
160
+ isBatteryOptimizationExempt: () => boolean;
161
+ /** Request exemption from Android battery optimizations (opens the system dialog). */
162
+ requestBatteryOptimizationExemption: () => Promise<boolean>;
122
163
 
123
164
  /** Request the platform permissions needed for scanning and monitoring. */
124
165
  requestPermissions: () => Promise<boolean>;
@@ -149,6 +190,7 @@ export function useBeacon(options: UseBeaconOptions = {}): UseBeaconResult {
149
190
  [],
150
191
  );
151
192
  const [isMonitoring, setIsMonitoring] = useState(false);
193
+ const [isEventLoggingEnabled, setIsEventLoggingEnabled] = useState(false);
152
194
  const [inRangeMap, setInRangeMap] = useState<Record<string, InRangeBeacon>>(
153
195
  {},
154
196
  );
@@ -171,6 +213,11 @@ export function useBeacon(options: UseBeaconOptions = {}): UseBeaconResult {
171
213
  } catch {
172
214
  /* unsupported platform */
173
215
  }
216
+ try {
217
+ setIsEventLoggingEnabled(ExpoBeacon.isEventLoggingEnabled());
218
+ } catch {
219
+ /* unsupported platform */
220
+ }
174
221
  if (handlers.current.track === false) return;
175
222
  try {
176
223
  const now = Date.now();
@@ -369,6 +416,57 @@ export function useBeacon(options: UseBeaconOptions = {}): UseBeaconResult {
369
416
  await ExpoBeacon.stopMonitoring();
370
417
  setIsMonitoring(false);
371
418
  }, []);
419
+ const getMonitoringConfig = useCallback(
420
+ () => ExpoBeacon.getMonitoringConfig(),
421
+ [],
422
+ );
423
+ const getMonitoredDeviceState = useCallback(
424
+ (identifier: string) => ExpoBeacon.getMonitoredDeviceState(identifier),
425
+ [],
426
+ );
427
+ const getMonitoredDeviceStates = useCallback(
428
+ () => ExpoBeacon.getMonitoredDeviceStates(),
429
+ [],
430
+ );
431
+
432
+ const setNotificationConfig = useCallback(
433
+ (config: NotificationConfig) => ExpoBeacon.setNotificationConfig(config),
434
+ [],
435
+ );
436
+
437
+ const enableEventLogging = useCallback(() => {
438
+ ExpoBeacon.enableEventLogging();
439
+ setIsEventLoggingEnabled(true);
440
+ }, []);
441
+ const disableEventLogging = useCallback(() => {
442
+ ExpoBeacon.disableEventLogging();
443
+ setIsEventLoggingEnabled(false);
444
+ }, []);
445
+ const getEventLogs = useCallback(
446
+ (opts?: EventLogQueryOptions) => ExpoBeacon.getEventLogs(opts),
447
+ [],
448
+ );
449
+ const clearEventLogs = useCallback(() => ExpoBeacon.clearEventLogs(), []);
450
+ const destroyEventLogs = useCallback(() => {
451
+ ExpoBeacon.destroyEventLogs();
452
+ setIsEventLoggingEnabled(false);
453
+ }, []);
454
+
455
+ const setApiEndpoint = useCallback(
456
+ (url: string, apiKey?: string, id?: string) =>
457
+ ExpoBeacon.setApiEndpoint(url, apiKey, id),
458
+ [],
459
+ );
460
+ const getApiEndpoint = useCallback(() => ExpoBeacon.getApiEndpoint(), []);
461
+
462
+ const isBatteryOptimizationExempt = useCallback(
463
+ () => ExpoBeacon.isBatteryOptimizationExempt(),
464
+ [],
465
+ );
466
+ const requestBatteryOptimizationExemption = useCallback(
467
+ () => ExpoBeacon.requestBatteryOptimizationExemption(),
468
+ [],
469
+ );
372
470
 
373
471
  const requestPermissions = useCallback(
374
472
  () => ExpoBeacon.requestPermissionsAsync(),
@@ -382,6 +480,7 @@ export function useBeacon(options: UseBeaconOptions = {}): UseBeaconResult {
382
480
  pairedEddystones,
383
481
  inRange,
384
482
  isMonitoring,
483
+ isEventLoggingEnabled,
385
484
  refreshPaired,
386
485
  pairBeacon,
387
486
  unpairBeacon,
@@ -394,6 +493,19 @@ export function useBeacon(options: UseBeaconOptions = {}): UseBeaconResult {
394
493
  stopContinuousScan,
395
494
  startMonitoring,
396
495
  stopMonitoring,
496
+ getMonitoringConfig,
497
+ getMonitoredDeviceState,
498
+ getMonitoredDeviceStates,
499
+ setNotificationConfig,
500
+ enableEventLogging,
501
+ disableEventLogging,
502
+ getEventLogs,
503
+ clearEventLogs,
504
+ destroyEventLogs,
505
+ setApiEndpoint,
506
+ getApiEndpoint,
507
+ isBatteryOptimizationExempt,
508
+ requestBatteryOptimizationExemption,
397
509
  requestPermissions,
398
510
  };
399
511
  }