@kingstinct/react-native-healthkit 8.7.2 → 9.0.1

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 (449) hide show
  1. package/README.md +34 -21
  2. package/ReactNativeHealthkit.podspec +36 -0
  3. package/app.plugin.js +43 -33
  4. package/ios/Bridge.h +8 -0
  5. package/ios/CategoryTypeModule.swift +128 -0
  6. package/ios/CharacteristicTypeModule.swift +78 -0
  7. package/ios/Constants.swift +2 -0
  8. package/ios/CoreModule.swift +376 -0
  9. package/ios/CorrelationTypeModule.swift +153 -0
  10. package/ios/HeartbeatSeriesModule.swift +189 -0
  11. package/ios/Helpers.swift +525 -251
  12. package/ios/QuantityTypeModule.swift +461 -0
  13. package/ios/Serializers.swift +211 -124
  14. package/ios/SourceProxy.swift +35 -0
  15. package/ios/StateOfMindModule.swift +160 -0
  16. package/ios/WorkoutProxy.swift +412 -0
  17. package/ios/WorkoutSessionModule.swift +182 -0
  18. package/ios/WorkoutsModule.swift +357 -0
  19. package/package.json +43 -127
  20. package/react-native.config.js +16 -0
  21. package/src/hooks/useHealthkitAuthorization.test.ts +47 -29
  22. package/src/hooks/useHealthkitAuthorization.ts +21 -15
  23. package/src/hooks/useIsHealthDataAvailable.test.ts +17 -7
  24. package/src/hooks/useIsHealthDataAvailable.ts +7 -7
  25. package/src/hooks/useMostRecentCategorySample.ts +10 -12
  26. package/src/hooks/useMostRecentQuantitySample.ts +17 -36
  27. package/src/hooks/useMostRecentWorkout.ts +16 -38
  28. package/src/hooks/useSources.ts +8 -12
  29. package/src/hooks/useStatisticsForQuantity.ts +19 -14
  30. package/src/hooks/useSubscribeToChanges.ts +9 -13
  31. package/src/index.ios.ts +232 -0
  32. package/src/index.ts +444 -0
  33. package/src/modules.ts +43 -0
  34. package/src/specs/CategoryTypeModule.nitro.ts +64 -0
  35. package/src/specs/CharacteristicTypeModule.nitro.ts +22 -0
  36. package/src/specs/CoreModule.nitro.ts +107 -0
  37. package/src/specs/CorrelationTypeModule.nitro.ts +23 -0
  38. package/src/specs/HeartbeatSeriesModule.nitro.ts +19 -0
  39. package/src/specs/QuantityTypeModule.nitro.ts +60 -0
  40. package/src/specs/SourceProxy.nitro.ts +13 -0
  41. package/src/specs/StateOfMindModule.nitro.ts +23 -0
  42. package/src/specs/WorkoutProxy.nitro.ts +18 -0
  43. package/src/specs/WorkoutSessionModule.nitro.ts +71 -0
  44. package/src/specs/WorkoutsModule.nitro.ts +32 -0
  45. package/src/test-setup.ts +68 -54
  46. package/src/test-utils.ts +3 -2
  47. package/src/types/Auth.ts +17 -0
  48. package/src/types/Background.ts +9 -0
  49. package/src/types/CategoryType.ts +249 -0
  50. package/src/types/CategoryTypeIdentifier.ts +99 -0
  51. package/src/types/Characteristics.ts +53 -0
  52. package/src/types/Constants.ts +25 -0
  53. package/src/types/CorrelationType.ts +31 -0
  54. package/src/types/Device.ts +13 -0
  55. package/src/types/HeartbeatSeries.ts +29 -0
  56. package/src/types/InterfaceVerification.ts +164 -0
  57. package/src/types/InterfaceVerificationExample.ts +89 -0
  58. package/src/types/QuantitySample.ts +30 -0
  59. package/src/types/QuantityType.ts +192 -0
  60. package/src/types/QuantityTypeIdentifier.ts +758 -0
  61. package/src/types/QueryOptions.ts +69 -0
  62. package/src/types/README-InterfaceVerification.md +103 -0
  63. package/src/types/Shared.ts +79 -0
  64. package/src/types/Source.ts +11 -0
  65. package/src/types/StateOfMind.ts +110 -0
  66. package/src/types/Subscriptons.ts +10 -0
  67. package/src/types/Units.ts +190 -0
  68. package/src/types/WeatherCondition.ts +31 -0
  69. package/src/types/WorkoutKit.ts +18 -0
  70. package/src/types/Workouts.ts +282 -0
  71. package/src/utils/getMostRecentCategorySample.ts +7 -11
  72. package/src/utils/getMostRecentQuantitySample.ts +8 -18
  73. package/src/utils/getMostRecentWorkout.ts +7 -17
  74. package/src/utils/getPreferredUnit.ts +12 -8
  75. package/src/utils/subscribeToChanges.ts +9 -26
  76. package/LICENSE +0 -21
  77. package/ios/ReactNativeHealthkit-Bridging-Header.h +0 -2
  78. package/ios/ReactNativeHealthkit.m +0 -271
  79. package/ios/ReactNativeHealthkit.swift +0 -2333
  80. package/ios/ReactNativeHealthkit.xcodeproj/project.pbxproj +0 -279
  81. package/kingstinct-react-native-healthkit.podspec +0 -21
  82. package/lib/commonjs/hooks/useHealthkitAuthorization.js +0 -39
  83. package/lib/commonjs/hooks/useHealthkitAuthorization.js.map +0 -1
  84. package/lib/commonjs/hooks/useHealthkitAuthorization.test.js +0 -72
  85. package/lib/commonjs/hooks/useHealthkitAuthorization.test.js.map +0 -1
  86. package/lib/commonjs/hooks/useIsHealthDataAvailable.js +0 -27
  87. package/lib/commonjs/hooks/useIsHealthDataAvailable.js.map +0 -1
  88. package/lib/commonjs/hooks/useIsHealthDataAvailable.test.js +0 -41
  89. package/lib/commonjs/hooks/useIsHealthDataAvailable.test.js.map +0 -1
  90. package/lib/commonjs/hooks/useMostRecentCategorySample.js +0 -23
  91. package/lib/commonjs/hooks/useMostRecentCategorySample.js.map +0 -1
  92. package/lib/commonjs/hooks/useMostRecentQuantitySample.js +0 -37
  93. package/lib/commonjs/hooks/useMostRecentQuantitySample.js.map +0 -1
  94. package/lib/commonjs/hooks/useMostRecentWorkout.js +0 -48
  95. package/lib/commonjs/hooks/useMostRecentWorkout.js.map +0 -1
  96. package/lib/commonjs/hooks/useSources.js +0 -22
  97. package/lib/commonjs/hooks/useSources.js.map +0 -1
  98. package/lib/commonjs/hooks/useStatisticsForQuantity.js +0 -28
  99. package/lib/commonjs/hooks/useStatisticsForQuantity.js.map +0 -1
  100. package/lib/commonjs/hooks/useSubscribeToChanges.js +0 -28
  101. package/lib/commonjs/hooks/useSubscribeToChanges.js.map +0 -1
  102. package/lib/commonjs/index.ios.js +0 -531
  103. package/lib/commonjs/index.ios.js.map +0 -1
  104. package/lib/commonjs/index.js +0 -22
  105. package/lib/commonjs/index.js.map +0 -1
  106. package/lib/commonjs/index.native.js +0 -235
  107. package/lib/commonjs/index.native.js.map +0 -1
  108. package/lib/commonjs/index.web.js +0 -22
  109. package/lib/commonjs/index.web.js.map +0 -1
  110. package/lib/commonjs/native-types.js +0 -1575
  111. package/lib/commonjs/native-types.js.map +0 -1
  112. package/lib/commonjs/test-setup.js +0 -57
  113. package/lib/commonjs/test-setup.js.map +0 -1
  114. package/lib/commonjs/test-utils.js +0 -18
  115. package/lib/commonjs/test-utils.js.map +0 -1
  116. package/lib/commonjs/types.js +0 -17
  117. package/lib/commonjs/types.js.map +0 -1
  118. package/lib/commonjs/utils/deleteQuantitySample.js +0 -11
  119. package/lib/commonjs/utils/deleteQuantitySample.js.map +0 -1
  120. package/lib/commonjs/utils/deleteSamples.js +0 -18
  121. package/lib/commonjs/utils/deleteSamples.js.map +0 -1
  122. package/lib/commonjs/utils/deleteWorkoutSample.js +0 -11
  123. package/lib/commonjs/utils/deleteWorkoutSample.js.map +0 -1
  124. package/lib/commonjs/utils/deserializeCategorySample.js +0 -13
  125. package/lib/commonjs/utils/deserializeCategorySample.js.map +0 -1
  126. package/lib/commonjs/utils/deserializeCategorySample.test.js +0 -26
  127. package/lib/commonjs/utils/deserializeCategorySample.test.js.map +0 -1
  128. package/lib/commonjs/utils/deserializeCorrelation.js +0 -26
  129. package/lib/commonjs/utils/deserializeCorrelation.js.map +0 -1
  130. package/lib/commonjs/utils/deserializeHeartbeatSeriesSample.js +0 -15
  131. package/lib/commonjs/utils/deserializeHeartbeatSeriesSample.js.map +0 -1
  132. package/lib/commonjs/utils/deserializeSample.js +0 -15
  133. package/lib/commonjs/utils/deserializeSample.js.map +0 -1
  134. package/lib/commonjs/utils/deserializeWorkout.js +0 -15
  135. package/lib/commonjs/utils/deserializeWorkout.js.map +0 -1
  136. package/lib/commonjs/utils/ensureMetadata.js +0 -11
  137. package/lib/commonjs/utils/ensureMetadata.js.map +0 -1
  138. package/lib/commonjs/utils/ensureTotals.js +0 -11
  139. package/lib/commonjs/utils/ensureTotals.js.map +0 -1
  140. package/lib/commonjs/utils/ensureUnit.js +0 -17
  141. package/lib/commonjs/utils/ensureUnit.js.map +0 -1
  142. package/lib/commonjs/utils/getDateOfBirth.js +0 -14
  143. package/lib/commonjs/utils/getDateOfBirth.js.map +0 -1
  144. package/lib/commonjs/utils/getMostRecentCategorySample.js +0 -17
  145. package/lib/commonjs/utils/getMostRecentCategorySample.js.map +0 -1
  146. package/lib/commonjs/utils/getMostRecentQuantitySample.js +0 -21
  147. package/lib/commonjs/utils/getMostRecentQuantitySample.js.map +0 -1
  148. package/lib/commonjs/utils/getMostRecentWorkout.js +0 -19
  149. package/lib/commonjs/utils/getMostRecentWorkout.js.map +0 -1
  150. package/lib/commonjs/utils/getPreferredUnit.js +0 -14
  151. package/lib/commonjs/utils/getPreferredUnit.js.map +0 -1
  152. package/lib/commonjs/utils/getPreferredUnits.js +0 -14
  153. package/lib/commonjs/utils/getPreferredUnits.js.map +0 -1
  154. package/lib/commonjs/utils/getPreferredUnitsTyped.js +0 -33
  155. package/lib/commonjs/utils/getPreferredUnitsTyped.js.map +0 -1
  156. package/lib/commonjs/utils/getRequestStatusForAuthorization.js +0 -21
  157. package/lib/commonjs/utils/getRequestStatusForAuthorization.js.map +0 -1
  158. package/lib/commonjs/utils/getWorkoutPlanById.js +0 -13
  159. package/lib/commonjs/utils/getWorkoutPlanById.js.map +0 -1
  160. package/lib/commonjs/utils/prepareOptions.js +0 -25
  161. package/lib/commonjs/utils/prepareOptions.js.map +0 -1
  162. package/lib/commonjs/utils/queryCategorySamples.js +0 -17
  163. package/lib/commonjs/utils/queryCategorySamples.js.map +0 -1
  164. package/lib/commonjs/utils/queryCategorySamplesWithAnchor.js +0 -21
  165. package/lib/commonjs/utils/queryCategorySamplesWithAnchor.js.map +0 -1
  166. package/lib/commonjs/utils/queryCorrelationSamples.js +0 -17
  167. package/lib/commonjs/utils/queryCorrelationSamples.js.map +0 -1
  168. package/lib/commonjs/utils/queryHeartbeatSeriesSamples.js +0 -17
  169. package/lib/commonjs/utils/queryHeartbeatSeriesSamples.js.map +0 -1
  170. package/lib/commonjs/utils/queryHeartbeatSeriesSamplesWithAnchor.js +0 -21
  171. package/lib/commonjs/utils/queryHeartbeatSeriesSamplesWithAnchor.js.map +0 -1
  172. package/lib/commonjs/utils/queryQuantitySamples.js +0 -19
  173. package/lib/commonjs/utils/queryQuantitySamples.js.map +0 -1
  174. package/lib/commonjs/utils/queryQuantitySamplesWithAnchor.js +0 -23
  175. package/lib/commonjs/utils/queryQuantitySamplesWithAnchor.js.map +0 -1
  176. package/lib/commonjs/utils/querySources.js +0 -14
  177. package/lib/commonjs/utils/querySources.js.map +0 -1
  178. package/lib/commonjs/utils/queryStateOfMindSamples.js +0 -22
  179. package/lib/commonjs/utils/queryStateOfMindSamples.js.map +0 -1
  180. package/lib/commonjs/utils/queryStatisticsCollectionForQuantity.js +0 -16
  181. package/lib/commonjs/utils/queryStatisticsCollectionForQuantity.js.map +0 -1
  182. package/lib/commonjs/utils/queryStatisticsForQuantity.js +0 -29
  183. package/lib/commonjs/utils/queryStatisticsForQuantity.js.map +0 -1
  184. package/lib/commonjs/utils/queryWorkoutSamplesWithAnchor.js +0 -26
  185. package/lib/commonjs/utils/queryWorkoutSamplesWithAnchor.js.map +0 -1
  186. package/lib/commonjs/utils/queryWorkouts.js +0 -22
  187. package/lib/commonjs/utils/queryWorkouts.js.map +0 -1
  188. package/lib/commonjs/utils/requestAuthorization.js +0 -22
  189. package/lib/commonjs/utils/requestAuthorization.js.map +0 -1
  190. package/lib/commonjs/utils/saveCategorySample.js +0 -20
  191. package/lib/commonjs/utils/saveCategorySample.js.map +0 -1
  192. package/lib/commonjs/utils/saveCorrelationSample.js +0 -35
  193. package/lib/commonjs/utils/saveCorrelationSample.js.map +0 -1
  194. package/lib/commonjs/utils/saveQuantitySample.js +0 -16
  195. package/lib/commonjs/utils/saveQuantitySample.js.map +0 -1
  196. package/lib/commonjs/utils/saveStateOfMindSample.js +0 -17
  197. package/lib/commonjs/utils/saveStateOfMindSample.js.map +0 -1
  198. package/lib/commonjs/utils/saveWorkoutRoute.js +0 -26
  199. package/lib/commonjs/utils/saveWorkoutRoute.js.map +0 -1
  200. package/lib/commonjs/utils/saveWorkoutSample.js +0 -36
  201. package/lib/commonjs/utils/saveWorkoutSample.js.map +0 -1
  202. package/lib/commonjs/utils/serializeDate.js +0 -9
  203. package/lib/commonjs/utils/serializeDate.js.map +0 -1
  204. package/lib/commonjs/utils/serializeDate.test.js +0 -17
  205. package/lib/commonjs/utils/serializeDate.test.js.map +0 -1
  206. package/lib/commonjs/utils/startWatchApp.js +0 -11
  207. package/lib/commonjs/utils/startWatchApp.js.map +0 -1
  208. package/lib/commonjs/utils/subscribeToChanges.js +0 -27
  209. package/lib/commonjs/utils/subscribeToChanges.js.map +0 -1
  210. package/lib/module/hooks/useHealthkitAuthorization.js +0 -32
  211. package/lib/module/hooks/useHealthkitAuthorization.js.map +0 -1
  212. package/lib/module/hooks/useHealthkitAuthorization.test.js +0 -68
  213. package/lib/module/hooks/useHealthkitAuthorization.test.js.map +0 -1
  214. package/lib/module/hooks/useIsHealthDataAvailable.js +0 -21
  215. package/lib/module/hooks/useIsHealthDataAvailable.js.map +0 -1
  216. package/lib/module/hooks/useIsHealthDataAvailable.test.js +0 -37
  217. package/lib/module/hooks/useIsHealthDataAvailable.test.js.map +0 -1
  218. package/lib/module/hooks/useMostRecentCategorySample.js +0 -16
  219. package/lib/module/hooks/useMostRecentCategorySample.js.map +0 -1
  220. package/lib/module/hooks/useMostRecentQuantitySample.js +0 -30
  221. package/lib/module/hooks/useMostRecentQuantitySample.js.map +0 -1
  222. package/lib/module/hooks/useMostRecentWorkout.js +0 -41
  223. package/lib/module/hooks/useMostRecentWorkout.js.map +0 -1
  224. package/lib/module/hooks/useSources.js +0 -15
  225. package/lib/module/hooks/useSources.js.map +0 -1
  226. package/lib/module/hooks/useStatisticsForQuantity.js +0 -21
  227. package/lib/module/hooks/useStatisticsForQuantity.js.map +0 -1
  228. package/lib/module/hooks/useSubscribeToChanges.js +0 -21
  229. package/lib/module/hooks/useSubscribeToChanges.js.map +0 -1
  230. package/lib/module/index.ios.js +0 -209
  231. package/lib/module/index.ios.js.map +0 -1
  232. package/lib/module/index.js +0 -4
  233. package/lib/module/index.js.map +0 -1
  234. package/lib/module/index.native.js +0 -160
  235. package/lib/module/index.native.js.map +0 -1
  236. package/lib/module/index.web.js +0 -4
  237. package/lib/module/index.web.js.map +0 -1
  238. package/lib/module/native-types.js +0 -1606
  239. package/lib/module/native-types.js.map +0 -1
  240. package/lib/module/test-setup.js +0 -54
  241. package/lib/module/test-setup.js.map +0 -1
  242. package/lib/module/test-utils.js +0 -11
  243. package/lib/module/test-utils.js.map +0 -1
  244. package/lib/module/types.js +0 -67
  245. package/lib/module/types.js.map +0 -1
  246. package/lib/module/utils/deleteQuantitySample.js +0 -4
  247. package/lib/module/utils/deleteQuantitySample.js.map +0 -1
  248. package/lib/module/utils/deleteSamples.js +0 -11
  249. package/lib/module/utils/deleteSamples.js.map +0 -1
  250. package/lib/module/utils/deleteWorkoutSample.js +0 -4
  251. package/lib/module/utils/deleteWorkoutSample.js.map +0 -1
  252. package/lib/module/utils/deserializeCategorySample.js +0 -7
  253. package/lib/module/utils/deserializeCategorySample.js.map +0 -1
  254. package/lib/module/utils/deserializeCategorySample.test.js +0 -22
  255. package/lib/module/utils/deserializeCategorySample.test.js.map +0 -1
  256. package/lib/module/utils/deserializeCorrelation.js +0 -19
  257. package/lib/module/utils/deserializeCorrelation.js.map +0 -1
  258. package/lib/module/utils/deserializeHeartbeatSeriesSample.js +0 -9
  259. package/lib/module/utils/deserializeHeartbeatSeriesSample.js.map +0 -1
  260. package/lib/module/utils/deserializeSample.js +0 -9
  261. package/lib/module/utils/deserializeSample.js.map +0 -1
  262. package/lib/module/utils/deserializeWorkout.js +0 -9
  263. package/lib/module/utils/deserializeWorkout.js.map +0 -1
  264. package/lib/module/utils/ensureMetadata.js +0 -5
  265. package/lib/module/utils/ensureMetadata.js.map +0 -1
  266. package/lib/module/utils/ensureTotals.js +0 -5
  267. package/lib/module/utils/ensureTotals.js.map +0 -1
  268. package/lib/module/utils/ensureUnit.js +0 -10
  269. package/lib/module/utils/ensureUnit.js.map +0 -1
  270. package/lib/module/utils/getDateOfBirth.js +0 -7
  271. package/lib/module/utils/getDateOfBirth.js.map +0 -1
  272. package/lib/module/utils/getMostRecentCategorySample.js +0 -10
  273. package/lib/module/utils/getMostRecentCategorySample.js.map +0 -1
  274. package/lib/module/utils/getMostRecentQuantitySample.js +0 -14
  275. package/lib/module/utils/getMostRecentQuantitySample.js.map +0 -1
  276. package/lib/module/utils/getMostRecentWorkout.js +0 -12
  277. package/lib/module/utils/getMostRecentWorkout.js.map +0 -1
  278. package/lib/module/utils/getPreferredUnit.js +0 -7
  279. package/lib/module/utils/getPreferredUnit.js.map +0 -1
  280. package/lib/module/utils/getPreferredUnits.js +0 -7
  281. package/lib/module/utils/getPreferredUnits.js.map +0 -1
  282. package/lib/module/utils/getPreferredUnitsTyped.js +0 -26
  283. package/lib/module/utils/getPreferredUnitsTyped.js.map +0 -1
  284. package/lib/module/utils/getRequestStatusForAuthorization.js +0 -14
  285. package/lib/module/utils/getRequestStatusForAuthorization.js.map +0 -1
  286. package/lib/module/utils/getWorkoutPlanById.js +0 -6
  287. package/lib/module/utils/getWorkoutPlanById.js.map +0 -1
  288. package/lib/module/utils/prepareOptions.js +0 -18
  289. package/lib/module/utils/prepareOptions.js.map +0 -1
  290. package/lib/module/utils/queryCategorySamples.js +0 -10
  291. package/lib/module/utils/queryCategorySamples.js.map +0 -1
  292. package/lib/module/utils/queryCategorySamplesWithAnchor.js +0 -14
  293. package/lib/module/utils/queryCategorySamplesWithAnchor.js.map +0 -1
  294. package/lib/module/utils/queryCorrelationSamples.js +0 -10
  295. package/lib/module/utils/queryCorrelationSamples.js.map +0 -1
  296. package/lib/module/utils/queryHeartbeatSeriesSamples.js +0 -10
  297. package/lib/module/utils/queryHeartbeatSeriesSamples.js.map +0 -1
  298. package/lib/module/utils/queryHeartbeatSeriesSamplesWithAnchor.js +0 -14
  299. package/lib/module/utils/queryHeartbeatSeriesSamplesWithAnchor.js.map +0 -1
  300. package/lib/module/utils/queryQuantitySamples.js +0 -12
  301. package/lib/module/utils/queryQuantitySamples.js.map +0 -1
  302. package/lib/module/utils/queryQuantitySamplesWithAnchor.js +0 -16
  303. package/lib/module/utils/queryQuantitySamplesWithAnchor.js.map +0 -1
  304. package/lib/module/utils/querySources.js +0 -7
  305. package/lib/module/utils/querySources.js.map +0 -1
  306. package/lib/module/utils/queryStateOfMindSamples.js +0 -14
  307. package/lib/module/utils/queryStateOfMindSamples.js.map +0 -1
  308. package/lib/module/utils/queryStatisticsCollectionForQuantity.js +0 -9
  309. package/lib/module/utils/queryStatisticsCollectionForQuantity.js.map +0 -1
  310. package/lib/module/utils/queryStatisticsForQuantity.js +0 -22
  311. package/lib/module/utils/queryStatisticsForQuantity.js.map +0 -1
  312. package/lib/module/utils/queryWorkoutSamplesWithAnchor.js +0 -19
  313. package/lib/module/utils/queryWorkoutSamplesWithAnchor.js.map +0 -1
  314. package/lib/module/utils/queryWorkouts.js +0 -15
  315. package/lib/module/utils/queryWorkouts.js.map +0 -1
  316. package/lib/module/utils/requestAuthorization.js +0 -15
  317. package/lib/module/utils/requestAuthorization.js.map +0 -1
  318. package/lib/module/utils/saveCategorySample.js +0 -13
  319. package/lib/module/utils/saveCategorySample.js.map +0 -1
  320. package/lib/module/utils/saveCorrelationSample.js +0 -28
  321. package/lib/module/utils/saveCorrelationSample.js.map +0 -1
  322. package/lib/module/utils/saveQuantitySample.js +0 -9
  323. package/lib/module/utils/saveQuantitySample.js.map +0 -1
  324. package/lib/module/utils/saveStateOfMindSample.js +0 -10
  325. package/lib/module/utils/saveStateOfMindSample.js.map +0 -1
  326. package/lib/module/utils/saveWorkoutRoute.js +0 -19
  327. package/lib/module/utils/saveWorkoutRoute.js.map +0 -1
  328. package/lib/module/utils/saveWorkoutSample.js +0 -29
  329. package/lib/module/utils/saveWorkoutSample.js.map +0 -1
  330. package/lib/module/utils/serializeDate.js +0 -3
  331. package/lib/module/utils/serializeDate.js.map +0 -1
  332. package/lib/module/utils/serializeDate.test.js +0 -14
  333. package/lib/module/utils/serializeDate.test.js.map +0 -1
  334. package/lib/module/utils/startWatchApp.js +0 -4
  335. package/lib/module/utils/startWatchApp.js.map +0 -1
  336. package/lib/module/utils/subscribeToChanges.js +0 -20
  337. package/lib/module/utils/subscribeToChanges.js.map +0 -1
  338. package/lib/typescript/example-expo/App.d.ts +0 -2
  339. package/lib/typescript/src/hooks/useHealthkitAuthorization.d.ts +0 -8
  340. package/lib/typescript/src/hooks/useHealthkitAuthorization.test.d.ts +0 -1
  341. package/lib/typescript/src/hooks/useIsHealthDataAvailable.d.ts +0 -7
  342. package/lib/typescript/src/hooks/useIsHealthDataAvailable.test.d.ts +0 -1
  343. package/lib/typescript/src/hooks/useMostRecentCategorySample.d.ts +0 -7
  344. package/lib/typescript/src/hooks/useMostRecentQuantitySample.d.ts +0 -7
  345. package/lib/typescript/src/hooks/useMostRecentWorkout.d.ts +0 -10
  346. package/lib/typescript/src/hooks/useSources.d.ts +0 -3
  347. package/lib/typescript/src/hooks/useStatisticsForQuantity.d.ts +0 -4
  348. package/lib/typescript/src/hooks/useSubscribeToChanges.d.ts +0 -3
  349. package/lib/typescript/src/index.d.ts +0 -3
  350. package/lib/typescript/src/index.ios.d.ts +0 -198
  351. package/lib/typescript/src/index.native.d.ts +0 -41
  352. package/lib/typescript/src/index.web.d.ts +0 -3
  353. package/lib/typescript/src/native-types.d.ts +0 -1764
  354. package/lib/typescript/src/test-setup.d.ts +0 -1
  355. package/lib/typescript/src/test-utils.d.ts +0 -2
  356. package/lib/typescript/src/types.d.ts +0 -111
  357. package/lib/typescript/src/utils/deleteQuantitySample.d.ts +0 -4
  358. package/lib/typescript/src/utils/deleteSamples.d.ts +0 -8
  359. package/lib/typescript/src/utils/deleteWorkoutSample.d.ts +0 -3
  360. package/lib/typescript/src/utils/deserializeCategorySample.d.ts +0 -4
  361. package/lib/typescript/src/utils/deserializeCategorySample.test.d.ts +0 -1
  362. package/lib/typescript/src/utils/deserializeCorrelation.d.ts +0 -4
  363. package/lib/typescript/src/utils/deserializeHeartbeatSeriesSample.d.ts +0 -4
  364. package/lib/typescript/src/utils/deserializeSample.d.ts +0 -4
  365. package/lib/typescript/src/utils/deserializeWorkout.d.ts +0 -4
  366. package/lib/typescript/src/utils/ensureMetadata.d.ts +0 -2
  367. package/lib/typescript/src/utils/ensureTotals.d.ts +0 -2
  368. package/lib/typescript/src/utils/ensureUnit.d.ts +0 -3
  369. package/lib/typescript/src/utils/getDateOfBirth.d.ts +0 -2
  370. package/lib/typescript/src/utils/getMostRecentCategorySample.d.ts +0 -4
  371. package/lib/typescript/src/utils/getMostRecentQuantitySample.d.ts +0 -4
  372. package/lib/typescript/src/utils/getMostRecentWorkout.d.ts +0 -5
  373. package/lib/typescript/src/utils/getPreferredUnit.d.ts +0 -4
  374. package/lib/typescript/src/utils/getPreferredUnits.d.ts +0 -4
  375. package/lib/typescript/src/utils/getPreferredUnitsTyped.d.ts +0 -9
  376. package/lib/typescript/src/utils/getRequestStatusForAuthorization.d.ts +0 -3
  377. package/lib/typescript/src/utils/getWorkoutPlanById.d.ts +0 -5
  378. package/lib/typescript/src/utils/prepareOptions.d.ts +0 -9
  379. package/lib/typescript/src/utils/queryCategorySamples.d.ts +0 -5
  380. package/lib/typescript/src/utils/queryCategorySamplesWithAnchor.d.ts +0 -10
  381. package/lib/typescript/src/utils/queryCorrelationSamples.d.ts +0 -5
  382. package/lib/typescript/src/utils/queryHeartbeatSeriesSamples.d.ts +0 -10
  383. package/lib/typescript/src/utils/queryHeartbeatSeriesSamplesWithAnchor.d.ts +0 -10
  384. package/lib/typescript/src/utils/queryQuantitySamples.d.ts +0 -7
  385. package/lib/typescript/src/utils/queryQuantitySamplesWithAnchor.d.ts +0 -12
  386. package/lib/typescript/src/utils/querySources.d.ts +0 -4
  387. package/lib/typescript/src/utils/queryStateOfMindSamples.d.ts +0 -7
  388. package/lib/typescript/src/utils/queryStatisticsCollectionForQuantity.d.ts +0 -3
  389. package/lib/typescript/src/utils/queryStatisticsForQuantity.d.ts +0 -14
  390. package/lib/typescript/src/utils/queryWorkoutSamplesWithAnchor.d.ts +0 -9
  391. package/lib/typescript/src/utils/queryWorkouts.d.ts +0 -4
  392. package/lib/typescript/src/utils/requestAuthorization.d.ts +0 -4
  393. package/lib/typescript/src/utils/saveCategorySample.d.ts +0 -11
  394. package/lib/typescript/src/utils/saveCorrelationSample.d.ts +0 -8
  395. package/lib/typescript/src/utils/saveQuantitySample.d.ts +0 -7
  396. package/lib/typescript/src/utils/saveStateOfMindSample.d.ts +0 -11
  397. package/lib/typescript/src/utils/saveWorkoutRoute.d.ts +0 -3
  398. package/lib/typescript/src/utils/saveWorkoutSample.d.ts +0 -11
  399. package/lib/typescript/src/utils/serializeDate.d.ts +0 -2
  400. package/lib/typescript/src/utils/serializeDate.test.d.ts +0 -1
  401. package/lib/typescript/src/utils/startWatchApp.d.ts +0 -3
  402. package/lib/typescript/src/utils/subscribeToChanges.d.ts +0 -3
  403. package/src/index.ios.tsx +0 -292
  404. package/src/index.native.tsx +0 -233
  405. package/src/index.tsx +0 -5
  406. package/src/index.web.tsx +0 -5
  407. package/src/native-types.ts +0 -2471
  408. package/src/types.ts +0 -156
  409. package/src/utils/deleteQuantitySample.ts +0 -14
  410. package/src/utils/deleteSamples.ts +0 -23
  411. package/src/utils/deleteWorkoutSample.ts +0 -7
  412. package/src/utils/deserializeCategorySample.test.ts +0 -24
  413. package/src/utils/deserializeCategorySample.ts +0 -12
  414. package/src/utils/deserializeCorrelation.ts +0 -28
  415. package/src/utils/deserializeHeartbeatSeriesSample.ts +0 -12
  416. package/src/utils/deserializeSample.ts +0 -17
  417. package/src/utils/deserializeWorkout.ts +0 -14
  418. package/src/utils/ensureMetadata.ts +0 -5
  419. package/src/utils/ensureTotals.ts +0 -5
  420. package/src/utils/ensureUnit.ts +0 -19
  421. package/src/utils/getDateOfBirth.ts +0 -8
  422. package/src/utils/getPreferredUnits.ts +0 -14
  423. package/src/utils/getPreferredUnitsTyped.ts +0 -38
  424. package/src/utils/getRequestStatusForAuthorization.ts +0 -21
  425. package/src/utils/getWorkoutPlanById.ts +0 -7
  426. package/src/utils/prepareOptions.ts +0 -19
  427. package/src/utils/queryCategorySamples.ts +0 -29
  428. package/src/utils/queryCategorySamplesWithAnchor.ts +0 -39
  429. package/src/utils/queryCorrelationSamples.ts +0 -29
  430. package/src/utils/queryHeartbeatSeriesSamples.ts +0 -29
  431. package/src/utils/queryHeartbeatSeriesSamplesWithAnchor.ts +0 -33
  432. package/src/utils/queryQuantitySamples.ts +0 -38
  433. package/src/utils/queryQuantitySamplesWithAnchor.ts +0 -46
  434. package/src/utils/querySources.ts +0 -21
  435. package/src/utils/queryStateOfMindSamples.ts +0 -14
  436. package/src/utils/queryStatisticsCollectionForQuantity.ts +0 -38
  437. package/src/utils/queryStatisticsForQuantity.ts +0 -38
  438. package/src/utils/queryWorkoutSamplesWithAnchor.ts +0 -46
  439. package/src/utils/queryWorkouts.ts +0 -28
  440. package/src/utils/requestAuthorization.ts +0 -19
  441. package/src/utils/saveCategorySample.ts +0 -31
  442. package/src/utils/saveCorrelationSample.ts +0 -43
  443. package/src/utils/saveQuantitySample.ts +0 -29
  444. package/src/utils/saveStateOfMindSample.ts +0 -38
  445. package/src/utils/saveWorkoutRoute.ts +0 -21
  446. package/src/utils/saveWorkoutSample.ts +0 -42
  447. package/src/utils/serializeDate.test.ts +0 -16
  448. package/src/utils/serializeDate.ts +0 -5
  449. package/src/utils/startWatchApp.ts +0 -7
