Skip to content

Commit fcb9831

Browse files
authored
Merge pull request #163 from Nesh108/master
Added `saveHeartRateSample` to the library
2 parents b1aaf5f + 7ce15ab commit fcb9831

7 files changed

+76
-0
lines changed

RCTAppleHealthKit/RCTAppleHealthKit+Methods_Vitals.h

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
@interface RCTAppleHealthKit (Methods_Vitals)
1111

12+
- (void)vitals_saveHeartRateSample:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
1213
- (void)vitals_getHeartRateSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
1314
- (void)vitals_getRestingHeartRate:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
1415
- (void)vitals_getWalkingHeartRateAverage:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;

RCTAppleHealthKit/RCTAppleHealthKit+Methods_Vitals.m

+27
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,33 @@
1212

1313
@implementation RCTAppleHealthKit (Methods_Vitals)
1414

15+
- (void)vitals_saveHeartRateSample:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback
16+
{
17+
NSDate *timeHeartRateSampleWasTaken = [RCTAppleHealthKit dateFromOptions:input key:@"date" withDefault:[NSDate date]];
18+
double heartRateValue = [RCTAppleHealthKit doubleFromOptions:input key:@"value" withDefault:-99];
19+
if(heartRateValue == -99){
20+
callback(@[RCTMakeError(@"heartRateValue is required in options", nil, nil)]);
21+
return;
22+
}
23+
24+
HKUnit *count = [HKUnit countUnit];
25+
HKUnit *minute = [HKUnit minuteUnit];
26+
HKUnit *unit = [RCTAppleHealthKit hkUnitFromOptions:input key:@"unit" withDefault:[count unitDividedByUnit:minute]];
27+
28+
HKQuantitySample* heartRate = [HKQuantitySample quantitySampleWithType:[HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]
29+
quantity:[HKQuantity quantityWithUnit:unit doubleValue:heartRateValue]
30+
startDate:timeHeartRateSampleWasTaken
31+
endDate:timeHeartRateSampleWasTaken];
32+
33+
[self.healthStore saveObject:heartRate withCompletion:^(BOOL success, NSError *error) {
34+
if (!success) {
35+
NSLog(@"An error occured saving the heart rate sample: %@", error);
36+
callback(@[RCTMakeError(@"An error occured saving the heart rate sample", error, nil)]);
37+
return;
38+
}
39+
callback(@[[NSNull null], @true]);
40+
}];
41+
}
1542

1643
- (void)vitals_getHeartRateSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback
1744
{

RCTAppleHealthKit/RCTAppleHealthKit+TypesAndPermissions.m

+3
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,9 @@ - (nullable HKObjectType *)getWritePermFromText:(nonnull NSString*) key {
385385
if ([@"BloodAlcoholContent" isEqualToString: key]) {
386386
return [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBloodAlcoholContent];
387387
}
388+
if ([@"HeartRate" isEqualToString: key]) {
389+
return [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];
390+
}
388391

389392
return nil;
390393
}

RCTAppleHealthKit/RCTAppleHealthKit.m

+6
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,12 @@ + (BOOL)requiresMainQueueSetup
363363
[self getWater:input callback:callback];
364364
}
365365

366+
RCT_EXPORT_METHOD(saveHeartRateSample:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback)
367+
{
368+
[self _initializeHealthStore];
369+
[self vitals_saveHeartRateSample:input callback:callback];
370+
}
371+
366372
RCT_EXPORT_METHOD(getWaterSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback)
367373
{
368374
[self _initializeHealthStore];

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ All the documentation is under the [docs](/docs) folder. They are split into the
256256
257257
- [getBloodPressureSamples](/docs/getBloodPressureSamples.md)
258258
- [getElectrocardiogramSamples](/docs/getElectrocardiogramSamples.md)
259+
- [saveHeartRateSample](/docs/saveHeartRateSample.md)
259260
- [getHeartRateSamples](/docs/getHeartRateSamples.md)
260261
- [getHeartRateVariabilitySamples](/docs/getHeartRateVariabilitySamples.md)
261262
- [getHeartbeatSeriesSamples](/docs/getHeartbeatSeriesSamples.md)

docs/saveHeartRateSample.md

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# saveHeartRateSample
2+
3+
Save a Heart Rate sample to Healthkit
4+
5+
`saveHeartRateSample` accepts an options object containing a numeric heart rate value in Beats per minute (BPM).
6+
In the example below a heart rate sample of 72BPM is added to Healthkit.
7+
8+
Example input options:
9+
10+
```javascript
11+
let options = {
12+
value: 72, // Amount in BPM
13+
date: (new Date(2018,10,1)).toISOString(), // Optional, time when the Heart Rate was logged
14+
}
15+
```
16+
17+
Call the method:
18+
19+
```javascript
20+
AppleHealthKit.saveHeartRateSample((options: Object), (err: Object, results: boolean) => {
21+
if (err) {
22+
console.log('Error saving Heart Rate to Healthkit: ', err)
23+
return
24+
}
25+
// Heart Rate successfully saved
26+
})
27+
```
28+
29+
Example output:
30+
31+
```json
32+
1
33+
```

index.d.ts

+5
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,11 @@ declare module 'react-native-health' {
235235
callback: (err: string, results: HealthValue) => void,
236236
): void
237237

238+
saveHeartRateSample(
239+
options: HealthValueOptions,
240+
callback: (error: string, result: HealthValue) => void,
241+
): void
242+
238243
getWaterSamples(
239244
options: HealthInputOptions,
240245
callback: (err: string, results: Array<HealthValue>) => void,

0 commit comments

Comments
 (0)