@kingstinct/react-native-healthkit 8.7.2 → 9.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -21
- package/ReactNativeHealthkit.podspec +36 -0
- package/app.plugin.js +43 -33
- package/ios/Bridge.h +8 -0
- package/ios/CategoryTypeModule.swift +128 -0
- package/ios/CharacteristicTypeModule.swift +78 -0
- package/ios/Constants.swift +2 -0
- package/ios/CoreModule.swift +376 -0
- package/ios/CorrelationTypeModule.swift +153 -0
- package/ios/HeartbeatSeriesModule.swift +189 -0
- package/ios/Helpers.swift +525 -251
- package/ios/QuantityTypeModule.swift +461 -0
- package/ios/Serializers.swift +211 -124
- package/ios/SourceProxy.swift +35 -0
- package/ios/StateOfMindModule.swift +160 -0
- package/ios/WorkoutProxy.swift +412 -0
- package/ios/WorkoutSessionModule.swift +182 -0
- package/ios/WorkoutsModule.swift +357 -0
- package/package.json +43 -127
- package/react-native.config.js +16 -0
- package/src/hooks/useHealthkitAuthorization.test.ts +47 -29
- package/src/hooks/useHealthkitAuthorization.ts +21 -15
- package/src/hooks/useIsHealthDataAvailable.test.ts +17 -7
- package/src/hooks/useIsHealthDataAvailable.ts +7 -7
- package/src/hooks/useMostRecentCategorySample.ts +10 -12
- package/src/hooks/useMostRecentQuantitySample.ts +17 -36
- package/src/hooks/useMostRecentWorkout.ts +16 -38
- package/src/hooks/useSources.ts +8 -12
- package/src/hooks/useStatisticsForQuantity.ts +19 -14
- package/src/hooks/useSubscribeToChanges.ts +9 -13
- package/src/index.ios.ts +232 -0
- package/src/index.ts +444 -0
- package/src/modules.ts +43 -0
- package/src/specs/CategoryTypeModule.nitro.ts +64 -0
- package/src/specs/CharacteristicTypeModule.nitro.ts +22 -0
- package/src/specs/CoreModule.nitro.ts +107 -0
- package/src/specs/CorrelationTypeModule.nitro.ts +23 -0
- package/src/specs/HeartbeatSeriesModule.nitro.ts +19 -0
- package/src/specs/QuantityTypeModule.nitro.ts +60 -0
- package/src/specs/SourceProxy.nitro.ts +13 -0
- package/src/specs/StateOfMindModule.nitro.ts +23 -0
- package/src/specs/WorkoutProxy.nitro.ts +18 -0
- package/src/specs/WorkoutSessionModule.nitro.ts +71 -0
- package/src/specs/WorkoutsModule.nitro.ts +32 -0
- package/src/test-setup.ts +68 -54
- package/src/test-utils.ts +3 -2
- package/src/types/Auth.ts +17 -0
- package/src/types/Background.ts +9 -0
- package/src/types/CategoryType.ts +249 -0
- package/src/types/CategoryTypeIdentifier.ts +99 -0
- package/src/types/Characteristics.ts +53 -0
- package/src/types/Constants.ts +25 -0
- package/src/types/CorrelationType.ts +31 -0
- package/src/types/Device.ts +13 -0
- package/src/types/HeartbeatSeries.ts +29 -0
- package/src/types/InterfaceVerification.ts +164 -0
- package/src/types/InterfaceVerificationExample.ts +89 -0
- package/src/types/QuantitySample.ts +30 -0
- package/src/types/QuantityType.ts +192 -0
- package/src/types/QuantityTypeIdentifier.ts +758 -0
- package/src/types/QueryOptions.ts +69 -0
- package/src/types/README-InterfaceVerification.md +103 -0
- package/src/types/Shared.ts +79 -0
- package/src/types/Source.ts +11 -0
- package/src/types/StateOfMind.ts +110 -0
- package/src/types/Subscriptons.ts +10 -0
- package/src/types/Units.ts +190 -0
- package/src/types/WeatherCondition.ts +31 -0
- package/src/types/WorkoutKit.ts +18 -0
- package/src/types/Workouts.ts +282 -0
- package/src/utils/getMostRecentCategorySample.ts +7 -11
- package/src/utils/getMostRecentQuantitySample.ts +8 -18
- package/src/utils/getMostRecentWorkout.ts +7 -17
- package/src/utils/getPreferredUnit.ts +12 -8
- package/src/utils/subscribeToChanges.ts +9 -26
- package/LICENSE +0 -21
- package/ios/ReactNativeHealthkit-Bridging-Header.h +0 -2
- package/ios/ReactNativeHealthkit.m +0 -271
- package/ios/ReactNativeHealthkit.swift +0 -2333
- package/ios/ReactNativeHealthkit.xcodeproj/project.pbxproj +0 -279
- package/kingstinct-react-native-healthkit.podspec +0 -21
- package/lib/commonjs/hooks/useHealthkitAuthorization.js +0 -39
- package/lib/commonjs/hooks/useHealthkitAuthorization.js.map +0 -1
- package/lib/commonjs/hooks/useHealthkitAuthorization.test.js +0 -72
- package/lib/commonjs/hooks/useHealthkitAuthorization.test.js.map +0 -1
- package/lib/commonjs/hooks/useIsHealthDataAvailable.js +0 -27
- package/lib/commonjs/hooks/useIsHealthDataAvailable.js.map +0 -1
- package/lib/commonjs/hooks/useIsHealthDataAvailable.test.js +0 -41
- package/lib/commonjs/hooks/useIsHealthDataAvailable.test.js.map +0 -1
- package/lib/commonjs/hooks/useMostRecentCategorySample.js +0 -23
- package/lib/commonjs/hooks/useMostRecentCategorySample.js.map +0 -1
- package/lib/commonjs/hooks/useMostRecentQuantitySample.js +0 -37
- package/lib/commonjs/hooks/useMostRecentQuantitySample.js.map +0 -1
- package/lib/commonjs/hooks/useMostRecentWorkout.js +0 -48
- package/lib/commonjs/hooks/useMostRecentWorkout.js.map +0 -1
- package/lib/commonjs/hooks/useSources.js +0 -22
- package/lib/commonjs/hooks/useSources.js.map +0 -1
- package/lib/commonjs/hooks/useStatisticsForQuantity.js +0 -28
- package/lib/commonjs/hooks/useStatisticsForQuantity.js.map +0 -1
- package/lib/commonjs/hooks/useSubscribeToChanges.js +0 -28
- package/lib/commonjs/hooks/useSubscribeToChanges.js.map +0 -1
- package/lib/commonjs/index.ios.js +0 -531
- package/lib/commonjs/index.ios.js.map +0 -1
- package/lib/commonjs/index.js +0 -22
- package/lib/commonjs/index.js.map +0 -1
- package/lib/commonjs/index.native.js +0 -235
- package/lib/commonjs/index.native.js.map +0 -1
- package/lib/commonjs/index.web.js +0 -22
- package/lib/commonjs/index.web.js.map +0 -1
- package/lib/commonjs/native-types.js +0 -1575
- package/lib/commonjs/native-types.js.map +0 -1
- package/lib/commonjs/test-setup.js +0 -57
- package/lib/commonjs/test-setup.js.map +0 -1
- package/lib/commonjs/test-utils.js +0 -18
- package/lib/commonjs/test-utils.js.map +0 -1
- package/lib/commonjs/types.js +0 -17
- package/lib/commonjs/types.js.map +0 -1
- package/lib/commonjs/utils/deleteQuantitySample.js +0 -11
- package/lib/commonjs/utils/deleteQuantitySample.js.map +0 -1
- package/lib/commonjs/utils/deleteSamples.js +0 -18
- package/lib/commonjs/utils/deleteSamples.js.map +0 -1
- package/lib/commonjs/utils/deleteWorkoutSample.js +0 -11
- package/lib/commonjs/utils/deleteWorkoutSample.js.map +0 -1
- package/lib/commonjs/utils/deserializeCategorySample.js +0 -13
- package/lib/commonjs/utils/deserializeCategorySample.js.map +0 -1
- package/lib/commonjs/utils/deserializeCategorySample.test.js +0 -26
- package/lib/commonjs/utils/deserializeCategorySample.test.js.map +0 -1
- package/lib/commonjs/utils/deserializeCorrelation.js +0 -26
- package/lib/commonjs/utils/deserializeCorrelation.js.map +0 -1
- package/lib/commonjs/utils/deserializeHeartbeatSeriesSample.js +0 -15
- package/lib/commonjs/utils/deserializeHeartbeatSeriesSample.js.map +0 -1
- package/lib/commonjs/utils/deserializeSample.js +0 -15
- package/lib/commonjs/utils/deserializeSample.js.map +0 -1
- package/lib/commonjs/utils/deserializeWorkout.js +0 -15
- package/lib/commonjs/utils/deserializeWorkout.js.map +0 -1
- package/lib/commonjs/utils/ensureMetadata.js +0 -11
- package/lib/commonjs/utils/ensureMetadata.js.map +0 -1
- package/lib/commonjs/utils/ensureTotals.js +0 -11
- package/lib/commonjs/utils/ensureTotals.js.map +0 -1
- package/lib/commonjs/utils/ensureUnit.js +0 -17
- package/lib/commonjs/utils/ensureUnit.js.map +0 -1
- package/lib/commonjs/utils/getDateOfBirth.js +0 -14
- package/lib/commonjs/utils/getDateOfBirth.js.map +0 -1
- package/lib/commonjs/utils/getMostRecentCategorySample.js +0 -17
- package/lib/commonjs/utils/getMostRecentCategorySample.js.map +0 -1
- package/lib/commonjs/utils/getMostRecentQuantitySample.js +0 -21
- package/lib/commonjs/utils/getMostRecentQuantitySample.js.map +0 -1
- package/lib/commonjs/utils/getMostRecentWorkout.js +0 -19
- package/lib/commonjs/utils/getMostRecentWorkout.js.map +0 -1
- package/lib/commonjs/utils/getPreferredUnit.js +0 -14
- package/lib/commonjs/utils/getPreferredUnit.js.map +0 -1
- package/lib/commonjs/utils/getPreferredUnits.js +0 -14
- package/lib/commonjs/utils/getPreferredUnits.js.map +0 -1
- package/lib/commonjs/utils/getPreferredUnitsTyped.js +0 -33
- package/lib/commonjs/utils/getPreferredUnitsTyped.js.map +0 -1
- package/lib/commonjs/utils/getRequestStatusForAuthorization.js +0 -21
- package/lib/commonjs/utils/getRequestStatusForAuthorization.js.map +0 -1
- package/lib/commonjs/utils/getWorkoutPlanById.js +0 -13
- package/lib/commonjs/utils/getWorkoutPlanById.js.map +0 -1
- package/lib/commonjs/utils/prepareOptions.js +0 -25
- package/lib/commonjs/utils/prepareOptions.js.map +0 -1
- package/lib/commonjs/utils/queryCategorySamples.js +0 -17
- package/lib/commonjs/utils/queryCategorySamples.js.map +0 -1
- package/lib/commonjs/utils/queryCategorySamplesWithAnchor.js +0 -21
- package/lib/commonjs/utils/queryCategorySamplesWithAnchor.js.map +0 -1
- package/lib/commonjs/utils/queryCorrelationSamples.js +0 -17
- package/lib/commonjs/utils/queryCorrelationSamples.js.map +0 -1
- package/lib/commonjs/utils/queryHeartbeatSeriesSamples.js +0 -17
- package/lib/commonjs/utils/queryHeartbeatSeriesSamples.js.map +0 -1
- package/lib/commonjs/utils/queryHeartbeatSeriesSamplesWithAnchor.js +0 -21
- package/lib/commonjs/utils/queryHeartbeatSeriesSamplesWithAnchor.js.map +0 -1
- package/lib/commonjs/utils/queryQuantitySamples.js +0 -19
- package/lib/commonjs/utils/queryQuantitySamples.js.map +0 -1
- package/lib/commonjs/utils/queryQuantitySamplesWithAnchor.js +0 -23
- package/lib/commonjs/utils/queryQuantitySamplesWithAnchor.js.map +0 -1
- package/lib/commonjs/utils/querySources.js +0 -14
- package/lib/commonjs/utils/querySources.js.map +0 -1
- package/lib/commonjs/utils/queryStateOfMindSamples.js +0 -22
- package/lib/commonjs/utils/queryStateOfMindSamples.js.map +0 -1
- package/lib/commonjs/utils/queryStatisticsCollectionForQuantity.js +0 -16
- package/lib/commonjs/utils/queryStatisticsCollectionForQuantity.js.map +0 -1
- package/lib/commonjs/utils/queryStatisticsForQuantity.js +0 -29
- package/lib/commonjs/utils/queryStatisticsForQuantity.js.map +0 -1
- package/lib/commonjs/utils/queryWorkoutSamplesWithAnchor.js +0 -26
- package/lib/commonjs/utils/queryWorkoutSamplesWithAnchor.js.map +0 -1
- package/lib/commonjs/utils/queryWorkouts.js +0 -22
- package/lib/commonjs/utils/queryWorkouts.js.map +0 -1
- package/lib/commonjs/utils/requestAuthorization.js +0 -22
- package/lib/commonjs/utils/requestAuthorization.js.map +0 -1
- package/lib/commonjs/utils/saveCategorySample.js +0 -20
- package/lib/commonjs/utils/saveCategorySample.js.map +0 -1
- package/lib/commonjs/utils/saveCorrelationSample.js +0 -35
- package/lib/commonjs/utils/saveCorrelationSample.js.map +0 -1
- package/lib/commonjs/utils/saveQuantitySample.js +0 -16
- package/lib/commonjs/utils/saveQuantitySample.js.map +0 -1
- package/lib/commonjs/utils/saveStateOfMindSample.js +0 -17
- package/lib/commonjs/utils/saveStateOfMindSample.js.map +0 -1
- package/lib/commonjs/utils/saveWorkoutRoute.js +0 -26
- package/lib/commonjs/utils/saveWorkoutRoute.js.map +0 -1
- package/lib/commonjs/utils/saveWorkoutSample.js +0 -36
- package/lib/commonjs/utils/saveWorkoutSample.js.map +0 -1
- package/lib/commonjs/utils/serializeDate.js +0 -9
- package/lib/commonjs/utils/serializeDate.js.map +0 -1
- package/lib/commonjs/utils/serializeDate.test.js +0 -17
- package/lib/commonjs/utils/serializeDate.test.js.map +0 -1
- package/lib/commonjs/utils/startWatchApp.js +0 -11
- package/lib/commonjs/utils/startWatchApp.js.map +0 -1
- package/lib/commonjs/utils/subscribeToChanges.js +0 -27
- package/lib/commonjs/utils/subscribeToChanges.js.map +0 -1
- package/lib/module/hooks/useHealthkitAuthorization.js +0 -32
- package/lib/module/hooks/useHealthkitAuthorization.js.map +0 -1
- package/lib/module/hooks/useHealthkitAuthorization.test.js +0 -68
- package/lib/module/hooks/useHealthkitAuthorization.test.js.map +0 -1
- package/lib/module/hooks/useIsHealthDataAvailable.js +0 -21
- package/lib/module/hooks/useIsHealthDataAvailable.js.map +0 -1
- package/lib/module/hooks/useIsHealthDataAvailable.test.js +0 -37
- package/lib/module/hooks/useIsHealthDataAvailable.test.js.map +0 -1
- package/lib/module/hooks/useMostRecentCategorySample.js +0 -16
- package/lib/module/hooks/useMostRecentCategorySample.js.map +0 -1
- package/lib/module/hooks/useMostRecentQuantitySample.js +0 -30
- package/lib/module/hooks/useMostRecentQuantitySample.js.map +0 -1
- package/lib/module/hooks/useMostRecentWorkout.js +0 -41
- package/lib/module/hooks/useMostRecentWorkout.js.map +0 -1
- package/lib/module/hooks/useSources.js +0 -15
- package/lib/module/hooks/useSources.js.map +0 -1
- package/lib/module/hooks/useStatisticsForQuantity.js +0 -21
- package/lib/module/hooks/useStatisticsForQuantity.js.map +0 -1
- package/lib/module/hooks/useSubscribeToChanges.js +0 -21
- package/lib/module/hooks/useSubscribeToChanges.js.map +0 -1
- package/lib/module/index.ios.js +0 -209
- package/lib/module/index.ios.js.map +0 -1
- package/lib/module/index.js +0 -4
- package/lib/module/index.js.map +0 -1
- package/lib/module/index.native.js +0 -160
- package/lib/module/index.native.js.map +0 -1
- package/lib/module/index.web.js +0 -4
- package/lib/module/index.web.js.map +0 -1
- package/lib/module/native-types.js +0 -1606
- package/lib/module/native-types.js.map +0 -1
- package/lib/module/test-setup.js +0 -54
- package/lib/module/test-setup.js.map +0 -1
- package/lib/module/test-utils.js +0 -11
- package/lib/module/test-utils.js.map +0 -1
- package/lib/module/types.js +0 -67
- package/lib/module/types.js.map +0 -1
- package/lib/module/utils/deleteQuantitySample.js +0 -4
- package/lib/module/utils/deleteQuantitySample.js.map +0 -1
- package/lib/module/utils/deleteSamples.js +0 -11
- package/lib/module/utils/deleteSamples.js.map +0 -1
- package/lib/module/utils/deleteWorkoutSample.js +0 -4
- package/lib/module/utils/deleteWorkoutSample.js.map +0 -1
- package/lib/module/utils/deserializeCategorySample.js +0 -7
- package/lib/module/utils/deserializeCategorySample.js.map +0 -1
- package/lib/module/utils/deserializeCategorySample.test.js +0 -22
- package/lib/module/utils/deserializeCategorySample.test.js.map +0 -1
- package/lib/module/utils/deserializeCorrelation.js +0 -19
- package/lib/module/utils/deserializeCorrelation.js.map +0 -1
- package/lib/module/utils/deserializeHeartbeatSeriesSample.js +0 -9
- package/lib/module/utils/deserializeHeartbeatSeriesSample.js.map +0 -1
- package/lib/module/utils/deserializeSample.js +0 -9
- package/lib/module/utils/deserializeSample.js.map +0 -1
- package/lib/module/utils/deserializeWorkout.js +0 -9
- package/lib/module/utils/deserializeWorkout.js.map +0 -1
- package/lib/module/utils/ensureMetadata.js +0 -5
- package/lib/module/utils/ensureMetadata.js.map +0 -1
- package/lib/module/utils/ensureTotals.js +0 -5
- package/lib/module/utils/ensureTotals.js.map +0 -1
- package/lib/module/utils/ensureUnit.js +0 -10
- package/lib/module/utils/ensureUnit.js.map +0 -1
- package/lib/module/utils/getDateOfBirth.js +0 -7
- package/lib/module/utils/getDateOfBirth.js.map +0 -1
- package/lib/module/utils/getMostRecentCategorySample.js +0 -10
- package/lib/module/utils/getMostRecentCategorySample.js.map +0 -1
- package/lib/module/utils/getMostRecentQuantitySample.js +0 -14
- package/lib/module/utils/getMostRecentQuantitySample.js.map +0 -1
- package/lib/module/utils/getMostRecentWorkout.js +0 -12
- package/lib/module/utils/getMostRecentWorkout.js.map +0 -1
- package/lib/module/utils/getPreferredUnit.js +0 -7
- package/lib/module/utils/getPreferredUnit.js.map +0 -1
- package/lib/module/utils/getPreferredUnits.js +0 -7
- package/lib/module/utils/getPreferredUnits.js.map +0 -1
- package/lib/module/utils/getPreferredUnitsTyped.js +0 -26
- package/lib/module/utils/getPreferredUnitsTyped.js.map +0 -1
- package/lib/module/utils/getRequestStatusForAuthorization.js +0 -14
- package/lib/module/utils/getRequestStatusForAuthorization.js.map +0 -1
- package/lib/module/utils/getWorkoutPlanById.js +0 -6
- package/lib/module/utils/getWorkoutPlanById.js.map +0 -1
- package/lib/module/utils/prepareOptions.js +0 -18
- package/lib/module/utils/prepareOptions.js.map +0 -1
- package/lib/module/utils/queryCategorySamples.js +0 -10
- package/lib/module/utils/queryCategorySamples.js.map +0 -1
- package/lib/module/utils/queryCategorySamplesWithAnchor.js +0 -14
- package/lib/module/utils/queryCategorySamplesWithAnchor.js.map +0 -1
- package/lib/module/utils/queryCorrelationSamples.js +0 -10
- package/lib/module/utils/queryCorrelationSamples.js.map +0 -1
- package/lib/module/utils/queryHeartbeatSeriesSamples.js +0 -10
- package/lib/module/utils/queryHeartbeatSeriesSamples.js.map +0 -1
- package/lib/module/utils/queryHeartbeatSeriesSamplesWithAnchor.js +0 -14
- package/lib/module/utils/queryHeartbeatSeriesSamplesWithAnchor.js.map +0 -1
- package/lib/module/utils/queryQuantitySamples.js +0 -12
- package/lib/module/utils/queryQuantitySamples.js.map +0 -1
- package/lib/module/utils/queryQuantitySamplesWithAnchor.js +0 -16
- package/lib/module/utils/queryQuantitySamplesWithAnchor.js.map +0 -1
- package/lib/module/utils/querySources.js +0 -7
- package/lib/module/utils/querySources.js.map +0 -1
- package/lib/module/utils/queryStateOfMindSamples.js +0 -14
- package/lib/module/utils/queryStateOfMindSamples.js.map +0 -1
- package/lib/module/utils/queryStatisticsCollectionForQuantity.js +0 -9
- package/lib/module/utils/queryStatisticsCollectionForQuantity.js.map +0 -1
- package/lib/module/utils/queryStatisticsForQuantity.js +0 -22
- package/lib/module/utils/queryStatisticsForQuantity.js.map +0 -1
- package/lib/module/utils/queryWorkoutSamplesWithAnchor.js +0 -19
- package/lib/module/utils/queryWorkoutSamplesWithAnchor.js.map +0 -1
- package/lib/module/utils/queryWorkouts.js +0 -15
- package/lib/module/utils/queryWorkouts.js.map +0 -1
- package/lib/module/utils/requestAuthorization.js +0 -15
- package/lib/module/utils/requestAuthorization.js.map +0 -1
- package/lib/module/utils/saveCategorySample.js +0 -13
- package/lib/module/utils/saveCategorySample.js.map +0 -1
- package/lib/module/utils/saveCorrelationSample.js +0 -28
- package/lib/module/utils/saveCorrelationSample.js.map +0 -1
- package/lib/module/utils/saveQuantitySample.js +0 -9
- package/lib/module/utils/saveQuantitySample.js.map +0 -1
- package/lib/module/utils/saveStateOfMindSample.js +0 -10
- package/lib/module/utils/saveStateOfMindSample.js.map +0 -1
- package/lib/module/utils/saveWorkoutRoute.js +0 -19
- package/lib/module/utils/saveWorkoutRoute.js.map +0 -1
- package/lib/module/utils/saveWorkoutSample.js +0 -29
- package/lib/module/utils/saveWorkoutSample.js.map +0 -1
- package/lib/module/utils/serializeDate.js +0 -3
- package/lib/module/utils/serializeDate.js.map +0 -1
- package/lib/module/utils/serializeDate.test.js +0 -14
- package/lib/module/utils/serializeDate.test.js.map +0 -1
- package/lib/module/utils/startWatchApp.js +0 -4
- package/lib/module/utils/startWatchApp.js.map +0 -1
- package/lib/module/utils/subscribeToChanges.js +0 -20
- package/lib/module/utils/subscribeToChanges.js.map +0 -1
- package/lib/typescript/example-expo/App.d.ts +0 -2
- package/lib/typescript/src/hooks/useHealthkitAuthorization.d.ts +0 -8
- package/lib/typescript/src/hooks/useHealthkitAuthorization.test.d.ts +0 -1
- package/lib/typescript/src/hooks/useIsHealthDataAvailable.d.ts +0 -7
- package/lib/typescript/src/hooks/useIsHealthDataAvailable.test.d.ts +0 -1
- package/lib/typescript/src/hooks/useMostRecentCategorySample.d.ts +0 -7
- package/lib/typescript/src/hooks/useMostRecentQuantitySample.d.ts +0 -7
- package/lib/typescript/src/hooks/useMostRecentWorkout.d.ts +0 -10
- package/lib/typescript/src/hooks/useSources.d.ts +0 -3
- package/lib/typescript/src/hooks/useStatisticsForQuantity.d.ts +0 -4
- package/lib/typescript/src/hooks/useSubscribeToChanges.d.ts +0 -3
- package/lib/typescript/src/index.d.ts +0 -3
- package/lib/typescript/src/index.ios.d.ts +0 -198
- package/lib/typescript/src/index.native.d.ts +0 -41
- package/lib/typescript/src/index.web.d.ts +0 -3
- package/lib/typescript/src/native-types.d.ts +0 -1764
- package/lib/typescript/src/test-setup.d.ts +0 -1
- package/lib/typescript/src/test-utils.d.ts +0 -2
- package/lib/typescript/src/types.d.ts +0 -111
- package/lib/typescript/src/utils/deleteQuantitySample.d.ts +0 -4
- package/lib/typescript/src/utils/deleteSamples.d.ts +0 -8
- package/lib/typescript/src/utils/deleteWorkoutSample.d.ts +0 -3
- package/lib/typescript/src/utils/deserializeCategorySample.d.ts +0 -4
- package/lib/typescript/src/utils/deserializeCategorySample.test.d.ts +0 -1
- package/lib/typescript/src/utils/deserializeCorrelation.d.ts +0 -4
- package/lib/typescript/src/utils/deserializeHeartbeatSeriesSample.d.ts +0 -4
- package/lib/typescript/src/utils/deserializeSample.d.ts +0 -4
- package/lib/typescript/src/utils/deserializeWorkout.d.ts +0 -4
- package/lib/typescript/src/utils/ensureMetadata.d.ts +0 -2
- package/lib/typescript/src/utils/ensureTotals.d.ts +0 -2
- package/lib/typescript/src/utils/ensureUnit.d.ts +0 -3
- package/lib/typescript/src/utils/getDateOfBirth.d.ts +0 -2
- package/lib/typescript/src/utils/getMostRecentCategorySample.d.ts +0 -4
- package/lib/typescript/src/utils/getMostRecentQuantitySample.d.ts +0 -4
- package/lib/typescript/src/utils/getMostRecentWorkout.d.ts +0 -5
- package/lib/typescript/src/utils/getPreferredUnit.d.ts +0 -4
- package/lib/typescript/src/utils/getPreferredUnits.d.ts +0 -4
- package/lib/typescript/src/utils/getPreferredUnitsTyped.d.ts +0 -9
- package/lib/typescript/src/utils/getRequestStatusForAuthorization.d.ts +0 -3
- package/lib/typescript/src/utils/getWorkoutPlanById.d.ts +0 -5
- package/lib/typescript/src/utils/prepareOptions.d.ts +0 -9
- package/lib/typescript/src/utils/queryCategorySamples.d.ts +0 -5
- package/lib/typescript/src/utils/queryCategorySamplesWithAnchor.d.ts +0 -10
- package/lib/typescript/src/utils/queryCorrelationSamples.d.ts +0 -5
- package/lib/typescript/src/utils/queryHeartbeatSeriesSamples.d.ts +0 -10
- package/lib/typescript/src/utils/queryHeartbeatSeriesSamplesWithAnchor.d.ts +0 -10
- package/lib/typescript/src/utils/queryQuantitySamples.d.ts +0 -7
- package/lib/typescript/src/utils/queryQuantitySamplesWithAnchor.d.ts +0 -12
- package/lib/typescript/src/utils/querySources.d.ts +0 -4
- package/lib/typescript/src/utils/queryStateOfMindSamples.d.ts +0 -7
- package/lib/typescript/src/utils/queryStatisticsCollectionForQuantity.d.ts +0 -3
- package/lib/typescript/src/utils/queryStatisticsForQuantity.d.ts +0 -14
- package/lib/typescript/src/utils/queryWorkoutSamplesWithAnchor.d.ts +0 -9
- package/lib/typescript/src/utils/queryWorkouts.d.ts +0 -4
- package/lib/typescript/src/utils/requestAuthorization.d.ts +0 -4
- package/lib/typescript/src/utils/saveCategorySample.d.ts +0 -11
- package/lib/typescript/src/utils/saveCorrelationSample.d.ts +0 -8
- package/lib/typescript/src/utils/saveQuantitySample.d.ts +0 -7
- package/lib/typescript/src/utils/saveStateOfMindSample.d.ts +0 -11
- package/lib/typescript/src/utils/saveWorkoutRoute.d.ts +0 -3
- package/lib/typescript/src/utils/saveWorkoutSample.d.ts +0 -11
- package/lib/typescript/src/utils/serializeDate.d.ts +0 -2
- package/lib/typescript/src/utils/serializeDate.test.d.ts +0 -1
- package/lib/typescript/src/utils/startWatchApp.d.ts +0 -3
- package/lib/typescript/src/utils/subscribeToChanges.d.ts +0 -3
- package/src/index.ios.tsx +0 -292
- package/src/index.native.tsx +0 -233
- package/src/index.tsx +0 -5
- package/src/index.web.tsx +0 -5
- package/src/native-types.ts +0 -2471
- package/src/types.ts +0 -156
- package/src/utils/deleteQuantitySample.ts +0 -14
- package/src/utils/deleteSamples.ts +0 -23
- package/src/utils/deleteWorkoutSample.ts +0 -7
- package/src/utils/deserializeCategorySample.test.ts +0 -24
- package/src/utils/deserializeCategorySample.ts +0 -12
- package/src/utils/deserializeCorrelation.ts +0 -28
- package/src/utils/deserializeHeartbeatSeriesSample.ts +0 -12
- package/src/utils/deserializeSample.ts +0 -17
- package/src/utils/deserializeWorkout.ts +0 -14
- package/src/utils/ensureMetadata.ts +0 -5
- package/src/utils/ensureTotals.ts +0 -5
- package/src/utils/ensureUnit.ts +0 -19
- package/src/utils/getDateOfBirth.ts +0 -8
- package/src/utils/getPreferredUnits.ts +0 -14
- package/src/utils/getPreferredUnitsTyped.ts +0 -38
- package/src/utils/getRequestStatusForAuthorization.ts +0 -21
- package/src/utils/getWorkoutPlanById.ts +0 -7
- package/src/utils/prepareOptions.ts +0 -19
- package/src/utils/queryCategorySamples.ts +0 -29
- package/src/utils/queryCategorySamplesWithAnchor.ts +0 -39
- package/src/utils/queryCorrelationSamples.ts +0 -29
- package/src/utils/queryHeartbeatSeriesSamples.ts +0 -29
- package/src/utils/queryHeartbeatSeriesSamplesWithAnchor.ts +0 -33
- package/src/utils/queryQuantitySamples.ts +0 -38
- package/src/utils/queryQuantitySamplesWithAnchor.ts +0 -46
- package/src/utils/querySources.ts +0 -21
- package/src/utils/queryStateOfMindSamples.ts +0 -14
- package/src/utils/queryStatisticsCollectionForQuantity.ts +0 -38
- package/src/utils/queryStatisticsForQuantity.ts +0 -38
- package/src/utils/queryWorkoutSamplesWithAnchor.ts +0 -46
- package/src/utils/queryWorkouts.ts +0 -28
- package/src/utils/requestAuthorization.ts +0 -19
- package/src/utils/saveCategorySample.ts +0 -31
- package/src/utils/saveCorrelationSample.ts +0 -43
- package/src/utils/saveQuantitySample.ts +0 -29
- package/src/utils/saveStateOfMindSample.ts +0 -38
- package/src/utils/saveWorkoutRoute.ts +0 -21
- package/src/utils/saveWorkoutSample.ts +0 -42
- package/src/utils/serializeDate.test.ts +0 -16
- package/src/utils/serializeDate.ts +0 -5
- package/src/utils/startWatchApp.ts +0 -7
package/README.md
CHANGED
|
@@ -64,60 +64,60 @@ During runtime check and request permissions with `requestAuthorization`. Failin
|
|
|
64
64
|
|
|
65
65
|
Some hook examples:
|
|
66
66
|
```TypeScript
|
|
67
|
-
import {
|
|
67
|
+
import { useHealthkitAuthorization, saveQuantitySample } from '@kingstinct/react-native-healthkit';
|
|
68
68
|
|
|
69
|
-
const [authorizationStatus, requestAuthorization] = useHealthkitAuthorization([
|
|
69
|
+
const [authorizationStatus, requestAuthorization] = useHealthkitAuthorization(['HKQuantityTypeIdentifierBloodGlucose'])
|
|
70
70
|
|
|
71
71
|
// make sure that you've requested authorization before requesting data, otherwise your app will crash
|
|
72
72
|
import { useMostRecentQuantitySample, HKQuantityTypeIdentifier, useMostRecentCategorySample } from '@kingstinct/react-native-healthkit';
|
|
73
73
|
|
|
74
|
-
const mostRecentBloodGlucoseSample = useMostRecentQuantitySample(
|
|
75
|
-
const lastBodyFatSample = useMostRecentQuantitySample(
|
|
76
|
-
const lastMindfulSession = useMostRecentCategorySample(
|
|
74
|
+
const mostRecentBloodGlucoseSample = useMostRecentQuantitySample('HKQuantityTypeIdentifierBloodGlucose')
|
|
75
|
+
const lastBodyFatSample = useMostRecentQuantitySample('HKQuantityTypeIdentifierBodyFatPercentage')
|
|
76
|
+
const lastMindfulSession = useMostRecentCategorySample('HKCategoryTypeIdentifierMindfulSession')
|
|
77
77
|
const lastWorkout = useMostRecentWorkout()
|
|
78
78
|
```
|
|
79
79
|
|
|
80
80
|
Some imperative examples:
|
|
81
81
|
```TypeScript
|
|
82
|
-
import
|
|
82
|
+
import { isHealthDataAvailable, requestAuthorization, subscribeToChanges, saveQuantitySample, getMostRecentQuantitySample } from '@kingstinct/react-native-healthkit';
|
|
83
83
|
|
|
84
|
-
const isAvailable = await
|
|
84
|
+
const isAvailable = await isHealthDataAvailable();
|
|
85
85
|
|
|
86
86
|
/* Read latest sample of any data */
|
|
87
|
-
await
|
|
87
|
+
await requestAuthorization(['HKQuantityTypeIdentifierBodyFatPercentage']); // request read permission for bodyFatPercentage
|
|
88
88
|
|
|
89
|
-
const { quantity, unit, startDate, endDate } = await
|
|
89
|
+
const { quantity, unit, startDate, endDate } = await getMostRecentQuantitySample('HKQuantityTypeIdentifierBodyFatPercentage'); // read latest sample
|
|
90
90
|
|
|
91
91
|
console.log(quantity) // 17.5
|
|
92
92
|
console.log(unit) // %
|
|
93
93
|
|
|
94
|
-
await
|
|
94
|
+
await requestAuthorization(['HKQuantityTypeIdentifierHeartRate']); // request read permission for heart rate
|
|
95
95
|
|
|
96
96
|
/* Subscribe to data (Make sure to request permissions before subscribing to changes) */
|
|
97
97
|
const [hasRequestedAuthorization, setHasRequestedAuthorization] = useState(false);
|
|
98
98
|
|
|
99
99
|
useEffect(() => {
|
|
100
|
-
|
|
100
|
+
requestAuthorization(['HKQuantityTypeIdentifierHeartRate']).then(() => {
|
|
101
101
|
setHasRequestedAuthorization(true);
|
|
102
102
|
});
|
|
103
103
|
}, []);
|
|
104
104
|
|
|
105
105
|
useEffect(() => {
|
|
106
106
|
if (hasRequestedAuthorization) {
|
|
107
|
-
const unsubscribe =
|
|
107
|
+
const unsubscribe = subscribeToChanges(HKQuantityTypeIdentifier.heartRate, () => {
|
|
108
108
|
// refetch data as needed
|
|
109
109
|
});
|
|
110
|
-
}
|
|
111
110
|
|
|
112
|
-
|
|
111
|
+
return () => unsubscribe();
|
|
112
|
+
}
|
|
113
113
|
}, [hasRequestedAuthorization]);
|
|
114
114
|
|
|
115
115
|
/* write data */
|
|
116
|
-
await
|
|
116
|
+
await requestAuthorization([], [HKQuantityTypeIdentifier.insulinDelivery]); // request write permission for insulin delivery
|
|
117
117
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
118
|
+
saveQuantitySample(
|
|
119
|
+
'HKQuantityTypeIdentifierInsulinDelivery',
|
|
120
|
+
'IU',
|
|
121
121
|
5.5,
|
|
122
122
|
{
|
|
123
123
|
metadata: {
|
|
@@ -130,7 +130,7 @@ Some imperative examples:
|
|
|
130
130
|
);
|
|
131
131
|
```
|
|
132
132
|
|
|
133
|
-
### HealthKit Anchors
|
|
133
|
+
### HealthKit Anchors
|
|
134
134
|
In 6.0 you can use HealthKit anchors to get changes and deleted items which is very useful for syncing. This is a breaking change - but a very easy one to handle that TypeScript should help you with. Most queries now return an object containing samples which is what was returned as only an array before.
|
|
135
135
|
|
|
136
136
|
```newAnchor``` is a base64-encoded string returned from HealthKit that contain sync information. After each successful sync, store the anchor for the next time your anchor query is called to only return the values that have changed.
|
|
@@ -140,11 +140,11 @@ In 6.0 you can use HealthKit anchors to get changes and deleted items which is v
|
|
|
140
140
|
Example:
|
|
141
141
|
|
|
142
142
|
```TypeScript
|
|
143
|
-
const { newAnchor, samples, deletedSamples } = await queryQuantitySamplesWithAnchor(
|
|
143
|
+
const { newAnchor, samples, deletedSamples } = await queryQuantitySamplesWithAnchor('HKQuantityTypeIdentifierStepCount', {
|
|
144
144
|
limit: 2,
|
|
145
145
|
})
|
|
146
146
|
|
|
147
|
-
const nextResult = await queryQuantitySamplesWithAnchor(
|
|
147
|
+
const nextResult = await queryQuantitySamplesWithAnchor('HKQuantityTypeIdentifierStepCount', {
|
|
148
148
|
limit: 2,
|
|
149
149
|
anchor: newAnchor,
|
|
150
150
|
})
|
|
@@ -152,6 +152,18 @@ Example:
|
|
|
152
152
|
// etc..
|
|
153
153
|
```
|
|
154
154
|
|
|
155
|
+
## Migration to 9.0.0
|
|
156
|
+
|
|
157
|
+
There are a lot of under-the-hood changes in version 9.0.0, some of them are breaking (although I've tried to reduce it as much as possible).
|
|
158
|
+
- Most of all - the library has been migrated to use react-native-nitro-modules. This improves performance, type-safety and gets rid of a lot of boilerplate code that made it harder to maintain and add features to the library.
|
|
159
|
+
- Naming conventions have changed - most of the HK-prefixed stuff has been removed to avoid conflicts on the native side and also make the library more beautiful to look at. As an example the type previously called HKQuantityTypeIdentifier is not just QuantityTypeIdentifier on the library level.
|
|
160
|
+
- Less required params by default - making it easier to start using the library, for example calling `queryQuantitySamples('HKQuantityTypeIdentifierStepCount')` will simply return the last 20 samples.
|
|
161
|
+
- Flexible filters that map closer to the native constructs. This can easily be extended.
|
|
162
|
+
- `deleteObjects` replaces all previous deletion methods, using the new flexible filters.
|
|
163
|
+
- Workouts are returned as proxies containing not only data but also functions, for example `getWorkoutRoutes`.
|
|
164
|
+
- Identifiers are now just strings, and more strictly typed.
|
|
165
|
+
- Units are now just strings.
|
|
166
|
+
|
|
155
167
|
## A note on Apple Documentation
|
|
156
168
|
|
|
157
169
|
We're striving to do as straight a mapping as possible to the Native Libraries. This means that in most cases the Apple Documentation makes sense. However, when it comes to the Healthkit [Metadata Keys](https://developer.apple.com/documentation/healthkit/samples/metadata_keys) the documentation doesn't actually reflect the serialized values. For example HKMetadataKeyExternalUUID in the documentation serializes to HKExternalUUID - which is what we use.
|
|
@@ -177,3 +189,4 @@ At Kingstinct we're also able to provide enterprise-grade support for this packa
|
|
|
177
189
|
## License
|
|
178
190
|
|
|
179
191
|
MIT
|
|
192
|
+
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require "json"
|
|
2
|
+
|
|
3
|
+
package = JSON.parse(File.read(File.join(__dir__, "package.json")))
|
|
4
|
+
|
|
5
|
+
Pod::Spec.new do |s|
|
|
6
|
+
s.name = "ReactNativeHealthkit"
|
|
7
|
+
s.version = package["version"]
|
|
8
|
+
s.summary = package["description"]
|
|
9
|
+
s.homepage = package["homepage"]
|
|
10
|
+
s.license = package["license"]
|
|
11
|
+
s.authors = package["author"]
|
|
12
|
+
|
|
13
|
+
s.platforms = { :ios => min_ios_version_supported, :visionos => 1.0 }
|
|
14
|
+
s.source = { :git => "https://github.com/kingstinct/react-native-healthkit.git", :tag => "#{s.version}" }
|
|
15
|
+
|
|
16
|
+
s.source_files = [
|
|
17
|
+
# Implementation (Swift)
|
|
18
|
+
"ios/**/*.{swift}",
|
|
19
|
+
# Autolinking/Registration (Objective-C++)
|
|
20
|
+
"ios/**/*.{m,mm}",
|
|
21
|
+
# Implementation (C++ objects)
|
|
22
|
+
"cpp/**/*.{hpp,cpp}",
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
s.pod_target_xcconfig = {
|
|
26
|
+
# C++ compiler flags, mainly for folly.
|
|
27
|
+
"GCC_PREPROCESSOR_DEFINITIONS" => "$(inherited) FOLLY_NO_CONFIG FOLLY_CFG_NO_COROUTINES"
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
load 'nitrogen/generated/ios/ReactNativeHealthkit+autolinking.rb'
|
|
31
|
+
add_nitrogen_files(s)
|
|
32
|
+
|
|
33
|
+
s.dependency 'React-jsi'
|
|
34
|
+
s.dependency 'React-callinvoker'
|
|
35
|
+
install_modules_dependencies(s)
|
|
36
|
+
end
|
package/app.plugin.js
CHANGED
|
@@ -10,7 +10,7 @@ const {
|
|
|
10
10
|
* @typedef ConfigPlugin
|
|
11
11
|
* @type {import('@expo/config-plugins').ConfigPlugin<T>}
|
|
12
12
|
* @template T = void
|
|
13
|
-
*/
|
|
13
|
+
*/
|
|
14
14
|
|
|
15
15
|
// please note that the BackgroundConfig currently doesn't actually enable background delivery for any types, but you
|
|
16
16
|
// can set it to false if you don't want the entitlement
|
|
@@ -18,8 +18,8 @@ const {
|
|
|
18
18
|
/**
|
|
19
19
|
* @typedef BackgroundConfig
|
|
20
20
|
* @type {false | Partial<Record<
|
|
21
|
-
* import('./src/native-types').
|
|
22
|
-
* import('./src/native-types').
|
|
21
|
+
* import('./src/native-types').SampleTypeIdentifier,
|
|
22
|
+
* import('./src/native-types').UpdateFrequency
|
|
23
23
|
* >>}
|
|
24
24
|
|
|
25
25
|
/**
|
|
@@ -33,59 +33,69 @@ const {
|
|
|
33
33
|
/**
|
|
34
34
|
* @typedef AppPluginConfig
|
|
35
35
|
* @type {InfoPlistConfig & { background?: BackgroundConfig }}
|
|
36
|
-
*/
|
|
36
|
+
*/
|
|
37
37
|
|
|
38
38
|
/**
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
* @type {ConfigPlugin<{background: BackgroundConfig}>}
|
|
40
|
+
*/
|
|
41
41
|
const withEntitlementsPlugin = (
|
|
42
42
|
config,
|
|
43
43
|
/**
|
|
44
44
|
* @type {{background: BackgroundConfig} | undefined}
|
|
45
45
|
* */
|
|
46
46
|
props,
|
|
47
|
-
) =>
|
|
48
|
-
config
|
|
47
|
+
) =>
|
|
48
|
+
withEntitlementsPlist(config, (config) => {
|
|
49
|
+
config.modResults['com.apple.developer.healthkit'] = true
|
|
49
50
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
// background is enabled by default, but possible to opt-out from
|
|
52
|
+
// (haven't seen any drawbacks from having it enabled)
|
|
53
|
+
if (props?.background !== false) {
|
|
54
|
+
config.modResults['com.apple.developer.healthkit.background-delivery'] =
|
|
55
|
+
true
|
|
56
|
+
}
|
|
55
57
|
|
|
56
|
-
|
|
57
|
-
})
|
|
58
|
+
return config
|
|
59
|
+
})
|
|
58
60
|
|
|
59
61
|
/**
|
|
60
62
|
* @type {ConfigPlugin<InfoPlistConfig>}
|
|
61
63
|
*/
|
|
62
|
-
const withInfoPlistPlugin = (
|
|
64
|
+
const withInfoPlistPlugin = (
|
|
65
|
+
config,
|
|
63
66
|
/**
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
props
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
67
|
+
* @type {{NSHealthShareUsageDescription: string | boolean, NSHealthUpdateUsageDescription: string | boolean} | undefined}
|
|
68
|
+
* */
|
|
69
|
+
props,
|
|
70
|
+
) =>
|
|
71
|
+
withInfoPlist(config, (config) => {
|
|
72
|
+
if (props?.NSHealthShareUsageDescription !== false) {
|
|
73
|
+
config.modResults.NSHealthShareUsageDescription =
|
|
74
|
+
props.NSHealthShareUsageDescription ??
|
|
75
|
+
`${config.name} wants to read your health data`
|
|
76
|
+
}
|
|
70
77
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
78
|
+
if (props?.NSHealthUpdateUsageDescription !== false) {
|
|
79
|
+
config.modResults.NSHealthUpdateUsageDescription =
|
|
80
|
+
props.NSHealthUpdateUsageDescription ??
|
|
81
|
+
`${config.name} wants to update your health data`
|
|
82
|
+
}
|
|
74
83
|
|
|
75
|
-
|
|
76
|
-
})
|
|
84
|
+
return config
|
|
85
|
+
})
|
|
77
86
|
|
|
78
87
|
const pkg = require('./package.json')
|
|
79
88
|
|
|
80
89
|
/**
|
|
81
90
|
* @type {ConfigPlugin<AppPluginConfig>}
|
|
82
|
-
*/
|
|
83
|
-
const healthkitAppPlugin = (config, props) =>
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
]
|
|
91
|
+
*/
|
|
92
|
+
const healthkitAppPlugin = (config, props) =>
|
|
93
|
+
withPlugins(config, [
|
|
94
|
+
[withEntitlementsPlugin, props],
|
|
95
|
+
[withInfoPlistPlugin, props],
|
|
96
|
+
])
|
|
87
97
|
|
|
88
98
|
/**
|
|
89
99
|
* @type {ConfigPlugin<AppPluginConfig>}
|
|
90
|
-
*/
|
|
100
|
+
*/
|
|
91
101
|
module.exports = createRunOncePlugin(healthkitAppPlugin, pkg.name, pkg.version)
|
package/ios/Bridge.h
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import HealthKit
|
|
2
|
+
import NitroModules
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class CategoryTypeModule : HybridCategoryTypeModuleSpec {
|
|
7
|
+
func saveCategorySample(
|
|
8
|
+
identifier: CategoryTypeIdentifier,
|
|
9
|
+
value: Double,
|
|
10
|
+
startDate: Date,
|
|
11
|
+
endDate: Date,
|
|
12
|
+
metadata: AnyMapHolder
|
|
13
|
+
) throws -> Promise<Bool> {
|
|
14
|
+
let type = try initializeCategoryType(identifier.stringValue)
|
|
15
|
+
|
|
16
|
+
let sample = HKCategorySample(
|
|
17
|
+
type: type,
|
|
18
|
+
value: Int(value),
|
|
19
|
+
start: startDate,
|
|
20
|
+
end: endDate,
|
|
21
|
+
metadata: anyMapToDictionary(metadata)
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
return Promise.async {
|
|
25
|
+
try await withCheckedThrowingContinuation { continuation in
|
|
26
|
+
store.save(sample) { (success: Bool, error: Error?) in
|
|
27
|
+
if let error = error {
|
|
28
|
+
continuation.resume(throwing: error)
|
|
29
|
+
} else {
|
|
30
|
+
continuation.resume(returning: success)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
func queryCategorySamples(
|
|
38
|
+
identifier: CategoryTypeIdentifier,
|
|
39
|
+
options: QueryOptionsWithSortOrder?,
|
|
40
|
+
) throws -> Promise<[CategorySample]> {
|
|
41
|
+
let sampleType = try initializeCategoryType(identifier.stringValue)
|
|
42
|
+
let predicate = try createPredicate(filter: options?.filter)
|
|
43
|
+
let queryLimit = getQueryLimit(options?.limit)
|
|
44
|
+
|
|
45
|
+
return Promise.async {
|
|
46
|
+
try await withCheckedThrowingContinuation { continuation in
|
|
47
|
+
let query = HKSampleQuery(
|
|
48
|
+
sampleType: sampleType,
|
|
49
|
+
predicate: predicate,
|
|
50
|
+
limit: queryLimit,
|
|
51
|
+
sortDescriptors: getSortDescriptors(ascending: options?.ascending)
|
|
52
|
+
) { (_: HKSampleQuery, samples: [HKSample]?, error: Error?) in
|
|
53
|
+
if let error = error {
|
|
54
|
+
continuation.resume(throwing: error)
|
|
55
|
+
return
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
guard let samples = samples else {
|
|
59
|
+
continuation.resume(returning: [])
|
|
60
|
+
return
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
let categorySamples = samples.compactMap { sample -> CategorySample? in
|
|
64
|
+
guard let categorySample = sample as? HKCategorySample else { return nil }
|
|
65
|
+
return serializeCategorySample(sample: categorySample)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
continuation.resume(returning: categorySamples)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
store.execute(query)
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
func queryCategorySamplesWithAnchor(
|
|
78
|
+
identifier: CategoryTypeIdentifier,
|
|
79
|
+
options: QueryOptionsWithAnchor
|
|
80
|
+
) throws -> Promise<CategorySamplesWithAnchorResponse> {
|
|
81
|
+
let sampleType = try initializeCategoryType(identifier.stringValue)
|
|
82
|
+
|
|
83
|
+
let predicate = try createPredicate(filter: options.filter)
|
|
84
|
+
let queryLimit = getQueryLimit(options.limit)
|
|
85
|
+
let queryAnchor = try deserializeHKQueryAnchor(base64String: options.anchor)
|
|
86
|
+
|
|
87
|
+
return Promise.async {
|
|
88
|
+
try await withCheckedThrowingContinuation { continuation in
|
|
89
|
+
let query = HKAnchoredObjectQuery(
|
|
90
|
+
type: sampleType,
|
|
91
|
+
predicate: predicate,
|
|
92
|
+
anchor: queryAnchor,
|
|
93
|
+
limit: queryLimit
|
|
94
|
+
) { (_: HKAnchoredObjectQuery, samples: [HKSample]?, deletedSamples: [HKDeletedObject]?, newAnchor: HKQueryAnchor?, error: Error?) in
|
|
95
|
+
if let error = error {
|
|
96
|
+
continuation.resume(throwing: error)
|
|
97
|
+
return
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
guard let samples = samples else {
|
|
101
|
+
let response = CategorySamplesWithAnchorResponse(
|
|
102
|
+
samples: [],
|
|
103
|
+
deletedSamples: deletedSamples?.map { serializeDeletedSample(sample: $0) } ?? [],
|
|
104
|
+
newAnchor: serializeAnchor(anchor: newAnchor) ?? ""
|
|
105
|
+
)
|
|
106
|
+
continuation.resume(returning: response)
|
|
107
|
+
return
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
let categorySamples = samples.compactMap { sample -> CategorySample? in
|
|
111
|
+
guard let categorySample = sample as? HKCategorySample else { return nil }
|
|
112
|
+
return serializeCategorySample(sample: categorySample)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
let response = CategorySamplesWithAnchorResponse(
|
|
116
|
+
samples: categorySamples,
|
|
117
|
+
deletedSamples: deletedSamples?.map { serializeDeletedSample(sample: $0) } ?? [],
|
|
118
|
+
newAnchor: serializeAnchor(anchor: newAnchor) ?? ""
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
continuation.resume(returning: response)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
store.execute(query)
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
|
|
2
|
+
import HealthKit
|
|
3
|
+
import NitroModules
|
|
4
|
+
|
|
5
|
+
class CharacteristicTypeModule: HybridCharacteristicTypeModuleSpec {
|
|
6
|
+
func getBloodTypeAsync() throws -> Promise<BloodType> {
|
|
7
|
+
return Promise.resolved(withResult: try self.getBloodType())
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
func getDateOfBirthAsync() throws -> Promise<Date> {
|
|
11
|
+
return Promise.resolved(withResult: try self.getDateOfBirth())
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
func getBiologicalSexAsync() throws -> Promise<BiologicalSex> {
|
|
15
|
+
return Promise.resolved(withResult: try self.getBiologicalSex())
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
func getFitzpatrickSkinTypeAsync() throws -> Promise<FitzpatrickSkinType> {
|
|
19
|
+
return Promise.resolved(withResult: try self.getFitzpatrickSkinType())
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
func getWheelchairUseAsync() throws -> Promise<WheelchairUse> {
|
|
23
|
+
return Promise.resolved(withResult: try self.getWheelchairUse())
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Using the global 'store' instance defined in Auth.swift
|
|
27
|
+
|
|
28
|
+
func getBiologicalSex() throws -> BiologicalSex {
|
|
29
|
+
let biologicalSexObject = try store.biologicalSex()
|
|
30
|
+
if let biologicalSex = BiologicalSex(rawValue: Int32(biologicalSexObject.biologicalSex.rawValue)) {
|
|
31
|
+
return biologicalSex
|
|
32
|
+
}
|
|
33
|
+
throw RuntimeError.error(withMessage: "[react-native-healthkit] Got unknown biological sex value: \(biologicalSexObject.biologicalSex.rawValue)")
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
func getDateOfBirth() throws -> Date {
|
|
37
|
+
let dateOfBirthComponents = try store.dateOfBirthComponents()
|
|
38
|
+
|
|
39
|
+
if let date = dateOfBirthComponents.date {
|
|
40
|
+
return date
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
throw RuntimeError.error(withMessage: "[react-native-healthkit] Date of birth is not available or not set")
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
func getBloodType() throws -> BloodType {
|
|
47
|
+
let bloodTypeObject = try store.bloodType()
|
|
48
|
+
|
|
49
|
+
if let bloodType = BloodType(rawValue: Int32(bloodTypeObject.bloodType.rawValue)){
|
|
50
|
+
return bloodType
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
throw RuntimeError.error(withMessage: "[react-native-healthkit] Got unknown blood type value: \(bloodTypeObject.bloodType.rawValue)")
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
func getFitzpatrickSkinType() throws -> FitzpatrickSkinType {
|
|
57
|
+
if #available(iOS 9.0, *) {
|
|
58
|
+
let skinTypeObject = try store.fitzpatrickSkinType()
|
|
59
|
+
|
|
60
|
+
if let skinType = FitzpatrickSkinType(rawValue: Int32(skinTypeObject.skinType.rawValue)) {
|
|
61
|
+
return skinType
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
throw RuntimeError.error(withMessage: "[react-native-healthkit] Got unknown Fitzpatrick skin type value: \(skinTypeObject.skinType.rawValue)")
|
|
65
|
+
} else {
|
|
66
|
+
throw RuntimeError.error(withMessage: "Fitzpatrick skin type is not available before iOS 9.0")
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@available(iOS 10.0, *)
|
|
71
|
+
func getWheelchairUse() throws -> WheelchairUse {
|
|
72
|
+
let wheelchairUseObject = try store.wheelchairUse()
|
|
73
|
+
if let wheelChairUse = WheelchairUse(rawValue: Int32(wheelchairUseObject.wheelchairUse.rawValue)) {
|
|
74
|
+
return wheelChairUse
|
|
75
|
+
}
|
|
76
|
+
throw RuntimeError.error(withMessage: "[react-native-healthkit] Got unknown wheelchair use value: \(wheelchairUseObject.wheelchairUse.rawValue)")
|
|
77
|
+
}
|
|
78
|
+
}
|
package/ios/Constants.swift
CHANGED
|
@@ -31,3 +31,5 @@ let HKWorkoutSessionLocationTypePropertyName = "locationType"
|
|
|
31
31
|
let SpeedUnit = HKUnit(from: "m/s") // HKUnit.meter().unitDivided(by: HKUnit.second())
|
|
32
32
|
// Support for MET data: HKAverageMETs 8.24046 kcal/hr·kg
|
|
33
33
|
let METUnit = HKUnit(from: "kcal/hr·kg")
|
|
34
|
+
|
|
35
|
+
let DEFAULT_QUERY_LIMIT = 20
|