package/README.md CHANGED
@@ -64,60 +64,60 @@ During runtime check and request permissions with `requestAuthorization`. Failin
64
64
 
65
65
  Some hook examples:
66
66
  ```TypeScript
67
- import { HKQuantityTypeIdentifier, useHealthkitAuthorization } from '@kingstinct/react-native-healthkit';
67
+ import { useHealthkitAuthorization, saveQuantitySample } from '@kingstinct/react-native-healthkit';
68
68
 
69
- const [authorizationStatus, requestAuthorization] = useHealthkitAuthorization([HKQuantityTypeIdentifier.bloodGlucose])
69
+ const [authorizationStatus, requestAuthorization] = useHealthkitAuthorization(['HKQuantityTypeIdentifierBloodGlucose'])
70
70
 
71
71
  // make sure that you've requested authorization before requesting data, otherwise your app will crash
72
72
  import { useMostRecentQuantitySample, HKQuantityTypeIdentifier, useMostRecentCategorySample } from '@kingstinct/react-native-healthkit';
73
73
 
74
- const mostRecentBloodGlucoseSample = useMostRecentQuantitySample(HKQuantityTypeIdentifier.bloodGlucose)
75
- const lastBodyFatSample = useMostRecentQuantitySample(HKQuantityTypeIdentifier.bodyFatPercentage)
76
- const lastMindfulSession = useMostRecentCategorySample(HKCategoryTypeIdentifier.mindfulSession)
74
+ const mostRecentBloodGlucoseSample = useMostRecentQuantitySample('HKQuantityTypeIdentifierBloodGlucose')
75
+ const lastBodyFatSample = useMostRecentQuantitySample('HKQuantityTypeIdentifierBodyFatPercentage')
76
+ const lastMindfulSession = useMostRecentCategorySample('HKCategoryTypeIdentifierMindfulSession')
77
77
  const lastWorkout = useMostRecentWorkout()
78
78
  ```
