@kingstinct/react-native-healthkit 8.7.2 → 9.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 (449) hide show
  1. package/ReactNativeHealthkit.podspec +36 -0
  2. package/app.plugin.js +43 -33
  3. package/ios/Bridge.h +8 -0
  4. package/ios/CategoryTypeModule.swift +128 -0
  5. package/ios/CharacteristicTypeModule.swift +78 -0
  6. package/ios/Constants.swift +2 -0
  7. package/ios/CoreModule.swift +376 -0
  8. package/ios/CorrelationTypeModule.swift +153 -0
  9. package/ios/HeartbeatSeriesModule.swift +189 -0
  10. package/ios/Helpers.swift +529 -251
  11. package/ios/QuantityTypeModule.swift +461 -0
  12. package/ios/Serializers.swift +211 -124
  13. package/ios/SourceProxy.swift +35 -0
  14. package/ios/StateOfMindModule.swift +160 -0
  15. package/ios/WorkoutProxy.swift +405 -0
  16. package/ios/WorkoutSessionModule.swift +182 -0
  17. package/ios/WorkoutsModule.swift +357 -0
  18. package/package.json +43 -127
  19. package/react-native.config.js +16 -0
  20. package/src/hooks/useHealthkitAuthorization.test.ts +47 -29
  21. package/src/hooks/useHealthkitAuthorization.ts +21 -15
  22. package/src/hooks/useIsHealthDataAvailable.test.ts +17 -7
  23. package/src/hooks/useIsHealthDataAvailable.ts +7 -7
  24. package/src/hooks/useMostRecentCategorySample.ts +10 -12
  25. package/src/hooks/useMostRecentQuantitySample.ts +17 -36
  26. package/src/hooks/useMostRecentWorkout.ts +16 -38
  27. package/src/hooks/useSources.ts +8 -12
  28. package/src/hooks/useStatisticsForQuantity.ts +19 -14
  29. package/src/hooks/useSubscribeToChanges.ts +9 -13
  30. package/src/index.ios.ts +232 -0
  31. package/src/index.ts +444 -0
  32. package/src/modules.ts +43 -0
  33. package/src/specs/CategoryTypeModule.nitro.ts +64 -0
  34. package/src/specs/CharacteristicTypeModule.nitro.ts +22 -0
  35. package/src/specs/CoreModule.nitro.ts +107 -0
  36. package/src/specs/CorrelationTypeModule.nitro.ts +23 -0
  37. package/src/specs/HeartbeatSeriesModule.nitro.ts +19 -0
  38. package/src/specs/QuantityTypeModule.nitro.ts +60 -0
  39. package/src/specs/SourceProxy.nitro.ts +13 -0
  40. package/src/specs/StateOfMindModule.nitro.ts +23 -0
  41. package/src/specs/WorkoutProxy.nitro.ts +18 -0
  42. package/src/specs/WorkoutSessionModule.nitro.ts +71 -0
  43. package/src/specs/WorkoutsModule.nitro.ts +32 -0
  44. package/src/test-setup.ts +68 -54
  45. package/src/test-utils.ts +3 -2
  46. package/src/types/Auth.ts +17 -0
  47. package/src/types/Background.ts +9 -0
  48. package/src/types/CategoryType.ts +249 -0
  49. package/src/types/CategoryTypeIdentifier.ts +99 -0
  50. package/src/types/Characteristics.ts +53 -0
  51. package/src/types/Constants.ts +25 -0
  52. package/src/types/CorrelationType.ts +31 -0
  53. package/src/types/Device.ts +13 -0
  54. package/src/types/HeartbeatSeries.ts +29 -0
  55. package/src/types/InterfaceVerification.ts +164 -0
  56. package/src/types/InterfaceVerificationExample.ts +89 -0
  57. package/src/types/QuantitySample.ts +30 -0
  58. package/src/types/QuantityType.ts +192 -0
  59. package/src/types/QuantityTypeIdentifier.ts +758 -0
  60. package/src/types/QueryOptions.ts +69 -0
  61. package/src/types/README-InterfaceVerification.md +103 -0
  62. package/src/types/Shared.ts +79 -0
  63. package/src/types/Source.ts +11 -0
  64. package/src/types/StateOfMind.ts +110 -0
  65. package/src/types/Subscriptons.ts +10 -0
  66. package/src/types/Units.ts +190 -0
  67. package/src/types/WeatherCondition.ts +31 -0
  68. package/src/types/WorkoutKit.ts +18 -0
  69. package/src/types/Workouts.ts +282 -0
  70. package/src/utils/getMostRecentCategorySample.ts +7 -11
  71. package/src/utils/getMostRecentQuantitySample.ts +8 -18
  72. package/src/utils/getMostRecentWorkout.ts +7 -17
  73. package/src/utils/getPreferredUnit.ts +12 -8
  74. package/src/utils/subscribeToChanges.ts +9 -26
  75. package/LICENSE +0 -21
  76. package/README.md +0 -179
  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
