@kingstinct/react-native-healthkit 5.4.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +59 -18
  2. package/ios/ReactNativeHealthkit.m +2 -0
  3. package/ios/ReactNativeHealthkit.swift +121 -40
  4. package/lib/commonjs/index.js +10 -2
  5. package/lib/commonjs/index.js.map +1 -1
  6. package/lib/commonjs/native-types.js.map +1 -1
  7. package/lib/commonjs/types.js.map +1 -1
  8. package/lib/commonjs/utils/deserializeCorrelation.js.map +1 -1
  9. package/lib/commonjs/utils/deserializeSample.js +2 -2
  10. package/lib/commonjs/utils/deserializeSample.js.map +1 -1
  11. package/lib/commonjs/utils/getMostRecentCategorySample.js +1 -1
  12. package/lib/commonjs/utils/getMostRecentCategorySample.js.map +1 -1
  13. package/lib/commonjs/utils/getMostRecentQuantitySample.js +1 -1
  14. package/lib/commonjs/utils/getMostRecentQuantitySample.js.map +1 -1
  15. package/lib/commonjs/utils/prepareOptions.js +4 -2
  16. package/lib/commonjs/utils/prepareOptions.js.map +1 -1
  17. package/lib/commonjs/utils/queryCategorySamples.js +6 -2
  18. package/lib/commonjs/utils/queryCategorySamples.js.map +1 -1
  19. package/lib/commonjs/utils/queryQuantitySamples.js +6 -2
  20. package/lib/commonjs/utils/queryQuantitySamples.js.map +1 -1
  21. package/lib/commonjs/utils/serializeDate.js +1 -1
  22. package/lib/commonjs/utils/serializeDate.js.map +1 -1
  23. package/lib/commonjs/utils/serializeDate.test.js +1 -1
  24. package/lib/commonjs/utils/serializeDate.test.js.map +1 -1
  25. package/lib/module/index.js +10 -2
  26. package/lib/module/index.js.map +1 -1
  27. package/lib/module/native-types.js.map +1 -1
  28. package/lib/module/types.js +0 -14
  29. package/lib/module/types.js.map +1 -1
  30. package/lib/module/utils/deserializeCorrelation.js +2 -2
  31. package/lib/module/utils/deserializeCorrelation.js.map +1 -1
  32. package/lib/module/utils/deserializeSample.js +2 -2
  33. package/lib/module/utils/deserializeSample.js.map +1 -1
  34. package/lib/module/utils/getMostRecentCategorySample.js +1 -1
  35. package/lib/module/utils/getMostRecentCategorySample.js.map +1 -1
  36. package/lib/module/utils/getMostRecentQuantitySample.js +1 -1
  37. package/lib/module/utils/getMostRecentQuantitySample.js.map +1 -1
  38. package/lib/module/utils/prepareOptions.js +4 -2
  39. package/lib/module/utils/prepareOptions.js.map +1 -1
  40. package/lib/module/utils/queryCategorySamples.js +6 -2
  41. package/lib/module/utils/queryCategorySamples.js.map +1 -1
  42. package/lib/module/utils/queryQuantitySamples.js +7 -3
  43. package/lib/module/utils/queryQuantitySamples.js.map +1 -1
  44. package/lib/module/utils/serializeDate.js +1 -1
  45. package/lib/module/utils/serializeDate.js.map +1 -1
  46. package/lib/module/utils/serializeDate.test.js +1 -1
  47. package/lib/module/utils/serializeDate.test.js.map +1 -1
  48. package/lib/typescript/src/native-types.d.ts +21 -2
  49. package/lib/typescript/src/types.d.ts +1 -0
  50. package/lib/typescript/src/utils/deserializeSample.d.ts +2 -2
  51. package/lib/typescript/src/utils/prepareOptions.d.ts +1 -0
  52. package/lib/typescript/src/utils/queryCategorySamples.d.ts +7 -2
  53. package/lib/typescript/src/utils/queryQuantitySamples.d.ts +7 -2
  54. package/package.json +2 -1
  55. package/src/index.tsx +11 -3
  56. package/src/native-types.ts +29 -4
  57. package/src/types.ts +1 -134
  58. package/src/utils/deserializeCorrelation.ts +2 -2
  59. package/src/utils/deserializeSample.ts +2 -2
  60. package/src/utils/getMostRecentCategorySample.ts +1 -1
  61. package/src/utils/getMostRecentQuantitySample.ts +1 -1
  62. package/src/utils/prepareOptions.ts +6 -3
  63. package/src/utils/queryCategorySamples.ts +15 -4
  64. package/src/utils/queryQuantitySamples.ts +16 -5
  65. package/src/utils/serializeDate.test.ts +1 -1
  66. package/src/utils/serializeDate.ts +3 -1
