@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
@@ -7,174 +7,281 @@
7
7
 
8
8
  import Foundation
9
9
  import HealthKit
10
+ import NitroModules
10
11
 
11
- let _dateFormatter = ISO8601DateFormatter()
12
-
13
- func serializeQuantity(unit: HKUnit, quantity: HKQuantity?) -> [String: Any]? {
14
- guard let q = quantity else {
12
+ func serializeQuantityTyped(unit: HKUnit, quantityNullable: HKQuantity?) -> Quantity? {
13
+ guard let q = quantityNullable else {
15
14
  return nil
16
15
  }
16
+
17
+ return Quantity(
18
+ unit: unit.unitString,
19
+ quantity: q.doubleValue(for: unit)
20
+ )
21
+ }
22
+
23
+ func serializeQuantityTyped(unit: HKUnit, quantity: HKQuantity) -> Quantity {
24
+ return Quantity(
25
+ unit: unit.unitString,
26
+ quantity: quantity.doubleValue(for: unit)
27
+ )
28
+ }
17
29
 
18
- return [
19
- "quantity": q.doubleValue(for: unit),
20
- "unit": unit.unitString
21
- ]
30
+ func serializeQuantitySample(sample: HKQuantitySample, unit: HKUnit) throws -> QuantitySample {
31
+ if let quantityType = QuantityTypeIdentifier(fromString: sample.quantityType.identifier) {
32
+ return QuantitySample(
33
+ uuid: sample.uuid.uuidString,
34
+ device: serializeDevice(hkDevice: sample.device),
35
+ quantityType: quantityType,
36
+ startDate: sample.startDate,
37
+ endDate: sample.endDate,
38
+ quantity: sample.quantity.doubleValue(for: unit),
39
+ unit: unit.unitString,
40
+ metadata: serializeMetadata(sample.metadata),
41
+ sourceRevision: serializeSourceRevision(sample.sourceRevision),
42
+ )
43
+ }
44
+ throw RuntimeError.error(withMessage: "[react-native-healthkit] Unable to recognize quantityType: \(sample.quantityType.identifier)")
22
45
  }
23
46
 
24
- func serializeQuantitySample(sample: HKQuantitySample, unit: HKUnit) -> NSDictionary {
25
- let endDate = _dateFormatter.string(from: sample.endDate)
26
- let startDate = _dateFormatter.string(from: sample.startDate)
27
-
28
- let quantity = sample.quantity.doubleValue(for: unit)
29
-
30
- return [
31
- "uuid": sample.uuid.uuidString,
32
- "device": serializeDevice(_device: sample.device) as Any,
33
- "quantityType": sample.quantityType.identifier,
34
- "endDate": endDate,
35
- "startDate": startDate,
36
- "quantity": quantity,
37
- "unit": unit.unitString,
38
- "metadata": serializeMetadata(metadata: sample.metadata),
39
- "sourceRevision": serializeSourceRevision(_sourceRevision: sample.sourceRevision) as Any
40
- ]
47
+ func serializeDeletedSample(sample: HKDeletedObject) -> DeletedSample {
48
+ return DeletedSample(
49
+ uuid: sample.uuid.uuidString,
50
+ metadata: serializeMetadata(sample.metadata)
51
+ )
41
52
  }
42
53
 
43
- func serializeDeletedSample(sample: HKDeletedObject) -> NSDictionary {
44
- return [
45
- "uuid": sample.uuid.uuidString,
46
- "metadata": serializeMetadata(metadata: sample.metadata)
47
- ]
54
+
55
+ func serializeCategorySample(sample: HKCategorySample) -> CategorySample {
56
+ return CategorySample(
57
+ uuid: sample.uuid.uuidString,
58
+ device: serializeDevice(hkDevice: sample.device),
59
+ categoryType: CategoryTypeIdentifier(fromString: sample.categoryType.identifier)!,
60
+ startDate: sample.startDate,
61
+ endDate: sample.endDate,
62
+ value: Double(sample.value),
63
+ metadata: serializeMetadata(sample.metadata),
64
+ sourceRevision: serializeSourceRevision(sample.sourceRevision)
65
+ )
48
66
  }
49
67
 
50
- func serializeCategorySample(sample: HKCategorySample) -> NSDictionary {
51
- let endDate = _dateFormatter.string(from: sample.endDate)
52
- let startDate = _dateFormatter.string(from: sample.startDate)
53
-
54
- return [
55
- "uuid": sample.uuid.uuidString,
56
- "device": serializeDevice(_device: sample.device) as Any,
57
- "categoryType": sample.categoryType.identifier,
58
- "endDate": endDate,
59
- "startDate": startDate,
60
- "value": sample.value,
61
- "metadata": serializeMetadata(metadata: sample.metadata),
62
- "sourceRevision": serializeSourceRevision(_sourceRevision: sample.sourceRevision) as Any
63
- ]
68
+ func serializeSource(_ source: HKSource) -> SourceProxy {
69
+ return SourceProxy(
70
+ source: source
71
+ )
64
72
  }
65
73
 
66
- func serializeSource(source: HKSource) -> NSDictionary {
67
74
 
68
- return [
69
- "bundleIdentifier": source.bundleIdentifier,
70
- "name": source.name
71
- ]
75
+ func getUnitForQuantityType(quantityType: HKQuantityType) -> HKUnit? {
76
+ if quantityType.is(compatibleWith: HKUnit.percent()) {
77
+ return HKUnit.percent()
78
+ }
79
+
80
+ if quantityType.is(compatibleWith: HKUnit.second()) {
81
+ return HKUnit.second()
82
+ }
83
+
84
+ if quantityType.is(compatibleWith: HKUnit.kilocalorie()) {
85
+ return HKUnit.kilocalorie()
86
+ }
87
+
88
+ if quantityType.is(compatibleWith: HKUnit.count()) {
89
+ return HKUnit.count()
90
+ }
91
+
92
+ if quantityType.is(compatibleWith: HKUnit.meter()) {
93
+ return HKUnit.meter()
94
+ }
95
+
96
+ if quantityType.is(compatibleWith: SpeedUnit) {
97
+ return SpeedUnit
98
+ }
99
+
100
+ if quantityType.is(compatibleWith: METUnit) {
101
+ return METUnit
102
+ }
103
+
104
+ if #available(iOS 11, *) {
105
+ if quantityType.is(compatibleWith: HKUnit.internationalUnit()) {
106
+ return HKUnit.internationalUnit()
107
+ }
108
+ }
109
+
110
+ if #available(iOS 13, *) {
111
+ if quantityType.is(compatibleWith: HKUnit.hertz()) {
112
+ return HKUnit.hertz()
113
+ }
114
+ if quantityType.is(compatibleWith: HKUnit.decibelHearingLevel()) {
115
+ return HKUnit.decibelHearingLevel()
116
+ }
117
+ }
118
+
119
+ if #available(iOS 17.0, *) {
120
+ if quantityType.is(compatibleWith: HKUnit.lux()) {
121
+ return HKUnit.lux()
122
+ }
123
+ }
124
+
125
+ #if compiler(>=6)
126
+ if #available(iOS 18.0, *) {
127
+ if quantityType.is(compatibleWith: HKUnit.appleEffortScore()) {
128
+ return HKUnit.appleEffortScore()
129
+ }
130
+ }
131
+ #endif
132
+
133
+
134
+ return nil
72
135
  }
73
136
 
74
- func serializeUnknownQuantity(quantity: HKQuantity) -> [String: Any]? {
137
+ func serializeUnknownQuantityTyped(quantity: HKQuantity?) -> Quantity? {
138
+ guard let quantity = quantity else {
139
+ return nil
140
+ }
141
+
75
142
  if quantity.is(compatibleWith: HKUnit.percent()) {
76
- return serializeQuantity(unit: HKUnit.percent(), quantity: quantity)
143
+ return serializeQuantityTyped(unit: HKUnit.percent(), quantity: quantity)
77
144
  }
78
145
 
79
146
  if quantity.is(compatibleWith: HKUnit.second()) {
80
- return serializeQuantity(unit: HKUnit.second(), quantity: quantity)
147
+ return serializeQuantityTyped(unit: HKUnit.second(), quantity: quantity)
81
148
  }
82
149
 
83
150
  if quantity.is(compatibleWith: HKUnit.kilocalorie()) {
84
- return serializeQuantity(unit: HKUnit.kilocalorie(), quantity: quantity)
151
+ return serializeQuantityTyped(unit: HKUnit.kilocalorie(), quantity: quantity)
85
152
  }
86
153
 
87
154
  if quantity.is(compatibleWith: HKUnit.count()) {
88
- return serializeQuantity(unit: HKUnit.count(), quantity: quantity)
155
+ return serializeQuantityTyped(unit: HKUnit.count(), quantity: quantity)
89
156
  }
90
157
 
91
158
  if quantity.is(compatibleWith: HKUnit.meter()) {
92
- return serializeQuantity(unit: HKUnit.meter(), quantity: quantity)
159
+ return serializeQuantityTyped(unit: HKUnit.meter(), quantity: quantity)
93
160
  }
94
161
 
95
162
  if #available(iOS 11, *) {
96
163
  if quantity.is(compatibleWith: HKUnit.internationalUnit()) {
97
- return serializeQuantity(unit: HKUnit.internationalUnit(), quantity: quantity)
164
+ return serializeQuantityTyped(unit: HKUnit.internationalUnit(), quantity: quantity)
98
165
  }
99
166
  }
100
167
 
101
168
  if #available(iOS 13, *) {
102
169
  if quantity.is(compatibleWith: HKUnit.hertz()) {
103
- return serializeQuantity(unit: HKUnit.hertz(), quantity: quantity)
170
+ return serializeQuantityTyped(unit: HKUnit.hertz(), quantity: quantity)
104
171
  }
105
172
  if quantity.is(compatibleWith: HKUnit.decibelHearingLevel()) {
106
- return serializeQuantity(unit: HKUnit.decibelHearingLevel(), quantity: quantity)
173
+ return serializeQuantityTyped(unit: HKUnit.decibelHearingLevel(), quantity: quantity)
107
174
  }
108
175
  }
109
176
 
110
177
  if #available(iOS 17.0, *) {
111
178
  if quantity.is(compatibleWith: HKUnit.lux()) {
112
- return serializeQuantity(unit: HKUnit.lux(), quantity: quantity)
179
+ return serializeQuantityTyped(unit: HKUnit.lux(), quantity: quantity)
113
180
  }
114
181
  }
115
182
 
116
183
  #if compiler(>=6)
117
184
  if #available(iOS 18.0, *) {
118
185
  if quantity.is(compatibleWith: HKUnit.appleEffortScore()) {
119
- return serializeQuantity(unit: HKUnit.appleEffortScore(), quantity: quantity)
186
+ return serializeQuantityTyped(unit: HKUnit.appleEffortScore(), quantity: quantity)
120
187
  }
121
188
  }
