in src/hooks/common.ts [110:276]
export function useSensors(): [
ItemProps[],
EventManagementFN,
EventManagementFN,
] {
const [sensors, setSensors] = useState<ItemProps[]>(
(
[
{
id: AVAILABLE_SENSORS.ACCELEROMETER,
name: 'Accelerometer',
dataType: 'object',
icon: {
name: 'rocket-outline',
type: Platform.select({
android: 'material-community',
default: 'ionicon',
}),
},
enabled: true, // TODO: auto-enable based on settings,
simulated: defaults.emulator,
},
{
id: AVAILABLE_SENSORS.GYROSCOPE,
name: 'Gyroscope',
dataType: 'object',
enabled: true, // TODO: auto-enable based on settings
icon: {
name: 'compass-outline',
type: Platform.select({
android: 'material-community',
default: 'ionicon',
}),
},
simulated: defaults.emulator,
},
{
id: AVAILABLE_SENSORS.MAGNETOMETER,
name: 'Magnetometer',
dataType: 'object',
enabled: true, // TODO: auto-enable based on settings
icon: {
name: 'magnet-outline',
type: 'ionicon',
},
simulated: defaults.emulator,
},
{
id: AVAILABLE_SENSORS.BAROMETER,
dataType: 'number',
name: 'Barometer',
enabled: true, // TODO: auto-enable based on settings
icon: {
name: 'weather-partly-cloudy',
type: 'material-community',
},
simulated: defaults.emulator,
},
{
id: AVAILABLE_SENSORS.GEOLOCATION,
name: 'Geolocation',
dataType: 'object',
enabled: true, // TODO: auto-enable based on settings
icon: {
name: 'location-outline',
type: 'ionicon',
},
simulated: defaults.emulator,
},
{
id: AVAILABLE_SENSORS.BATTERY,
name: 'Battery level',
dataType: 'number',
enabled: true, // TODO: auto-enable based on settings,
simulated: defaults.emulator,
icon: {
name: Platform.select({
android: 'battery-medium',
default: 'battery-half-sharp',
}) as string,
type: Platform.select({
android: 'material-community',
default: 'ionicon',
}),
},
},
] as ItemProps[]
).map<ItemProps>(s => ({
...s,
enable: (val?: boolean) => {
const enabled = val !== undefined ? val : true;
SensorMap[s.id].enable(enabled);
setSensors(currentSensors => {
return currentSensors.map(sensor => {
if (sensor.id === s.id) {
return {
...sensor,
enabled,
};
}
return sensor;
});
});
},
sendInterval: (value: number) => {
SensorMap[s.id].sendInterval(value);
},
})),
);
const dataHandler = (id: string, value: any) => {
setSensors(currentSensors => {
return currentSensors.map(sensor => {
if (sensor.id === id) {
return {
...sensor,
value,
};
}
return sensor;
});
});
};
const availableHandler = (id: string) => {
setSensors(currentSensors => {
const currentIndex = currentSensors.findIndex(s => s.id === id);
if (currentIndex > -1) {
currentSensors.splice(currentIndex, 1);
}
return currentSensors;
});
};
const addListener = useCallback(
(id: string, event: string, handler: (...args: any) => void) => {
SensorMap[id].addListener.bind(SensorMap[id])(event, handler);
},
[],
);
const removeListener = useCallback(
(id: string, event: string, handler: (...args: any) => void) => {
SensorMap[id].removeListener.bind(SensorMap[id])(event, handler);
},
[],
);
useEffect(() => {
sensors.forEach(s => {
addListener(s.id, DATA_AVAILABLE_EVENT, dataHandler);
addListener(s.id, SENSOR_UNAVAILABLE_EVENT, availableHandler);
SensorMap[s.id].simulate(s.simulated);
SensorMap[s.id].enable(true);
});
return () => {
sensors.forEach(s => {
removeListener(s.id, DATA_AVAILABLE_EVENT, dataHandler);
removeListener(s.id, SENSOR_UNAVAILABLE_EVENT, availableHandler);
SensorMap[s.id].enable(false);
});
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return [sensors, addListener, removeListener];
}