Skip to content

Instantly share code, notes, and snippets.

@allthetime
Created August 30, 2019 18:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save allthetime/7c23b2fb914c44cb35072fdece93e788 to your computer and use it in GitHub Desktop.
Save allthetime/7c23b2fb914c44cb35072fdece93e788 to your computer and use it in GitHub Desktop.
import { DeviceEventEmitter, NativeModules, NativeEventEmitter } from "react-native";
import { Observable } from "rxjs";
import { publish, refCount } from "rxjs/operators";
import * as RNSensors from "./rnsensors";
const {
Gyroscope: GyroNative,
Accelerometer: AccNative,
Magnetometer: MagnNative,
Barometer: BarNative
} = NativeModules;
const nativeApis = new Map([
["accelerometer", AccNative],
["gyroscope", GyroNative],
["magnetometer", MagnNative],
["barometer", BarNative]
]);
const listenerKeys = new Map([
["accelerometer", "Accelerometer"],
["gyroscope", "Gyroscope"],
["magnetometer", "Magnetometer"],
["barometer", "Barometer"]
]);
function createSensorObservable(sensorType) {
return Observable.create(function subscribe(observer) {
this.isSensorAvailable = false;
this.unsubscribeCallback = () => {
if (!this.isSensorAvailable) return;
// stop the sensor
RNSensors.stop(sensorType);
};
RNSensors.isAvailable(sensorType).then(
() => {
let event = new NativeEventEmitter(nativeApis.get(sensorType))
console.log
event.addListener(listenerKeys.get(sensorType), data => {
observer.next(data);
});
this.isSensorAvailable = true;
// Start the sensor manager
RNSensors.start(sensorType);
},
() => {
observer.error(`Sensor ${sensorType} is not available`);
}
);
return this.unsubscribeCallback;
}).pipe(makeSingleton());
}
// As we only have one sensor we need to share it between the different consumers
function makeSingleton() {
return source => source.pipe(publish(), refCount());
}
const accelerometer = createSensorObservable("accelerometer");
const gyroscope = createSensorObservable("gyroscope");
const magnetometer = createSensorObservable("magnetometer");
const barometer = createSensorObservable("barometer");
export default {
gyroscope,
accelerometer,
magnetometer,
barometer
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment