UNPKG

@indoor-track/ibeacon

Version:

Uma biblioteca React Native que fornece APIs nativas para escanear, detectar e obter informações de dispositivos iBeacon via Bluetooth Low Energy...

91 lines (76 loc) 2.33 kB
import { useEffect, useState } from 'react'; import { Platform } from 'react-native'; import { IbeaconEventEmitter } from './NativeIbeacon'; import { check, requestMultiple, PERMISSIONS, RESULTS, type Permission, } from 'react-native-permissions'; interface IbeaconScanResult { id: string; major: number; minor: number; txPower: number; rssi: number; distance: number; type: string; } interface ScanError { message: string; type: string; } export const useIbeaconScan = () => { const [results, setResults] = useState<IbeaconScanResult[]>([]); const [error, setError] = useState<ScanError | null>(null); const [initialized, setInitialized] = useState(false); useEffect(() => { async function requestBluetoothPermissions() { if (Platform.OS === 'android') { const permissionsToRequest: Permission[] = []; const bluetoothScan = PERMISSIONS.ANDROID.BLUETOOTH_SCAN; const bluetoothConnect = PERMISSIONS.ANDROID.BLUETOOTH_CONNECT; const scanStatus = await check(bluetoothScan); const connectStatus = await check(bluetoothConnect); if (scanStatus !== RESULTS.GRANTED) { permissionsToRequest.push(bluetoothScan); } if (connectStatus !== RESULTS.GRANTED) { permissionsToRequest.push(bluetoothConnect); } if (permissionsToRequest.length > 0) { const statuses = await requestMultiple(permissionsToRequest); if ( statuses[PERMISSIONS.ANDROID.BLUETOOTH_SCAN] !== RESULTS.GRANTED || statuses[PERMISSIONS.ANDROID.BLUETOOTH_CONNECT] !== RESULTS.GRANTED ) { requestBluetoothPermissions(); } } } setInitialized(true); } requestBluetoothPermissions(); }, []); useEffect(() => { if (!initialized) return; const resultListener = IbeaconEventEmitter.addListener( 'ScanResult', (data: IbeaconScanResult) => { setResults((prev) => [...prev, data]); } ); const errorListener = IbeaconEventEmitter.addListener( 'ScanError', (err: ScanError) => { setError(err); } ); return () => { resultListener.remove(); errorListener.remove(); }; }, [initialized]); return { results, error, initialized }; };