@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.
- 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 +529 -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 +405 -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/README.md +0 -179
- 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
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
//
|
|
2
|
+
// WorkoutProxy.swift
|
|
3
|
+
// Pods
|
|
4
|
+
//
|
|
5
|
+
// Created by Robert Herber on 2025-06-07.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import CoreLocation
|
|
9
|
+
import HealthKit
|
|
10
|
+
import NitroModules
|
|
11
|
+
|
|
12
|
+
@available(iOS 17.0.0, *)
|
|
13
|
+
func getWorkoutPlanInternal(workout: HKWorkout) async throws -> WorkoutPlan? {
|
|
14
|
+
let workoutPlan = try await workout.workoutPlan
|
|
15
|
+
if let id = workoutPlan?.id.uuidString {
|
|
16
|
+
if let activityType = workoutPlan?.workout.activity {
|
|
17
|
+
let workoutPlan = WorkoutPlan(
|
|
18
|
+
id: id,
|
|
19
|
+
activityType: WorkoutActivityType.init(
|
|
20
|
+
rawValue: Int32(activityType.rawValue)
|
|
21
|
+
)!
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
return workoutPlan
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return nil
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
func getWorkoutRoutesInternal(
|
|
32
|
+
workout: HKWorkout
|
|
33
|
+
) async throws -> [HKWorkoutRoute]? {
|
|
34
|
+
let workoutPredicate = HKQuery.predicateForObjects(from: workout)
|
|
35
|
+
let samples = try await withCheckedThrowingContinuation {
|
|
36
|
+
(continuation: CheckedContinuation<[HKSample], Error>) in
|
|
37
|
+
let query = HKAnchoredObjectQuery(
|
|
38
|
+
type: HKSeriesType.workoutRoute(),
|
|
39
|
+
predicate: workoutPredicate,
|
|
40
|
+
anchor: nil,
|
|
41
|
+
limit: HKObjectQueryNoLimit
|
|
42
|
+
) {
|
|
43
|
+
(_, samples, _, _, error) in
|
|
44
|
+
|
|
45
|
+
if let hasError = error {
|
|
46
|
+
return continuation.resume(throwing: hasError)
|
|
47
|
+
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
guard let samples = samples else {
|
|
51
|
+
return continuation.resume(
|
|
52
|
+
throwing: RuntimeError.error(withMessage: "Empty response")
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
continuation.resume(returning: samples)
|
|
57
|
+
}
|
|
58
|
+
store.execute(query)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
guard let routes = samples as? [HKWorkoutRoute] else {
|
|
62
|
+
return nil
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return routes
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
func getRouteLocations(
|
|
69
|
+
route: HKWorkoutRoute
|
|
70
|
+
) async -> [CLLocation] {
|
|
71
|
+
let locations = try! await withCheckedThrowingContinuation {
|
|
72
|
+
(continuation: CheckedContinuation<[CLLocation], Error>) in
|
|
73
|
+
var allLocations: [CLLocation] = []
|
|
74
|
+
|
|
75
|
+
let query = HKWorkoutRouteQuery(route: route) {
|
|
76
|
+
(_, locationsOrNil, done, errorOrNil) in
|
|
77
|
+
|
|
78
|
+
if let error = errorOrNil {
|
|
79
|
+
continuation.resume(throwing: error)
|
|
80
|
+
return
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
guard let currentLocationBatch = locationsOrNil else {
|
|
84
|
+
return continuation.resume(
|
|
85
|
+
throwing: RuntimeError.error(withMessage: "Empty response")
|
|
86
|
+
)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
allLocations.append(contentsOf: currentLocationBatch)
|
|
90
|
+
|
|
91
|
+
if done {
|
|
92
|
+
continuation.resume(returning: allLocations)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
store.execute(query)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return locations
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
func serializeLocation(location: CLLocation, previousLocation: CLLocation?)
|
|
103
|
+
-> WorkoutRouteLocation {
|
|
104
|
+
var distance: CLLocationDistance?
|
|
105
|
+
if let previousLocation = previousLocation {
|
|
106
|
+
distance = location.distance(from: previousLocation)
|
|
107
|
+
} else {
|
|
108
|
+
distance = nil
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return WorkoutRouteLocation(
|
|
112
|
+
altitude: location.altitude,
|
|
113
|
+
course: location.course,
|
|
114
|
+
date: location.timestamp,
|
|
115
|
+
distance: distance,
|
|
116
|
+
horizontalAccuracy: location.horizontalAccuracy,
|
|
117
|
+
latitude: location.coordinate.latitude,
|
|
118
|
+
longitude: location.coordinate.longitude,
|
|
119
|
+
speed: location.speed,
|
|
120
|
+
speedAccuracy: location.speedAccuracy,
|
|
121
|
+
verticalAccuracy: location.verticalAccuracy
|
|
122
|
+
)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
func getSerializedWorkoutLocations(
|
|
126
|
+
workout: HKWorkout
|
|
127
|
+
) async throws -> [WorkoutRoute] {
|
|
128
|
+
let routes = try await getWorkoutRoutesInternal(
|
|
129
|
+
workout: workout
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
var allRoutes: [WorkoutRoute] = []
|
|
133
|
+
guard let _routes = routes else {
|
|
134
|
+
throw RuntimeError.error(withMessage: "Unexpected empty response")
|
|
135
|
+
}
|
|
136
|
+
for route in _routes {
|
|
137
|
+
let routeMetadata = serializeMetadata(
|
|
138
|
+
route.metadata
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
let routeCLLocations = await getRouteLocations(
|
|
142
|
+
route: route
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
let routeLocations = routeCLLocations.enumerated().map {
|
|
146
|
+
(i, loc) in
|
|
147
|
+
serializeLocation(
|
|
148
|
+
location: loc,
|
|
149
|
+
previousLocation: i == 0 ? nil : routeCLLocations[i - 1]
|
|
150
|
+
)
|
|
151
|
+
}
|
|
152
|
+
// let routeInfos: WorkoutRoute = ["locations": routeLocations]
|
|
153
|
+
|
|
154
|
+
allRoutes.append(
|
|
155
|
+
WorkoutRoute(
|
|
156
|
+
locations: routeLocations,
|
|
157
|
+
HKMetadataKeySyncIdentifier: routeMetadata.getString(
|
|
158
|
+
key: "HKMetadataKeySyncIdentifier"
|
|
159
|
+
),
|
|
160
|
+
HKMetadataKeySyncVersion: routeMetadata.getDouble(
|
|
161
|
+
key: "HKMetadataKeySyncVersion"
|
|
162
|
+
)
|
|
163
|
+
)
|
|
164
|
+
)
|
|
165
|
+
}
|
|
166
|
+
return allRoutes
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
func saveWorkoutRouteInternal(
|
|
170
|
+
workout: HKWorkout,
|
|
171
|
+
locations: [LocationForSaving]
|
|
172
|
+
) -> Promise<Bool> {
|
|
173
|
+
return Promise.async {
|
|
174
|
+
try await withCheckedThrowingContinuation { continuation in
|
|
175
|
+
Task {
|
|
176
|
+
do {
|
|
177
|
+
// create CLLocations and return if locations are empty
|
|
178
|
+
let clLocations = mapLocations(from: locations)
|
|
179
|
+
let routeBuilder = HKWorkoutRouteBuilder(
|
|
180
|
+
healthStore: store,
|
|
181
|
+
device: nil
|
|
182
|
+
)
|
|
183
|
+
try await routeBuilder.insertRouteData(clLocations)
|
|
184
|
+
try await routeBuilder.finishRoute(with: workout, metadata: nil)
|
|
185
|
+
|
|
186
|
+
return continuation.resume(returning: true)
|
|
187
|
+
} catch {
|
|
188
|
+
return continuation.resume(throwing: error)
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
class WorkoutProxy: HybridWorkoutProxySpec {
|
|
197
|
+
func toJSON(key: String?) throws -> WorkoutSample {
|
|
198
|
+
if key != nil && key?.isEmpty != true {
|
|
199
|
+
print("WorkoutProxy does not support toJSON with key: \(key!)")
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return WorkoutSample(
|
|
203
|
+
uuid: self.uuid,
|
|
204
|
+
device: self.device,
|
|
205
|
+
workoutActivityType: self.workoutActivityType,
|
|
206
|
+
duration: self.duration,
|
|
207
|
+
totalDistance: self.totalDistance,
|
|
208
|
+
totalEnergyBurned: self.totalEnergyBurned,
|
|
209
|
+
totalSwimmingStrokeCount: self.totalSwimmingStrokeCount,
|
|
210
|
+
totalFlightsClimbed: self.totalFlightsClimbed,
|
|
211
|
+
startDate: self.startDate,
|
|
212
|
+
endDate: self.endDate,
|
|
213
|
+
metadata: self.metadata,
|
|
214
|
+
sourceRevision: self.sourceRevision,
|
|
215
|
+
events: self.events,
|
|
216
|
+
activities: self.activities
|
|
217
|
+
)
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
var uuid: String {
|
|
221
|
+
get {
|
|
222
|
+
return workout.uuid.uuidString
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
var device: Device? {
|
|
227
|
+
if let hkDevice = workout.device {
|
|
228
|
+
return Device(
|
|
229
|
+
name: hkDevice.name,
|
|
230
|
+
firmwareVersion: hkDevice.firmwareVersion,
|
|
231
|
+
hardwareVersion: hkDevice.hardwareVersion,
|
|
232
|
+
localIdentifier: hkDevice.localIdentifier,
|
|
233
|
+
manufacturer: hkDevice.manufacturer,
|
|
234
|
+
model: hkDevice.model,
|
|
235
|
+
softwareVersion: hkDevice.softwareVersion,
|
|
236
|
+
udiDeviceIdentifier: hkDevice.udiDeviceIdentifier
|
|
237
|
+
)
|
|
238
|
+
}
|
|
239
|
+
return nil
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
var workoutActivityType: WorkoutActivityType {
|
|
243
|
+
get {
|
|
244
|
+
if let activityType = WorkoutActivityType.init(
|
|
245
|
+
rawValue: Int32(workout.workoutActivityType.rawValue)
|
|
246
|
+
) {
|
|
247
|
+
return activityType
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
print("Unknown workout activity type: \(workout.workoutActivityType.rawValue), falling back to 'other'")
|
|
251
|
+
|
|
252
|
+
return WorkoutActivityType.other
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
var duration: Quantity {
|
|
257
|
+
get {
|
|
258
|
+
let quantity = HKQuantity(unit: .second(), doubleValue: workout.duration)
|
|
259
|
+
|
|
260
|
+
let duration = serializeQuantityTyped(
|
|
261
|
+
unit: .second(),
|
|
262
|
+
quantity: quantity
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
return duration
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
var totalDistance: Quantity? {
|
|
270
|
+
if let hkTotalDistance = workout.totalDistance {
|
|
271
|
+
return Quantity(
|
|
272
|
+
unit: "meters",
|
|
273
|
+
quantity: hkTotalDistance.doubleValue(for: HKUnit.meter())
|
|
274
|
+
)
|
|
275
|
+
}
|
|
276
|
+
return nil
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
var totalEnergyBurned: Quantity? {
|
|
280
|
+
get {
|
|
281
|
+
return serializeQuantityTyped(
|
|
282
|
+
unit: energyUnit,
|
|
283
|
+
quantityNullable: workout.totalEnergyBurned
|
|
284
|
+
)
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
var totalSwimmingStrokeCount: Quantity? {
|
|
289
|
+
get {
|
|
290
|
+
return serializeQuantityTyped(
|
|
291
|
+
unit: .count(),
|
|
292
|
+
quantityNullable: workout.totalSwimmingStrokeCount
|
|
293
|
+
)
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
var totalFlightsClimbed: Quantity? {
|
|
299
|
+
if #available(iOS 11, *) {
|
|
300
|
+
if let hkTotalFlightsClimbed = workout.totalFlightsClimbed {
|
|
301
|
+
return Quantity(
|
|
302
|
+
unit: "count",
|
|
303
|
+
quantity: hkTotalFlightsClimbed.doubleValue(for: HKUnit.count())
|
|
304
|
+
)
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return nil
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
var energyUnit: HKUnit
|
|
311
|
+
|
|
312
|
+
var startDate: Date {
|
|
313
|
+
get {
|
|
314
|
+
return workout.startDate
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
var endDate: Date {
|
|
319
|
+
get {
|
|
320
|
+
return workout.endDate
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
var metadata: AnyMapHolder? {
|
|
325
|
+
get {
|
|
326
|
+
return serializeMetadata(workout.metadata)
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
var sourceRevision: SourceRevision? {
|
|
331
|
+
get {
|
|
332
|
+
return serializeSourceRevision(workout.sourceRevision)
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
var events: [WorkoutEvent]? {
|
|
337
|
+
if let hkWorkoutEvents = workout.workoutEvents {
|
|
338
|
+
return hkWorkoutEvents.compactMap { event in
|
|
339
|
+
if let type = WorkoutEventType.init(
|
|
340
|
+
rawValue: Int32(event.type.rawValue)
|
|
341
|
+
) {
|
|
342
|
+
return WorkoutEvent(
|
|
343
|
+
type: type,
|
|
344
|
+
startDate: event.dateInterval.start,
|
|
345
|
+
endDate: event.dateInterval.end
|
|
346
|
+
)
|
|
347
|
+
}
|
|
348
|
+
print(
|
|
349
|
+
"Failed to initialize WorkoutEventType with rawValue: \(event.type.rawValue)"
|
|
350
|
+
)
|
|
351
|
+
return nil
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
return nil
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
var activities: [WorkoutActivity]? {
|
|
358
|
+
if #available(iOS 16.0, *) {
|
|
359
|
+
let hkActivities = workout.workoutActivities
|
|
360
|
+
|
|
361
|
+
return hkActivities.map { activity in
|
|
362
|
+
return WorkoutActivity(
|
|
363
|
+
startDate: activity.startDate,
|
|
364
|
+
endDate: activity.endDate ?? activity.startDate,
|
|
365
|
+
uuid: activity.uuid.uuidString,
|
|
366
|
+
duration: activity.duration
|
|
367
|
+
)
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
return nil
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
let distanceUnit: HKUnit
|
|
374
|
+
|
|
375
|
+
private let workout: HKWorkout
|
|
376
|
+
|
|
377
|
+
init(workout: HKWorkout, distanceUnit: HKUnit, energyUnit: HKUnit) {
|
|
378
|
+
self.energyUnit = energyUnit
|
|
379
|
+
self.distanceUnit = distanceUnit
|
|
380
|
+
|
|
381
|
+
self.workout = workout
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
func getWorkoutPlan() throws -> Promise<WorkoutPlan?> {
|
|
385
|
+
return Promise.async {
|
|
386
|
+
if #available(iOS 17.0.0, *) {
|
|
387
|
+
return try await getWorkoutPlanInternal(workout: self.workout)
|
|
388
|
+
} else {
|
|
389
|
+
throw RuntimeError.error(
|
|
390
|
+
withMessage: "Workout plans are only available on iOS 17.0 or later"
|
|
391
|
+
)
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
func saveWorkoutRoute(locations: [LocationForSaving]) throws -> Promise<Bool> {
|
|
397
|
+
return saveWorkoutRouteInternal(workout: self.workout, locations: locations)
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
func getWorkoutRoutes() throws -> Promise<[WorkoutRoute]> {
|
|
401
|
+
return Promise.async {
|
|
402
|
+
return try await getSerializedWorkoutLocations(workout: self.workout)
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Workout.swift
|
|
3
|
+
// Pods
|
|
4
|
+
//
|
|
5
|
+
// Created by Robert Herber on 2025-06-13.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import WorkoutKit
|
|
9
|
+
import NitroModules
|
|
10
|
+
import HealthKit
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@available(iOS 17.0, *)
|
|
14
|
+
class WorkoutSessionDelegate: NSObject, HKWorkoutSessionDelegate {
|
|
15
|
+
func workoutSession(_ workoutSession: HKWorkoutSession, didChangeTo toState: HKWorkoutSessionState, from fromState: HKWorkoutSessionState, date: Date) {
|
|
16
|
+
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
func workoutSession(_ workoutSession: HKWorkoutSession, didFailWithError error: any Error) {
|
|
20
|
+
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
// var options: WorkoutSessionMirroringStartHandlerOptions? = nil
|
|
26
|
+
/*var onStateChange: ((_ event: WorkoutStateChangeEvent) -> Void)?
|
|
27
|
+
var onError: ((_ event: WorkoutErrorEvent) -> Void)?
|
|
28
|
+
var onDataReceived: ((_ event: WorkoutDataReceivedEvent) -> Void)?
|
|
29
|
+
var onEventReceived: ((_ event: WorkoutEventReceivedEvent) -> Void)?*/
|
|
30
|
+
// var options: WorkoutSessionMirroringStartHandlerOptions? = nil
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
/*func workoutSession(
|
|
34
|
+
_ workoutSession: HKWorkoutSession,
|
|
35
|
+
didChangeTo toState: HKWorkoutSessionState,
|
|
36
|
+
from fromState: HKWorkoutSessionState,
|
|
37
|
+
date: Date
|
|
38
|
+
) {
|
|
39
|
+
Task { @MainActor [weak self] in
|
|
40
|
+
guard let self = self else { return }
|
|
41
|
+
|
|
42
|
+
_listeners.onStateChange(
|
|
43
|
+
WorkoutStateChangeEvent(
|
|
44
|
+
toState: WorkoutSessionState(rawValue: Int32(toState.rawValue))!,
|
|
45
|
+
fromState: WorkoutSessionState(rawValue: Int32(fromState.rawValue))!,
|
|
46
|
+
date: date
|
|
47
|
+
)
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
func workoutSession(_ workoutSession: HKWorkoutSession, didFailWithError error: any Error) {
|
|
53
|
+
Task { @MainActor [weak self] in
|
|
54
|
+
guard let self = self else { return }
|
|
55
|
+
|
|
56
|
+
self._listeners.onError(
|
|
57
|
+
WorkoutErrorEvent(error: error.localizedDescription)
|
|
58
|
+
)
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
func workoutSession(
|
|
63
|
+
_ workoutSession: HKWorkoutSession,
|
|
64
|
+
didReceiveDataFromRemoteWorkoutSession data: [Data]
|
|
65
|
+
) {
|
|
66
|
+
Task { [weak self] in
|
|
67
|
+
guard let self = self else { return }
|
|
68
|
+
|
|
69
|
+
do {
|
|
70
|
+
let serializedData = data.compactMap { dataItem -> RemoteSessionSharableData? in
|
|
71
|
+
guard let json = try? JSONSerialization.jsonObject(with: dataItem) as? [String: Any] else {
|
|
72
|
+
return nil
|
|
73
|
+
}
|
|
74
|
+
if let type = json["type"] as? String,
|
|
75
|
+
let payload = json["payload"] as? [String: Any] {
|
|
76
|
+
|
|
77
|
+
return RemoteSessionSharableData(
|
|
78
|
+
type: type,
|
|
79
|
+
payload: serializeMetadata(payload)
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
return nil
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
await MainActor.run { [weak self] in
|
|
86
|
+
guard let self = self else { return }
|
|
87
|
+
|
|
88
|
+
self._listeners.onDataReceived(
|
|
89
|
+
WorkoutDataReceivedEvent(data: serializedData)
|
|
90
|
+
)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
func workoutSession(_ workoutSession: HKWorkoutSession, didGenerate event: HKWorkoutEvent) {
|
|
98
|
+
|
|
99
|
+
self._listeners.onEventReceived(
|
|
100
|
+
WorkoutEventReceivedEvent(
|
|
101
|
+
type: WorkoutEventType(rawValue: Int32(event.type.rawValue))!,
|
|
102
|
+
)
|
|
103
|
+
)
|
|
104
|
+
}*/
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
class WorkoutSessionModule: HybridWorkoutSessionModuleSpec {
|
|
108
|
+
// var options: WorkoutSessionMirroringStartHandlerOptions? = nil
|
|
109
|
+
func workoutSessionMirroringStartHandler(options: WorkoutSessionMirroringStartHandlerOptions) throws -> Bool {
|
|
110
|
+
// self.options = options
|
|
111
|
+
if #available(iOS 17.0, *) {
|
|
112
|
+
store.workoutSessionMirroringStartHandler = { [weak self] mirroringSession in
|
|
113
|
+
let workoutSessionDelegate = WorkoutSessionDelegate()
|
|
114
|
+
// workoutSessionDelegate.options = options
|
|
115
|
+
/*workoutSessionDelegate.onStateChange = { event in
|
|
116
|
+
// if let options = self?.options {
|
|
117
|
+
// options.onStateChange(event)
|
|
118
|
+
// }
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
options.onStateChange(event)
|
|
122
|
+
}*/
|
|
123
|
+
mirroringSession.delegate = workoutSessionDelegate
|
|
124
|
+
self?._workoutSession = mirroringSession
|
|
125
|
+
self?._workoutSessionDelegate = workoutSessionDelegate
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return true
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/*func workoutSessionMirroringStartHandler(onError: @escaping (WorkoutErrorEvent) -> Void, onStateChange: @escaping (WorkoutStateChangeEvent) -> Void, onDataReceived: @escaping (WorkoutDataReceivedEvent) -> Void, onEventReceived: @escaping (WorkoutEventReceivedEvent) -> Void) throws -> Bool {
|
|
133
|
+
if #available(iOS 17.0, *) {
|
|
134
|
+
/*store.workoutSessionMirroringStartHandler = { [weak self] mirroringSession in
|
|
135
|
+
let workoutSessionDelegate = WorkoutSessionDelegate()
|
|
136
|
+
// workoutSessionDelegate.onStateChange = onStateChange
|
|
137
|
+
mirroringSession.delegate = workoutSessionDelegate
|
|
138
|
+
self?._workoutSession = mirroringSession
|
|
139
|
+
self?._workoutSessionDelegate = workoutSessionDelegate
|
|
140
|
+
}*/
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return true
|
|
144
|
+
}*/
|
|
145
|
+
|
|
146
|
+
// var workoutSession: HKWorkoutSession? = nil
|
|
147
|
+
// var workoutSessionDelegate: WorkoutSessionDelegate? = nil
|
|
148
|
+
|
|
149
|
+
func startWatchAppWithWorkoutConfiguration(workoutConfiguration: WorkoutConfiguration) throws -> Promise<Bool> {
|
|
150
|
+
let configuration = parseWorkoutConfiguration(workoutConfiguration)
|
|
151
|
+
|
|
152
|
+
return Promise.async {
|
|
153
|
+
try await withCheckedThrowingContinuation { continuation in
|
|
154
|
+
store.startWatchApp(with: configuration) { success, error in
|
|
155
|
+
if let error {
|
|
156
|
+
continuation.resume(throwing: RuntimeError.error(withMessage: error.localizedDescription))
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
continuation.resume(returning: success)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
var _workoutSession: Any? = nil
|
|
166
|
+
var _workoutSessionDelegate: Any? = nil
|
|
167
|
+
|
|
168
|
+
/*func workoutSessionMirroringStartHandler(options: StartWatchAppWithWorkoutConfigurationOptions) throws -> Bool {
|
|
169
|
+
if #available(iOS 17.0, *) {
|
|
170
|
+
store.workoutSessionMirroringStartHandler = { [weak self] mirroringSession in
|
|
171
|
+
let workoutSessionDelegate = WorkoutSessionDelegate()
|
|
172
|
+
workoutSessionDelegate.onStateChange = options.onStateChange
|
|
173
|
+
mirroringSession.delegate = workoutSessionDelegate
|
|
174
|
+
self?._workoutSession = mirroringSession
|
|
175
|
+
self?._workoutSessionDelegate = workoutSessionDelegate
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return true
|
|
180
|
+
}*/
|
|
181
|
+
|
|
182
|
+
}
|