@@ -0,0 +1,376 @@
1
+ import HealthKit
2
+ import NitroModules
3
+ //
4
+ // Core.swift
5
+ // Pods
6
+ //
7
+ // Created by Robert Herber on 2025-05-28.
8
+ //
9
+
10
+ var store = HKHealthStore.init()
11
+
12
+ var quantityTypeUnitCache = Dictionary<HKQuantityType, HKUnit>()
13
+
14
+ func getUnitToUse(unitOverride: String?, quantityType: HKQuantityType) async throws -> HKUnit {
15
+ if let unitOverride = unitOverride {
16
+ let unit = HKUnit(from: unitOverride)
17
+
18
+ if(!quantityType.is(compatibleWith: unit)){
19
+ throw RuntimeError.error(withMessage: "[react-native-healthkit] Unit \(unitOverride) is incompatible with \(quantityType.identifier)")
20
+ }
21
+
22
+ return unit
23
+ }
24
+
25
+ if let preferredUnit = try await getPreferredUnitsInternal(quantityTypes: [quantityType]).first?.value {
26
+ return preferredUnit
27
+ }
28
+
29
+ throw RuntimeError.error(withMessage: "[react-native-healthkit] Must specify a unit for \(quantityType.identifier)")
30
+ }
31
+
32
+ func getPreferredUnitsInternal(quantityTypes: [HKQuantityType], forceUpdate: Bool? = false) async throws -> [HKQuantityType: HKUnit] {
33
+
34
+ if(forceUpdate != true){
35
+ let itemsInCache = quantityTypeUnitCache.filter { (quantityType: HKQuantityType, unit: HKUnit) in
36
+ return quantityTypes.contains(where: { $0 == quantityType })
37
+ }
38
+ if(itemsInCache.count == quantityTypes.count){
39
+ return itemsInCache
40
+ }
41
+ }
42
+
43
+
44
+ return try await withCheckedThrowingContinuation { continuation in
45
+ store.preferredUnits(for: Set(quantityTypes)) {
46
+ (typePerUnits: [HKQuantityType: HKUnit], error: Error?) in
47
+ if let error = error {
48
+ return continuation.resume(throwing: error)
49
+ }
50
+
51
+ typePerUnits.forEach { (type: HKQuantityType, unit: HKUnit) in
52
+ quantityTypeUnitCache.updateValue(unit, forKey: type)
53
+ }
54
+
55
+ return continuation.resume(returning: typePerUnits)
56
+ }
57
+ }
58
+ }
59
+
60
+ class CoreModule : HybridCoreModuleSpec {
61
+ func areObjectTypesAvailable(objectTypeIdentifiers: [ObjectTypeIdentifier]) -> Dictionary<String, Bool> {
62
+ var dict = Dictionary<String, Bool>()
63
+
64
+ for objectTypeIdentifier in objectTypeIdentifiers {
65
+ dict[objectTypeIdentifier.stringValue] = isObjectTypeAvailable(objectTypeIdentifier: objectTypeIdentifier)
66
+ }
67
+
68
+ return dict
69
+ }
70
+
71
+ func areObjectTypesAvailableAsync(objectTypeIdentifiers: [ObjectTypeIdentifier]) -> Promise<Dictionary<String, Bool>> {
72
+ return Promise.resolved(withResult: areObjectTypesAvailable(objectTypeIdentifiers: objectTypeIdentifiers))
73
+ }
74
+
75
+
76
+
77
+ func isObjectTypeAvailable(objectTypeIdentifier: ObjectTypeIdentifier) -> Bool {
78
+ do {
79
+ let _ = try objectTypeFrom(objectTypeIdentifier: objectTypeIdentifier)
80
+ return true
81
+ } catch {
82
+ return false
83
+ }
84
+ }
85
+
86
+ func isObjectTypeAvailableAsync(objectTypeIdentifier: ObjectTypeIdentifier) -> Promise<Bool> {
87
+ return Promise.resolved(withResult: isObjectTypeAvailable(objectTypeIdentifier: objectTypeIdentifier))
88
+ }
89
+
90
+ func authorizationStatusFor(
91
+ type: ObjectTypeIdentifier
92
+ ) throws -> AuthorizationStatus {
93
+ let objectType = try objectTypeFrom(objectTypeIdentifier: type)
94
+
95
+ let authStatus = store.authorizationStatus(for: objectType)
96
+
97
+ if let authStatus = AuthorizationStatus(rawValue: Int32(authStatus.rawValue)){
98
+ return authStatus
99
+ }
100
+
101
+ throw RuntimeError.error(withMessage: "[react-native-healthkit] got unrecognized AuthorizationStatus with value \(authStatus.rawValue)")
102
+ }
103
+
104
+ func getRequestStatusForAuthorization(toShare: [SampleTypeIdentifierWriteable], toRead: [ObjectTypeIdentifier]) throws -> Promise<AuthorizationRequestStatus> {
105
+ let toShare = sampleTypesFromArray(typeIdentifiersWriteable: toShare)
106
+ let toRead = objectTypesFromArray(typeIdentifiers: toRead)
107
+
108
+ return Promise.async {
109
+ try await withCheckedThrowingContinuation { continuation in
110
+ store.getRequestStatusForAuthorization(toShare: toShare, read: toRead) { status, error in
111
+ if let error = error {
112
+ continuation.resume(throwing: error)
113
+ } else {
114
+ if let authStatus = AuthorizationRequestStatus(rawValue: Int32(status.rawValue)) {
115
+ continuation.resume(returning: authStatus)
116
+ } else {
117
+ continuation.resume(throwing: RuntimeError.error(withMessage: "Unrecognized authStatus returned: \(status.rawValue)"))
118
+ }
119
+
120
+ }
121
+ }
122
+ }
123
+ }
124
+ }
125
+
126
+ func requestAuthorization(toShare: [SampleTypeIdentifierWriteable], toRead: [ObjectTypeIdentifier]) throws -> Promise<Bool> {
127
+ let share = sampleTypesFromArray(typeIdentifiersWriteable: toShare)
128
+ let toRead = objectTypesFromArray(typeIdentifiers: toRead)
129
+
130
+ return Promise.async {
131
+ try await withCheckedThrowingContinuation { continuation in
132
+ store.requestAuthorization(toShare: share, read: toRead) { status, error in
133
+ if let error = error {
134
+ continuation.resume(throwing: error)
135
+ } else {
136
+ continuation.resume(returning: status)
137
+ }
138
+ }
139
+ }
140
+ }
141
+ }
142
+
143
+ func querySources(identifier: SampleTypeIdentifier) throws -> Promise<[HybridSourceProxySpec]> {
144
+ let sampleType = try sampleTypeFrom(sampleTypeIdentifier: identifier)
145
+
146
+ return Promise.async {
147
+ try await withCheckedThrowingContinuation { continuation in
148
+ let query = HKSourceQuery(
149
+ sampleType: sampleType,
150
+ samplePredicate: nil
151
+ ) { (_: HKSourceQuery, sources: Set<HKSource>?, error: Error?) in
152
+ if let error = error {
153
+ continuation.resume(throwing: error)
154
+ return
155
+ }
156
+
157
+ guard let sources = sources else {
158
+ return continuation.resume(throwing: RuntimeError.error(withMessage: "Empty response for sample type \(identifier.stringValue)"))
159
+ }
160
+
161
+ let serializedSources = sources.map { source -> SourceProxy in
162
+
163
+ return SourceProxy(
164
+ source: source
165
+ )
166
+ }
167
+
168
+ continuation.resume(returning: serializedSources)
169
+ }
170
+
171
+ store.execute(query)
172
+ }
173
+ }
174
+ }
175
+
176
+ func enableBackgroundDelivery(typeIdentifier: ObjectTypeIdentifier, updateFrequency: UpdateFrequency) throws -> Promise<Bool> {
177
+ if let frequency = HKUpdateFrequency(rawValue: Int(updateFrequency.rawValue)) {
178
+ let type = try objectTypeFrom(objectTypeIdentifier: typeIdentifier)
179
+ return Promise.async {
180
+ try await withCheckedThrowingContinuation { continuation in
181
+ store.enableBackgroundDelivery(
182
+ for: type,
183
+ frequency: frequency
184
+ ) { (success, error) in
185
+ if let err = error {
186
+ return continuation.resume(throwing: err)
187
+ }
188
+ return continuation.resume(returning: success)
189
+ }
190
+ }
191
+ }
192
+ } else {
193
+ throw RuntimeError.error(withMessage: "Invalid update frequency value: \(updateFrequency)")
194
+ }
195
+ }
196
+
197
+ func disableBackgroundDelivery(
198
+ typeIdentifier: ObjectTypeIdentifier
199
+ ) throws -> Promise<Bool> {
200
+ return Promise.async {
201
+ let type = try objectTypeFrom(objectTypeIdentifier: typeIdentifier)
202
+ return try await withCheckedThrowingContinuation { continuation in
203
+ store.disableBackgroundDelivery(
204
+ for: type
205
+ ) { (success, error) in
206
+ if let err = error {
207
+ return continuation.resume(throwing: err)
208
+ }
209
+ return continuation.resume(returning: success)
210
+ }
211
+ }
212
+ }
213
+ }
214
+
215
+ func disableAllBackgroundDelivery() throws -> Promise<Bool> {
216
+ return Promise.async {
217
+ try await withCheckedThrowingContinuation { continuation in
218
+ store.disableAllBackgroundDelivery(completion: { (success, error) in
219
+ guard let err = error else {
220
+ return continuation.resume(returning: success)
221
+ }
222
+ return continuation.resume(throwing: err)
223
+ })
224
+ }
225
+ }
226
+ }
227
+
228
+ func unsubscribeQueryAsync(queryId: String) throws -> Promise<Bool> {
229
+ let result = try self.unsubscribeQuery(queryId: queryId)
230
+
231
+ return Promise.resolved(withResult: result)
232
+ }
233
+
234
+ func isHealthDataAvailableAsync() -> Promise<Bool> {
235
+ return Promise.resolved(withResult: HKHealthStore.isHealthDataAvailable())
236
+ }
237
+
238
+ func isProtectedDataAvailableAsync() -> Promise<Bool> {
239
+ return Promise.resolved(withResult: UIApplication.shared.isProtectedDataAvailable)
240
+ }
241
+
242
+ func isHealthDataAvailable() throws -> Bool {
243
+ return HKHealthStore.isHealthDataAvailable()
244
+ }
245
+
246
+ func isProtectedDataAvailable() throws -> Bool {
247
+ return UIApplication.shared.isProtectedDataAvailable
248
+ }
249
+
250
+ func getPreferredUnits(identifiers: [QuantityTypeIdentifier], forceUpdate: Bool?) throws -> Promise<[IdentifierWithUnit]> {
251
+ return Promise.async {
252
+
253
+ let quantityTypes = identifiers.compactMap { identifier in
254
+ do {
255
+ let quantityType = try initializeQuantityType(identifier.stringValue)
256
+ return quantityType
257
+ } catch {
258
+ print(error.localizedDescription)
259
+ return nil
260
+ }
261
+ }
262
+
263
+ let typePerUnits = try await getPreferredUnitsInternal(quantityTypes: quantityTypes, forceUpdate: forceUpdate)
264
+
265
+ let dic = typePerUnits.map { typePerUnit in
266
+ return IdentifierWithUnit(
267
+ typeIdentifier: typePerUnit.key.identifier,
268
+ unit: typePerUnit.value.unitString
269
+ )
270
+ }
271
+
272
+ return dic
273
+ }
274
+ }
275
+
276
+ var _runningQueries: [String: HKQuery] = [:]
277
+
278
+ func deleteObjects(objectTypeIdentifier: ObjectTypeIdentifier, filter: FilterForSamples) throws -> Promise<Double> {
279
+ let predicate = try createPredicateForSamples(filter: filter)
280
+ let of = try objectTypeFrom(objectTypeIdentifier: objectTypeIdentifier)
281
+
282
+ return Promise.async {
283
+ return try await withCheckedThrowingContinuation { continuation in
284
+ store.deleteObjects(of: of, predicate: predicate) { (success, count, error) in
285
+ if let error = error {
286
+ continuation.resume(throwing: error)
287
+ } else {
288
+ continuation.resume(returning: Double(count))
289
+ }
290
+ }
291
+ }
292
+ }
293
+ }
294
+
295
+ func subscribeToObserverQuery(
296
+ typeIdentifier: SampleTypeIdentifier,
297
+ callback: @escaping (OnChangeCallbackArgs) -> Void
298
+ ) throws -> String {
299
+ let sampleType = try sampleTypeFrom(sampleTypeIdentifier: typeIdentifier)
300
+
301
+ let predicate = HKQuery.predicateForSamples(
302
+ withStart: Date.init(),
303
+ end: nil,
304
+ options: HKQueryOptions.strictStartDate
305
+ )
306
+
307
+ let queryId = UUID().uuidString
308
+
309
+ func responder(
310
+ query: HKObserverQuery,
311
+ handler: @escaping HKObserverQueryCompletionHandler,
312
+ error: Error?
313
+ ) {
314
+ DispatchQueue.main.async {
315
+ callback(OnChangeCallbackArgs(typeIdentifier: typeIdentifier, errorMessage: error?.localizedDescription))
316
+ handler()
317
+ }
318
+ }
319
+
320
+ let query = HKObserverQuery(
321
+ sampleType: sampleType,
322
+ predicate: predicate
323
+ ) {
324
+ (query: HKObserverQuery, handler: @escaping HKObserverQueryCompletionHandler, error: Error?)
325
+ in
326
+
327
+ return responder(query: query, handler: handler, error: error)
328
+
329
+ }
330
+
331
+ store.execute(query)
332
+
333
+ self._runningQueries.updateValue(query, forKey: queryId)
334
+
335
+ //resolve(queryId)
336
+
337
+ return queryId
338
+ }
339
+
340
+ func unsubscribeQuery(queryId: String) throws -> Bool {
341
+ guard let query = self._runningQueries[queryId] else {
342
+ throw RuntimeError.error(withMessage: "Query with id \(queryId) not found")
343
+ }
344
+
345
+ store.stop(query)
346
+
347
+ self._runningQueries.removeValue(forKey: queryId)
348
+
349
+ return true
350
+ }
351
+
352
+ func unsubscribeQueriesAsync(queryIds: [String]) throws -> Promise<Double> {
353
+ let successCount = self.unsubscribeQueries(queryIds: queryIds)
354
+
355
+ return Promise.resolved(withResult: successCount)
356
+ }
357
+
358
+ func unsubscribeQueries(queryIds: [String]) -> Double {
359
+ let successCounts = queryIds.map { queryId in
360
+ if let query = self._runningQueries[queryId] {
361
+ store.stop(query)
362
+
363
+ self._runningQueries.removeValue(forKey: queryId)
364
+
365
+ return true
366
+ }
367
+
368
+ print("Query with id \(queryId) not found, skipping unsubscribe")
369
+
370
+ return false
371
+ }
372
+
373
+ return Double(successCounts.filter { $0 }.count)
374
+ }
375
+
376
+ }
@@ -0,0 +1,153 @@
1
+ import HealthKit
2
+ import NitroModules
3
+
4
+ class CorrelationTypeModule : HybridCorrelationTypeModuleSpec {
5
+ func saveCorrelationSample(
6
+ typeIdentifier: CorrelationTypeIdentifier,
7
+ samples: [SampleForSaving],
8
+ start: Date,
9
+ end: Date,
10
+ metadata: AnyMapHolder
11
+ ) throws -> Promise<Bool> {
12
+ let correlationType = try initializeCorrelationType(typeIdentifier.stringValue)
13
+
14
+ var initializedSamples = Set<HKSample>()
15
+
16
+ for sample in samples {
17
+ if let quantitySample = sample as? QuantitySampleForSaving {
18
+ let quantityTypeId = HKQuantityTypeIdentifier(rawValue: quantitySample.quantityType.stringValue)
19
+ guard let quantityType = HKSampleType.quantityType(forIdentifier: quantityTypeId) else {
20
+ continue
21
+ }
22
+
23
+ let unit = HKUnit(from: quantitySample.unit)
24
+ let quantity = HKQuantity(unit: unit, doubleValue: quantitySample.quantity)
25
+ let hkQuantitySample = HKQuantitySample(
26
+ type: quantityType,
27
+ quantity: quantity,
28
+ start: start,
29
+ end: end,
30
+ metadata: anyMapToDictionary(quantitySample.metadata)
31
+ )
32
+ initializedSamples.insert(hkQuantitySample)
33
+
34
+ } else if let categorySample = sample as? CategorySampleForSaving {
35
+ let categoryType = try initializeCategoryType(categorySample.categoryType.stringValue)
36
+
37
+ let hkCategorySample = HKCategorySample(
38
+ type: categoryType,
39
+ value: Int(categorySample.value),
40
+ start: categorySample.start,
41
+ end: categorySample.end,
42
+ metadata: anyMapToDictionary(categorySample.metadata)
43
+ )
44
+ initializedSamples.insert(hkCategorySample)
45
+ }
46
+ }
47
+
48
+ let correlation = HKCorrelation(
49
+ type: correlationType,
50
+ start: start,
51
+ end: end,
52
+ objects: initializedSamples,
53
+ metadata: anyMapToDictionary(metadata)
54
+ )
55
+
56
+ return Promise.async {
57
+ try await withCheckedThrowingContinuation { continuation in
58
+ store.save(correlation) { (success: Bool, error: Error?) in
59
+ if let error = error {
60
+ continuation.resume(throwing: error)
61
+ } else {
62
+ continuation.resume(returning: success)
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+
69
+ func queryCorrelationSamples(
70
+ typeIdentifier: CorrelationTypeIdentifier,
71
+ from: Date,
72
+ to: Date
73
+ ) throws -> Promise<[CorrelationSample]> {
74
+ let correlationType = try initializeCorrelationType(typeIdentifier.stringValue)
75
+ let predicate = try createPredicate(
76
+ filter: Variant_PredicateWithUUID_PredicateWithUUIDs_PredicateWithMetadataKey_PredicateWithStartAndEnd_PredicateFromWorkout_FilterForSamplesAnd_FilterForSamplesOr.fourth(
77
+ PredicateWithStartAndEnd(
78
+ startDate: from,
79
+ endDate: to,
80
+ strictEndDate: true,
81
+ strictStartDate: true
82
+ )
83
+ )
84
+ )
85
+
86
+ return Promise.async {
87
+ try await withCheckedThrowingContinuation { continuation in
88
+ let query = HKCorrelationQuery(
89
+ type: correlationType,
90
+ predicate: predicate,
91
+ samplePredicates: nil
92
+ ) { (_: HKCorrelationQuery, correlations: [HKCorrelation]?, error: Error?) in
93
+ if let error = error {
94
+ continuation.resume(throwing: error)
95
+ return
96
+ }
97
+
98
+ guard let correlations = correlations else {
99
+ continuation.resume(returning: [])
100
+ return
101
+ }
102
+
103
+ // Collect all quantity types to get preferred units
104
+ var quantityTypes = Set<HKQuantityType>()
105
+ for correlation in correlations {
106
+ for object in correlation.objects {
107
+ if let quantitySample = object as? HKQuantitySample {
108
+ quantityTypes.insert(quantitySample.quantityType)
109
+ }
110
+ }
111
+ }
112
+
113
+ store.preferredUnits(for: quantityTypes) { (unitMap: [HKQuantityType: HKUnit], error: Error?) in
114
+ if let error = error {
115
+ continuation.resume(throwing: error)
116
+ return
117
+ }
118
+
119
+ let serializedCorrelations = correlations.map { correlation -> CorrelationSample in
120
+ let objects = correlation.objects.compactMap { object -> CorrelationObject? in
121
+ if let quantitySample = object as? HKQuantitySample,
122
+ let unit = unitMap[quantitySample.quantityType] {
123
+ do {
124
+ let quantitySample = try serializeQuantitySample(sample: quantitySample, unit: unit)
125
+ return CorrelationObject.second(quantitySample)
126
+ } catch {
127
+ print(error.localizedDescription)
128
+ }
129
+
130
+ } else if let categorySample = object as? HKCategorySample {
131
+ return CorrelationObject.first(serializeCategorySample(sample: categorySample))
132
+ }
133
+ return nil
134
+ }
135
+
136
+ return CorrelationSample(
137
+ correlationType: CorrelationTypeIdentifier(fromString: correlation.correlationType.identifier)!,
138
+ objects: objects,
139
+ metadata: serializeMetadata(correlation.metadata),
140
+ startDate: correlation.startDate,
141
+ endDate: correlation.endDate
142
+ )
143
+ }
144
+
145
+ continuation.resume(returning: serializedCorrelations)
146
+ }
147
+ }
148
+
149
+ store.execute(query)
150
+ }
151
+ }
152
+ }
153
+ }