122
189
  #endif
123
190
 
124
191
  if quantity.is(compatibleWith: SpeedUnit) {
125
- return serializeQuantity(unit: SpeedUnit, quantity: quantity)
192
+ return serializeQuantityTyped(unit: SpeedUnit, quantity: quantity)
126
193
  }
127
194
 
128
195
  if quantity.is(compatibleWith: METUnit) {
129
- return serializeQuantity(unit: METUnit, quantity: quantity)
196
+ return serializeQuantityTyped(unit: METUnit, quantity: quantity)
130
197
  }
131
198
 
132
199
  return nil
133
200
  }
134
201
 
135
- func serializeMetadata(metadata: [String: Any]?) -> NSDictionary {
136
- let serialized: NSMutableDictionary = [:]
202
+ func serializeUnknownQuantity(quantity: HKQuantity) -> Dictionary<String, AnyValue>? {
203
+ if let quantityTyped = serializeUnknownQuantityTyped(quantity: quantity) {
204
+ return [
205
+ "quantity": AnyValue.number(quantityTyped.quantity),
206
+ "unit": AnyValue.string(quantityTyped.unit)
207
+ ]
208
+ }
209
+
210
+ return nil
211
+ }
212
+
213
+ func serializeMetadata(_ metadata: [String: Any]?) -> AnyMapHolder {
214
+ let serialized = AnyMapHolder()
137
215
  if let m = metadata {
138
216
  for item in m {
139
217
  if let bool = item.value as? Bool {
140
- serialized.setValue(bool, forKey: item.key)
218
+ serialized.setBoolean(key: item.key, value: bool)
141
219
  }
220
+
142
221
  if let str = item.value as? String {
143
- serialized.setValue(str, forKey: item.key)
222
+ serialized.setString(key: item.key, value: str)
144
223
  }
145
224
 
146
225
  if let double = item.value as? Double {
147
- serialized.setValue(double, forKey: item.key)
226
+ serialized.setDouble(key: item.key, value: double)
148
227
  }
228
+
149
229
  if let quantity = item.value as? HKQuantity {
150
230
  if let s = serializeUnknownQuantity(quantity: quantity) {
151
- serialized.setValue(s, forKey: item.key)
231
+ serialized.setObject(key: item.key, value: s)
152
232
  }
153
233
  }
234
+
235
+ if let dict = item.value as? Dictionary<String, AnyValue> {
236
+ serialized.setObject(key: item.key, value: dict)
237
+ }
154
238
  }
155
239
  }
156
240
  return serialized
157
241
  }
158
242
 
159
- func serializeDevice(_device: HKDevice?) -> [String: String?]? {
160
- guard let device = _device else {
161
- return nil
243
+ /*func serializeGenericMetadata(_ metadata: [String: Any]?) -> GenericMetadata? {
244
+ if let metadata = metadata {
245
+ return GenericMetadata(
246
+ HKExternalUUID: metadata["HKExternalUUID"] as? String,
247
+ HKTimeZone: metadata["HKTimeZone"] as? String,
248
+ HKWasUserEntered: metadata["HKWasUserEntered"] as? Bool,
249
+ HKDeviceSerialNumber: metadata["HKDeviceSerialNumber"] as? String,
250
+ HKUDIDeviceIdentifier: metadata["HKUDIDeviceIdentifier"] as? String,
251
+ HKUDIProductionIdentifier: metadata["HKUDIProductionIdentifier"] as? String,
252
+ HKDigitalSignature: metadata["HKDigitalSignature"] as? String,
253
+ HKDeviceName: metadata["HKDeviceName"] as? String,
254
+ HKDeviceManufacturerName: metadata["HKDeviceManufacturerName"] as? String,
255
+ HKSyncIdentifier: metadata["HKSyncIdentifier"] as? String,
256
+ HKSyncVersion: metadata["HKSyncVersion"] as? Double,
257
+ HKWasTakenInLab: metadata["HKWasTakenInLab"] as? Bool,
258
+ HKReferenceRangeLowerLimit: metadata["HKReferenceRangeLowerLimit"] as? Double,
259
+ HKReferenceRangeUpperLimit: metadata["HKReferenceRangeUpperLimit"] as? Double,
260
+ allMetadata: serializeAllMetadata(metadata)
261
+ )
162
262
  }
263
+ return nil
264
+ }*/
163
265
 
164
- return [
165
- "name": device.name,
166
- "firmwareVersion": device.firmwareVersion,
167
- "hardwareVersion": device.hardwareVersion,
168
- "localIdentifier": device.localIdentifier,
169
- "manufacturer": device.manufacturer,
170
- "model": device.model,
171
- "softwareVersion": device.softwareVersion,
172
- "udiDeviceIdentifier": device.udiDeviceIdentifier
173
- ]
266
+ func serializeDevice(hkDevice: HKDevice?) -> Device? {
267
+ guard let hkDevice = hkDevice else {
268
+ return nil
269
+ }
270
+
271
+ return Device(
272
+ name: hkDevice.name,
273
+ firmwareVersion: hkDevice.firmwareVersion,
274
+ hardwareVersion: hkDevice.hardwareVersion,
275
+ localIdentifier: hkDevice.localIdentifier,
276
+ manufacturer: hkDevice.manufacturer,
277
+ model: hkDevice.model,
278
+ softwareVersion: hkDevice.softwareVersion,
279
+ udiDeviceIdentifier: hkDevice.udiDeviceIdentifier
280
+ )
174
281
  }
175
282
 
176
- func serializeOperatingSystemVersion(_version: OperatingSystemVersion?) -> String? {
177
- guard let version = _version else {
283
+ func serializeOperatingSystemVersion(_ version: OperatingSystemVersion?) -> String? {
284
+ guard let version = version else {
178
285
  return nil
179
286
  }
180
287
 
@@ -183,56 +290,36 @@ func serializeOperatingSystemVersion(_version: OperatingSystemVersion?) -> Strin
183
290
  return versionString
184
291
  }
185
292
 
186
- func serializeSourceRevision(_sourceRevision: HKSourceRevision?) -> [String: Any?]? {
187
- guard let sourceRevision = _sourceRevision else {
293
+ func serializeSourceRevision(_ hkSourceRevision: HKSourceRevision?) -> SourceRevision? {
294
+ guard let hkSourceRevision = hkSourceRevision else {
188
295
  return nil
189
296
  }
190
297
 
191
- var dict = [
192
- "source": [
193
- "name": sourceRevision.source.name,
194
- "bundleIdentifier": sourceRevision.source.bundleIdentifier
195
- ],
196
- "version": sourceRevision.version as Any
197
- ] as [String: Any]
198
-
298
+
199
299
  if #available(iOS 11, *) {
200
- dict["operatingSystemVersion"] = serializeOperatingSystemVersion(_version: sourceRevision.operatingSystemVersion)
201
- dict["productType"] = sourceRevision.productType
300
+ return SourceRevision(
301
+ source: serializeSource(hkSourceRevision.source),
302
+ version: hkSourceRevision.version,
303
+ operatingSystemVersion: serializeOperatingSystemVersion( hkSourceRevision.operatingSystemVersion),
304
+ productType: hkSourceRevision.productType
305
+ )
202
306
  }
203
-
204
- return dict
205
- }
206
-
207
- func deserializeHKQueryAnchor(anchor: String) -> HKQueryAnchor? {
208
- return anchor.isEmpty ? nil : base64StringToHKQueryAnchor(base64String: anchor)
307
+
308
+ return SourceRevision(
309
+ source: serializeSource(hkSourceRevision.source),
310
+ version: hkSourceRevision.version,
311
+ operatingSystemVersion: nil,
312
+ productType: nil
313
+ )
209
314
  }
210
315
 
211
316
  func serializeAnchor(anchor: HKQueryAnchor?) -> String? {
212
- guard let anch = anchor else {
213
- return nil
214
- }
317
+ if let anchor = anchor {
318
+ let data = NSKeyedArchiver.archivedData(withRootObject: anchor)
319
+ let encoded = data.base64EncodedString()
215
320
 
216
- let data = NSKeyedArchiver.archivedData(withRootObject: anch)
217
- let encoded = data.base64EncodedString()
218
-
219
- return encoded
220
- }
221
-
222
- func serializeStatistic(unit: HKUnit, quantity: HKQuantity?, stats: HKStatistics?) -> [String: Any]? {
223
- guard let q = quantity, let stats = stats else {
321
+ return encoded
322
+ } else {
224
323
  return nil
225
324
  }
226
-
227
- let endDate = _dateFormatter.string(from: stats.endDate)
228
- let startDate = _dateFormatter.string(from: stats.startDate)
229
- let quantityType = stats.quantityType.identifier
230
-
231
- return [
232
- "quantityType": quantityType,
233
- "startDate": startDate,
234
- "endDate": endDate,
235
- "quantity": q.doubleValue(for: unit),
236
- "unit": unit.unitString
237
- ]
238
325
  }
@@ -0,0 +1,35 @@
1
+ //
2
+ // SourceProxy.swift
3
+ // Pods
4
+ //
5
+ // Created by Robert Herber on 2025-06-16.
6
+ //
7
+
8
+ import HealthKit
9
+ import NitroModules
10
+
11
+ class SourceProxy: HybridSourceProxySpec {
12
+ func toJSON(key: String?) throws -> Source {
13
+ if key != nil && key?.isEmpty != true {
14
+ print("SourceProxy does not support toJSON with key: \(key!)")
15
+ }
16
+
17
+ return Source(
18
+ name: self.name,
19
+ bundleIdentifier: self.bundleIdentifier
20
+ )
21
+
22
+ }
23
+
24
+ private let source: HKSource
25
+
26
+ let name: String
27
+
28
+ let bundleIdentifier: String
29
+
30
+ init(source: HKSource) {
31
+ self.source = source
32
+ self.name = source.name
33
+ self.bundleIdentifier = source.bundleIdentifier
34
+ }
35
+ }
@@ -0,0 +1,160 @@
1
+ import HealthKit
2
+ import NitroModules
3
+
4
+ @available(iOS 18.0, *)
5
+ func serializeStateOfMindSample(sample: HKStateOfMind) -> StateOfMindSample {
6
+ // todo: warn if we get unknown labels??
7
+ let associations = sample.associations.compactMap { association in
8
+ if let association = StateOfMindAssociation(rawValue: Int32(association.rawValue)) {
9
+ return association
10
+ }
11
+ print("[react-native-healthkit] Unknown StateOfMindAssociation raw value: \(association.rawValue)")
12
+
13
+ return nil
14
+ }
15
+
16
+ // todo: warn if we get unknown labels??
17
+ let labels = sample.labels.compactMap { label in
18
+ if let label = StateOfMindLabel(rawValue: Int32(label.rawValue)){
19
+ return label
20
+ }
21
+
22
+ print("[react-native-healthkit] Unknown StateOfMindLabel raw value: \(label.rawValue)")
23
+ return nil
24
+ }
25
+
26
+ return StateOfMindSample(
27
+ uuid: sample.uuid.uuidString,
28
+ device: serializeDevice(hkDevice: sample.device),
29
+ startDate: sample.startDate,
30
+ endDate: sample.endDate,
31
+ metadata: serializeMetadata(sample.metadata),
32
+ sourceRevision: serializeSourceRevision(sample.sourceRevision),
33
+ valence: sample.valence,
34
+ // todo: handle better?
35
+ kind: StateOfMindKind(rawValue: Int32(sample.kind.rawValue))!,
36
+ // todo: handle better?
37
+ valenceClassification: StateOfMindValenceClassification(rawValue: Int32(sample.valenceClassification.rawValue))!,
38
+ associations: associations,
39
+ labels: labels
40
+ )
41
+ }
42
+
43
+ #if compiler(>=6)
44
+ class StateOfMindModule : HybridStateOfMindModuleSpec {
45
+ func queryStateOfMindSamples(
46
+ options: QueryOptionsWithSortOrder?
47
+ ) throws -> Promise<[StateOfMindSample]> {
48
+ if #available(iOS 18.0, *) {
49
+ let predicate = try createPredicate(filter: options?.filter)
50
+ let queryLimit = getQueryLimit(options?.limit)
51
+
52
+ return Promise.async {
53
+ try await withCheckedThrowingContinuation { continuation in
54
+ let type = HKStateOfMindType.stateOfMindType()
55
+
56
+ let query = HKSampleQuery(
57
+ sampleType: type,
58
+ predicate: predicate,
59
+ limit: queryLimit,
60
+ sortDescriptors: [
61
+ NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: options?.ascending ?? false)
62
+ ]
63
+ ) { (_: HKSampleQuery, samples: [HKSample]?, error: Error?) in
64
+ if let error = error {
65
+ continuation.resume(throwing: error)
66
+ return
67
+ }
68
+
69
+ guard let samples = samples as? [HKStateOfMind] else {
70
+ return continuation.resume(throwing: RuntimeError.error(withMessage: "[react-native-healthkit] Unexpected empty response"))
71
+ }
72
+
73
+ let serializedSamples = samples.map { sample -> StateOfMindSample in
74
+ return serializeStateOfMindSample(sample: sample)
75
+ }
76
+
77
+ continuation.resume(returning: serializedSamples)
78
+ }
79
+
80
+ store.execute(query)
81
+ }
82
+ }
83
+ } else {
84
+ throw RuntimeError.error(withMessage: "StateOfMind is only available on iOS 18 and later")
85
+ }
86
+ }
87
+
88
+ func saveStateOfMindSample(
89
+ date: Date,
90
+ kind: StateOfMindKind,
91
+ valence: Double,
92
+ labels: [StateOfMindLabel],
93
+ associations: [StateOfMindAssociation],
94
+ metadata: AnyMapHolder?
95
+ ) throws -> Promise<Bool> {
96
+ if #available(iOS 18, *) {
97
+ return Promise.async {
98
+ try await withCheckedThrowingContinuation { continuation in
99
+ // Convert enum values to HKStateOfMind types
100
+ if let hkKind = HKStateOfMind.Kind.init(rawValue: Int(kind.rawValue)) {
101
+ let hkLabels = labels.compactMap {
102
+ if let label = HKStateOfMind.Label.init(rawValue: Int($0.rawValue)) {
103
+ return label
104
+ }
105
+ print("[react-native-healthkit] Unknown StateOfMindLabel raw value: \($0.rawValue)")
106
+ return nil
107
+ }
108
+ let hkAssociations = associations.compactMap {
109
+ if let association = HKStateOfMind.Association.init(rawValue: Int($0.rawValue)) {
110
+ return association
111
+ }
112
+ print("[react-native-healthkit] Unknown StateOfMindAssociation raw value: \($0.rawValue)")
113
+ return nil
114
+ }
115
+
116
+ let sample = HKStateOfMind(
117
+ date: date,
118
+ kind: hkKind,
119
+ valence: valence,
120
+ labels: hkLabels,
121
+ associations: hkAssociations,
122
+ metadata: anyMapToDictionary(metadata ?? AnyMapHolder())
123
+ )
124
+
125
+ store.save(sample) { (success: Bool, error: Error?) in
126
+ if let error = error {
127
+ continuation.resume(throwing: error)
128
+ } else {
129
+ continuation.resume(returning: success)
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+ } else {
136
+ throw RuntimeError.error(withMessage: "StateOfMind is only available on iOS 18 and later")
137
+ }
138
+ }
139
+ }
140
+ #else
141
+ // Fallback for older Xcode versions
142
+ class StateOfMind : HybridStateOfMindModuleSpec {
143
+ func queryStateOfMindSamples(
144
+ options: QueryOptionsWithSortOrder?
145
+ ) throws -> Promise<[StateOfMindSample]> {
146
+ throw RuntimeError.error(withMessage: "State of Mind features require iOS 18.0 or later and Xcode 16 or later to compile")
147
+ }
148
+
149
+ func saveStateOfMindSample(
150
+ date: Date,
151
+ kind: StateOfMindKind,
152
+ valence: Double,
153
+ labels: [StateOfMindLabel],
154
+ associations: [StateOfMindAssociation],
155
+ metadata: [String: Any]?
156
+ ) throws -> Promise<Bool> {
157
+ throw RuntimeError.error(withMessage: "State of Mind features require iOS 18.0 or later and Xcode 16 or later to compile")
158
+ }
159
+ }
160
+ #endif