79
79
 
80
80
  Some imperative examples:
81
81
  ```TypeScript
82
- import HealthKit, { HKUnit, HKQuantityTypeIdentifier, HKInsulinDeliveryReason, HKCategoryTypeIdentifier } from '@kingstinct/react-native-healthkit';
82
+ import { isHealthDataAvailable, requestAuthorization, subscribeToChanges, saveQuantitySample, getMostRecentQuantitySample } from '@kingstinct/react-native-healthkit';
83
83
 
84
- const isAvailable = await HealthKit.isHealthDataAvailable();
84
+ const isAvailable = await isHealthDataAvailable();
85
85
 
86
86
  /* Read latest sample of any data */
87
- await HealthKit.requestAuthorization([HKQuantityTypeIdentifier.bodyFatPercentage]); // request read permission for bodyFatPercentage
87
+ await requestAuthorization(['HKQuantityTypeIdentifierBodyFatPercentage']); // request read permission for bodyFatPercentage
88
88
 
89
- const { quantity, unit, startDate, endDate } = await HealthKit.getMostRecentQuantitySample(HKQuantityTypeIdentifier.bodyFatPercentage); // read latest sample
89
+ const { quantity, unit, startDate, endDate } = await getMostRecentQuantitySample('HKQuantityTypeIdentifierBodyFatPercentage'); // read latest sample
90
90
 
91
91
  console.log(quantity) // 17.5
92
92
  console.log(unit) // %
93
93
 
94
- await HealthKit.requestAuthorization([HKQuantityTypeIdentifier.heartRate]); // request read permission for heart rate
94
+ await requestAuthorization(['HKQuantityTypeIdentifierHeartRate']); // request read permission for heart rate
95
95
 
96
96
  /* Subscribe to data (Make sure to request permissions before subscribing to changes) */
97
97
  const [hasRequestedAuthorization, setHasRequestedAuthorization] = useState(false);
98
98
 
99
99
  useEffect(() => {
100
- HealthKit.requestAuthorization([HKQuantityTypeIdentifier.heartRate]).then(() => {
100
+ requestAuthorization(['HKQuantityTypeIdentifierHeartRate']).then(() => {
101
101
  setHasRequestedAuthorization(true);
102
102
  });
103
103
  }, []);
104
104
 
105
105
  useEffect(() => {
106
106
  if (hasRequestedAuthorization) {
107
- const unsubscribe = HealthKit.subscribeToChanges(HKQuantityTypeIdentifier.heartRate, () => {
107
+ const unsubscribe = subscribeToChanges(HKQuantityTypeIdentifier.heartRate, () => {
108
108
  // refetch data as needed
109
109
  });
110
- }
111
110
 
112
- return () => unsubscribe();
111
+ return () => unsubscribe();
112
+ }
113
113
  }, [hasRequestedAuthorization]);
114
114
 
115
115
  /* write data */
116
- await HealthKit.requestAuthorization([], [HKQuantityTypeIdentifier.insulinDelivery]); // request write permission for insulin delivery
116
+ await requestAuthorization([], [HKQuantityTypeIdentifier.insulinDelivery]); // request write permission for insulin delivery
117
117
 
118
- ReactNativeHealthkit.saveQuantitySample(
119
- HKQuantityTypeIdentifier.insulinDelivery,
120
- HKUnit.InternationalUnit,
118
+ saveQuantitySample(
119
+ 'HKQuantityTypeIdentifierInsulinDelivery',
120
+ 'IU',
121
121
  5.5,
122
122
  {
123
123
  metadata: {
@@ -130,7 +130,7 @@ Some imperative examples:
130
130
  );
131
131
  ```
