1 |
|
2 |
|
3 | import { NativeEventEmitter, NativeModules } from 'react-native';
|
4 | import invariant from 'invariant';
|
5 |
|
6 | const PedometerEventEmitter = new NativeEventEmitter(
|
7 | NativeModules.ExponentPedometer
|
8 | );
|
9 |
|
10 | type PedometerResult = { steps: number };
|
11 | type PedometerUpdateCallback = (result: PedometerResult) => void;
|
12 | type PedometerListener = { remove: () => void };
|
13 |
|
14 | let _listenerCount = 0;
|
15 |
|
16 | export function watchStepCount(
|
17 | callback: PedometerUpdateCallback
|
18 | ): PedometerListener {
|
19 | if (_listenerCount === 0) {
|
20 | NativeModules.ExponentPedometer.watchStepCount();
|
21 | }
|
22 | _listenerCount++;
|
23 |
|
24 | const listener = PedometerEventEmitter.addListener(
|
25 | 'Exponent.pedometerUpdate',
|
26 | callback
|
27 | );
|
28 |
|
29 | return {
|
30 | remove() {
|
31 | listener.remove();
|
32 | _listenerCount--;
|
33 | if (_listenerCount === 0) {
|
34 | NativeModules.ExponentPedometer.stopWatchingStepCount();
|
35 | }
|
36 | },
|
37 | };
|
38 | }
|
39 |
|
40 | export async function getStepCountAsync(
|
41 | start: Date,
|
42 | end: Date
|
43 | ): Promise<PedometerResult> {
|
44 | invariant(
|
45 | start <= end,
|
46 | 'Pedometer: The start date must be smaller than the end date.'
|
47 | );
|
48 | return await NativeModules.ExponentPedometer.getStepCountAsync(
|
49 | start.getTime(),
|
50 | end.getTime()
|
51 | );
|
52 | }
|
53 |
|
54 | export async function isAvailableAsync(): Promise<boolean> {
|
55 | return await NativeModules.ExponentPedometer.isAvailableAsync();
|
56 | }
|