package/README.md CHANGED
@@ -21,15 +21,34 @@ This library is provided as-is without any warranty and is not affiliated with A
21
21
 
22
22
  ## Installation
23
23
 
24
- ### Native or Expo Bare Workflow
24
+ ### Expo Managed Workflow (easiest - with config plugin)
25
+ Usage with Expo is possible - just keep in mind it will not work in Expo Go and [you'll need to roll your own Dev Client](https://docs.expo.dev/development/getting-started/).
26
+
25
27
  1. `yarn add @kingstinct/react-native-healthkit` (or `npm install @kingstinct/react-native-healthkit`)
26
- 2. `npx pod-install`
27
- 3. Set `NSHealthUpdateUsageDescription` and `NSHealthShareUsageDescription` in your `Info.plist`
28
- 4. Enable the HealthKit capability for the project in Xcode.
29
- 5. Since this package is using Swift you might also need to add a bridging header in your project if you haven't already, you can [find more about that in the official React Native docs](https://reactnative.dev/docs/native-modules-ios#exporting-swift)
30
- 6. During runtime check and request permissions with `requestAuthorization`. Failing to request authorization, or requesting a permission you haven't requested yet, will result in the app crashing.
28
+ 2. Update your app.json with the config plugin:
29
+ ```json
30
+ {
31
+ "expo": {
32
+ "plugins": ["@kingstinct/react-native-healthkit"]
33
+ }
34
+ }
35
+ ```
36
+ this will give you defaults that make the app build without any further configuration. If you want, you can override the defaults:
37
+ ```json
38
+ {
39
+ "expo": {
40
+ "plugins": ["@kingstinct/react-native-healthkit", {
41
+ "NSHealthShareUsageDescription": "Your own custom usage description",
42
+ "NSHealthUpdateUsageDescription": false, // if you have no plans to update data, you can skip adding it to your info.plist
43
+ "background": false // if you have no plans to use it in background mode, skip adding it to the entitlements
44
+ }]
45
+ }
46
+ }
47
+ ```
48
+ 3. Build a new Dev Client
49
+ 4. During runtime check and request permissions with `requestAuthorization`. Failing to request authorization, or requesting a permission you haven't requested yet, will result in the app crashing.
31
50
 
32
- ### Expo Managed Workflow
51
+ ### Expo Managed Workflow (manual)
33
52
  Usage with Expo is possible - just keep in mind it will not work in Expo Go and [you'll need to roll your own Dev Client](https://docs.expo.dev/development/getting-started/).
34
53
 
35
54
  1. `yarn add @kingstinct/react-native-healthkit` (or `npm install @kingstinct/react-native-healthkit`)
@@ -39,12 +58,12 @@ Usage with Expo is possible - just keep in mind it will not work in Expo Go and
39
58
  "expo": {
40
59
  "ios": {
41
60
  "infoPlist": {
42
- "NSHealthShareUsageDescription": "<< your usage description here >>",
43
- "NSHealthUpdateUsageDescription": "<< your usage description here >>"
61
+ "NSHealthShareUsageDescription": "<< your usage description here >>", // (optional) if you want to read healthkit data
62
+ "NSHealthUpdateUsageDescription": "<< your usage description here >>" // (optional) if you want to write healthkit data
44
63
  },
45
64
  "entitlements": {
46
- "com.apple.developer.healthkit": true,
47
- "com.apple.developer.healthkit.background-delivery": true
65
+ "com.apple.developer.healthkit": true, // required to use healthkit
66
+ "com.apple.developer.healthkit.background-delivery": true // (optional) if you want to use background delivery
48
67
  }
49
68
  }
50
69
  }
@@ -53,6 +72,14 @@ Usage with Expo is possible - just keep in mind it will not work in Expo Go and
53
72
  3. Build a new Dev Client
54
73
  4. During runtime check and request permissions with `requestAuthorization`. Failing to request authorization, or requesting a permission you haven't requested yet, will result in the app crashing.
55
74
 
75
+ ### Native or Expo Bare Workflow
76
+ 1. `yarn add @kingstinct/react-native-healthkit` (or `npm install @kingstinct/react-native-healthkit`)
77
+ 2. `npx pod-install`
78
+ 3. Set `NSHealthUpdateUsageDescription` and `NSHealthShareUsageDescription` in your `Info.plist`
79
+ 4. Enable the HealthKit capability for the project in Xcode.
80
+ 5. Since this package is using Swift you might also need to add a bridging header in your project if you haven't already, you can [find more about that in the official React Native docs](https://reactnative.dev/docs/native-modules-ios#exporting-swift)
81
+ 6. During runtime check and request permissions with `requestAuthorization`. Failing to request authorization, or requesting a permission you haven't requested yet, will result in the app crashing.
82
+
56
83
  ## Usage
57
84
 
58
85
  Some hook examples:
@@ -62,9 +89,12 @@ import { HKQuantityTypeIdentifier, useHealthkitAuthorization } from '@kingstinct
62
89
  const [authorizationStatus, requestAuthorization] = useHealthkitAuthorization([HKQuantityTypeIdentifier.bloodGlucose])
63
90
 
64
91
  // make sure that you've requested authorization before requesting data, otherwise your app will crash
65
- import { useMostRecentQuantitySample, HKQuantityTypeIdentifier } from '@kingstinct/react-native-healthkit';
92
+ import { useMostRecentQuantitySample, HKQuantityTypeIdentifier, useMostRecentCategorySample } from '@kingstinct/react-native-healthkit';
66
93
 
67
94
  const mostRecentBloodGlucoseSample = useMostRecentQuantitySample(HKQuantityTypeIdentifier.bloodGlucose)
95
+ const lastBodyFatSample = useMostRecentQuantitySample(HKQuantityTypeIdentifier.bodyFatPercentage)
96
+ const lastMindfulSession = useMostRecentCategorySample(HKCategoryTypeIdentifier.mindfulSession)
97
+ const lastWorkout = useMostRecentWorkout()
68
98
  ```
69
99
 
70
100
  Some imperative examples:
@@ -104,14 +134,21 @@ Some imperative examples:
104
134
  },
105
135
  }
106
136
  );
137
+ ```
107
138
 
139
+ ### HealthKit Anchors (breaking change in 6.0)
140
+ In 6.0 you can use HealthKit anchors to get changes and deleted items which is very useful for syncing. This is a breaking change - but a very easy one to handle that TypeScript should help you with. Most queries now return an object containing samples which is what was returned as only an array before. In addition you also get deletedSamples and a newAnchor you can use for more advanced use cases, example:
141
+ ```TypeScript
142
+ const { newAnchor, samples, deletedSamples } = await queryQuantitySamples(HKQuantityTypeIdentifier.stepCount, {
143
+ limit: 2,
144
+ })
145
+
146
+ const nextResult = await queryQuantitySamples(HKQuantityTypeIdentifier.stepCount, {
147
+ limit: 2,
148
+ anchor: newAnchor,
149
+ })
108
150
 
109
- /* Hooks */
110
- const lastBodyFatSample = HealthKit.useMostRecentQuantitySample(HKQuantityTypeIdentifier.bodyFatPercentage);
111
- const lastMindfulSession = Healthkit.useMostRecentCategorySample(
112
- HKCategoryTypeIdentifier.mindfulSession
113
- );
114
- const lastWorkout = Healthkit.useMostRecentWorkout();
151
+ // etc..
115
152
  ```
116
153
 
117
154
  ## A note on Apple Documentation
@@ -122,6 +159,10 @@ We're striving to do as straight a mapping as possible to the Native Libraries.
122
159
 
123
160
  For accessing Clinical Records use old version (3.x) or use specific branch ""
124
161
 
162
+ ## Android alternatives
163
+
164
+ For a similar library for Android, check out [react-native-health-connect](https://github.com/matinzd/react-native-health-connect/) that works with the new Health Connect. For Google Fit [react-native-google-fit](https://www.npmjs.com/package/react-native-google-fit) seems to be the most popular option, and and another possible option is to work directly with the Google Fit REST API which I've some experience with.
165
+
125
166
  ## Contributing
126
167
 
127
168
  See the [contributing guide](CONTRIBUTING.md) to learn how to contribute to the repository and the development workflow.
@@ -104,6 +104,7 @@ RCT_EXTERN_METHOD(queryCategorySamples:(NSString)typeIdentifier
104
104
  to:(NSDate)to
105
105
  limit:(NSInteger)limit
106
106
  ascending:(BOOL)ascending
107
+ anchor:(NSString)anchor
107
108
  resolve:(RCTPromiseResolveBlock)resolve
108
109
  reject:(RCTPromiseRejectBlock)reject
109
110
  )
@@ -139,6 +140,7 @@ RCT_EXTERN_METHOD(queryQuantitySamples:(NSString)typeIdentifier
139
140
  to:(NSDate)to
140
141
  limit:(NSInteger)limit
141
142
  ascending:(BOOL)ascending
143
+ anchor:(NSString)anchor
142
144
  resolve:(RCTPromiseResolveBlock)resolve
143
145
  reject:(RCTPromiseRejectBlock)reject
144
146
  )
@@ -253,6 +253,13 @@ class ReactNativeHealthkit: RCTEventEmitter {
253
253
  "sourceRevision": self.serializeSourceRevision(_sourceRevision: sample.sourceRevision) as Any,
254
254
  ]
255
255
  }
256
+
257
+ func serializeDeletedSample(sample: HKDeletedObject) -> NSDictionary {
258
+ return [
259
+ "uuid": sample.uuid.uuidString,
260
+ "metadata": self.serializeMetadata(metadata: sample.metadata)
261
+ ]
262
+ }
256
263
 
257
264
  func serializeCategorySample(sample: HKCategorySample) -> NSDictionary {
258
265
  let endDate = _dateFormatter.string(from: sample.endDate)
@@ -874,6 +881,7 @@ class ReactNativeHealthkit: RCTEventEmitter {
874
881
  guard let device = _device else {
875
882
  return nil;
876
883
  }
884
+
877
885
  return [
878
886
  "name": device.name,
879
887
  "firmwareVersion": device.firmwareVersion,
@@ -882,6 +890,7 @@ class ReactNativeHealthkit: RCTEventEmitter {
882
890
  "manufacturer": device.manufacturer,
883
891
  "model": device.model,
884
892
  "softwareVersion": device.softwareVersion,
893
+ "udiDeviceIdentifier": device.udiDeviceIdentifier
885
894
  ]
886
895
  }
887
896
 
@@ -974,9 +983,49 @@ class ReactNativeHealthkit: RCTEventEmitter {
974
983
  store.execute(q);
975
984
  }
976
985
 
986
+ func serializeAnchor(anchor: HKQueryAnchor?) -> String? {
987
+ guard let anch = anchor else {
988
+ return nil
989
+ }
990
+
991
+ let data = NSKeyedArchiver.archivedData(withRootObject: anch)
992
+ let encoded = data.base64EncodedString();
993
+
994
+ return encoded;
995
+ }
996
+
997
+ func base64StringToHKQueryAnchor(base64String: String) -> HKQueryAnchor? {
998
+ // Step 1: Decode the base64 string to a Data object
999
+ guard let data = Data(base64Encoded: base64String) else {
1000
+ print("Error: Invalid base64 string")
1001
+ return nil
1002
+ }
977
1003
 
978
- @objc(queryQuantitySamples:unitString:from:to:limit:ascending:resolve:reject:)
979
- func queryQuantitySamples(typeIdentifier: String, unitString: String, from: Date, to: Date, limit: Int, ascending: Bool, resolve: @escaping RCTPromiseResolveBlock,reject: @escaping RCTPromiseRejectBlock) -> Void {
1004
+ // Step 2: Use NSKeyedUnarchiver to unarchive the data and create an HKQueryAnchor object
1005
+ do {
1006
+ let unarchiver = try NSKeyedUnarchiver(forReadingFrom: data)
1007
+ unarchiver.requiresSecureCoding = true
1008
+ let anchor = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)
1009
+
1010
+ return anchor as? HKQueryAnchor
1011
+ } catch {
1012
+ print("Error: Unable to unarchive HKQueryAnchor object: \(error)")
1013
+ return nil
1014
+ }
1015
+ }
1016
+
1017
+ @objc(queryQuantitySamples:unitString:from:to:limit:ascending:anchor:resolve:reject:)
1018
+ func queryQuantitySamples(
1019
+ typeIdentifier: String,
1020
+ unitString: String,
1021
+ from: Date,
1022
+ to: Date,
1023
+ limit: Int,
1024
+ ascending: Bool,
1025
+ anchor: String,
1026
+ resolve: @escaping RCTPromiseResolveBlock,
1027
+ reject: @escaping RCTPromiseRejectBlock
1028
+ ) -> Void {
980
1029
  guard let store = _store else {
981
1030
  return reject(INIT_ERROR, INIT_ERROR_MESSAGE, nil);
982
1031
  }
@@ -992,25 +1041,39 @@ class ReactNativeHealthkit: RCTEventEmitter {
992
1041
  let predicate = from != nil || to != nil ? HKQuery.predicateForSamples(withStart: from, end: to, options: [HKQueryOptions.strictEndDate, HKQueryOptions.strictStartDate]) : nil;
993
1042
 
994
1043
  let limit = limit == 0 ? HKObjectQueryNoLimit : limit;
995
-
996
- let q = HKSampleQuery(sampleType: sampleType, predicate: predicate, limit: limit, sortDescriptors: [NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: ascending)]) { (query: HKSampleQuery, sample: [HKSample]?, error: Error?) in
997
- guard let err = error else {
998
- guard let samples = sample else {
999
- return resolve([]);
1000
- }
1001
- let arr: NSMutableArray = [];
1002
-
1003
- for s in samples {
1004
- if let sample = s as? HKQuantitySample {
1005
- let serialized = self.serializeQuantitySample(sample: sample, unit: HKUnit.init(from: unitString))
1006
-
1007
- arr.add(serialized)
1008
- }
1009
- }
1010
-
1011
- return resolve(arr);
1012
- }
1013
- reject(GENERIC_ERROR, err.localizedDescription, err);
1044
+
1045
+ let actualAnchor = anchor.isEmpty ? nil : base64StringToHKQueryAnchor(base64String: anchor)
1046
+
1047
+ let q = HKAnchoredObjectQuery(
1048
+ type: sampleType,
1049
+ predicate: predicate,
1050
+ anchor: actualAnchor,
1051
+ limit: limit
1052
+ ) { (
1053
+ query: HKAnchoredObjectQuery,
1054
+ s: [HKSample]?,
1055
+ deletedSamples: [HKDeletedObject]?,
1056
+ newAnchor: HKQueryAnchor?,
1057
+ error: Error?
1058
+ ) in
1059
+ guard let err = error else {
1060
+ guard let samples = s else {
1061
+ return resolve([]);
1062
+ }
1063
+
1064
+ return resolve([
1065
+ "samples": samples.map({ sample in
1066
+ let serialized = self.serializeQuantitySample(sample: sample as! HKQuantitySample, unit: HKUnit.init(from: unitString))
1067
+
1068
+ return serialized
1069
+ }) as Any,
1070
+ "deletedSamples": deletedSamples?.map({ sample in
1071
+ return self.serializeDeletedSample(sample: sample)
1072
+ }) as Any,
1073
+ "newAnchor": self.serializeAnchor(anchor: newAnchor) as Any
1074
+ ]);
1075
+ }
1076
+ reject(GENERIC_ERROR, err.localizedDescription, err);
1014
1077
  }
1015
1078
 
1016
1079
  store.execute(q);
@@ -1027,8 +1090,8 @@ class ReactNativeHealthkit: RCTEventEmitter {
1027
1090
  return reject(TYPE_IDENTIFIER_ERROR, typeIdentifier, nil);
1028
1091
  }
1029
1092
 
1030
- let from = from.timeIntervalSince1970 > 0 ? from : nil;
1031
- let to = to.timeIntervalSince1970 > 0 ? to : nil;
1093
+ let from = from.timeIntervalSince1970 >= 0 ? from : nil;
1094
+ let to = to.timeIntervalSince1970 >= 0 ? to : nil;
1032
1095
 
1033
1096
  let predicate = from != nil || to != nil ? HKQuery.predicateForSamples(withStart: from, end: to, options: [HKQueryOptions.strictEndDate, HKQueryOptions.strictStartDate]) : nil;
1034
1097
 
@@ -1082,8 +1145,8 @@ class ReactNativeHealthkit: RCTEventEmitter {
1082
1145
  store.execute(q);
1083
1146
  }
1084
1147
 
1085
- @objc(queryCategorySamples:from:to:limit:ascending:resolve:reject:)
1086
- func queryCategorySamples(typeIdentifier: String, from: Date, to: Date, limit: Int, ascending: Bool, resolve: @escaping RCTPromiseResolveBlock,reject: @escaping RCTPromiseRejectBlock) -> Void {
1148
+ @objc(queryCategorySamples:from:to:limit:ascending:anchor:resolve:reject:)
1149
+ func queryCategorySamples(typeIdentifier: String, from: Date, to: Date, limit: Int, ascending: Bool, anchor: String, resolve: @escaping RCTPromiseResolveBlock,reject: @escaping RCTPromiseRejectBlock) -> Void {
1087
1150
  guard let store = _store else {
1088
1151
  return reject(INIT_ERROR, INIT_ERROR_MESSAGE, nil);
1089
1152
  }
@@ -1099,25 +1162,43 @@ class ReactNativeHealthkit: RCTEventEmitter {
1099
1162
  let predicate = from != nil || to != nil ? HKQuery.predicateForSamples(withStart: from, end: to, options: [HKQueryOptions.strictEndDate, HKQueryOptions.strictStartDate]) : nil;
1100
1163
 
1101
1164
  let limit = limit == 0 ? HKObjectQueryNoLimit : limit;
1165
+
1166
+ let q = HKAnchoredObjectQuery(
1167
+ type: sampleType,
1168
+ predicate: predicate,
1169
+ anchor: anchor != "" ? base64StringToHKQueryAnchor(base64String: anchor) : nil,
1170
+ limit: limit
1171
+ ) { (
1172
+ query: HKAnchoredObjectQuery,
1173
+ s: [HKSample]?,
1174
+ deletedSamples: [HKDeletedObject]?,
1175
+ newAnchor: HKQueryAnchor?,
1176
+ error: Error?
1177
+ ) in
1178
+ guard let err = error else {
1179
+ guard let samples = s else {
1180
+ return resolve([]);
1181
+ }
1182
+
1183
+ let arr: NSMutableArray = [];
1102
1184
 
1103
- let q = HKSampleQuery(sampleType: sampleType, predicate: predicate, limit: limit, sortDescriptors: [NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: ascending)]) { (query: HKSampleQuery, sample: [HKSample]?, error: Error?) in
1104
- guard let err = error else {
1105
- guard let samples = sample else {
1106
- return resolve([]);
1107
- }
1108
- let arr: NSMutableArray = [];
1109
-
1110
- for s in samples {
1111
- if let sample = s as? HKCategorySample {
1112
- let serialized = self.serializeCategorySample(sample: sample);
1185
+ for s in samples {
1186
+ if let sample = s as? HKCategorySample {
1187
+ let serialized = self.serializeCategorySample(sample: sample);
1113
1188
 
1114
- arr.add(serialized)
1115
- }
1189
+ arr.add(serialized)
1116
1190
  }
1117
-
1118
- return resolve(arr);
1119
1191
  }
1120
- reject(GENERIC_ERROR, err.localizedDescription, err);
1192
+
1193
+ return resolve([
1194
+ "samples": arr,
1195
+ "deletedSamples": deletedSamples?.map({ sample in
1196
+ return self.serializeDeletedSample(sample: sample)
1197
+ }) as Any,
1198
+ "newAnchor": self.serializeAnchor(anchor: newAnchor) as Any
1199
+ ]);
1200
+ }
1201
+ reject(GENERIC_ERROR, err.localizedDescription, err);
1121
1202
  }
1122
1203
 
1123
1204
  store.execute(q);
@@ -56,9 +56,17 @@ const Healthkit = {
56
56
  getWheelchairUse: UnavailableFn(Promise.resolve(_nativeTypes.HKWheelchairUse.notSet)),
57
57
  getWorkoutRoutes: UnavailableFn(Promise.resolve([])),
58
58
  isHealthDataAvailable: async () => Promise.resolve(false),
59
- queryCategorySamples: UnavailableFn(Promise.resolve([])),
59
+ queryCategorySamples: UnavailableFn(Promise.resolve({
60
+ samples: [],
61
+ deletedSamples: [],
62
+ newAnchor: ''
63
+ })),
60
64
  queryCorrelationSamples: UnavailableFn(Promise.resolve([])),
61
- queryQuantitySamples: UnavailableFn(Promise.resolve([])),
65
+ queryQuantitySamples: UnavailableFn(Promise.resolve({
66
+ samples: [],
67
+ deletedSamples: [],
68
+ newAnchor: ''
69
+ })),
62
70
  queryStatisticsForQuantity: UnavailableFn(Promise.resolve({
63
71
  averageQuantity: undefined,
64
72
  maximumQuantity: undefined,
@@ -1 +1 @@
1
- {"version":3,"names":["notAvailableError","Platform","OS","hasWarned","UnavailableFn","retVal","console","warn","Healthkit","authorizationStatusFor","Promise","resolve","disableAllBackgroundDelivery","disableBackgroundDelivery","enableBackgroundDelivery","getBiologicalSex","HKBiologicalSex","notSet","getBloodType","HKBloodType","getDateOfBirth","Date","getFitzpatrickSkinType","HKFitzpatrickSkinType","getMostRecentCategorySample","getMostRecentQuantitySample","getMostRecentWorkout","getPreferredUnit","HKUnits","Count","getPreferredUnits","getRequestStatusForAuthorization","HKAuthorizationRequestStatus","unknown","getWheelchairUse","HKWheelchairUse","getWorkoutRoutes","isHealthDataAvailable","queryCategorySamples","queryCorrelationSamples","queryQuantitySamples","queryStatisticsForQuantity","averageQuantity","undefined","maximumQuantity","minimumQuantity","sumQuantity","mostRecentQuantity","mostRecentQuantityDateInterval","duration","queryWorkouts","querySources","requestAuthorization","deleteQuantitySample","deleteSamples","saveCategorySample","saveCorrelationSample","saveQuantitySample","saveWorkoutSample","subscribeToChanges","useMostRecentCategorySample","useMostRecentQuantitySample","useMostRecentWorkout","useSubscribeToChanges","useHealthkitAuthorization","useIsHealthDataAvailable","canAccessProtectedData"],"sources":["index.tsx"],"sourcesContent":["import { Platform } from 'react-native'\n\nimport {\n HKAuthorizationRequestStatus, HKBiologicalSex, HKBloodType, HKFitzpatrickSkinType, HKUnits, HKWheelchairUse,\n} from './native-types'\n\nimport type ReactNativeHealthkit from './index.ios'\n\nconst notAvailableError = `[@kingstinct/react-native-healthkit] Platform \"${\n Platform.OS\n}\" not supported`\n\nlet hasWarned = false\n\nfunction UnavailableFn<T = unknown>(retVal: T) {\n return () => {\n if (!hasWarned) {\n // eslint-disable-next-line no-console\n console.warn(notAvailableError)\n hasWarned = true\n }\n return retVal\n }\n}\n\nconst Healthkit: typeof ReactNativeHealthkit = {\n authorizationStatusFor: UnavailableFn(Promise.resolve(false)),\n disableAllBackgroundDelivery: UnavailableFn(Promise.resolve(false)),\n disableBackgroundDelivery: UnavailableFn(Promise.resolve(false)),\n enableBackgroundDelivery: UnavailableFn(Promise.resolve(false)),\n getBiologicalSex: UnavailableFn(Promise.resolve(HKBiologicalSex.notSet)),\n getBloodType: UnavailableFn(Promise.resolve(HKBloodType.notSet)),\n getDateOfBirth: UnavailableFn(Promise.resolve(new Date(0))),\n getFitzpatrickSkinType: UnavailableFn(Promise.resolve(HKFitzpatrickSkinType.notSet)),\n getMostRecentCategorySample: UnavailableFn(Promise.resolve(null)),\n getMostRecentQuantitySample: UnavailableFn(Promise.resolve(null)),\n getMostRecentWorkout: UnavailableFn(Promise.resolve(null)),\n getPreferredUnit: UnavailableFn(Promise.resolve(HKUnits.Count)),\n getPreferredUnits: UnavailableFn(Promise.resolve([])),\n getRequestStatusForAuthorization: UnavailableFn(Promise.resolve(HKAuthorizationRequestStatus.unknown)),\n getWheelchairUse: UnavailableFn(Promise.resolve(HKWheelchairUse.notSet)),\n getWorkoutRoutes: UnavailableFn(Promise.resolve([])),\n isHealthDataAvailable: async () => Promise.resolve(false),\n queryCategorySamples: UnavailableFn(Promise.resolve([])),\n queryCorrelationSamples: UnavailableFn(Promise.resolve([])),\n queryQuantitySamples: UnavailableFn(Promise.resolve([])),\n queryStatisticsForQuantity: UnavailableFn(Promise.resolve({\n averageQuantity: undefined,\n maximumQuantity: undefined,\n minimumQuantity: undefined,\n sumQuantity: undefined,\n mostRecentQuantity: undefined,\n mostRecentQuantityDateInterval: undefined,\n duration: undefined,\n })),\n queryWorkouts: UnavailableFn(Promise.resolve([])),\n querySources: UnavailableFn(Promise.resolve([])),\n requestAuthorization: UnavailableFn(Promise.resolve(false)),\n deleteQuantitySample: UnavailableFn(Promise.resolve(false)),\n deleteSamples: UnavailableFn(Promise.resolve(false)),\n saveCategorySample: UnavailableFn(Promise.resolve(false)),\n saveCorrelationSample: UnavailableFn(Promise.resolve(false)),\n saveQuantitySample: UnavailableFn(Promise.resolve(false)),\n saveWorkoutSample: UnavailableFn(Promise.resolve(false)),\n subscribeToChanges: UnavailableFn(Promise.resolve(async () => Promise.resolve(false))),\n useMostRecentCategorySample: UnavailableFn(null),\n useMostRecentQuantitySample: UnavailableFn(null),\n useMostRecentWorkout: UnavailableFn(null),\n useSubscribeToChanges: UnavailableFn([null, () => null]),\n useHealthkitAuthorization: UnavailableFn([null, async () => Promise.resolve(HKAuthorizationRequestStatus.unknown)] as const),\n useIsHealthDataAvailable: () => false,\n canAccessProtectedData: async () => Promise.resolve(false),\n}\n\nexport * from './types'\n\nexport default Healthkit\n"],"mappings":"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"}
1
+ {"version":3,"names":["notAvailableError","Platform","OS","hasWarned","UnavailableFn","retVal","console","warn","Healthkit","authorizationStatusFor","Promise","resolve","disableAllBackgroundDelivery","disableBackgroundDelivery","enableBackgroundDelivery","getBiologicalSex","HKBiologicalSex","notSet","getBloodType","HKBloodType","getDateOfBirth","Date","getFitzpatrickSkinType","HKFitzpatrickSkinType","getMostRecentCategorySample","getMostRecentQuantitySample","getMostRecentWorkout","getPreferredUnit","HKUnits","Count","getPreferredUnits","getRequestStatusForAuthorization","HKAuthorizationRequestStatus","unknown","getWheelchairUse","HKWheelchairUse","getWorkoutRoutes","isHealthDataAvailable","queryCategorySamples","samples","deletedSamples","newAnchor","queryCorrelationSamples","queryQuantitySamples","queryStatisticsForQuantity","averageQuantity","undefined","maximumQuantity","minimumQuantity","sumQuantity","mostRecentQuantity","mostRecentQuantityDateInterval","duration","queryWorkouts","querySources","requestAuthorization","deleteQuantitySample","deleteSamples","saveCategorySample","saveCorrelationSample","saveQuantitySample","saveWorkoutSample","subscribeToChanges","useMostRecentCategorySample","useMostRecentQuantitySample","useMostRecentWorkout","useSubscribeToChanges","useHealthkitAuthorization","useIsHealthDataAvailable","canAccessProtectedData"],"sources":["index.tsx"],"sourcesContent":["import { Platform } from 'react-native'\n\nimport {\n HKAuthorizationRequestStatus, HKBiologicalSex, HKBloodType, HKFitzpatrickSkinType, HKQuantityTypeIdentifier, HKUnits, HKWheelchairUse, QueryQuantitySamplesResponseRaw,\n} from './native-types'\n\nimport type ReactNativeHealthkit from './index.ios'\n\nconst notAvailableError = `[@kingstinct/react-native-healthkit] Platform \"${\n Platform.OS\n}\" not supported`\n\nlet hasWarned = false\n\nfunction UnavailableFn<T = unknown>(retVal: T) {\n return () => {\n if (!hasWarned) {\n // eslint-disable-next-line no-console\n console.warn(notAvailableError)\n hasWarned = true\n }\n return retVal\n }\n}\n\nconst Healthkit: typeof ReactNativeHealthkit = {\n authorizationStatusFor: UnavailableFn(Promise.resolve(false)),\n disableAllBackgroundDelivery: UnavailableFn(Promise.resolve(false)),\n disableBackgroundDelivery: UnavailableFn(Promise.resolve(false)),\n enableBackgroundDelivery: UnavailableFn(Promise.resolve(false)),\n getBiologicalSex: UnavailableFn(Promise.resolve(HKBiologicalSex.notSet)),\n getBloodType: UnavailableFn(Promise.resolve(HKBloodType.notSet)),\n getDateOfBirth: UnavailableFn(Promise.resolve(new Date(0))),\n getFitzpatrickSkinType: UnavailableFn(Promise.resolve(HKFitzpatrickSkinType.notSet)),\n getMostRecentCategorySample: UnavailableFn(Promise.resolve(null)),\n getMostRecentQuantitySample: UnavailableFn(Promise.resolve(null)),\n getMostRecentWorkout: UnavailableFn(Promise.resolve(null)),\n getPreferredUnit: UnavailableFn(Promise.resolve(HKUnits.Count)),\n getPreferredUnits: UnavailableFn(Promise.resolve([])),\n getRequestStatusForAuthorization: UnavailableFn(Promise.resolve(HKAuthorizationRequestStatus.unknown)),\n getWheelchairUse: UnavailableFn(Promise.resolve(HKWheelchairUse.notSet)),\n getWorkoutRoutes: UnavailableFn(Promise.resolve([])),\n isHealthDataAvailable: async () => Promise.resolve(false),\n queryCategorySamples: UnavailableFn(Promise.resolve({\n samples: [],\n deletedSamples: [],\n newAnchor: '',\n })),\n queryCorrelationSamples: UnavailableFn(Promise.resolve([])),\n queryQuantitySamples: UnavailableFn(Promise.resolve({\n samples: [],\n deletedSamples: [],\n newAnchor: '',\n })),\n queryStatisticsForQuantity: UnavailableFn(Promise.resolve({\n averageQuantity: undefined,\n maximumQuantity: undefined,\n minimumQuantity: undefined,\n sumQuantity: undefined,\n mostRecentQuantity: undefined,\n mostRecentQuantityDateInterval: undefined,\n duration: undefined,\n })),\n queryWorkouts: UnavailableFn(Promise.resolve([])),\n querySources: UnavailableFn(Promise.resolve([])),\n requestAuthorization: UnavailableFn(Promise.resolve(false)),\n deleteQuantitySample: UnavailableFn(Promise.resolve(false)),\n deleteSamples: UnavailableFn(Promise.resolve(false)),\n saveCategorySample: UnavailableFn(Promise.resolve(false)),\n saveCorrelationSample: UnavailableFn(Promise.resolve(false)),\n saveQuantitySample: UnavailableFn(Promise.resolve(false)),\n saveWorkoutSample: UnavailableFn(Promise.resolve(false)),\n subscribeToChanges: UnavailableFn(Promise.resolve(async () => Promise.resolve(false))),\n useMostRecentCategorySample: UnavailableFn(null),\n useMostRecentQuantitySample: UnavailableFn(null),\n useMostRecentWorkout: UnavailableFn(null),\n useSubscribeToChanges: UnavailableFn([null, () => null]),\n useHealthkitAuthorization: UnavailableFn([null, async () => Promise.resolve(HKAuthorizationRequestStatus.unknown)] as const),\n useIsHealthDataAvailable: () => false,\n canAccessProtectedData: async () => Promise.resolve(false),\n}\n\nexport * from './types'\n\nexport default Healthkit\n"],"mappings":"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"}