@appeeky/expo-healthkit 0.1.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/CHANGELOG.md +26 -0
- package/LICENSE +92 -0
- package/README.md +453 -0
- package/android/build.gradle +22 -0
- package/android/src/main/AndroidManifest.xml +74 -0
- package/android/src/main/java/expo/modules/healthkit/ExpoHealthKitModule.kt +228 -0
- package/android/src/main/java/expo/modules/healthkit/HealthConnectMapping.kt +129 -0
- package/android/src/main/java/expo/modules/healthkit/HealthConnectNutrition.kt +152 -0
- package/android/src/main/java/expo/modules/healthkit/HealthConnectRationaleActivity.kt +62 -0
- package/android/src/main/java/expo/modules/healthkit/HealthConnectService.kt +1054 -0
- package/android/src/main/java/expo/modules/healthkit/HealthConnectUnits.kt +133 -0
- package/android/src/main/java/expo/modules/healthkit/HealthConnectWorkouts.kt +105 -0
- package/android/src/main/java/expo/modules/healthkit/HealthKitExceptions.kt +30 -0
- package/app.plugin.js +1 -0
- package/build/ExpoHealthKitModule.d.ts +39 -0
- package/build/ExpoHealthKitModule.d.ts.map +1 -0
- package/build/ExpoHealthKitModule.js +35 -0
- package/build/ExpoHealthKitModule.js.map +1 -0
- package/build/ExpoHealthKitModule.web.d.ts +39 -0
- package/build/ExpoHealthKitModule.web.d.ts.map +1 -0
- package/build/ExpoHealthKitModule.web.js +105 -0
- package/build/ExpoHealthKitModule.web.js.map +1 -0
- package/build/dates.d.ts +6 -0
- package/build/dates.d.ts.map +1 -0
- package/build/dates.js +13 -0
- package/build/dates.js.map +1 -0
- package/build/errors.d.ts +9 -0
- package/build/errors.d.ts.map +1 -0
- package/build/errors.js +18 -0
- package/build/errors.js.map +1 -0
- package/build/identifiers.d.ts +418 -0
- package/build/identifiers.d.ts.map +1 -0
- package/build/identifiers.js +402 -0
- package/build/identifiers.js.map +1 -0
- package/build/index.d.ts +454 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +418 -0
- package/build/index.js.map +1 -0
- package/build/types.d.ts +542 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +2 -0
- package/build/types.js.map +1 -0
- package/docs/banner.jpg +0 -0
- package/expo-module.config.json +9 -0
- package/ios/ExpoHealthKit.podspec +30 -0
- package/ios/ExpoHealthKitModule.swift +155 -0
- package/ios/HealthKitAdvancedQueries.swift +458 -0
- package/ios/HealthKitExceptions.swift +109 -0
- package/ios/HealthKitIdentifiers.swift +183 -0
- package/ios/HealthKitRecords.swift +214 -0
- package/ios/HealthKitService.swift +626 -0
- package/ios/PrivacyInfo.xcprivacy +14 -0
- package/package.json +105 -0
- package/plugin/build/index.d.ts +30 -0
- package/plugin/build/index.js +138 -0
- package/src/ExpoHealthKitModule.ts +116 -0
- package/src/ExpoHealthKitModule.web.ts +140 -0
- package/src/dates.ts +17 -0
- package/src/errors.ts +22 -0
- package/src/identifiers.ts +494 -0
- package/src/index.ts +563 -0
- package/src/types.ts +625 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
package expo.modules.healthkit
|
|
2
|
+
|
|
3
|
+
internal object HealthConnectUnits {
|
|
4
|
+
fun toRequested(canonical: Double, unit: String, kind: QuantityKind): Double {
|
|
5
|
+
if (unit.isEmpty()) return canonical
|
|
6
|
+
return when (kind) {
|
|
7
|
+
QuantityKind.COUNT, QuantityKind.BPM, QuantityKind.FLOORS, QuantityKind.VO2, QuantityKind.HRV -> canonical
|
|
8
|
+
QuantityKind.PERCENT -> if (unit == "%") canonical else canonical * 100.0
|
|
9
|
+
QuantityKind.MASS -> massFromKg(canonical, unit)
|
|
10
|
+
QuantityKind.LENGTH -> lengthFromMeters(canonical, unit)
|
|
11
|
+
QuantityKind.ENERGY -> energyFromKcal(canonical, unit)
|
|
12
|
+
QuantityKind.TEMPERATURE -> temperatureFromCelsius(canonical, unit)
|
|
13
|
+
QuantityKind.PRESSURE -> if (unit == "mmHg") canonical else canonical
|
|
14
|
+
QuantityKind.VOLUME -> volumeFromLiters(canonical, unit)
|
|
15
|
+
QuantityKind.GLUCOSE -> glucoseFromMgDl(canonical, unit)
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
fun toCanonical(value: Double, unit: String, kind: QuantityKind): Double {
|
|
20
|
+
if (unit.isEmpty()) return value
|
|
21
|
+
return when (kind) {
|
|
22
|
+
QuantityKind.COUNT, QuantityKind.BPM, QuantityKind.FLOORS, QuantityKind.VO2, QuantityKind.HRV -> value
|
|
23
|
+
QuantityKind.PERCENT -> if (unit == "%" && value > 1.0) value / 100.0 else value
|
|
24
|
+
QuantityKind.MASS -> massToKg(value, unit)
|
|
25
|
+
QuantityKind.LENGTH -> lengthToMeters(value, unit)
|
|
26
|
+
QuantityKind.ENERGY -> energyToKcal(value, unit)
|
|
27
|
+
QuantityKind.TEMPERATURE -> temperatureToCelsius(value, unit)
|
|
28
|
+
QuantityKind.PRESSURE -> value
|
|
29
|
+
QuantityKind.VOLUME -> volumeToLiters(value, unit)
|
|
30
|
+
QuantityKind.GLUCOSE -> glucoseToMgDl(value, unit)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
private fun massToKg(value: Double, unit: String): Double = when (unit) {
|
|
35
|
+
"kg" -> value
|
|
36
|
+
"g" -> value / 1000.0
|
|
37
|
+
"mg" -> value / 1_000_000.0
|
|
38
|
+
"lb" -> value / 2.2046226218
|
|
39
|
+
else -> value
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
private fun massFromKg(value: Double, unit: String): Double = when (unit) {
|
|
43
|
+
"kg" -> value
|
|
44
|
+
"g" -> value * 1000.0
|
|
45
|
+
"mg" -> value * 1_000_000.0
|
|
46
|
+
"lb" -> value * 2.2046226218
|
|
47
|
+
else -> value
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private fun lengthToMeters(value: Double, unit: String): Double = when (unit) {
|
|
51
|
+
"m" -> value
|
|
52
|
+
"km" -> value * 1000.0
|
|
53
|
+
"cm" -> value / 100.0
|
|
54
|
+
"mi" -> value * 1609.344
|
|
55
|
+
"ft" -> value * 0.3048
|
|
56
|
+
"in" -> value * 0.0254
|
|
57
|
+
else -> value
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
private fun lengthFromMeters(value: Double, unit: String): Double = when (unit) {
|
|
61
|
+
"m" -> value
|
|
62
|
+
"km" -> value / 1000.0
|
|
63
|
+
"cm" -> value * 100.0
|
|
64
|
+
"mi" -> value / 1609.344
|
|
65
|
+
"ft" -> value / 0.3048
|
|
66
|
+
"in" -> value / 0.0254
|
|
67
|
+
else -> value
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private fun energyToKcal(value: Double, unit: String): Double = when (unit) {
|
|
71
|
+
"kcal" -> value
|
|
72
|
+
"J" -> value / 4184.0
|
|
73
|
+
else -> value
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
private fun energyFromKcal(value: Double, unit: String): Double = when (unit) {
|
|
77
|
+
"kcal" -> value
|
|
78
|
+
"J" -> value * 4184.0
|
|
79
|
+
else -> value
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
private fun temperatureToCelsius(value: Double, unit: String): Double = when (unit) {
|
|
83
|
+
"degC" -> value
|
|
84
|
+
"degF" -> (value - 32.0) * 5.0 / 9.0
|
|
85
|
+
else -> value
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
private fun temperatureFromCelsius(value: Double, unit: String): Double = when (unit) {
|
|
89
|
+
"degC" -> value
|
|
90
|
+
"degF" -> value * 9.0 / 5.0 + 32.0
|
|
91
|
+
else -> value
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
private fun volumeToLiters(value: Double, unit: String): Double = when (unit) {
|
|
95
|
+
"L" -> value
|
|
96
|
+
"mL" -> value / 1000.0
|
|
97
|
+
else -> value
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
private fun volumeFromLiters(value: Double, unit: String): Double = when (unit) {
|
|
101
|
+
"L" -> value
|
|
102
|
+
"mL" -> value * 1000.0
|
|
103
|
+
else -> value
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private fun glucoseToMgDl(value: Double, unit: String): Double = when {
|
|
107
|
+
unit == "mg/dL" -> value
|
|
108
|
+
unit.startsWith("mmol") -> value * 18.018
|
|
109
|
+
else -> value
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
private fun glucoseFromMgDl(value: Double, unit: String): Double = when {
|
|
113
|
+
unit == "mg/dL" -> value
|
|
114
|
+
unit.startsWith("mmol") -> value / 18.018
|
|
115
|
+
else -> value
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
internal enum class QuantityKind {
|
|
120
|
+
COUNT,
|
|
121
|
+
MASS,
|
|
122
|
+
LENGTH,
|
|
123
|
+
ENERGY,
|
|
124
|
+
TEMPERATURE,
|
|
125
|
+
PRESSURE,
|
|
126
|
+
VOLUME,
|
|
127
|
+
GLUCOSE,
|
|
128
|
+
PERCENT,
|
|
129
|
+
BPM,
|
|
130
|
+
FLOORS,
|
|
131
|
+
VO2,
|
|
132
|
+
HRV
|
|
133
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
package expo.modules.healthkit
|
|
2
|
+
|
|
3
|
+
import androidx.health.connect.client.records.ExerciseSessionRecord
|
|
4
|
+
|
|
5
|
+
internal object HealthConnectWorkouts {
|
|
6
|
+
fun toHealthConnect(hkActivityType: Int): Int = when (hkActivityType) {
|
|
7
|
+
1 -> ExerciseSessionRecord.EXERCISE_TYPE_FOOTBALL_AMERICAN
|
|
8
|
+
2 -> ExerciseSessionRecord.EXERCISE_TYPE_OTHER_WORKOUT
|
|
9
|
+
3 -> ExerciseSessionRecord.EXERCISE_TYPE_FOOTBALL_AUSTRALIAN
|
|
10
|
+
4 -> ExerciseSessionRecord.EXERCISE_TYPE_BADMINTON
|
|
11
|
+
5 -> ExerciseSessionRecord.EXERCISE_TYPE_BASEBALL
|
|
12
|
+
6 -> ExerciseSessionRecord.EXERCISE_TYPE_BASKETBALL
|
|
13
|
+
8 -> ExerciseSessionRecord.EXERCISE_TYPE_BOXING
|
|
14
|
+
9 -> ExerciseSessionRecord.EXERCISE_TYPE_ROCK_CLIMBING
|
|
15
|
+
10 -> ExerciseSessionRecord.EXERCISE_TYPE_CRICKET
|
|
16
|
+
13 -> ExerciseSessionRecord.EXERCISE_TYPE_BIKING
|
|
17
|
+
14, 15, 77, 78 -> ExerciseSessionRecord.EXERCISE_TYPE_DANCING
|
|
18
|
+
16 -> ExerciseSessionRecord.EXERCISE_TYPE_ELLIPTICAL
|
|
19
|
+
18 -> ExerciseSessionRecord.EXERCISE_TYPE_FENCING
|
|
20
|
+
20, 50 -> ExerciseSessionRecord.EXERCISE_TYPE_STRENGTH_TRAINING
|
|
21
|
+
21 -> ExerciseSessionRecord.EXERCISE_TYPE_GOLF
|
|
22
|
+
22 -> ExerciseSessionRecord.EXERCISE_TYPE_GYMNASTICS
|
|
23
|
+
23 -> ExerciseSessionRecord.EXERCISE_TYPE_HANDBALL
|
|
24
|
+
24 -> ExerciseSessionRecord.EXERCISE_TYPE_HIKING
|
|
25
|
+
25 -> ExerciseSessionRecord.EXERCISE_TYPE_ICE_HOCKEY
|
|
26
|
+
28 -> ExerciseSessionRecord.EXERCISE_TYPE_MARTIAL_ARTS
|
|
27
|
+
31 -> ExerciseSessionRecord.EXERCISE_TYPE_PADDLING
|
|
28
|
+
34 -> ExerciseSessionRecord.EXERCISE_TYPE_RACQUETBALL
|
|
29
|
+
35 -> ExerciseSessionRecord.EXERCISE_TYPE_ROWING
|
|
30
|
+
36 -> ExerciseSessionRecord.EXERCISE_TYPE_RUGBY
|
|
31
|
+
37 -> ExerciseSessionRecord.EXERCISE_TYPE_RUNNING
|
|
32
|
+
38 -> ExerciseSessionRecord.EXERCISE_TYPE_SAILING
|
|
33
|
+
39 -> ExerciseSessionRecord.EXERCISE_TYPE_SKATING
|
|
34
|
+
40, 60, 61 -> ExerciseSessionRecord.EXERCISE_TYPE_SKIING
|
|
35
|
+
41 -> ExerciseSessionRecord.EXERCISE_TYPE_SOCCER
|
|
36
|
+
42 -> ExerciseSessionRecord.EXERCISE_TYPE_SOFTBALL
|
|
37
|
+
43 -> ExerciseSessionRecord.EXERCISE_TYPE_SQUASH
|
|
38
|
+
44, 68 -> ExerciseSessionRecord.EXERCISE_TYPE_STAIR_CLIMBING
|
|
39
|
+
45 -> ExerciseSessionRecord.EXERCISE_TYPE_SURFING
|
|
40
|
+
46 -> ExerciseSessionRecord.EXERCISE_TYPE_SWIMMING_POOL
|
|
41
|
+
47 -> ExerciseSessionRecord.EXERCISE_TYPE_TABLE_TENNIS
|
|
42
|
+
48 -> ExerciseSessionRecord.EXERCISE_TYPE_TENNIS
|
|
43
|
+
51 -> ExerciseSessionRecord.EXERCISE_TYPE_VOLLEYBALL
|
|
44
|
+
52 -> ExerciseSessionRecord.EXERCISE_TYPE_WALKING
|
|
45
|
+
54 -> ExerciseSessionRecord.EXERCISE_TYPE_WATER_POLO
|
|
46
|
+
57 -> ExerciseSessionRecord.EXERCISE_TYPE_YOGA
|
|
47
|
+
63 -> ExerciseSessionRecord.EXERCISE_TYPE_HIGH_INTENSITY_INTERVAL_TRAINING
|
|
48
|
+
64 -> ExerciseSessionRecord.EXERCISE_TYPE_CALISTHENICS
|
|
49
|
+
66 -> ExerciseSessionRecord.EXERCISE_TYPE_PILATES
|
|
50
|
+
67 -> ExerciseSessionRecord.EXERCISE_TYPE_SNOWBOARDING
|
|
51
|
+
70, 71 -> ExerciseSessionRecord.EXERCISE_TYPE_WHEELCHAIR
|
|
52
|
+
74 -> ExerciseSessionRecord.EXERCISE_TYPE_BIKING
|
|
53
|
+
75 -> ExerciseSessionRecord.EXERCISE_TYPE_FRISBEE_DISC
|
|
54
|
+
else -> ExerciseSessionRecord.EXERCISE_TYPE_OTHER_WORKOUT
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
fun toHealthKit(exerciseType: Int): Int = when (exerciseType) {
|
|
58
|
+
ExerciseSessionRecord.EXERCISE_TYPE_FOOTBALL_AMERICAN -> 1
|
|
59
|
+
ExerciseSessionRecord.EXERCISE_TYPE_FOOTBALL_AUSTRALIAN -> 3
|
|
60
|
+
ExerciseSessionRecord.EXERCISE_TYPE_BADMINTON -> 4
|
|
61
|
+
ExerciseSessionRecord.EXERCISE_TYPE_BASEBALL -> 5
|
|
62
|
+
ExerciseSessionRecord.EXERCISE_TYPE_BASKETBALL -> 6
|
|
63
|
+
ExerciseSessionRecord.EXERCISE_TYPE_BOXING -> 8
|
|
64
|
+
ExerciseSessionRecord.EXERCISE_TYPE_ROCK_CLIMBING -> 9
|
|
65
|
+
ExerciseSessionRecord.EXERCISE_TYPE_CRICKET -> 10
|
|
66
|
+
ExerciseSessionRecord.EXERCISE_TYPE_BIKING, ExerciseSessionRecord.EXERCISE_TYPE_BIKING_STATIONARY -> 13
|
|
67
|
+
ExerciseSessionRecord.EXERCISE_TYPE_DANCING -> 14
|
|
68
|
+
ExerciseSessionRecord.EXERCISE_TYPE_ELLIPTICAL -> 16
|
|
69
|
+
ExerciseSessionRecord.EXERCISE_TYPE_FENCING -> 18
|
|
70
|
+
ExerciseSessionRecord.EXERCISE_TYPE_STRENGTH_TRAINING, ExerciseSessionRecord.EXERCISE_TYPE_WEIGHTLIFTING -> 50
|
|
71
|
+
ExerciseSessionRecord.EXERCISE_TYPE_GOLF -> 21
|
|
72
|
+
ExerciseSessionRecord.EXERCISE_TYPE_GYMNASTICS -> 22
|
|
73
|
+
ExerciseSessionRecord.EXERCISE_TYPE_HANDBALL -> 23
|
|
74
|
+
ExerciseSessionRecord.EXERCISE_TYPE_HIKING -> 24
|
|
75
|
+
ExerciseSessionRecord.EXERCISE_TYPE_ICE_HOCKEY -> 25
|
|
76
|
+
ExerciseSessionRecord.EXERCISE_TYPE_MARTIAL_ARTS -> 28
|
|
77
|
+
ExerciseSessionRecord.EXERCISE_TYPE_PADDLING -> 31
|
|
78
|
+
ExerciseSessionRecord.EXERCISE_TYPE_RACQUETBALL -> 34
|
|
79
|
+
ExerciseSessionRecord.EXERCISE_TYPE_ROWING, ExerciseSessionRecord.EXERCISE_TYPE_ROWING_MACHINE -> 35
|
|
80
|
+
ExerciseSessionRecord.EXERCISE_TYPE_RUGBY -> 36
|
|
81
|
+
ExerciseSessionRecord.EXERCISE_TYPE_RUNNING, ExerciseSessionRecord.EXERCISE_TYPE_RUNNING_TREADMILL -> 37
|
|
82
|
+
ExerciseSessionRecord.EXERCISE_TYPE_SAILING -> 38
|
|
83
|
+
ExerciseSessionRecord.EXERCISE_TYPE_SKATING -> 39
|
|
84
|
+
ExerciseSessionRecord.EXERCISE_TYPE_SKIING -> 40
|
|
85
|
+
ExerciseSessionRecord.EXERCISE_TYPE_SOCCER -> 41
|
|
86
|
+
ExerciseSessionRecord.EXERCISE_TYPE_SOFTBALL -> 42
|
|
87
|
+
ExerciseSessionRecord.EXERCISE_TYPE_SQUASH -> 43
|
|
88
|
+
ExerciseSessionRecord.EXERCISE_TYPE_STAIR_CLIMBING, ExerciseSessionRecord.EXERCISE_TYPE_STAIR_CLIMBING_MACHINE -> 44
|
|
89
|
+
ExerciseSessionRecord.EXERCISE_TYPE_SURFING -> 45
|
|
90
|
+
ExerciseSessionRecord.EXERCISE_TYPE_SWIMMING_POOL, ExerciseSessionRecord.EXERCISE_TYPE_SWIMMING_OPEN_WATER -> 46
|
|
91
|
+
ExerciseSessionRecord.EXERCISE_TYPE_TABLE_TENNIS -> 47
|
|
92
|
+
ExerciseSessionRecord.EXERCISE_TYPE_TENNIS -> 48
|
|
93
|
+
ExerciseSessionRecord.EXERCISE_TYPE_VOLLEYBALL -> 51
|
|
94
|
+
ExerciseSessionRecord.EXERCISE_TYPE_WALKING -> 52
|
|
95
|
+
ExerciseSessionRecord.EXERCISE_TYPE_WATER_POLO -> 54
|
|
96
|
+
ExerciseSessionRecord.EXERCISE_TYPE_YOGA -> 57
|
|
97
|
+
ExerciseSessionRecord.EXERCISE_TYPE_HIGH_INTENSITY_INTERVAL_TRAINING -> 63
|
|
98
|
+
ExerciseSessionRecord.EXERCISE_TYPE_CALISTHENICS -> 64
|
|
99
|
+
ExerciseSessionRecord.EXERCISE_TYPE_PILATES -> 66
|
|
100
|
+
ExerciseSessionRecord.EXERCISE_TYPE_SNOWBOARDING -> 67
|
|
101
|
+
ExerciseSessionRecord.EXERCISE_TYPE_WHEELCHAIR -> 70
|
|
102
|
+
ExerciseSessionRecord.EXERCISE_TYPE_FRISBEE_DISC -> 75
|
|
103
|
+
else -> 0
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
package expo.modules.healthkit
|
|
2
|
+
|
|
3
|
+
import expo.modules.kotlin.exception.CodedException
|
|
4
|
+
|
|
5
|
+
internal class HealthKitUnavailableException :
|
|
6
|
+
CodedException("Health data is not available. On iOS use a development build with HealthKit. On Android install Health Connect.")
|
|
7
|
+
|
|
8
|
+
internal class EmptyPermissionsException :
|
|
9
|
+
CodedException("Provide at least one HealthKit type in toRead or toShare")
|
|
10
|
+
|
|
11
|
+
internal class InvalidIdentifierException(identifier: String) :
|
|
12
|
+
CodedException("Unknown or unsupported HealthKit identifier: $identifier")
|
|
13
|
+
|
|
14
|
+
internal class InvalidUnitException(unit: String) :
|
|
15
|
+
CodedException("Invalid HealthKit unit string: $unit")
|
|
16
|
+
|
|
17
|
+
internal class InvalidDateException(value: String) :
|
|
18
|
+
CodedException("Invalid ISO-8601 date: $value")
|
|
19
|
+
|
|
20
|
+
internal class InvalidSampleTypeException(identifier: String) :
|
|
21
|
+
CodedException("Identifier is not a writable sample type: $identifier")
|
|
22
|
+
|
|
23
|
+
internal class MissingDeleteTypeException :
|
|
24
|
+
CodedException("deleteObjects requires a type, optionally with uuid or a date range")
|
|
25
|
+
|
|
26
|
+
internal class EmptyCorrelationException :
|
|
27
|
+
CodedException("saveCorrelation requires at least one quantity object")
|
|
28
|
+
|
|
29
|
+
internal class HealthConnectUnsupportedException(feature: String) :
|
|
30
|
+
CodedException("$feature is not available on Android Health Connect")
|
package/app.plugin.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('./plugin/build');
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { NativeModule } from 'expo';
|
|
2
|
+
import type { ExpoHealthKitModuleEvents, NativeActivitySummary, NativeActivitySummaryQueryOptions, NativeAnchoredQueryOptions, NativeAnchoredQueryResult, NativeAudiogramSample, NativeAuthorizationOptions, NativeCategoryQueryOptions, NativeCategorySample, NativeCategorySampleInput, NativeClinicalRecord, NativeClinicalRecordQueryOptions, NativeCorrelation, NativeCorrelationInput, NativeCorrelationQueryOptions, NativeDateRangeQueryOptions, NativeDeleteObjectsOptions, NativeElectrocardiogramQueryOptions, NativeElectrocardiogramSample, NativeHeartbeatSeriesQueryOptions, NativeHeartbeatSeriesSample, NativeQuantityQueryOptions, NativeQuantitySample, NativeQuantitySampleInput, NativeStatistics, NativeStatisticsCollectionQueryOptions, NativeStatisticsQueryOptions, NativeWorkoutInput, NativeWorkoutQueryOptions, NativeWorkoutRoute, NativeWorkoutRouteQueryOptions, NativeWorkoutSample } from './types';
|
|
3
|
+
declare class ExpoHealthKitModule extends NativeModule<ExpoHealthKitModuleEvents> {
|
|
4
|
+
isHealthDataAvailable(): boolean;
|
|
5
|
+
requestAuthorization(options: NativeAuthorizationOptions): Promise<boolean>;
|
|
6
|
+
getAuthorizationStatus(identifier: string): Promise<number>;
|
|
7
|
+
getRequestStatusForAuthorization(options: NativeAuthorizationOptions): Promise<number>;
|
|
8
|
+
queryQuantitySamples(options: NativeQuantityQueryOptions): Promise<NativeQuantitySample[]>;
|
|
9
|
+
queryCategorySamples(options: NativeCategoryQueryOptions): Promise<NativeCategorySample[]>;
|
|
10
|
+
queryWorkouts(options: NativeWorkoutQueryOptions): Promise<NativeWorkoutSample[]>;
|
|
11
|
+
queryElectrocardiograms(options: NativeElectrocardiogramQueryOptions): Promise<NativeElectrocardiogramSample[]>;
|
|
12
|
+
queryActivitySummaries(options: NativeActivitySummaryQueryOptions): Promise<NativeActivitySummary[]>;
|
|
13
|
+
queryClinicalRecords(options: NativeClinicalRecordQueryOptions): Promise<NativeClinicalRecord[]>;
|
|
14
|
+
queryAudiograms(options: NativeDateRangeQueryOptions): Promise<NativeAudiogramSample[]>;
|
|
15
|
+
queryWorkoutRoute(options: NativeWorkoutRouteQueryOptions): Promise<NativeWorkoutRoute[]>;
|
|
16
|
+
queryCorrelations(options: NativeCorrelationQueryOptions): Promise<NativeCorrelation[]>;
|
|
17
|
+
queryHeartbeatSeries(options: NativeHeartbeatSeriesQueryOptions): Promise<NativeHeartbeatSeriesSample[]>;
|
|
18
|
+
queryStatistics(options: NativeStatisticsQueryOptions): Promise<NativeStatistics>;
|
|
19
|
+
queryStatisticsCollection(options: NativeStatisticsCollectionQueryOptions): Promise<NativeStatistics[]>;
|
|
20
|
+
queryAnchored(options: NativeAnchoredQueryOptions): Promise<NativeAnchoredQueryResult>;
|
|
21
|
+
saveQuantitySample(sample: NativeQuantitySampleInput): Promise<string>;
|
|
22
|
+
saveCategorySample(sample: NativeCategorySampleInput): Promise<string>;
|
|
23
|
+
saveWorkout(workout: NativeWorkoutInput): Promise<string>;
|
|
24
|
+
saveCorrelation(correlation: NativeCorrelationInput): Promise<string>;
|
|
25
|
+
deleteObjects(options: NativeDeleteObjectsOptions): Promise<number>;
|
|
26
|
+
getBiologicalSex(): Promise<number>;
|
|
27
|
+
getBloodType(): Promise<number>;
|
|
28
|
+
getDateOfBirth(): Promise<string | null>;
|
|
29
|
+
getFitzpatrickSkinType(): Promise<number>;
|
|
30
|
+
getWheelchairUse(): Promise<number>;
|
|
31
|
+
enableBackgroundDelivery(type: string, frequency: number): Promise<boolean>;
|
|
32
|
+
disableBackgroundDelivery(type: string): Promise<boolean>;
|
|
33
|
+
disableAllBackgroundDelivery(): Promise<boolean>;
|
|
34
|
+
observeTypes(types: string[]): Promise<void>;
|
|
35
|
+
clearObserverQueries(): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
declare const _default: ExpoHealthKitModule;
|
|
38
|
+
export default _default;
|
|
39
|
+
//# sourceMappingURL=ExpoHealthKitModule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExpoHealthKitModule.d.ts","sourceRoot":"","sources":["../src/ExpoHealthKitModule.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { requireNativeModule } from 'expo';
|
|
2
|
+
import { HealthKitError } from './errors';
|
|
3
|
+
const nativeModule = requireNativeModule('ExpoHealthKit');
|
|
4
|
+
function rethrowAsHealthKitError(error) {
|
|
5
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
6
|
+
const code = error && typeof error === 'object' && 'code' in error
|
|
7
|
+
? String(error.code)
|
|
8
|
+
: 'ERR_HEALTHKIT';
|
|
9
|
+
const wrapped = new HealthKitError(message, code);
|
|
10
|
+
if (__DEV__) {
|
|
11
|
+
console.warn(`[expo-healthkit] ${code}: ${message}`);
|
|
12
|
+
}
|
|
13
|
+
throw wrapped;
|
|
14
|
+
}
|
|
15
|
+
export default new Proxy(nativeModule, {
|
|
16
|
+
get(target, property, receiver) {
|
|
17
|
+
const value = Reflect.get(target, property, receiver);
|
|
18
|
+
if (typeof value !== 'function') {
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
return (...args) => {
|
|
22
|
+
try {
|
|
23
|
+
const result = value.apply(target, args);
|
|
24
|
+
if (result instanceof Promise) {
|
|
25
|
+
return result.catch(rethrowAsHealthKitError);
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
rethrowAsHealthKitError(error);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=ExpoHealthKitModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExpoHealthKitModule.js","sourceRoot":"","sources":["../src/ExpoHealthKitModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAgF1C,MAAM,YAAY,GAAG,mBAAmB,CAAsB,eAAe,CAAC,CAAC;AAE/E,SAAS,uBAAuB,CAAC,KAAc;IAC7C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,IAAI,GACR,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK;QACnD,CAAC,CAAC,MAAM,CAAE,KAA2B,CAAC,IAAI,CAAC;QAC3C,CAAC,CAAC,eAAe,CAAC;IACtB,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,oBAAoB,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,OAAO,CAAC;AAChB,CAAC;AAED,eAAe,IAAI,KAAK,CAAC,YAAY,EAAE;IACrC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAY,CAAC;QACjE,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE;YAC5B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAI,KAA0C,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC/E,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;oBAC9B,OAAO,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAC/C,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;CACF,CAAwB,CAAC","sourcesContent":["import { NativeModule, requireNativeModule } from 'expo';\n\nimport { HealthKitError } from './errors';\n\nimport type {\n ExpoHealthKitModuleEvents,\n NativeActivitySummary,\n NativeActivitySummaryQueryOptions,\n NativeAnchoredQueryOptions,\n NativeAnchoredQueryResult,\n NativeAudiogramSample,\n NativeAuthorizationOptions,\n NativeCategoryQueryOptions,\n NativeCategorySample,\n NativeCategorySampleInput,\n NativeClinicalRecord,\n NativeClinicalRecordQueryOptions,\n NativeCorrelation,\n NativeCorrelationInput,\n NativeCorrelationQueryOptions,\n NativeDateRangeQueryOptions,\n NativeDeleteObjectsOptions,\n NativeElectrocardiogramQueryOptions,\n NativeElectrocardiogramSample,\n NativeHeartbeatSeriesQueryOptions,\n NativeHeartbeatSeriesSample,\n NativeQuantityQueryOptions,\n NativeQuantitySample,\n NativeQuantitySampleInput,\n NativeStatistics,\n NativeStatisticsCollectionQueryOptions,\n NativeStatisticsQueryOptions,\n NativeWorkoutInput,\n NativeWorkoutQueryOptions,\n NativeWorkoutRoute,\n NativeWorkoutRouteQueryOptions,\n NativeWorkoutSample,\n} from './types';\n\ndeclare class ExpoHealthKitModule extends NativeModule<ExpoHealthKitModuleEvents> {\n isHealthDataAvailable(): boolean;\n requestAuthorization(options: NativeAuthorizationOptions): Promise<boolean>;\n getAuthorizationStatus(identifier: string): Promise<number>;\n getRequestStatusForAuthorization(options: NativeAuthorizationOptions): Promise<number>;\n queryQuantitySamples(options: NativeQuantityQueryOptions): Promise<NativeQuantitySample[]>;\n queryCategorySamples(options: NativeCategoryQueryOptions): Promise<NativeCategorySample[]>;\n queryWorkouts(options: NativeWorkoutQueryOptions): Promise<NativeWorkoutSample[]>;\n queryElectrocardiograms(\n options: NativeElectrocardiogramQueryOptions\n ): Promise<NativeElectrocardiogramSample[]>;\n queryActivitySummaries(\n options: NativeActivitySummaryQueryOptions\n ): Promise<NativeActivitySummary[]>;\n queryClinicalRecords(options: NativeClinicalRecordQueryOptions): Promise<NativeClinicalRecord[]>;\n queryAudiograms(options: NativeDateRangeQueryOptions): Promise<NativeAudiogramSample[]>;\n queryWorkoutRoute(options: NativeWorkoutRouteQueryOptions): Promise<NativeWorkoutRoute[]>;\n queryCorrelations(options: NativeCorrelationQueryOptions): Promise<NativeCorrelation[]>;\n queryHeartbeatSeries(\n options: NativeHeartbeatSeriesQueryOptions\n ): Promise<NativeHeartbeatSeriesSample[]>;\n queryStatistics(options: NativeStatisticsQueryOptions): Promise<NativeStatistics>;\n queryStatisticsCollection(\n options: NativeStatisticsCollectionQueryOptions\n ): Promise<NativeStatistics[]>;\n queryAnchored(options: NativeAnchoredQueryOptions): Promise<NativeAnchoredQueryResult>;\n saveQuantitySample(sample: NativeQuantitySampleInput): Promise<string>;\n saveCategorySample(sample: NativeCategorySampleInput): Promise<string>;\n saveWorkout(workout: NativeWorkoutInput): Promise<string>;\n saveCorrelation(correlation: NativeCorrelationInput): Promise<string>;\n deleteObjects(options: NativeDeleteObjectsOptions): Promise<number>;\n getBiologicalSex(): Promise<number>;\n getBloodType(): Promise<number>;\n getDateOfBirth(): Promise<string | null>;\n getFitzpatrickSkinType(): Promise<number>;\n getWheelchairUse(): Promise<number>;\n enableBackgroundDelivery(type: string, frequency: number): Promise<boolean>;\n disableBackgroundDelivery(type: string): Promise<boolean>;\n disableAllBackgroundDelivery(): Promise<boolean>;\n observeTypes(types: string[]): Promise<void>;\n clearObserverQueries(): Promise<void>;\n}\n\nconst nativeModule = requireNativeModule<ExpoHealthKitModule>('ExpoHealthKit');\n\nfunction rethrowAsHealthKitError(error: unknown): never {\n const message = error instanceof Error ? error.message : String(error);\n const code =\n error && typeof error === 'object' && 'code' in error\n ? String((error as { code: unknown }).code)\n : 'ERR_HEALTHKIT';\n const wrapped = new HealthKitError(message, code);\n if (__DEV__) {\n console.warn(`[expo-healthkit] ${code}: ${message}`);\n }\n throw wrapped;\n}\n\nexport default new Proxy(nativeModule, {\n get(target, property, receiver) {\n const value = Reflect.get(target, property, receiver) as unknown;\n if (typeof value !== 'function') {\n return value;\n }\n return (...args: unknown[]) => {\n try {\n const result = (value as (...inner: unknown[]) => unknown).apply(target, args);\n if (result instanceof Promise) {\n return result.catch(rethrowAsHealthKitError);\n }\n return result;\n } catch (error) {\n rethrowAsHealthKitError(error);\n }\n };\n },\n}) as ExpoHealthKitModule;\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { NativeModule } from 'expo';
|
|
2
|
+
import type { ExpoHealthKitModuleEvents } from './types';
|
|
3
|
+
declare class ExpoHealthKitModule extends NativeModule<ExpoHealthKitModuleEvents> {
|
|
4
|
+
isHealthDataAvailable(): boolean;
|
|
5
|
+
requestAuthorization(): Promise<boolean>;
|
|
6
|
+
getAuthorizationStatus(): Promise<number>;
|
|
7
|
+
getRequestStatusForAuthorization(): Promise<number>;
|
|
8
|
+
queryQuantitySamples(): Promise<never>;
|
|
9
|
+
queryCategorySamples(): Promise<never>;
|
|
10
|
+
queryWorkouts(): Promise<never>;
|
|
11
|
+
queryElectrocardiograms(): Promise<never>;
|
|
12
|
+
queryActivitySummaries(): Promise<never>;
|
|
13
|
+
queryClinicalRecords(): Promise<never>;
|
|
14
|
+
queryAudiograms(): Promise<never>;
|
|
15
|
+
queryWorkoutRoute(): Promise<never>;
|
|
16
|
+
queryCorrelations(): Promise<never>;
|
|
17
|
+
queryHeartbeatSeries(): Promise<never>;
|
|
18
|
+
queryStatistics(): Promise<never>;
|
|
19
|
+
queryStatisticsCollection(): Promise<never>;
|
|
20
|
+
queryAnchored(): Promise<never>;
|
|
21
|
+
saveQuantitySample(): Promise<string>;
|
|
22
|
+
saveCategorySample(): Promise<string>;
|
|
23
|
+
saveWorkout(): Promise<string>;
|
|
24
|
+
saveCorrelation(): Promise<string>;
|
|
25
|
+
deleteObjects(): Promise<number>;
|
|
26
|
+
getBiologicalSex(): Promise<number>;
|
|
27
|
+
getBloodType(): Promise<number>;
|
|
28
|
+
getDateOfBirth(): Promise<string | null>;
|
|
29
|
+
getFitzpatrickSkinType(): Promise<number>;
|
|
30
|
+
getWheelchairUse(): Promise<number>;
|
|
31
|
+
enableBackgroundDelivery(): Promise<boolean>;
|
|
32
|
+
disableBackgroundDelivery(): Promise<boolean>;
|
|
33
|
+
disableAllBackgroundDelivery(): Promise<boolean>;
|
|
34
|
+
observeTypes(): Promise<void>;
|
|
35
|
+
clearObserverQueries(): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
declare const _default: typeof ExpoHealthKitModule;
|
|
38
|
+
export default _default;
|
|
39
|
+
//# sourceMappingURL=ExpoHealthKitModule.web.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExpoHealthKitModule.web.d.ts","sourceRoot":"","sources":["../src/ExpoHealthKitModule.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,MAAM,CAAC;AAGvD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAMzD,cAAM,mBAAoB,SAAQ,YAAY,CAAC,yBAAyB,CAAC;IACvE,qBAAqB,IAAI,OAAO;IAI1B,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IAIxC,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIzC,gCAAgC,IAAI,OAAO,CAAC,MAAM,CAAC;IAInD,oBAAoB,IAAI,OAAO,CAAC,KAAK,CAAC;IAItC,oBAAoB,IAAI,OAAO,CAAC,KAAK,CAAC;IAItC,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC;IAI/B,uBAAuB,IAAI,OAAO,CAAC,KAAK,CAAC;IAIzC,sBAAsB,IAAI,OAAO,CAAC,KAAK,CAAC;IAIxC,oBAAoB,IAAI,OAAO,CAAC,KAAK,CAAC;IAItC,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;IAIjC,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC;IAInC,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC;IAInC,oBAAoB,IAAI,OAAO,CAAC,KAAK,CAAC;IAItC,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;IAIjC,yBAAyB,IAAI,OAAO,CAAC,KAAK,CAAC;IAI3C,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC;IAI/B,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIrC,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIrC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAI9B,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAIlC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAIhC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAI/B,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIzC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC,wBAAwB,IAAI,OAAO,CAAC,OAAO,CAAC;IAI5C,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC;IAI7C,4BAA4B,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5C;;AAED,wBAA6E"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { NativeModule, registerWebModule } from 'expo';
|
|
2
|
+
import { HealthKitUnavailableError } from './errors';
|
|
3
|
+
function unavailable() {
|
|
4
|
+
throw new HealthKitUnavailableError();
|
|
5
|
+
}
|
|
6
|
+
class ExpoHealthKitModule extends NativeModule {
|
|
7
|
+
isHealthDataAvailable() {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
async requestAuthorization() {
|
|
11
|
+
return unavailable();
|
|
12
|
+
}
|
|
13
|
+
async getAuthorizationStatus() {
|
|
14
|
+
return unavailable();
|
|
15
|
+
}
|
|
16
|
+
async getRequestStatusForAuthorization() {
|
|
17
|
+
return unavailable();
|
|
18
|
+
}
|
|
19
|
+
async queryQuantitySamples() {
|
|
20
|
+
return unavailable();
|
|
21
|
+
}
|
|
22
|
+
async queryCategorySamples() {
|
|
23
|
+
return unavailable();
|
|
24
|
+
}
|
|
25
|
+
async queryWorkouts() {
|
|
26
|
+
return unavailable();
|
|
27
|
+
}
|
|
28
|
+
async queryElectrocardiograms() {
|
|
29
|
+
return unavailable();
|
|
30
|
+
}
|
|
31
|
+
async queryActivitySummaries() {
|
|
32
|
+
return unavailable();
|
|
33
|
+
}
|
|
34
|
+
async queryClinicalRecords() {
|
|
35
|
+
return unavailable();
|
|
36
|
+
}
|
|
37
|
+
async queryAudiograms() {
|
|
38
|
+
return unavailable();
|
|
39
|
+
}
|
|
40
|
+
async queryWorkoutRoute() {
|
|
41
|
+
return unavailable();
|
|
42
|
+
}
|
|
43
|
+
async queryCorrelations() {
|
|
44
|
+
return unavailable();
|
|
45
|
+
}
|
|
46
|
+
async queryHeartbeatSeries() {
|
|
47
|
+
return unavailable();
|
|
48
|
+
}
|
|
49
|
+
async queryStatistics() {
|
|
50
|
+
return unavailable();
|
|
51
|
+
}
|
|
52
|
+
async queryStatisticsCollection() {
|
|
53
|
+
return unavailable();
|
|
54
|
+
}
|
|
55
|
+
async queryAnchored() {
|
|
56
|
+
return unavailable();
|
|
57
|
+
}
|
|
58
|
+
async saveQuantitySample() {
|
|
59
|
+
return unavailable();
|
|
60
|
+
}
|
|
61
|
+
async saveCategorySample() {
|
|
62
|
+
return unavailable();
|
|
63
|
+
}
|
|
64
|
+
async saveWorkout() {
|
|
65
|
+
return unavailable();
|
|
66
|
+
}
|
|
67
|
+
async saveCorrelation() {
|
|
68
|
+
return unavailable();
|
|
69
|
+
}
|
|
70
|
+
async deleteObjects() {
|
|
71
|
+
return unavailable();
|
|
72
|
+
}
|
|
73
|
+
async getBiologicalSex() {
|
|
74
|
+
return unavailable();
|
|
75
|
+
}
|
|
76
|
+
async getBloodType() {
|
|
77
|
+
return unavailable();
|
|
78
|
+
}
|
|
79
|
+
async getDateOfBirth() {
|
|
80
|
+
return unavailable();
|
|
81
|
+
}
|
|
82
|
+
async getFitzpatrickSkinType() {
|
|
83
|
+
return unavailable();
|
|
84
|
+
}
|
|
85
|
+
async getWheelchairUse() {
|
|
86
|
+
return unavailable();
|
|
87
|
+
}
|
|
88
|
+
async enableBackgroundDelivery() {
|
|
89
|
+
return unavailable();
|
|
90
|
+
}
|
|
91
|
+
async disableBackgroundDelivery() {
|
|
92
|
+
return unavailable();
|
|
93
|
+
}
|
|
94
|
+
async disableAllBackgroundDelivery() {
|
|
95
|
+
return unavailable();
|
|
96
|
+
}
|
|
97
|
+
async observeTypes() {
|
|
98
|
+
return unavailable();
|
|
99
|
+
}
|
|
100
|
+
async clearObserverQueries() {
|
|
101
|
+
return unavailable();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export default registerWebModule(ExpoHealthKitModule, 'ExpoHealthKitModule');
|
|
105
|
+
//# sourceMappingURL=ExpoHealthKitModule.web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExpoHealthKitModule.web.js","sourceRoot":"","sources":["../src/ExpoHealthKitModule.web.ts"],"names":[],"mappings":"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","sourcesContent":["import { NativeModule, registerWebModule } from 'expo';\n\nimport { HealthKitUnavailableError } from './errors';\nimport type { ExpoHealthKitModuleEvents } from './types';\n\nfunction unavailable(): never {\n throw new HealthKitUnavailableError();\n}\n\nclass ExpoHealthKitModule extends NativeModule<ExpoHealthKitModuleEvents> {\n isHealthDataAvailable(): boolean {\n return false;\n }\n\n async requestAuthorization(): Promise<boolean> {\n return unavailable();\n }\n\n async getAuthorizationStatus(): Promise<number> {\n return unavailable();\n }\n\n async getRequestStatusForAuthorization(): Promise<number> {\n return unavailable();\n }\n\n async queryQuantitySamples(): Promise<never> {\n return unavailable();\n }\n\n async queryCategorySamples(): Promise<never> {\n return unavailable();\n }\n\n async queryWorkouts(): Promise<never> {\n return unavailable();\n }\n\n async queryElectrocardiograms(): Promise<never> {\n return unavailable();\n }\n\n async queryActivitySummaries(): Promise<never> {\n return unavailable();\n }\n\n async queryClinicalRecords(): Promise<never> {\n return unavailable();\n }\n\n async queryAudiograms(): Promise<never> {\n return unavailable();\n }\n\n async queryWorkoutRoute(): Promise<never> {\n return unavailable();\n }\n\n async queryCorrelations(): Promise<never> {\n return unavailable();\n }\n\n async queryHeartbeatSeries(): Promise<never> {\n return unavailable();\n }\n\n async queryStatistics(): Promise<never> {\n return unavailable();\n }\n\n async queryStatisticsCollection(): Promise<never> {\n return unavailable();\n }\n\n async queryAnchored(): Promise<never> {\n return unavailable();\n }\n\n async saveQuantitySample(): Promise<string> {\n return unavailable();\n }\n\n async saveCategorySample(): Promise<string> {\n return unavailable();\n }\n\n async saveWorkout(): Promise<string> {\n return unavailable();\n }\n\n async saveCorrelation(): Promise<string> {\n return unavailable();\n }\n\n async deleteObjects(): Promise<number> {\n return unavailable();\n }\n\n async getBiologicalSex(): Promise<number> {\n return unavailable();\n }\n\n async getBloodType(): Promise<number> {\n return unavailable();\n }\n\n async getDateOfBirth(): Promise<string | null> {\n return unavailable();\n }\n\n async getFitzpatrickSkinType(): Promise<number> {\n return unavailable();\n }\n\n async getWheelchairUse(): Promise<number> {\n return unavailable();\n }\n\n async enableBackgroundDelivery(): Promise<boolean> {\n return unavailable();\n }\n\n async disableBackgroundDelivery(): Promise<boolean> {\n return unavailable();\n }\n\n async disableAllBackgroundDelivery(): Promise<boolean> {\n return unavailable();\n }\n\n async observeTypes(): Promise<void> {\n return unavailable();\n }\n\n async clearObserverQueries(): Promise<void> {\n return unavailable();\n }\n}\n\nexport default registerWebModule(ExpoHealthKitModule, 'ExpoHealthKitModule');\n"]}
|
package/build/dates.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { DateInput } from './types';
|
|
2
|
+
export declare function toIso(value: DateInput): string;
|
|
3
|
+
export declare function toOptionalIso(value?: DateInput): string | undefined;
|
|
4
|
+
export declare function fromIso(value: string): Date;
|
|
5
|
+
export declare function resolveEndDate(startDate: DateInput, endDate?: DateInput): string;
|
|
6
|
+
//# sourceMappingURL=dates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../src/dates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,wBAAgB,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAE9C;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAEnE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAEhF"}
|
package/build/dates.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function toIso(value) {
|
|
2
|
+
return value instanceof Date ? value.toISOString() : value;
|
|
3
|
+
}
|
|
4
|
+
export function toOptionalIso(value) {
|
|
5
|
+
return value == null ? undefined : toIso(value);
|
|
6
|
+
}
|
|
7
|
+
export function fromIso(value) {
|
|
8
|
+
return new Date(value);
|
|
9
|
+
}
|
|
10
|
+
export function resolveEndDate(startDate, endDate) {
|
|
11
|
+
return toIso(endDate ?? startDate);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=dates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dates.js","sourceRoot":"","sources":["../src/dates.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,KAAK,CAAC,KAAgB;IACpC,OAAO,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAiB;IAC7C,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAoB,EAAE,OAAmB;IACtE,OAAO,KAAK,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;AACrC,CAAC","sourcesContent":["import type { DateInput } from './types';\n\nexport function toIso(value: DateInput): string {\n return value instanceof Date ? value.toISOString() : value;\n}\n\nexport function toOptionalIso(value?: DateInput): string | undefined {\n return value == null ? undefined : toIso(value);\n}\n\nexport function fromIso(value: string): Date {\n return new Date(value);\n}\n\nexport function resolveEndDate(startDate: DateInput, endDate?: DateInput): string {\n return toIso(endDate ?? startDate);\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class HealthKitUnavailableError extends Error {
|
|
2
|
+
readonly code = "ERR_HEALTHKIT_UNAVAILABLE";
|
|
3
|
+
constructor(message?: string);
|
|
4
|
+
}
|
|
5
|
+
export declare class HealthKitError extends Error {
|
|
6
|
+
readonly code: string;
|
|
7
|
+
constructor(message: string, code?: string);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,+BAA+B;gBAG1C,OAAO,SAA2K;CAMrL;AAED,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,OAAO,EAAE,MAAM,EAAE,IAAI,SAAkB;CAMpD"}
|
package/build/errors.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export class HealthKitUnavailableError extends Error {
|
|
2
|
+
code = 'ERR_HEALTHKIT_UNAVAILABLE';
|
|
3
|
+
constructor(message = 'Health data is not available. On iOS use a development build on a physical iPhone or the iOS Simulator. On Android install Health Connect and use a development build.') {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = 'HealthKitUnavailableError';
|
|
6
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export class HealthKitError extends Error {
|
|
10
|
+
code;
|
|
11
|
+
constructor(message, code = 'ERR_HEALTHKIT') {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = 'HealthKitError';
|
|
14
|
+
this.code = code;
|
|
15
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACzC,IAAI,GAAG,2BAA2B,CAAC;IAE5C,YACE,OAAO,GAAG,wKAAwK;QAElL,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,IAAI,CAAS;IAEtB,YAAY,OAAe,EAAE,IAAI,GAAG,eAAe;QACjD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF","sourcesContent":["export class HealthKitUnavailableError extends Error {\n readonly code = 'ERR_HEALTHKIT_UNAVAILABLE';\n\n constructor(\n message = 'Health data is not available. On iOS use a development build on a physical iPhone or the iOS Simulator. On Android install Health Connect and use a development build.'\n ) {\n super(message);\n this.name = 'HealthKitUnavailableError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class HealthKitError extends Error {\n readonly code: string;\n\n constructor(message: string, code = 'ERR_HEALTHKIT') {\n super(message);\n this.name = 'HealthKitError';\n this.code = code;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n"]}
|