@kingstinct/react-native-healthkit 12.1.2 → 12.2.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 (266) hide show
  1. package/ios/CategoryTypeModule.swift +49 -97
  2. package/ios/CharacteristicTypeModule.swift +77 -63
  3. package/ios/CoreModule.swift +324 -280
  4. package/ios/CorrelationTypeModule.swift +192 -144
  5. package/ios/ElectrocardiogramModule.swift +185 -194
  6. package/ios/HeartbeatSeriesModule.swift +123 -171
  7. package/ios/Helpers.swift +312 -571
  8. package/ios/MedicationModule.swift +259 -0
  9. package/ios/PredicateHelpers.swift +334 -0
  10. package/ios/QuantityTypeModule.swift +297 -378
  11. package/ios/Serializers.swift +273 -210
  12. package/ios/SourceProxy.swift +2 -2
  13. package/ios/StateOfMindModule.swift +179 -125
  14. package/ios/WorkoutProxy.swift +235 -112
  15. package/ios/WorkoutsModule.swift +214 -262
  16. package/lib/commonjs/healthkit.ios.js +22 -2
  17. package/lib/commonjs/healthkit.js +35 -5
  18. package/lib/commonjs/hooks/useStatisticsForQuantity.js +1 -1
  19. package/lib/commonjs/hooks/useSubscribeToCategorySamples.js +20 -0
  20. package/lib/commonjs/modules.js +2 -1
  21. package/lib/commonjs/specs/MedicationModule.nitro.js +27 -0
  22. package/lib/commonjs/types/Constants.js +2 -1
  23. package/lib/commonjs/types/QuantityType.js +8 -1
  24. package/lib/commonjs/types/QueryOptions.js +18 -0
  25. package/lib/commonjs/types/WeatherCondition.js +32 -32
  26. package/lib/commonjs/types/Workouts.js +1 -50
  27. package/lib/commonjs/utils/getCategorySampleById.js +1 -1
  28. package/lib/commonjs/utils/getQuantitySampleById.js +1 -1
  29. package/lib/commonjs/utils/getWorkoutById.js +1 -1
  30. package/lib/commonjs/utils/subscribeToCategorySamples.js +29 -0
  31. package/lib/commonjs/utils/subscribeToQuantitySamples.js +8 -25
  32. package/lib/module/healthkit.ios.js +20 -2
  33. package/lib/module/healthkit.js +32 -2
  34. package/lib/module/hooks/useStatisticsForQuantity.js +1 -1
  35. package/lib/module/hooks/useSubscribeToCategorySamples.js +17 -0
  36. package/lib/module/modules.js +1 -0
  37. package/lib/module/specs/MedicationModule.nitro.js +26 -0
  38. package/lib/module/types/Constants.js +1 -0
  39. package/lib/module/types/QuantityType.js +7 -0
  40. package/lib/module/types/QueryOptions.js +17 -1
  41. package/lib/module/types/WeatherCondition.js +31 -31
  42. package/lib/module/types/Workouts.js +0 -49
  43. package/lib/module/utils/getCategorySampleById.js +1 -1
  44. package/lib/module/utils/getQuantitySampleById.js +1 -1
  45. package/lib/module/utils/getWorkoutById.js +1 -1
  46. package/lib/module/utils/subscribeToCategorySamples.js +26 -0
  47. package/lib/module/utils/subscribeToQuantitySamples.js +8 -25
  48. package/lib/typescript/healthkit.d.ts +18 -9
  49. package/lib/typescript/healthkit.ios.d.ts +33 -15
  50. package/lib/typescript/hooks/useSubscribeToCategorySamples.d.ts +3 -0
  51. package/lib/typescript/modules.d.ts +2 -0
  52. package/lib/typescript/specs/CategoryTypeModule.nitro.d.ts +2 -2
  53. package/lib/typescript/specs/CoreModule.nitro.d.ts +2 -1
  54. package/lib/typescript/specs/CorrelationTypeModule.nitro.d.ts +4 -2
  55. package/lib/typescript/specs/ElectrocardiogramModule.nitro.d.ts +1 -1
  56. package/lib/typescript/specs/HeartbeatSeriesModule.nitro.d.ts +1 -1
  57. package/lib/typescript/specs/MedicationModule.nitro.d.ts +56 -0
  58. package/lib/typescript/specs/QuantityTypeModule.nitro.d.ts +4 -4
  59. package/lib/typescript/specs/StateOfMindModule.nitro.d.ts +4 -3
  60. package/lib/typescript/types/CategoryType.d.ts +10 -20
  61. package/lib/typescript/types/Constants.d.ts +1 -0
  62. package/lib/typescript/types/CorrelationType.d.ts +8 -10
  63. package/lib/typescript/types/ElectrocardiogramSample.d.ts +2 -12
  64. package/lib/typescript/types/HeartbeatSeries.d.ts +2 -14
  65. package/lib/typescript/types/QuantitySample.d.ts +2 -8
  66. package/lib/typescript/types/QuantityType.d.ts +7 -8
  67. package/lib/typescript/types/QuantityTypeIdentifier.d.ts +23 -23
  68. package/lib/typescript/types/QueryOptions.d.ts +43 -28
  69. package/lib/typescript/types/Shared.d.ts +52 -7
  70. package/lib/typescript/types/StateOfMind.d.ts +7 -10
  71. package/lib/typescript/types/Subscriptions.d.ts +12 -3
  72. package/lib/typescript/types/WeatherCondition.d.ts +1 -1
  73. package/lib/typescript/types/Workouts.d.ts +28 -81
  74. package/lib/typescript/utils/subscribeToCategorySamples.d.ts +5 -0
  75. package/nitrogen/generated/ios/ReactNativeHealthkit-Swift-Cxx-Bridge.cpp +57 -0
  76. package/nitrogen/generated/ios/ReactNativeHealthkit-Swift-Cxx-Bridge.hpp +592 -389
  77. package/nitrogen/generated/ios/ReactNativeHealthkit-Swift-Cxx-Umbrella.hpp +65 -30
  78. package/nitrogen/generated/ios/ReactNativeHealthkitAutolinking.mm +8 -0
  79. package/nitrogen/generated/ios/ReactNativeHealthkitAutolinking.swift +15 -0
  80. package/nitrogen/generated/ios/c++/HybridCategoryTypeModuleSpecSwift.hpp +32 -26
  81. package/nitrogen/generated/ios/c++/HybridCoreModuleSpecSwift.hpp +36 -37
  82. package/nitrogen/generated/ios/c++/HybridCorrelationTypeModuleSpecSwift.hpp +55 -2
  83. package/nitrogen/generated/ios/c++/HybridElectrocardiogramModuleSpecSwift.hpp +36 -30
  84. package/nitrogen/generated/ios/c++/HybridHeartbeatSeriesModuleSpecSwift.hpp +35 -29
  85. package/nitrogen/generated/ios/c++/HybridMedicationModuleSpecSwift.cpp +11 -0
  86. package/nitrogen/generated/ios/c++/HybridMedicationModuleSpecSwift.hpp +181 -0
  87. package/nitrogen/generated/ios/c++/HybridQuantityTypeModuleSpecSwift.hpp +48 -42
  88. package/nitrogen/generated/ios/c++/HybridStateOfMindModuleSpecSwift.hpp +59 -36
  89. package/nitrogen/generated/ios/c++/HybridWorkoutProxySpecSwift.hpp +150 -29
  90. package/nitrogen/generated/ios/c++/HybridWorkoutsModuleSpecSwift.hpp +13 -28
  91. package/nitrogen/generated/ios/swift/AggregationStyle.swift +48 -0
  92. package/nitrogen/generated/ios/swift/CategorySample.swift +571 -24
  93. package/nitrogen/generated/ios/swift/ComparisonPredicateOperator.swift +2 -2
  94. package/nitrogen/generated/ios/swift/CorrelationSample.swift +640 -17
  95. package/nitrogen/generated/ios/swift/{PredicateWithStartAndEnd.swift → DateFilter.swift} +5 -5
  96. package/nitrogen/generated/ios/swift/ECGQueryOptionsWithAnchor.swift +11 -91
  97. package/nitrogen/generated/ios/swift/ECGQueryOptionsWithSortOrder.swift +11 -91
  98. package/nitrogen/generated/ios/swift/ElectrocardiogramSample.swift +570 -72
  99. package/nitrogen/generated/ios/swift/FilterForSamples.swift +349 -12
  100. package/nitrogen/generated/ios/swift/FilterForSamplesBase.swift +234 -0
  101. package/nitrogen/generated/ios/swift/FilterForWorkouts.swift +366 -0
  102. package/nitrogen/generated/ios/swift/FilterForWorkoutsBase.swift +240 -0
  103. package/nitrogen/generated/ios/swift/Func_void_MedicationDoseEventsWithAnchorResponse.swift +47 -0
  104. package/nitrogen/generated/ios/swift/Func_void_QueryCorrelationSamplesWithAnchorResponse.swift +47 -0
  105. package/nitrogen/generated/ios/swift/Func_void_StateOfMindSamplesWithAnchorResponse.swift +47 -0
  106. package/nitrogen/generated/ios/swift/Func_void_std__vector_MedicationDoseEvent_.swift +47 -0
  107. package/nitrogen/generated/ios/swift/Func_void_std__vector_UserAnnotatedMedication_.swift +47 -0
  108. package/nitrogen/generated/ios/swift/GeneralForm.swift +104 -0
  109. package/nitrogen/generated/ios/swift/HeartRateMotionContext.swift +44 -0
  110. package/nitrogen/generated/ios/swift/HeartbeatSeriesSample.swift +565 -37
  111. package/nitrogen/generated/ios/swift/HybridCategoryTypeModuleSpec.swift +1 -1
  112. package/nitrogen/generated/ios/swift/HybridCategoryTypeModuleSpec_cxx.swift +2 -2
  113. package/nitrogen/generated/ios/swift/HybridCoreModuleSpec.swift +2 -1
  114. package/nitrogen/generated/ios/swift/HybridCoreModuleSpec_cxx.swift +19 -31
  115. package/nitrogen/generated/ios/swift/HybridCorrelationTypeModuleSpec.swift +2 -1
  116. package/nitrogen/generated/ios/swift/HybridCorrelationTypeModuleSpec_cxx.swift +21 -2
  117. package/nitrogen/generated/ios/swift/HybridElectrocardiogramModuleSpec.swift +1 -1
  118. package/nitrogen/generated/ios/swift/HybridElectrocardiogramModuleSpec_cxx.swift +2 -2
  119. package/nitrogen/generated/ios/swift/HybridHeartbeatSeriesModuleSpec.swift +1 -1
  120. package/nitrogen/generated/ios/swift/HybridHeartbeatSeriesModuleSpec_cxx.swift +2 -2
  121. package/nitrogen/generated/ios/swift/HybridMedicationModuleSpec.swift +60 -0
  122. package/nitrogen/generated/ios/swift/HybridMedicationModuleSpec_cxx.swift +208 -0
  123. package/nitrogen/generated/ios/swift/HybridQuantityTypeModuleSpec.swift +2 -2
  124. package/nitrogen/generated/ios/swift/HybridQuantityTypeModuleSpec_cxx.swift +9 -43
  125. package/nitrogen/generated/ios/swift/HybridStateOfMindModuleSpec.swift +2 -1
  126. package/nitrogen/generated/ios/swift/HybridStateOfMindModuleSpec_cxx.swift +21 -2
  127. package/nitrogen/generated/ios/swift/HybridWorkoutProxySpec.swift +34 -6
  128. package/nitrogen/generated/ios/swift/HybridWorkoutProxySpec_cxx.swift +376 -36
  129. package/nitrogen/generated/ios/swift/InsulinDeliveryReason.swift +40 -0
  130. package/nitrogen/generated/ios/swift/MedicationConcept.swift +80 -0
  131. package/nitrogen/generated/ios/swift/MedicationDoseEvent.swift +781 -0
  132. package/nitrogen/generated/ios/swift/MedicationDoseEventLogStatus.swift +56 -0
  133. package/nitrogen/generated/ios/swift/MedicationDoseEventScheduleType.swift +40 -0
  134. package/nitrogen/generated/ios/swift/MedicationDoseEventsWithAnchorResponse.swift +81 -0
  135. package/nitrogen/generated/ios/swift/ObjectTypeIdentifier.swift +16 -16
  136. package/nitrogen/generated/ios/swift/PredicateWithMetadataKey.swift +7 -7
  137. package/nitrogen/generated/ios/swift/QuantitySample.swift +574 -27
  138. package/nitrogen/generated/ios/swift/QuantityTypeIdentifier.swift +16 -16
  139. package/nitrogen/generated/ios/swift/QueryCorrelationSamplesWithAnchorResponse.swift +81 -0
  140. package/nitrogen/generated/ios/swift/QueryOptionsWithAnchor.swift +11 -91
  141. package/nitrogen/generated/ios/swift/QueryOptionsWithAnchorAndUnit.swift +11 -91
  142. package/nitrogen/generated/ios/swift/QueryOptionsWithSortOrder.swift +11 -91
  143. package/nitrogen/generated/ios/swift/QueryOptionsWithSortOrderAndUnit.swift +11 -91
  144. package/nitrogen/generated/ios/swift/RelatedCoding.swift +76 -0
  145. package/nitrogen/generated/ios/swift/SampleType.swift +68 -0
  146. package/nitrogen/generated/ios/swift/SampleTypeIdentifier.swift +16 -16
  147. package/nitrogen/generated/ios/swift/SampleTypeIdentifierWriteable.swift +0 -16
  148. package/nitrogen/generated/ios/swift/StateOfMindSample.swift +586 -58
  149. package/nitrogen/generated/ios/swift/StateOfMindSamplesWithAnchorResponse.swift +81 -0
  150. package/nitrogen/generated/ios/swift/StatisticsQueryOptions.swift +7 -75
  151. package/nitrogen/generated/ios/swift/UserAnnotatedMedication.swift +87 -0
  152. package/nitrogen/generated/ios/swift/WeatherCondition.swift +144 -0
  153. package/nitrogen/generated/ios/swift/WorkoutQueryOptions.swift +11 -105
  154. package/nitrogen/generated/ios/swift/WorkoutQueryOptionsWithAnchor.swift +11 -105
  155. package/nitrogen/generated/ios/swift/WorkoutSample.swift +751 -78
  156. package/nitrogen/generated/shared/c++/AggregationStyle.hpp +64 -0
  157. package/nitrogen/generated/shared/c++/CategorySample.hpp +126 -23
  158. package/nitrogen/generated/shared/c++/CorrelationSample.hpp +134 -12
  159. package/nitrogen/generated/shared/c++/{PredicateWithStartAndEnd.hpp → DateFilter.hpp} +10 -10
  160. package/nitrogen/generated/shared/c++/ECGQueryOptionsWithAnchor.hpp +12 -31
  161. package/nitrogen/generated/shared/c++/ECGQueryOptionsWithSortOrder.hpp +12 -31
  162. package/nitrogen/generated/shared/c++/ElectrocardiogramSample.hpp +135 -36
  163. package/nitrogen/generated/shared/c++/FilterForSamples.hpp +124 -0
  164. package/nitrogen/generated/shared/c++/FilterForSamplesBase.hpp +109 -0
  165. package/nitrogen/generated/shared/c++/FilterForWorkouts.hpp +131 -0
  166. package/nitrogen/generated/shared/c++/FilterForWorkoutsBase.hpp +116 -0
  167. package/nitrogen/generated/shared/c++/GeneralForm.hpp +140 -0
  168. package/nitrogen/generated/shared/c++/HeartRateMotionContext.hpp +67 -0
  169. package/nitrogen/generated/shared/c++/HeartbeatSeriesSample.hpp +131 -28
  170. package/nitrogen/generated/shared/c++/HybridCategoryTypeModuleSpec.hpp +1 -2
  171. package/nitrogen/generated/shared/c++/HybridCoreModuleSpec.cpp +1 -0
  172. package/nitrogen/generated/shared/c++/HybridCoreModuleSpec.hpp +10 -28
  173. package/nitrogen/generated/shared/c++/HybridCorrelationTypeModuleSpec.cpp +1 -0
  174. package/nitrogen/generated/shared/c++/HybridCorrelationTypeModuleSpec.hpp +11 -1
  175. package/nitrogen/generated/shared/c++/HybridElectrocardiogramModuleSpec.hpp +1 -2
  176. package/nitrogen/generated/shared/c++/HybridHeartbeatSeriesModuleSpec.hpp +1 -2
  177. package/nitrogen/generated/shared/c++/HybridMedicationModuleSpec.cpp +24 -0
  178. package/nitrogen/generated/shared/c++/HybridMedicationModuleSpec.hpp +80 -0
  179. package/nitrogen/generated/shared/c++/HybridQuantityTypeModuleSpec.cpp +1 -1
  180. package/nitrogen/generated/shared/c++/HybridQuantityTypeModuleSpec.hpp +6 -25
  181. package/nitrogen/generated/shared/c++/HybridStateOfMindModuleSpec.cpp +1 -0
  182. package/nitrogen/generated/shared/c++/HybridStateOfMindModuleSpec.hpp +9 -2
  183. package/nitrogen/generated/shared/c++/HybridWorkoutProxySpec.cpp +33 -5
  184. package/nitrogen/generated/shared/c++/HybridWorkoutProxySpec.hpp +56 -16
  185. package/nitrogen/generated/shared/c++/InsulinDeliveryReason.hpp +62 -0
  186. package/nitrogen/generated/shared/c++/MedicationConcept.hpp +93 -0
  187. package/nitrogen/generated/shared/c++/MedicationDoseEvent.hpp +240 -0
  188. package/nitrogen/generated/shared/c++/MedicationDoseEventLogStatus.hpp +66 -0
  189. package/nitrogen/generated/shared/c++/MedicationDoseEventScheduleType.hpp +62 -0
  190. package/nitrogen/generated/shared/c++/MedicationDoseEventsWithAnchorResponse.hpp +89 -0
  191. package/nitrogen/generated/shared/c++/ObjectTypeIdentifier.hpp +105 -105
  192. package/nitrogen/generated/shared/c++/PredicateWithMetadataKey.hpp +8 -8
  193. package/nitrogen/generated/shared/c++/QuantitySample.hpp +130 -27
  194. package/nitrogen/generated/shared/c++/QuantityTypeIdentifier.hpp +105 -105
  195. package/nitrogen/generated/shared/c++/QueryCorrelationSamplesWithAnchorResponse.hpp +89 -0
  196. package/nitrogen/generated/shared/c++/QueryOptionsWithAnchor.hpp +12 -31
  197. package/nitrogen/generated/shared/c++/QueryOptionsWithAnchorAndUnit.hpp +12 -31
  198. package/nitrogen/generated/shared/c++/QueryOptionsWithSortOrder.hpp +12 -31
  199. package/nitrogen/generated/shared/c++/QueryOptionsWithSortOrderAndUnit.hpp +12 -31
  200. package/nitrogen/generated/shared/c++/RelatedCoding.hpp +84 -0
  201. package/nitrogen/generated/shared/c++/SampleType.hpp +87 -0
  202. package/nitrogen/generated/shared/c++/SampleTypeIdentifier.hpp +105 -105
  203. package/nitrogen/generated/shared/c++/SampleTypeIdentifierWriteable.hpp +105 -121
  204. package/nitrogen/generated/shared/c++/StateOfMindSample.hpp +139 -36
  205. package/nitrogen/generated/shared/c++/StateOfMindSamplesWithAnchorResponse.hpp +89 -0
  206. package/nitrogen/generated/shared/c++/StatisticsQueryOptions.hpp +8 -27
  207. package/nitrogen/generated/shared/c++/UserAnnotatedMedication.hpp +90 -0
  208. package/nitrogen/generated/shared/c++/WeatherCondition.hpp +88 -0
  209. package/nitrogen/generated/shared/c++/WorkoutQueryOptions.hpp +12 -37
  210. package/nitrogen/generated/shared/c++/WorkoutQueryOptionsWithAnchor.hpp +12 -37
  211. package/nitrogen/generated/shared/c++/WorkoutSample.hpp +159 -35
  212. package/package.json +1 -1
  213. package/src/healthkit.ios.ts +30 -0
  214. package/src/healthkit.ts +68 -3
  215. package/src/hooks/useStatisticsForQuantity.ts +1 -1
  216. package/src/hooks/useSubscribeToCategorySamples.ts +31 -0
  217. package/src/modules.ts +4 -0
  218. package/src/specs/CategoryTypeModule.nitro.ts +2 -2
  219. package/src/specs/CoreModule.nitro.ts +3 -0
  220. package/src/specs/CorrelationTypeModule.nitro.ts +11 -3
  221. package/src/specs/ElectrocardiogramModule.nitro.ts +1 -1
  222. package/src/specs/HeartbeatSeriesModule.nitro.ts +1 -1
  223. package/src/specs/MedicationModule.nitro.ts +140 -0
  224. package/src/specs/QuantityTypeModule.nitro.ts +4 -7
  225. package/src/specs/StateOfMindModule.nitro.ts +10 -2
  226. package/src/types/CategoryType.ts +15 -22
  227. package/src/types/Constants.ts +3 -0
  228. package/src/types/CorrelationType.ts +10 -15
  229. package/src/types/ElectrocardiogramSample.ts +2 -14
  230. package/src/types/HeartbeatSeries.ts +2 -15
  231. package/src/types/QuantitySample.ts +2 -8
  232. package/src/types/QuantityType.ts +8 -17
  233. package/src/types/QuantityTypeIdentifier.ts +25 -25
  234. package/src/types/QueryOptions.ts +54 -43
  235. package/src/types/Shared.ts +74 -17
  236. package/src/types/StateOfMind.ts +8 -10
  237. package/src/types/Subscriptions.ts +19 -3
  238. package/src/types/WeatherCondition.ts +1 -1
  239. package/src/types/Workouts.ts +28 -91
  240. package/src/utils/getCategorySampleById.ts +1 -1
  241. package/src/utils/getQuantitySampleById.ts +1 -1
  242. package/src/utils/getWorkoutById.ts +1 -2
  243. package/src/utils/subscribeToCategorySamples.ts +38 -0
  244. package/src/utils/subscribeToQuantitySamples.ts +12 -37
  245. package/nitrogen/generated/ios/swift/FilterForSamplesAnd.swift +0 -94
  246. package/nitrogen/generated/ios/swift/FilterForSamplesOr.swift +0 -94
  247. package/nitrogen/generated/ios/swift/PredicateForSamples.swift +0 -21
  248. package/nitrogen/generated/ios/swift/PredicateForWorkouts.swift +0 -23
  249. package/nitrogen/generated/ios/swift/PredicateForWorkoutsAnd.swift +0 -108
  250. package/nitrogen/generated/ios/swift/PredicateForWorkoutsOr.swift +0 -108
  251. package/nitrogen/generated/ios/swift/PredicateFromWorkout.swift +0 -45
  252. package/nitrogen/generated/ios/swift/PredicateWithMetadataOperator.swift +0 -48
  253. package/nitrogen/generated/ios/swift/PredicateWithUUID.swift +0 -35
  254. package/nitrogen/generated/ios/swift/PredicateWithUUIDs.swift +0 -47
  255. package/nitrogen/generated/ios/swift/Variant_PredicateWithUUID_PredicateWithUUIDs_PredicateWithMetadataKey_PredicateWithStartAndEnd_PredicateFromWorkout_FilterForSamplesAnd_FilterForSamplesOr.swift +0 -23
  256. package/nitrogen/generated/ios/swift/Variant_PredicateWithUUID_PredicateWithUUIDs_PredicateWithMetadataKey_PredicateWithStartAndEnd_PredicateFromWorkout_WorkoutActivityTypePredicate_WorkoutDurationPredicate_PredicateForWorkoutsOr_PredicateForWorkoutsAnd.swift +0 -25
  257. package/nitrogen/generated/ios/swift/WorkoutActivityTypePredicate.swift +0 -35
  258. package/nitrogen/generated/shared/c++/FilterForSamplesAnd.hpp +0 -90
  259. package/nitrogen/generated/shared/c++/FilterForSamplesOr.hpp +0 -90
  260. package/nitrogen/generated/shared/c++/PredicateForWorkoutsAnd.hpp +0 -96
  261. package/nitrogen/generated/shared/c++/PredicateForWorkoutsOr.hpp +0 -96
  262. package/nitrogen/generated/shared/c++/PredicateFromWorkout.hpp +0 -77
  263. package/nitrogen/generated/shared/c++/PredicateWithMetadataOperator.hpp +0 -84
  264. package/nitrogen/generated/shared/c++/PredicateWithUUID.hpp +0 -75
  265. package/nitrogen/generated/shared/c++/PredicateWithUUIDs.hpp +0 -76
  266. package/nitrogen/generated/shared/c++/WorkoutActivityTypePredicate.hpp +0 -76
