@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
text/typescript
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 };
};