132
132
 
133
- ### HealthKit Anchors (breaking change in 6.0)
133
+ ### HealthKit Anchors
134
134
  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.
135
135
 
136
136
  ```newAnchor``` is a base64-encoded string returned from HealthKit that contain sync information. After each successful sync, store the anchor for the next time your anchor query is called to only return the values that have changed.
@@ -140,11 +140,11 @@ In 6.0 you can use HealthKit anchors to get changes and deleted items which is v
140
140
  Example:
141
141
 
142
142
  ```TypeScript
143
- const { newAnchor, samples, deletedSamples } = await queryQuantitySamplesWithAnchor(HKQuantityTypeIdentifier.stepCount, {
143
+ const { newAnchor, samples, deletedSamples } = await queryQuantitySamplesWithAnchor('HKQuantityTypeIdentifierStepCount', {
144
144
  limit: 2,
145
145
  })
146
146
 
147
- const nextResult = await queryQuantitySamplesWithAnchor(HKQuantityTypeIdentifier.stepCount, {
147
+ const nextResult = await queryQuantitySamplesWithAnchor('HKQuantityTypeIdentifierStepCount', {
148
148
  limit: 2,
149
149
  anchor: newAnchor,
150
150
  })
@@ -152,6 +152,18 @@ Example:
152
152
  // etc..
153
153
  ```