@@ -3,210 +3,201 @@ import NitroModules
3
3
 
4
4
  // MARK: - Helpers
5
5
 
6
- func getElectrocardiogramByID(
7
- seriesUUID: UUID
8
- ) async -> HKElectrocardiogram? {
9
- let predicate = HKQuery.predicateForObject(with: seriesUUID)
10
-
11
- let samples = try? await withCheckedThrowingContinuation { (continuation: CheckedContinuation<[HKSample], Error>) in
12
- let query = HKSampleQuery(
13
- sampleType: HKObjectType.electrocardiogramType(),
14
- predicate: predicate,
15
- limit: 1,
16
- sortDescriptors: nil
17
- ) { _, results, error in
18
- if let error { continuation.resume(throwing: error); return }
19
- guard let results else {
20
- continuation.resume(throwing: RuntimeError.error(withMessage: "Empty response"))
21
- return
22
- }
23
- continuation.resume(returning: results)
24
- }
25
- store.execute(query)
26
- }
27
-
28
- return (samples as? [HKElectrocardiogram])?.first
6
+ private func serializeSymptomsStatus(_ symptoms: HKElectrocardiogram.SymptomsStatus)
7
+ -> ElectrocardiogramSymptomsStatus {
8
+ switch symptoms {
9
+ case .notSet: return ElectrocardiogramSymptomsStatus(fromString: "notSet")!
10
+ case .none: return ElectrocardiogramSymptomsStatus(fromString: "none")!
11
+ case .present: return ElectrocardiogramSymptomsStatus(fromString: "present")!
12
+ @unknown default: return ElectrocardiogramSymptomsStatus(fromString: "notSet")!
13
+ }
29
14
  }
30
15
 
31
- @available(iOS 14.0, *)
32
- class ElectrocardiogramModule: HybridElectrocardiogramModuleSpec {
16
+ private func serializeECGSample(sample: HKElectrocardiogram, includeVoltages: Bool) async throws
17
+ -> ElectrocardiogramSample {
18
+ // Convert quantities
19
+ let bpmUnit = HKUnit.count().unitDivided(by: .minute())
20
+ let hzUnit = HKUnit.hertz()
21
+ let avgHR = sample.averageHeartRate?.doubleValue(for: bpmUnit)
22
+ let freqHz = sample.samplingFrequency?.doubleValue(for: hzUnit)
23
+
24
+ // Optional: waveform
25
+ let voltages: [ElectrocardiogramVoltage]? =
26
+ includeVoltages
27
+ ? try await getECGVoltages(sample: sample)
28
+ : nil
29
+
30
+ return ElectrocardiogramSample(
31
+ classification: serializeClassification(sample.classification),
32
+ symptomsStatus: serializeSymptomsStatus(sample.symptomsStatus),
33
+ averageHeartRateBpm: avgHR,
34
+ samplingFrequencyHz: freqHz,
35
+ numberOfVoltageMeasurements: Double(sample.numberOfVoltageMeasurements),
36
+ voltages: voltages,
37
+ sampleType: serializeSampleType(sample.sampleType),
38
+ startDate: sample.startDate,
39
+ endDate: sample.endDate,
40
+ hasUndeterminedDuration: sample.hasUndeterminedDuration,
41
+
42
+ metadataWeatherCondition: serializeWeatherCondition(
43
+ sample.metadata?[HKMetadataKeyWeatherCondition] as? HKWeatherCondition),
44
+ metadataWeatherHumidity: serializeUnknownQuantityTyped(
45
+ quantity: sample.metadata?[HKMetadataKeyWeatherHumidity] as? HKQuantity),
46
+ metadataWeatherTemperature: serializeUnknownQuantityTyped(
47
+ quantity: sample.metadata?[HKMetadataKeyWeatherTemperature] as? HKQuantity),
48
+ metadataInsulinDeliveryReason: serializeInsulinDeliveryReason(
49
+ sample.metadata?[HKMetadataKeyInsulinDeliveryReason] as? HKInsulinDeliveryReason),
50
+ metadataHeartRateMotionContext: serializeHeartRateMotionContext(
51
+ sample.metadata?[HKMetadataKeyHeartRateMotionContext] as? HKHeartRateMotionContext),
52
+
53
+ uuid: sample.uuid.uuidString,
54
+ sourceRevision: serializeSourceRevision(sample.sourceRevision),
55
+ device: serializeDevice(hkDevice: sample.device),
56
+ metadata: serializeMetadata(sample.metadata),
57
+
58
+ metadataExternalUUID: sample.metadata?[HKMetadataKeyExternalUUID] as? String,
59
+ metadataTimeZone: sample.metadata?[HKMetadataKeyTimeZone] as? String,
60
+ metadataWasUserEntered: sample.metadata?[HKMetadataKeyWasUserEntered] as? Bool,
61
+ metadataDeviceSerialNumber: sample.metadata?[HKMetadataKeyDeviceSerialNumber] as? String,
62
+ metadataUdiDeviceIdentifier: sample.metadata?[HKMetadataKeyUDIDeviceIdentifier] as? String,
63
+ metadataUdiProductionIdentifier: sample.metadata?[HKMetadataKeyUDIProductionIdentifier]
64
+ as? String,
65
+ metadataDigitalSignature: sample.metadata?[HKMetadataKeyDigitalSignature] as? String,
66
+ metadataDeviceName: sample.metadata?[HKMetadataKeyDeviceName] as? String,
67
+ metadataDeviceManufacturerName: sample.metadata?[HKMetadataKeyDeviceManufacturerName]
68
+ as? String,
69
+ metadataSyncIdentifier: sample.metadata?[HKMetadataKeySyncIdentifier] as? String,
70
+ metadataSyncVersion: sample.metadata?[HKMetadataKeySyncVersion] as? Double,
71
+ metadataWasTakenInLab: sample.metadata?[HKMetadataKeyWasTakenInLab] as? Bool,
72
+ metadataReferenceRangeLowerLimit: sample.metadata?[HKMetadataKeyReferenceRangeLowerLimit]
73
+ as? Double,
74
+ metadataReferenceRangeUpperLimit: sample.metadata?[HKMetadataKeyReferenceRangeUpperLimit]
75
+ as? Double,
76
+ metadataAlgorithmVersion: sample.metadata?[HKMetadataKeyAlgorithmVersion] as? Double
77
+ )
78
+ }
33
79
 
34
- // Query (simple)
35
- func queryElectrocardiogramSamples(
36
- options: ECGQueryOptionsWithSortOrder?
37
- ) throws -> Promise<[ElectrocardiogramSample]> {
38
- let predicate = try createPredicate(filter: options?.filter)
39
- let queryLimit = getQueryLimit(options?.limit)
40
- let ascending = options?.ascending ?? false
41
- let includeVoltages = options?.includeVoltages ?? false
42
-
43
- return Promise.async {
44
- try await withCheckedThrowingContinuation { continuation in
45
- let query = HKSampleQuery(
46
- sampleType: HKObjectType.electrocardiogramType(),
47
- predicate: predicate,
48
- limit: queryLimit,
49
- sortDescriptors: [
50
- NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: ascending)
51
- ]
52
- ) { _, samples, error in
53
- if let error { continuation.resume(throwing: error); return }
54
- guard let samples = samples as? [HKElectrocardiogram], !samples.isEmpty else {
55
- continuation.resume(returning: [])
56
- return
57
- }
58
-
59
- Task {
60
- do {
61
- var out: [ElectrocardiogramSample] = []
62
- out.reserveCapacity(samples.count)
63
- for s in samples {
64
- let serialized = try await self.serializeECGSample(sample: s, includeVoltages: includeVoltages)
65
- out.append(serialized)
66
- }
67
- continuation.resume(returning: out)
68
- } catch {
69
- continuation.resume(throwing: error)
70
- }
71
- }
72
- }
73
- store.execute(query)
74
- }
80
+ func getECGVoltages(sample: HKElectrocardiogram) async throws -> [ElectrocardiogramVoltage] {
81
+ try await withCheckedThrowingContinuation { continuation in
82
+ var all: [ElectrocardiogramVoltage] = []
83
+ all.reserveCapacity(sample.numberOfVoltageMeasurements)
84
+
85
+ // Stream measurements
86
+ let q = HKElectrocardiogramQuery(sample) { _, result in
87
+ switch result {
88
+ case .error(let error):
89
+ continuation.resume(throwing: error)
90
+
91
+ case .measurement(let m):
92
+ // Lead I-like from Apple Watch
93
+ if let v = m.quantity(for: .appleWatchSimilarToLeadI)?.doubleValue(for: .volt()) {
94
+ let item = ElectrocardiogramVoltage(
95
+ timeSinceSampleStart: m.timeSinceSampleStart,
96
+ voltage: v,
97
+ lead: ElectrocardiogramLead(fromString: "appleWatchSimilarToLeadI")!
98
+ )
99
+ all.append(item)
75
100
  }
76
- }
77
101
 
78
- // Query (anchored)
79
- func queryElectrocardiogramSamplesWithAnchor(
80
- options: ECGQueryOptionsWithAnchor
81
- ) throws -> Promise<ElectrocardiogramSamplesWithAnchorResponse> {
82
- let predicate = try createPredicate(filter: options.filter)
83
- let queryLimit = getQueryLimit(options.limit)
84
- let queryAnchor = try deserializeHKQueryAnchor(base64String: options.anchor)
85
- let includeVoltages = options.includeVoltages
86
-
87
- return Promise.async {
88
- try await withCheckedThrowingContinuation { continuation in
89
- let query = HKAnchoredObjectQuery(
90
- type: HKObjectType.electrocardiogramType(),
91
- predicate: predicate,
92
- anchor: queryAnchor,
93
- limit: queryLimit
94
- ) { _, samples, deleted, newAnchor, error in
95
- if let error { continuation.resume(throwing: error); return }
96
-
97
- Task {
98
- do {
99
- let typed = (samples as? [HKElectrocardiogram]) ?? []
100
- var out: [ElectrocardiogramSample] = []
101
- out.reserveCapacity(typed.count)
102
- for s in typed {
103
- let serialized = try await self.serializeECGSample(sample: s, includeVoltages: includeVoltages)
104
- out.append(serialized)
105
- }
106
-
107
- let response = ElectrocardiogramSamplesWithAnchorResponse(
108
- samples: out,
109
- deletedSamples: (deleted ?? []).map { serializeDeletedSample(sample: $0) },
110
- newAnchor: serializeAnchor(anchor: newAnchor) ?? ""
111
- )
112
- continuation.resume(returning: response)
113
- } catch {
114
- continuation.resume(throwing: error)
115
- }
116
- }
117
- }
118
- store.execute(query)
119
- }
120
- }
102
+ case .done:
103
+ continuation.resume(returning: all)
104
+ @unknown default:
105
+ continuation.resume(
106
+ throwing: runtimeErrorWithPrefix("HKElectrocardiogramQuery received unknown result type"))
107
+ }
121
108
  }
109
+ store.execute(q)
110
+ }
111
+ }
122
112
 
123
- // MARK: - Serialization
124
-
125
- private func serializeECGSample(sample: HKElectrocardiogram, includeVoltages: Bool) async throws -> ElectrocardiogramSample {
126
- // Convert quantities
127
- let bpmUnit = HKUnit.count().unitDivided(by: .minute())
128
- let hzUnit = HKUnit.hertz()
129
- let avgHR = sample.averageHeartRate?.doubleValue(for: bpmUnit)
130
- let freqHz = sample.samplingFrequency?.doubleValue(for: hzUnit)
131
-
132
- // Optional: waveform
133
- let voltages: [ElectrocardiogramVoltage]? = includeVoltages
134
- ? try await getECGVoltages(sample: sample)
135
- : nil
136
-
137
- // Algorithm version is stored in metadata under HKAppleECGAlgorithmVersion
138
- let algorithmVersion = sample.metadata?[HKMetadataKeyAlgorithmVersion] as? String
139
-
140
- return ElectrocardiogramSample(
141
- uuid: sample.uuid.uuidString,
142
- device: serializeDevice(hkDevice: sample.device),
143
- startDate: sample.startDate,
144
- endDate: sample.endDate,
145
- classification: serializeClassification(sample.classification),
146
- symptomsStatus: serializeSymptomsStatus(sample.symptomsStatus),
147
- averageHeartRateBpm: avgHR,
148
- samplingFrequencyHz: freqHz,
149
- numberOfVoltageMeasurements: Double(sample.numberOfVoltageMeasurements),
150
- algorithmVersion: algorithmVersion,
151
- voltages: voltages,
152
- metadata: serializeMetadata(sample.metadata),
153
- sourceRevision: serializeSourceRevision(sample.sourceRevision)
154
- )
155
- }
113
+ func serializeClassification(_ classification: HKElectrocardiogram.Classification)
114
+ -> ElectrocardiogramClassification {
115
+ switch classification {
116
+ case .notSet: return ElectrocardiogramClassification(fromString: "notSet")!
117
+ case .sinusRhythm: return ElectrocardiogramClassification(fromString: "sinusRhythm")!
118
+ case .atrialFibrillation:
119
+ return ElectrocardiogramClassification(fromString: "atrialFibrillation")!
120
+ case .inconclusiveLowHeartRate:
121
+ return ElectrocardiogramClassification(fromString: "inconclusiveLowHeartRate")!
122
+ case .inconclusiveHighHeartRate:
123
+ return ElectrocardiogramClassification(fromString: "inconclusiveHighHeartRate")!
124
+ case .inconclusivePoorReading:
125
+ return ElectrocardiogramClassification(fromString: "inconclusivePoorReading")!
126
+ case .inconclusiveOther: return ElectrocardiogramClassification(fromString: "inconclusiveOther")!
127
+ case .unrecognized: return ElectrocardiogramClassification(fromString: "inconclusiveOther")!
128
+ @unknown default: return ElectrocardiogramClassification(fromString: "inconclusiveOther")!
129
+ }
130
+ }
156
131
 
157
- private func getECGVoltages(sample: HKElectrocardiogram) async throws -> [ElectrocardiogramVoltage] {
158
- try await withCheckedThrowingContinuation { continuation in
159
- var all: [ElectrocardiogramVoltage] = []
160
- all.reserveCapacity(sample.numberOfVoltageMeasurements)
161
-
162
- // Stream measurements
163
- let q = HKElectrocardiogramQuery(sample) { _, result in
164
- switch result {
165
- case .error(let error):
166
- continuation.resume(throwing: error)
167
-
168
- case .measurement(let m):
169
- // Lead I-like from Apple Watch
170
- if let v = m.quantity(for: .appleWatchSimilarToLeadI)?.doubleValue(for: .volt()) {
171
- let item = ElectrocardiogramVoltage(
172
- timeSinceSampleStart: m.timeSinceSampleStart,
173
- voltage: v,
174
- lead: ElectrocardiogramLead(fromString: "appleWatchSimilarToLeadI")!
175
- )
176
- all.append(item)
177
- }
178
-
179
- case .done:
180
- continuation.resume(returning: all)
181
- @unknown default:
182
- continuation.resume(throwing: RuntimeError.error(withMessage: "HKElectrocardiogramQuery received unknown result type"))
183
- }
184
- }
185
- store.execute(q)
186
- }
187
- }
132
+ @available(iOS 14.0, *)
133
+ class ElectrocardiogramModule: HybridElectrocardiogramModuleSpec {
188
134
 
189
- // MARK: - Enum mappers
190
-
191
- private func serializeClassification(_ classification: HKElectrocardiogram.Classification) -> ElectrocardiogramClassification {
192
- switch classification {
193
- case .notSet: return ElectrocardiogramClassification(fromString: "notSet")!
194
- case .sinusRhythm: return ElectrocardiogramClassification(fromString: "sinusRhythm")!
195
- case .atrialFibrillation: return ElectrocardiogramClassification(fromString: "atrialFibrillation")!
196
- case .inconclusiveLowHeartRate: return ElectrocardiogramClassification(fromString: "inconclusiveLowHeartRate")!
197
- case .inconclusiveHighHeartRate: return ElectrocardiogramClassification(fromString: "inconclusiveHighHeartRate")!
198
- case .inconclusivePoorReading: return ElectrocardiogramClassification(fromString: "inconclusivePoorReading")!
199
- case .inconclusiveOther: return ElectrocardiogramClassification(fromString: "inconclusiveOther")!
200
- @unknown default: return ElectrocardiogramClassification(fromString: "inconclusiveOther")!
135
+ // Query (simple)
136
+ func queryElectrocardiogramSamples(
137
+ options: ECGQueryOptionsWithSortOrder
138
+ ) -> Promise<[ElectrocardiogramSample]> {
139
+ return Promise.async {
140
+ let predicate = createPredicateForSamples(options.filter)
141
+ let sortDescriptors = getSortDescriptors(ascending: options.ascending)
142
+ let includeVoltages = options.includeVoltages ?? false
143
+ let samples = try await sampleQueryAsync(
144
+ sampleType: .electrocardiogramType(),
145
+ limit: options.limit,
146
+ predicate: predicate,
147
+ sortDescriptors: sortDescriptors
148
+ ).compactMap { sample in
149
+ return sample as? HKElectrocardiogram
150
+ }
151
+
152
+ return try await withCheckedThrowingContinuation { continuation in
153
+ Task {
154
+ do {
155
+ var out: [ElectrocardiogramSample] = []
156
+ out.reserveCapacity(samples.count)
157
+ for s in samples {
158
+ let serialized = try await serializeECGSample(
159
+ sample: s,
160
+ includeVoltages: includeVoltages
161
+ )
162
+ out.append(serialized)
163
+ }
164
+ return continuation.resume(returning: out)
165
+ } catch {
166
+ return continuation.resume(throwing: error)
167
+ }
201
168
  }
169
+ }
202
170
  }
203
-
204
- private func serializeSymptomsStatus(_ symptoms: HKElectrocardiogram.SymptomsStatus) -> ElectrocardiogramSymptomsStatus {
205
- switch symptoms {
206
- case .notSet: return ElectrocardiogramSymptomsStatus(fromString: "notSet")!
207
- case .none: return ElectrocardiogramSymptomsStatus(fromString: "none")!
208
- case .present: return ElectrocardiogramSymptomsStatus(fromString: "present")!
209
- @unknown default: return ElectrocardiogramSymptomsStatus(fromString: "notSet")!
210
- }
171
+ }
172
+
173
+ // Query (anchored)
174
+ func queryElectrocardiogramSamplesWithAnchor(
175
+ options: ECGQueryOptionsWithAnchor
176
+ ) -> Promise<ElectrocardiogramSamplesWithAnchorResponse> {
177
+ return Promise.async {
178
+ let predicate = createPredicateForSamples(options.filter)
179
+ let includeVoltages = options.includeVoltages
180
+
181
+ let response = try await sampleAnchoredQueryAsync(
182
+ sampleType: HKObjectType.electrocardiogramType(),
183
+ limit: options.limit,
184
+ queryAnchor: options.anchor,
185
+ predicate: predicate
186
+ )
187
+
188
+ let typed = response.samples.compactMap { $0 as? HKElectrocardiogram }
189
+ var out: [ElectrocardiogramSample] = []
190
+ out.reserveCapacity(typed.count)
191
+ for s in typed {
192
+ let serialized = try await serializeECGSample(sample: s, includeVoltages: includeVoltages)
193
+ out.append(serialized)
194
+ }
195
+
196
+ return ElectrocardiogramSamplesWithAnchorResponse(
197
+ samples: out,
198
+ deletedSamples: response.deletedSamples,
199
+ newAnchor: response.newAnchor
200
+ )
211
201
  }
202
+ }
212
203
  }