Skip to content

Commit

Permalink
feat: add queryPedometerData
Browse files Browse the repository at this point in the history
  • Loading branch information
francisli committed Jan 19, 2024
1 parent 0e424b6 commit 53a0ee5
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 29 deletions.
7 changes: 6 additions & 1 deletion example/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
CMPedometerEventType,
startEventUpdates,
stopEventUpdates,
queryPedometerData,
} from 'react-native-cm-pedometer';

export default function App() {
Expand Down Expand Up @@ -48,13 +49,17 @@ export default function App() {
const [error, setError] = React.useState<Error | undefined>();

const [isDataStarted, setDataStarted] = React.useState<boolean>(false);
const [startDate, setStartDate] = React.useState<Date>(new Date());
const [data, setData] = React.useState<CMPedometerData | undefined>();

function onPressData() {
const now = new Date();
if (isDataStarted) {
stopUpdates();
queryPedometerData(startDate, now).then(setData);
} else {
startUpdates(new Date(), (newError, newData) => {
setStartDate(now);
startUpdates(now, (newError, newData) => {
setError(newError);
setData(newData);
});
Expand Down
4 changes: 4 additions & 0 deletions ios/CmPedometer.mm
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ @interface RCT_EXTERN_MODULE(CmPedometer, RCTEventEmitter)

// MARK: - Fetching Historical Pedometer Data

RCT_EXTERN_METHOD(queryPedometerData:(NSString *)from
to:(NSString *)to
withCallback:(RCTResponseSenderBlock)callback)

// MARK: -

+ (BOOL)requiresMainQueueSetup
Expand Down
60 changes: 45 additions & 15 deletions ios/CmPedometer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,31 @@ enum CmPedometerEvent: String, CaseIterable {
case onPedometerEvent
}

extension CMPedometerData {
func toPayload() -> [String: Any] {
return [
"startDate": CmPedometer.dateFormatter.string(from: startDate),
"endDate": CmPedometer.dateFormatter.string(from: endDate),
"numberOfSteps": numberOfSteps,
"distance": distance as Any,
"averageActivePace": averageActivePace as Any,
"currentPace": currentPace as Any,
"currentCadence": currentCadence as Any,
"floorsAscended": floorsAscended as Any,
"floorsDescended": floorsDescended as Any,
]
}
}

extension CMPedometerEvent {
func toPayload() -> [String: Any] {
return [
"date": CmPedometer.dateFormatter.string(from: date),
"type": type.rawValue
]
}
}

@objc(CmPedometer)
class CmPedometer: RCTEventEmitter {
static let instance = CMPedometer()
Expand Down Expand Up @@ -65,17 +90,7 @@ class CmPedometer: RCTEventEmitter {
var body: [String: Any] = [:]
body["error"] = error?.localizedDescription
if let data = data {
body["data"] = [
"startDate": CmPedometer.dateFormatter.string(from: data.startDate),
"endDate": CmPedometer.dateFormatter.string(from: data.endDate),
"numberOfSteps": data.numberOfSteps,
"distance": data.distance as Any,
"averageActivePace": data.averageActivePace as Any,
"currentPace": data.currentPace as Any,
"currentCadence": data.currentCadence as Any,
"floorsAscended": data.floorsAscended as Any,
"floorsDescended": data.floorsDescended as Any,
]
body["data"] = data.toPayload()
}
self.sendEvent(withName: CmPedometerEvent.onPedometerData.rawValue, body: body)
}
Expand All @@ -94,10 +109,7 @@ class CmPedometer: RCTEventEmitter {
var body: [String: Any] = [:]
body["error"] = error?.localizedDescription
if let pedometerEvent = pedometerEvent {
body["pedometerEvent"] = [
"date": CmPedometer.dateFormatter.string(from: pedometerEvent.date),
"type": pedometerEvent.type.rawValue
]
body["pedometerEvent"] = pedometerEvent.toPayload()
}
self.sendEvent(withName: CmPedometerEvent.onPedometerEvent.rawValue, body: body)
})
Expand All @@ -110,6 +122,24 @@ class CmPedometer: RCTEventEmitter {

// MARK: - Fetching Historical Pedometer Data

@objc(queryPedometerData:to:withCallback:)
func queryPedometerData(from: String, to: String, callback: @escaping RCTResponseSenderBlock) {
if let from = CmPedometer.dateFormatter.date(from: from),
let to = CmPedometer.dateFormatter.date(from: to) {
CmPedometer.instance.queryPedometerData(from: from, to: to) { (data, error) in
if let error = error {
callback([error.localizedDescription])
} else if let data = data {
callback([NSNull(), data.toPayload()])
} else {
callback(["An unexpected error has occurred."])
}
}
} else {
callback(["Invalid dates"])
}
}

// MARK: -

override func supportedEvents() -> [String]! {
Expand Down
53 changes: 40 additions & 13 deletions src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -78,20 +78,24 @@ export interface CMPedometerEvent {
type: CMPedometerEventType;
}

export type CMPedometerHandler = (
error: Error | undefined,
data: CMPedometerData | undefined
) => void;

export type CMPedometerEventHandler = (
error: Error | undefined,
pedometerEvent: CMPedometerEvent
) => void;

const enum CmPedometerEvent {
onPedometerData = 'onPedometerData',
onPedometerEvent = 'onPedometerEvent',
}
const eventEmitter = new NativeEventEmitter(CmPedometer);

export function startUpdates(
from: Date,
withHandler: (
error: Error | undefined,
data: CMPedometerData | undefined
) => void
): void {
eventEmitter.addListener(CmPedometerEvent.onPedometerData, (event: any) => {
export function startUpdates(from: Date, handler: CMPedometerHandler): void {
eventEmitter.addListener(CmPedometerEvent.onPedometerData, (event) => {
let error: Error | undefined;
if (event.error) {
error = new Error(event.error);
Expand All @@ -104,7 +108,7 @@ export function startUpdates(
endDate: new Date(event.data.endDate),
} as CMPedometerData;
}
withHandler(error, data);
handler(error, data);
});
CmPedometer.startUpdates(from.toISOString());
}
Expand All @@ -114,10 +118,8 @@ export function stopUpdates(): void {
CmPedometer.stopUpdates();
}

export function startEventUpdates(
handler: (error: Error | undefined, pedometerEvent: CMPedometerEvent) => void
): void {
eventEmitter.addListener(CmPedometerEvent.onPedometerEvent, (event: any) => {
export function startEventUpdates(handler: CMPedometerEventHandler): void {
eventEmitter.addListener(CmPedometerEvent.onPedometerEvent, (event) => {
let error: Error | undefined;
if (event.error) {
error = new Error(event.error);
Expand All @@ -140,3 +142,28 @@ export function stopEventUpdates(): void {
}

// Fetching Historical Pedometer Data

export function queryPedometerData(
from: Date,
to: Date
): Promise<CMPedometerData> {
return new Promise((resolve, reject) => {
CmPedometer.queryPedometerData(
from.toISOString(),
to.toISOString(),
(error: string | undefined, data: any) => {
if (error) {
reject(new Error(error));
} else if (data) {
resolve({
...data,
startDate: new Date(data.startDate),
endDate: new Date(data.endDate),
} as CMPedometerData);
} else {
reject(new Error('An unexpected error has occurred.'));
}
}
);
});
}

0 comments on commit 53a0ee5

Please sign in to comment.