154
154
 
155
+ ## Migration to 9.0.0
156
+
157
+ There are a lot of under-the-hood changes in version 9.0.0, some of them are breaking (although I've tried to reduce it as much as possible).
158
+ - Most of all - the library has been migrated to use react-native-nitro-modules. This improves performance, type-safety and gets rid of a lot of boilerplate code that made it harder to maintain and add features to the library.
159
+ - Naming conventions have changed - most of the HK-prefixed stuff has been removed to avoid conflicts on the native side and also make the library more beautiful to look at. As an example the type previously called HKQuantityTypeIdentifier is not just QuantityTypeIdentifier on the library level.
160
+ - Less required params by default - making it easier to start using the library, for example calling `queryQuantitySamples('HKQuantityTypeIdentifierStepCount')` will simply return the last 20 samples.
161
+ - Flexible filters that map closer to the native constructs. This can easily be extended.
162
+ - `deleteObjects` replaces all previous deletion methods, using the new flexible filters.
163
+ - Workouts are returned as proxies containing not only data but also functions, for example `getWorkoutRoutes`.
164
+ - Identifiers are now just strings, and more strictly typed.
165
+ - Units are now just strings.
166
+
155
167
  ## A note on Apple Documentation
156
168
 
157
169
  We're striving to do as straight a mapping as possible to the Native Libraries. This means that in most cases the Apple Documentation makes sense. However, when it comes to the Healthkit [Metadata Keys](https://developer.apple.com/documentation/healthkit/samples/metadata_keys) the documentation doesn't actually reflect the serialized values. For example HKMetadataKeyExternalUUID in the documentation serializes to HKExternalUUID - which is what we use.
@@ -177,3 +189,4 @@ At Kingstinct we're also able to provide enterprise-grade support for this packa
177
189
  ## License
178
190
 
179
191
  MIT
192
+
@@ -0,0 +1,36 @@
1
+ require "json"
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
+
5
+ Pod::Spec.new do |s|
6
+ s.name = "ReactNativeHealthkit"
7
+ s.version = package["version"]
8
+ s.summary = package["description"]
9
+ s.homepage = package["homepage"]
10
+ s.license = package["license"]
11
+ s.authors = package["author"]
12
+
13
+ s.platforms = { :ios => min_ios_version_supported, :visionos => 1.0 }
14
+ s.source = { :git => "https://github.com/kingstinct/react-native-healthkit.git", :tag => "#{s.version}" }
15
+
16
+ s.source_files = [
17
+ # Implementation (Swift)
18
+ "ios/**/*.{swift}",
19
+ # Autolinking/Registration (Objective-C++)
20
+ "ios/**/*.{m,mm}",
21
+ # Implementation (C++ objects)
22
+ "cpp/**/*.{hpp,cpp}",
23
+ ]
24
+
25
+ s.pod_target_xcconfig = {
26
+ # C++ compiler flags, mainly for folly.
27
+ "GCC_PREPROCESSOR_DEFINITIONS" => "$(inherited) FOLLY_NO_CONFIG FOLLY_CFG_NO_COROUTINES"
28
+ }
29
+
30
+ load 'nitrogen/generated/ios/ReactNativeHealthkit+autolinking.rb'
31
+ add_nitrogen_files(s)
32
+
33
+ s.dependency 'React-jsi'
34
+ s.dependency 'React-callinvoker'
35
+ install_modules_dependencies(s)
36
+ end
package/app.plugin.js CHANGED
@@ -10,7 +10,7 @@ const {
10
10
  * @typedef ConfigPlugin
11
11
  * @type {import('@expo/config-plugins').ConfigPlugin<T>}
12
12
  * @template T = void
13
- */
13
+ */
14
14
 
15
15
  // please note that the BackgroundConfig currently doesn't actually enable background delivery for any types, but you
16
16
  // can set it to false if you don't want the entitlement
@@ -18,8 +18,8 @@ const {
18
18
  /**
19
19
  * @typedef BackgroundConfig
20
20
  * @type {false | Partial<Record<
21
- * import('./src/native-types').HKSampleTypeIdentifier,
22
- * import('./src/native-types').HKUpdateFrequency
21
+ * import('./src/native-types').SampleTypeIdentifier,
22
+ * import('./src/native-types').UpdateFrequency
23
23
  * >>}
24
24
 
25
25
  /**
@@ -33,59 +33,69 @@ const {
33
33
  /**
34
34
  * @typedef AppPluginConfig
35
35
  * @type {InfoPlistConfig & { background?: BackgroundConfig }}
36
- */
36
+ */
37
37
 
38
38
  /**
39
- * @type {ConfigPlugin<{background: BackgroundConfig}>}
40
- */
39
+ * @type {ConfigPlugin<{background: BackgroundConfig}>}
40
+ */
41
41
  const withEntitlementsPlugin = (
42
42
  config,
43
43
  /**
44
44
  * @type {{background: BackgroundConfig} | undefined}
45
45
  * */
46
46
  props,
47
- ) => withEntitlementsPlist(config, (config) => {
48
- config.modResults['com.apple.developer.healthkit'] = true
47
+ ) =>
48
+ withEntitlementsPlist(config, (config) => {
49
+ config.modResults['com.apple.developer.healthkit'] = true
49
50
 
50
- // background is enabled by default, but possible to opt-out from
51
- // (haven't seen any drawbacks from having it enabled)
52
- if (props?.background !== false) {
53
- config.modResults['com.apple.developer.healthkit.background-delivery'] = true
54
- }
51
+ // background is enabled by default, but possible to opt-out from
52
+ // (haven't seen any drawbacks from having it enabled)
53
+ if (props?.background !== false) {
54
+ config.modResults['com.apple.developer.healthkit.background-delivery'] =
55
+ true
56
+ }
55
57
 
56
- return config
57
- })
58
+ return config
59
+ })
58
60
 
59
61
  /**
60
62
  * @type {ConfigPlugin<InfoPlistConfig>}
61
63
  */
62
- const withInfoPlistPlugin = (config,
64
+ const withInfoPlistPlugin = (
65
+ config,
63
66
  /**
64
- * @type {{NSHealthShareUsageDescription: string | boolean, NSHealthUpdateUsageDescription: string | boolean} | undefined}
65
- * */
66
- props) => withInfoPlist(config, (config) => {
67
- if (props?.NSHealthShareUsageDescription !== false) {
68
- config.modResults.NSHealthShareUsageDescription = props.NSHealthShareUsageDescription ?? `${config.name} wants to read your health data`
69
- }
67
+ * @type {{NSHealthShareUsageDescription: string | boolean, NSHealthUpdateUsageDescription: string | boolean} | undefined}
68
+ * */
69
+ props,
70
+ ) =>
71
+ withInfoPlist(config, (config) => {
72
+ if (props?.NSHealthShareUsageDescription !== false) {
73
+ config.modResults.NSHealthShareUsageDescription =
74
+ props.NSHealthShareUsageDescription ??
75
+ `${config.name} wants to read your health data`
76
+ }
70
77
 
71
- if (props?.NSHealthUpdateUsageDescription !== false) {
72
- config.modResults.NSHealthUpdateUsageDescription = props.NSHealthUpdateUsageDescription ?? `${config.name} wants to update your health data`
73
- }
78
+ if (props?.NSHealthUpdateUsageDescription !== false) {
79
+ config.modResults.NSHealthUpdateUsageDescription =
80
+ props.NSHealthUpdateUsageDescription ??
81
+ `${config.name} wants to update your health data`
82
+ }
74
83
 
75
- return config
76
- })
84
+ return config
85
+ })
77
86
 
78
87
  const pkg = require('./package.json')
79
88
 
80
89
  /**
81
90
  * @type {ConfigPlugin<AppPluginConfig>}
82
- */
83
- const healthkitAppPlugin = (config, props) => withPlugins(config, [
84
- [withEntitlementsPlugin, props],
85
- [withInfoPlistPlugin, props],
86
- ])
91
+ */
92
+ const healthkitAppPlugin = (config, props) =>
93
+ withPlugins(config, [
94
+ [withEntitlementsPlugin, props],
95
+ [withInfoPlistPlugin, props],
96
+ ])
87
97
 
88
98
  /**
89
99
  * @type {ConfigPlugin<AppPluginConfig>}
90
- */
100
+ */
91
101
  module.exports = createRunOncePlugin(healthkitAppPlugin, pkg.name, pkg.version)
package/ios/Bridge.h ADDED
@@ -0,0 +1,8 @@
1
+ //
2
+ // Bridge.h
3
+ // ReactNativeHealthkit
4
+ //
5
+ // Created by Marc Rousavy on 22.07.24.
6
+ //
7
+
8
+ #pragma once
@@ -0,0 +1,128 @@
1
+ import HealthKit
2
+ import NitroModules
3
+
4
+
5
+
6
+ class CategoryTypeModule : HybridCategoryTypeModuleSpec {
7
+ func saveCategorySample(
8
+ identifier: CategoryTypeIdentifier,
9
+ value: Double,
10
+ startDate: Date,
11
+ endDate: Date,
12
+ metadata: AnyMapHolder
13
+ ) throws -> Promise<Bool> {
14
+ let type = try initializeCategoryType(identifier.stringValue)
15
+
16
+ let sample = HKCategorySample(
17
+ type: type,
18
+ value: Int(value),
19
+ start: startDate,
20
+ end: endDate,
21
+ metadata: anyMapToDictionary(metadata)
22
+ )
23
+
24
+ return Promise.async {
25
+ try await withCheckedThrowingContinuation { continuation in
26
+ store.save(sample) { (success: Bool, error: Error?) in
27
+ if let error = error {
28
+ continuation.resume(throwing: error)
29
+ } else {
30
+ continuation.resume(returning: success)
31
+ }
32
+ }
33
+ }
34
+ }
35
+ }
36
+
37
+ func queryCategorySamples(
38
+ identifier: CategoryTypeIdentifier,
39
+ options: QueryOptionsWithSortOrder?,
40
+ ) throws -> Promise<[CategorySample]> {
41
+ let sampleType = try initializeCategoryType(identifier.stringValue)
42
+ let predicate = try createPredicate(filter: options?.filter)
43
+ let queryLimit = getQueryLimit(options?.limit)
44
+
45
+ return Promise.async {
46
+ try await withCheckedThrowingContinuation { continuation in
47
+ let query = HKSampleQuery(
48
+ sampleType: sampleType,
49
+ predicate: predicate,
50
+ limit: queryLimit,
51
+ sortDescriptors: getSortDescriptors(ascending: options?.ascending)
52
+ ) { (_: HKSampleQuery, samples: [HKSample]?, error: Error?) in
53
+ if let error = error {
54
+ continuation.resume(throwing: error)
55
+ return
56
+ }
57
+
58
+ guard let samples = samples else {
59
+ continuation.resume(returning: [])
60
+ return
61
+ }
62
+
63
+ let categorySamples = samples.compactMap { sample -> CategorySample? in
64
+ guard let categorySample = sample as? HKCategorySample else { return nil }
65
+ return serializeCategorySample(sample: categorySample)
66
+ }
67
+
68
+ continuation.resume(returning: categorySamples)
69
+ }
70
+
71
+ store.execute(query)
72
+ }
73
+ }
74
+ }
75
+
76
+
77
+ func queryCategorySamplesWithAnchor(
78
+ identifier: CategoryTypeIdentifier,
79
+ options: QueryOptionsWithAnchor
80
+ ) throws -> Promise<CategorySamplesWithAnchorResponse> {
81
+ let sampleType = try initializeCategoryType(identifier.stringValue)
82
+
83
+ let predicate = try createPredicate(filter: options.filter)
84
+ let queryLimit = getQueryLimit(options.limit)
85
+ let queryAnchor = try deserializeHKQueryAnchor(base64String: options.anchor)
86
+
87
+ return Promise.async {
88
+ try await withCheckedThrowingContinuation { continuation in
89
+ let query = HKAnchoredObjectQuery(
90
+ type: sampleType,
91
+ predicate: predicate,
92
+ anchor: queryAnchor,
93
+ limit: queryLimit
94
+ ) { (_: HKAnchoredObjectQuery, samples: [HKSample]?, deletedSamples: [HKDeletedObject]?, newAnchor: HKQueryAnchor?, error: Error?) in
95
+ if let error = error {
96
+ continuation.resume(throwing: error)
97
+ return
98
+ }
99
+
100
+ guard let samples = samples else {
101
+ let response = CategorySamplesWithAnchorResponse(
102
+ samples: [],
103
+ deletedSamples: deletedSamples?.map { serializeDeletedSample(sample: $0) } ?? [],
104
+ newAnchor: serializeAnchor(anchor: newAnchor) ?? ""
105
+ )
106
+ continuation.resume(returning: response)
107
+ return
108
+ }
109
+
110
+ let categorySamples = samples.compactMap { sample -> CategorySample? in
111
+ guard let categorySample = sample as? HKCategorySample else { return nil }
112
+ return serializeCategorySample(sample: categorySample)
113
+ }
114
+
115
+ let response = CategorySamplesWithAnchorResponse(
116
+ samples: categorySamples,
117
+ deletedSamples: deletedSamples?.map { serializeDeletedSample(sample: $0) } ?? [],
118
+ newAnchor: serializeAnchor(anchor: newAnchor) ?? ""
119
+ )
120
+
121
+ continuation.resume(returning: response)
122
+ }
123
+
124
+ store.execute(query)
125
+ }
126
+ }
127
+ }
128
+ }
@@ -0,0 +1,78 @@
1
+
2
+ import HealthKit
3
+ import NitroModules
4
+
5
+ class CharacteristicTypeModule: HybridCharacteristicTypeModuleSpec {
6
+ func getBloodTypeAsync() throws -> Promise<BloodType> {
7
+ return Promise.resolved(withResult: try self.getBloodType())
8
+ }
9
+
10
+ func getDateOfBirthAsync() throws -> Promise<Date> {
11
+ return Promise.resolved(withResult: try self.getDateOfBirth())
12
+ }
13
+
14
+ func getBiologicalSexAsync() throws -> Promise<BiologicalSex> {
15
+ return Promise.resolved(withResult: try self.getBiologicalSex())
16
+ }
17
+
18
+ func getFitzpatrickSkinTypeAsync() throws -> Promise<FitzpatrickSkinType> {
19
+ return Promise.resolved(withResult: try self.getFitzpatrickSkinType())
20
+ }
21
+
22
+ func getWheelchairUseAsync() throws -> Promise<WheelchairUse> {
23
+ return Promise.resolved(withResult: try self.getWheelchairUse())
24
+ }
25
+
26
+ // Using the global 'store' instance defined in Auth.swift
27
+
28
+ func getBiologicalSex() throws -> BiologicalSex {
29
+ let biologicalSexObject = try store.biologicalSex()
30
+ if let biologicalSex = BiologicalSex(rawValue: Int32(biologicalSexObject.biologicalSex.rawValue)) {
31
+ return biologicalSex
32
+ }
33
+ throw RuntimeError.error(withMessage: "[react-native-healthkit] Got unknown biological sex value: \(biologicalSexObject.biologicalSex.rawValue)")
34
+ }
35
+
36
+ func getDateOfBirth() throws -> Date {
37
+ let dateOfBirthComponents = try store.dateOfBirthComponents()
38
+
39
+ if let date = dateOfBirthComponents.date {
40
+ return date
41
+ }
42
+
43
+ throw RuntimeError.error(withMessage: "[react-native-healthkit] Date of birth is not available or not set")
44
+ }
45
+
46
+ func getBloodType() throws -> BloodType {
47
+ let bloodTypeObject = try store.bloodType()
48
+
49
+ if let bloodType = BloodType(rawValue: Int32(bloodTypeObject.bloodType.rawValue)){
50
+ return bloodType
51
+ }
52
+
53
+ throw RuntimeError.error(withMessage: "[react-native-healthkit] Got unknown blood type value: \(bloodTypeObject.bloodType.rawValue)")
54
+ }
55
+
56
+ func getFitzpatrickSkinType() throws -> FitzpatrickSkinType {
57
+ if #available(iOS 9.0, *) {
58
+ let skinTypeObject = try store.fitzpatrickSkinType()
59
+
60
+ if let skinType = FitzpatrickSkinType(rawValue: Int32(skinTypeObject.skinType.rawValue)) {
61
+ return skinType
62
+ }
63
+
64
+ throw RuntimeError.error(withMessage: "[react-native-healthkit] Got unknown Fitzpatrick skin type value: \(skinTypeObject.skinType.rawValue)")
65
+ } else {
66
+ throw RuntimeError.error(withMessage: "Fitzpatrick skin type is not available before iOS 9.0")
67
+ }
68
+ }
69
+
70
+ @available(iOS 10.0, *)
71
+ func getWheelchairUse() throws -> WheelchairUse {
72
+ let wheelchairUseObject = try store.wheelchairUse()
73
+ if let wheelChairUse = WheelchairUse(rawValue: Int32(wheelchairUseObject.wheelchairUse.rawValue)) {
74
+ return wheelChairUse
75
+ }
76
+ throw RuntimeError.error(withMessage: "[react-native-healthkit] Got unknown wheelchair use value: \(wheelchairUseObject.wheelchairUse.rawValue)")
77
+ }
78
+ }
@@ -31,3 +31,5 @@ let HKWorkoutSessionLocationTypePropertyName = "locationType"
31
31
  let SpeedUnit = HKUnit(from: "m/s") // HKUnit.meter().unitDivided(by: HKUnit.second())
32
32
  // Support for MET data: HKAverageMETs 8.24046 kcal/hr·kg
33
33
  let METUnit = HKUnit(from: "kcal/hr·kg")
34
+
35
+ let DEFAULT_QUERY_LIMIT = 20