@appeeky/expo-healthkit 0.1.0 → 0.2.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/.releaserc.json +22 -0
- package/CHANGELOG.md +15 -1
- package/README.md +30 -6
- package/android/src/main/java/expo/modules/healthkit/ExpoHealthKitModule.kt +8 -0
- package/android/src/main/java/expo/modules/healthkit/HealthConnectService.kt +39 -10
- package/build/ExpoHealthKitModule.d.ts +2 -0
- package/build/ExpoHealthKitModule.d.ts.map +1 -1
- package/build/ExpoHealthKitModule.js.map +1 -1
- package/build/ExpoHealthKitModule.web.d.ts +2 -0
- package/build/ExpoHealthKitModule.web.d.ts.map +1 -1
- package/build/ExpoHealthKitModule.web.js +4 -0
- package/build/ExpoHealthKitModule.web.js.map +1 -1
- package/build/index.d.ts +13 -5
- package/build/index.d.ts.map +1 -1
- package/build/index.js +61 -3
- package/build/index.js.map +1 -1
- package/build/types.d.ts +11 -1
- package/build/types.d.ts.map +1 -1
- package/build/types.js.map +1 -1
- package/expo-module.config.json +2 -1
- package/ios/ExpoHealthKitModule.swift +22 -9
- package/ios/HealthKitAppDelegateSubscriber.swift +14 -0
- package/ios/HealthKitObserverCenter.swift +199 -0
- package/ios/HealthKitService.swift +0 -28
- package/package.json +5 -1
- package/src/ExpoHealthKitModule.ts +2 -1
- package/src/ExpoHealthKitModule.web.ts +6 -0
- package/src/index.ts +72 -5
- package/src/types.ts +13 -1
package/.releaserc.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"branches": ["main"],
|
|
3
|
+
"plugins": [
|
|
4
|
+
"@semantic-release/commit-analyzer",
|
|
5
|
+
"@semantic-release/release-notes-generator",
|
|
6
|
+
[
|
|
7
|
+
"@semantic-release/changelog",
|
|
8
|
+
{
|
|
9
|
+
"changelogFile": "CHANGELOG.md"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"@semantic-release/npm",
|
|
13
|
+
"@semantic-release/github",
|
|
14
|
+
[
|
|
15
|
+
"@semantic-release/git",
|
|
16
|
+
{
|
|
17
|
+
"assets": ["CHANGELOG.md", "package.json", "package-lock.json"],
|
|
18
|
+
"message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
]
|
|
22
|
+
}
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
# [0.2.0](https://github.com/appeeky/expo-healthkit/compare/v0.1.1...v0.2.0) (2026-09-09)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **ios:** deliver HealthKit background updates before JS starts and hold the completion handler ([6ac0e6f](https://github.com/appeeky/expo-healthkit/commit/6ac0e6fde217940f3e89a7cd5ff64c68a12a0b2b))
|
|
7
|
+
|
|
8
|
+
## [0.1.1](https://github.com/appeeky/expo-healthkit/compare/v0.1.0...v0.1.1) (2026-09-05)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* use local datetime for Health Connect daily statistics ([d01e776](https://github.com/appeeky/expo-healthkit/commit/d01e776398fb7f45b2b4c0401593a871f03bb700))
|
|
14
|
+
|
|
1
15
|
# Changelog
|
|
2
16
|
|
|
3
17
|
## 0.1.0
|
|
@@ -22,5 +36,5 @@
|
|
|
22
36
|
- Published as [`@appeeky/expo-healthkit`](https://www.npmjs.com/package/@appeeky/expo-healthkit)
|
|
23
37
|
- npm-ready `exports`, `.npmignore`, and `prepublishOnly` build
|
|
24
38
|
- App Store privacy manifest (`PrivacyInfo.xcprivacy`)
|
|
25
|
-
- GitHub Actions for lint, typecheck, tests with coverage thresholds, and
|
|
39
|
+
- GitHub Actions for lint, typecheck, tests with coverage thresholds, pack contents, and automated semver releases to npm
|
|
26
40
|
- [PolyForm Shield 1.0.0](./LICENSE) (source-available; apps may use the SDK, competing SDKs may not)
|
package/README.md
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
<img width="1024" height="725" alt="image" src="https://github.com/user-attachments/assets/fadcd831-4187-42b1-b03b-3228ab2d8f32" />
|
|
2
|
+
|
|
2
3
|
|
|
3
4
|
# @appeeky/expo-healthkit
|
|
4
5
|
|
|
@@ -251,8 +252,10 @@ await HealthKit.deleteObjects({
|
|
|
251
252
|
```ts
|
|
252
253
|
await HealthKit.observe([HealthKit.QuantityType.stepCount]);
|
|
253
254
|
|
|
254
|
-
const subscription = HealthKit.addUpdateListener(({ type }) => {
|
|
255
|
-
// Re-query that type
|
|
255
|
+
const subscription = HealthKit.addUpdateListener(async ({ type }) => {
|
|
256
|
+
// Re-query that type. Return a promise: iOS keeps the app alive and holds
|
|
257
|
+
// the HealthKit completion handler until it settles (~25s cap).
|
|
258
|
+
await syncSteps();
|
|
256
259
|
});
|
|
257
260
|
|
|
258
261
|
await HealthKit.enableBackgroundDelivery(
|
|
@@ -265,6 +268,12 @@ await HealthKit.enableBackgroundDelivery(
|
|
|
265
268
|
|
|
266
269
|
Background delivery needs `isBackgroundDeliveryEnabled: true` on the config plugin and the HealthKit background mode.
|
|
267
270
|
|
|
271
|
+
**Killed-app relaunch.** Types passed to `observe` are persisted natively. When iOS relaunches the app in the background for a HealthKit delivery, the observer queries are re-registered in `didFinishLaunching` (via an Expo AppDelegate subscriber), before the JS runtime boots. The delivery is queued until JS calls `addUpdateListener`, then dispatched. Register your listener at module scope (or early in the root component) so it exists on cold start; `getObservedTypes()` tells you what is already being observed. `clearObservers()` stops and forgets them.
|
|
272
|
+
|
|
273
|
+
**Apple limits.** Step count, distance, energy, exercise/stand time and similar activity types are delivered at most **once per hour** regardless of `UpdateFrequency`; heart rate, sleep, workouts and body measurements are not capped. Each delivery gets ~30 s of background time; the library completes at 25 s if your listener hasn't. The Simulator never relaunches a killed app for HealthKit — test on a device.
|
|
274
|
+
|
|
275
|
+
**Debugging.** Native logs are under the `expo-healthkit` `os_log` subsystem (`restore`, `delivery`, `complete reason=js|timeout`). Full guide with a device test recipe: [`.cursor/skills/expo-healthkit/background-delivery.md`](.cursor/skills/expo-healthkit/background-delivery.md).
|
|
276
|
+
|
|
268
277
|
## 🏷️ Identifiers
|
|
269
278
|
|
|
270
279
|
Pass Apple's raw identifier strings. Named constants are provided for autocomplete; unknown identifiers still work if HealthKit knows them.
|
|
@@ -334,7 +343,7 @@ These throw `ERR_HEALTH_CONNECT_UNSUPPORTED` on Android. Health Connect has no e
|
|
|
334
343
|
| `queryWorkoutRoute` | Workout GPS polylines |
|
|
335
344
|
| `queryHeartbeatSeries` | Beat-to-beat series |
|
|
336
345
|
| `getBiologicalSex`, `getBloodType`, `getDateOfBirth`, `getFitzpatrickSkinType`, `getWheelchairUse` | HealthKit characteristics |
|
|
337
|
-
| `observe`, `enableBackgroundDelivery` | HealthKit observer queries / background delivery |
|
|
346
|
+
| `observe`, `getObservedTypes`, `enableBackgroundDelivery` | HealthKit observer queries / background delivery |
|
|
338
347
|
|
|
339
348
|
### Behavioral differences
|
|
340
349
|
|
|
@@ -395,6 +404,21 @@ Copy [`.cursor/skills/expo-healthkit/`](https://github.com/appeeky/expo-healthki
|
|
|
395
404
|
|
|
396
405
|
The skill tells the agent to pass Apple identifier strings through one query/save API on iOS and Android, request every type in `toRead`, and rebuild native code after Swift, Kotlin, or plugin changes.
|
|
397
406
|
|
|
407
|
+
## 🚀 Releases
|
|
408
|
+
|
|
409
|
+
Versions follow [semver](https://semver.org/). Pushing to `main` with a [Conventional Commit](https://www.conventionalcommits.org/) runs `.github/workflows/release.yml`: bump `package.json`, update `CHANGELOG.md`, GitHub Release, and `npm publish`.
|
|
410
|
+
|
|
411
|
+
| Commit | npm bump |
|
|
412
|
+
| --- | --- |
|
|
413
|
+
| `fix: …` | patch (`0.1.0` → `0.1.1`) |
|
|
414
|
+
| `feat: …` | minor (`0.1.0` → `0.2.0`) |
|
|
415
|
+
| `feat!: …` or `BREAKING CHANGE:` in the body | major (`0.1.0` → `1.0.0`) |
|
|
416
|
+
| `docs:`, `chore:`, `ci:`, `test:` | no release |
|
|
417
|
+
|
|
418
|
+
Squash-merge PRs so the merge commit (or PR title) starts with `fix:` / `feat:`. `chore:` and `ci:` do not publish.
|
|
419
|
+
|
|
420
|
+
npm publishes from GitHub Actions via [trusted publishing](https://docs.npmjs.com/trusted-publishers) (no `NPM_TOKEN`). One-time setup: package Settings → Trusted Publisher → GitHub Actions, repository `appeeky/expo-healthkit`, workflow filename `release.yml`, and allow **`npm publish`** (not only staged publish).
|
|
421
|
+
|
|
398
422
|
## 🤝 Contributing
|
|
399
423
|
|
|
400
424
|
Issues and pull requests are welcome. Contributions are licensed under [PolyForm Shield 1.0.0](./LICENSE).
|
|
@@ -438,7 +462,7 @@ npx expo run:android
|
|
|
438
462
|
|
|
439
463
|
### Docs
|
|
440
464
|
|
|
441
|
-
If the public API or Android mapping changes, update `README.md
|
|
465
|
+
If the public API or Android mapping changes, update `README.md` and `.cursor/skills/expo-healthkit/` (`SKILL.md`, `reference.md`, `examples.md`) in the same PR. `CHANGELOG.md` is generated on release from conventional commits.
|
|
442
466
|
|
|
443
467
|
## 🔒 Privacy
|
|
444
468
|
|
|
@@ -450,4 +474,4 @@ Health data stays on-device unless your app uploads it. Request only the types y
|
|
|
450
474
|
|
|
451
475
|
You **can** install and use this SDK inside your own Expo / React Native apps, including commercial products.
|
|
452
476
|
|
|
453
|
-
You **cannot** copy this SDK and sell, publish, or otherwise offer a competing HealthKit / Health Connect library based on it.
|
|
477
|
+
You **cannot** copy this SDK and sell, publish, or otherwise offer a competing HealthKit / Health Connect library based on it.
|
|
@@ -169,6 +169,14 @@ class ExpoHealthKitModule : Module() {
|
|
|
169
169
|
AsyncFunction("clearObserverQueries") {
|
|
170
170
|
Unit
|
|
171
171
|
}
|
|
172
|
+
|
|
173
|
+
AsyncFunction("getObservedTypes") {
|
|
174
|
+
emptyList<String>()
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
AsyncFunction("completeUpdate") { _: String ->
|
|
178
|
+
Unit
|
|
179
|
+
}
|
|
172
180
|
}
|
|
173
181
|
|
|
174
182
|
private suspend fun requestHealthPermissions(permissions: Set<String>): Set<String> {
|
|
@@ -47,6 +47,7 @@ import androidx.health.connect.client.units.Temperature
|
|
|
47
47
|
import androidx.health.connect.client.units.Volume
|
|
48
48
|
import java.time.Duration
|
|
49
49
|
import java.time.Instant
|
|
50
|
+
import java.time.LocalDateTime
|
|
50
51
|
import java.time.Period
|
|
51
52
|
import java.time.ZoneId
|
|
52
53
|
import java.time.ZoneOffset
|
|
@@ -124,9 +125,9 @@ internal class HealthConnectService(
|
|
|
124
125
|
HealthConnectMapping.SLEEP -> {
|
|
125
126
|
val sessions = readAll(SleepSessionRecord::class, filter, ascending, 0)
|
|
126
127
|
val samples = sessions.flatMap { session -> sleepSamples(session) }
|
|
127
|
-
applyLimit(
|
|
128
|
+
applyLimit(sortSamples(samples, ascending), limit)
|
|
128
129
|
}
|
|
129
|
-
else -> throw
|
|
130
|
+
else -> throw HealthConnectUnsupportedException(type)
|
|
130
131
|
}
|
|
131
132
|
}
|
|
132
133
|
|
|
@@ -205,7 +206,7 @@ internal class HealthConnectService(
|
|
|
205
206
|
correlation(record.metadata, type, record.startTime, record.endTime, objects)
|
|
206
207
|
}
|
|
207
208
|
}
|
|
208
|
-
else ->
|
|
209
|
+
else -> unmappedType(type)
|
|
209
210
|
}
|
|
210
211
|
}
|
|
211
212
|
|
|
@@ -255,7 +256,7 @@ internal class HealthConnectService(
|
|
|
255
256
|
else -> Period.ofDays(1)
|
|
256
257
|
}
|
|
257
258
|
client().aggregateGroupByPeriod(
|
|
258
|
-
AggregateGroupByPeriodRequest(metrics,
|
|
259
|
+
AggregateGroupByPeriodRequest(metrics, localTimeFilter(options), period)
|
|
259
260
|
).map { result ->
|
|
260
261
|
val start = result.startTime.atZone(ZoneId.systemDefault()).toInstant()
|
|
261
262
|
val end = result.endTime.atZone(ZoneId.systemDefault()).toInstant()
|
|
@@ -268,7 +269,7 @@ internal class HealthConnectService(
|
|
|
268
269
|
assertAvailable()
|
|
269
270
|
val type = requiredString(options, "type")
|
|
270
271
|
val unit = options["unit"] as? String ?: ""
|
|
271
|
-
val recordClass = HealthConnectMapping.recordClass(type) ?:
|
|
272
|
+
val recordClass = HealthConnectMapping.recordClass(type) ?: unmappedType(type)
|
|
272
273
|
val anchor = options["anchor"] as? String
|
|
273
274
|
val client = client()
|
|
274
275
|
if (anchor.isNullOrBlank()) {
|
|
@@ -433,7 +434,7 @@ internal class HealthConnectService(
|
|
|
433
434
|
val range = ensureRange(start, end)
|
|
434
435
|
HealthConnectNutrition.build(range.first, range.second, zoneOffset(range.first), zoneOffset(range.second), metadata(), values)
|
|
435
436
|
}
|
|
436
|
-
else ->
|
|
437
|
+
else -> unmappedType(type)
|
|
437
438
|
}
|
|
438
439
|
return client().insertRecords(listOf(record)).recordIdsList.first()
|
|
439
440
|
}
|
|
@@ -441,7 +442,7 @@ internal class HealthConnectService(
|
|
|
441
442
|
suspend fun deleteObjects(options: Map<String, Any?>): Int {
|
|
442
443
|
assertAvailable()
|
|
443
444
|
val type = options["type"] as? String ?: throw MissingDeleteTypeException()
|
|
444
|
-
val recordClass = HealthConnectMapping.recordClass(type) ?:
|
|
445
|
+
val recordClass = HealthConnectMapping.recordClass(type) ?: unmappedType(type)
|
|
445
446
|
val uuid = options["uuid"] as? String
|
|
446
447
|
val client = client()
|
|
447
448
|
if (!uuid.isNullOrBlank()) {
|
|
@@ -485,14 +486,22 @@ internal class HealthConnectService(
|
|
|
485
486
|
}
|
|
486
487
|
HealthConnectMapping.BASAL_ENERGY -> emptyList()
|
|
487
488
|
else -> {
|
|
488
|
-
val recordClass = HealthConnectMapping.recordClass(type) ?:
|
|
489
|
+
val recordClass = HealthConnectMapping.recordClass(type) ?: unmappedType(type)
|
|
489
490
|
readAll(recordClass, filter, ascending, 0).flatMap { record ->
|
|
490
491
|
quantitySamplesFromRecord(type, unit, record)
|
|
491
492
|
}
|
|
492
493
|
}
|
|
493
494
|
}
|
|
494
|
-
|
|
495
|
-
|
|
495
|
+
// `readAll` already honours `ascending` at the record level, but flattened
|
|
496
|
+
// records (heart rate series) can interleave, so sort explicitly by start date.
|
|
497
|
+
return applyLimit(sortSamples(samples, ascending), limit)
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
private fun sortSamples(samples: List<Map<String, Any?>>, ascending: Boolean): List<Map<String, Any?>> {
|
|
501
|
+
val sorted = samples.sortedBy { sample ->
|
|
502
|
+
(sample["startDate"] as? String)?.let { runCatching { Instant.parse(it) }.getOrNull() } ?: Instant.EPOCH
|
|
503
|
+
}
|
|
504
|
+
return if (ascending) sorted else sorted.reversed()
|
|
496
505
|
}
|
|
497
506
|
|
|
498
507
|
private fun quantitySamplesFromRecord(type: String, unit: String, record: Record): List<Map<String, Any?>> {
|
|
@@ -1002,6 +1011,19 @@ internal class HealthConnectService(
|
|
|
1002
1011
|
}
|
|
1003
1012
|
}
|
|
1004
1013
|
|
|
1014
|
+
private fun localTimeFilter(options: Map<String, Any?>): TimeRangeFilter {
|
|
1015
|
+
val zone = ZoneId.systemDefault()
|
|
1016
|
+
val from = (options["from"] as? String)?.let { parseInstant(it).atZone(zone).toLocalDateTime() }
|
|
1017
|
+
val to = (options["to"] as? String)?.let { parseInstant(it).atZone(zone).toLocalDateTime() }
|
|
1018
|
+
return when {
|
|
1019
|
+
from != null && to != null ->
|
|
1020
|
+
TimeRangeFilter.between(from, if (to.isAfter(from)) to else from.plusSeconds(1))
|
|
1021
|
+
from != null -> TimeRangeFilter.after(from)
|
|
1022
|
+
to != null -> TimeRangeFilter.before(to)
|
|
1023
|
+
else -> TimeRangeFilter.after(LocalDateTime.ofInstant(Instant.EPOCH, zone))
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1005
1027
|
private fun filterStart(options: Map<String, Any?>): Instant =
|
|
1006
1028
|
(options["from"] as? String)?.let { parseInstant(it) } ?: Instant.EPOCH
|
|
1007
1029
|
|
|
@@ -1026,6 +1048,13 @@ internal class HealthConnectService(
|
|
|
1026
1048
|
return start to end
|
|
1027
1049
|
}
|
|
1028
1050
|
|
|
1051
|
+
private fun unmappedType(type: String): Nothing {
|
|
1052
|
+
if (type.startsWith("HK")) {
|
|
1053
|
+
throw HealthConnectUnsupportedException(type)
|
|
1054
|
+
}
|
|
1055
|
+
throw InvalidIdentifierException(type)
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1029
1058
|
private fun requiredString(options: Map<String, Any?>, key: String): String =
|
|
1030
1059
|
options[key] as? String ?: throw InvalidIdentifierException(key)
|
|
1031
1060
|
|
|
@@ -33,6 +33,8 @@ declare class ExpoHealthKitModule extends NativeModule<ExpoHealthKitModuleEvents
|
|
|
33
33
|
disableAllBackgroundDelivery(): Promise<boolean>;
|
|
34
34
|
observeTypes(types: string[]): Promise<void>;
|
|
35
35
|
clearObserverQueries(): Promise<void>;
|
|
36
|
+
getObservedTypes(): Promise<string[]>;
|
|
37
|
+
completeUpdate(token: string): Promise<void>;
|
|
36
38
|
}
|
|
37
39
|
declare const _default: ExpoHealthKitModule;
|
|
38
40
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoHealthKitModule.d.ts","sourceRoot":"","sources":["../src/ExpoHealthKitModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuB,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ExpoHealthKitModule.d.ts","sourceRoot":"","sources":["../src/ExpoHealthKitModule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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;
|
|
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;AAiF1C,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';\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 getObservedTypes(): Promise<string[]>;\n completeUpdate(token: string): 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"]}
|
|
@@ -33,6 +33,8 @@ declare class ExpoHealthKitModule extends NativeModule<ExpoHealthKitModuleEvents
|
|
|
33
33
|
disableAllBackgroundDelivery(): Promise<boolean>;
|
|
34
34
|
observeTypes(): Promise<void>;
|
|
35
35
|
clearObserverQueries(): Promise<void>;
|
|
36
|
+
getObservedTypes(): Promise<string[]>;
|
|
37
|
+
completeUpdate(): Promise<void>;
|
|
36
38
|
}
|
|
37
39
|
declare const _default: typeof ExpoHealthKitModule;
|
|
38
40
|
export default _default;
|
|
@@ -1 +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;
|
|
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;IAIrC,gBAAgB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIrC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CACtC;;AAED,wBAA6E"}
|
|
@@ -100,6 +100,10 @@ class ExpoHealthKitModule extends NativeModule {
|
|
|
100
100
|
async clearObserverQueries() {
|
|
101
101
|
return unavailable();
|
|
102
102
|
}
|
|
103
|
+
async getObservedTypes() {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
async completeUpdate() { }
|
|
103
107
|
}
|
|
104
108
|
export default registerWebModule(ExpoHealthKitModule, 'ExpoHealthKitModule');
|
|
105
109
|
//# sourceMappingURL=ExpoHealthKitModule.web.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoHealthKitModule.web.js","sourceRoot":"","sources":["../src/ExpoHealthKitModule.web.ts"],"names":[],"mappings":"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
|
|
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 async getObservedTypes(): Promise<string[]> {\n return [];\n }\n\n async completeUpdate(): Promise<void> {}\n}\n\nexport default registerWebModule(ExpoHealthKitModule, 'ExpoHealthKitModule');\n"]}
|
package/build/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AuthorizationRequestStatus, AuthorizationStatus, BiologicalSex, BloodType, FitzpatrickSkinType, UpdateFrequency, WheelchairUse } from './identifiers';
|
|
2
|
-
import type { AnchoredQueryOptions, AnchoredQueryResult, AuthorizationOptions, CategorySample, CategorySampleInput, ClinicalRecord, ClinicalRecordQueryOptions, Correlation, CorrelationInput, CorrelationQueryOptions, DeleteObjectsOptions, ElectrocardiogramQueryOptions, ElectrocardiogramSample, ActivitySummary, ActivitySummaryQueryOptions, AudiogramSample, DateRangeQueryOptions, HeartbeatSeriesQueryOptions, HeartbeatSeriesSample, QuantityQueryOptions, QuantitySample, SampleQueryOptions, QuantitySampleInput, Statistics, StatisticsCollectionQueryOptions, StatisticsQueryOptions, WorkoutInput, WorkoutQueryOptions, WorkoutRoute, WorkoutRouteQueryOptions, WorkoutSample } from './types';
|
|
2
|
+
import type { AnchoredQueryOptions, AnchoredQueryResult, AuthorizationOptions, CategorySample, CategorySampleInput, ClinicalRecord, ClinicalRecordQueryOptions, Correlation, CorrelationInput, CorrelationQueryOptions, DeleteObjectsOptions, ElectrocardiogramQueryOptions, ElectrocardiogramSample, ActivitySummary, ActivitySummaryQueryOptions, AudiogramSample, DateRangeQueryOptions, HealthUpdateEvent, HealthUpdateListener, HeartbeatSeriesQueryOptions, HeartbeatSeriesSample, QuantityQueryOptions, QuantitySample, SampleQueryOptions, QuantitySampleInput, Statistics, StatisticsCollectionQueryOptions, StatisticsQueryOptions, WorkoutInput, WorkoutQueryOptions, WorkoutRoute, WorkoutRouteQueryOptions, WorkoutSample } from './types';
|
|
3
3
|
export * from './identifiers';
|
|
4
4
|
export * from './errors';
|
|
5
5
|
export type * from './types';
|
|
@@ -35,12 +35,19 @@ export declare function disableBackgroundDelivery(type: string): Promise<boolean
|
|
|
35
35
|
export declare function disableAllBackgroundDelivery(): Promise<boolean>;
|
|
36
36
|
export declare function observe(types: readonly string[]): Promise<void>;
|
|
37
37
|
export declare function clearObservers(): Promise<void>;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
/**
|
|
39
|
+
* Types currently registered with `observe`. Persisted natively on iOS, so it
|
|
40
|
+
* reflects observers re-registered at cold launch too.
|
|
41
|
+
*/
|
|
42
|
+
export declare function getObservedTypes(): Promise<string[]>;
|
|
43
|
+
/**
|
|
44
|
+
* Subscribe to observer / background-delivery updates. Return a promise from the
|
|
45
|
+
* listener to hold the iOS completion handler until your async work is done.
|
|
46
|
+
*/
|
|
47
|
+
export declare function addUpdateListener(listener: HealthUpdateListener): {
|
|
41
48
|
remove(): void;
|
|
42
49
|
};
|
|
43
|
-
export declare function useHealthKitUpdates():
|
|
50
|
+
export declare function useHealthKitUpdates(): HealthUpdateEvent | null;
|
|
44
51
|
declare const HealthKit: {
|
|
45
52
|
isAvailable: typeof isAvailable;
|
|
46
53
|
requestAuthorization: typeof requestAuthorization;
|
|
@@ -74,6 +81,7 @@ declare const HealthKit: {
|
|
|
74
81
|
disableAllBackgroundDelivery: typeof disableAllBackgroundDelivery;
|
|
75
82
|
observe: typeof observe;
|
|
76
83
|
clearObservers: typeof clearObservers;
|
|
84
|
+
getObservedTypes: typeof getObservedTypes;
|
|
77
85
|
addUpdateListener: typeof addUpdateListener;
|
|
78
86
|
useHealthKitUpdates: typeof useHealthKitUpdates;
|
|
79
87
|
QuantityType: {
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,aAAa,EACb,SAAS,EAWT,mBAAmB,EAKnB,eAAe,EACf,aAAa,EAGd,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,0BAA0B,EAC1B,WAAW,EACX,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,6BAA6B,EAC7B,uBAAuB,EACvB,eAAe,EACf,2BAA2B,EAC3B,eAAe,EACf,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/build/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
2
|
import { Platform } from 'react-native';
|
|
3
3
|
import ExpoHealthKitModule from './ExpoHealthKitModule';
|
|
4
4
|
import { fromIso, resolveEndDate, toIso, toOptionalIso } from './dates';
|
|
@@ -349,11 +349,68 @@ export async function clearObservers() {
|
|
|
349
349
|
assertAvailable();
|
|
350
350
|
await ExpoHealthKitModule.clearObserverQueries();
|
|
351
351
|
}
|
|
352
|
+
/**
|
|
353
|
+
* Types currently registered with `observe`. Persisted natively on iOS, so it
|
|
354
|
+
* reflects observers re-registered at cold launch too.
|
|
355
|
+
*/
|
|
356
|
+
export async function getObservedTypes() {
|
|
357
|
+
if (!isAvailable())
|
|
358
|
+
return [];
|
|
359
|
+
return ExpoHealthKitModule.getObservedTypes();
|
|
360
|
+
}
|
|
361
|
+
const updateListeners = new Set();
|
|
362
|
+
let nativeUpdateSubscription = null;
|
|
363
|
+
function runListener(listener, event) {
|
|
364
|
+
try {
|
|
365
|
+
return Promise.resolve(listener(event));
|
|
366
|
+
}
|
|
367
|
+
catch (error) {
|
|
368
|
+
return Promise.reject(error);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
function handleNativeUpdate(nativeEvent) {
|
|
372
|
+
const { token, type } = nativeEvent;
|
|
373
|
+
const event = { type };
|
|
374
|
+
const results = [...updateListeners].map((listener) => runListener(listener, event));
|
|
375
|
+
Promise.allSettled(results).then((settled) => {
|
|
376
|
+
if (__DEV__) {
|
|
377
|
+
for (const result of settled) {
|
|
378
|
+
if (result.status === 'rejected') {
|
|
379
|
+
console.warn('[expo-healthkit] update listener threw', result.reason);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
if (token) {
|
|
384
|
+
ExpoHealthKitModule.completeUpdate(token).catch(() => { });
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Subscribe to observer / background-delivery updates. Return a promise from the
|
|
390
|
+
* listener to hold the iOS completion handler until your async work is done.
|
|
391
|
+
*/
|
|
352
392
|
export function addUpdateListener(listener) {
|
|
353
|
-
|
|
393
|
+
updateListeners.add(listener);
|
|
394
|
+
if (!nativeUpdateSubscription) {
|
|
395
|
+
nativeUpdateSubscription = ExpoHealthKitModule.addListener('onUpdate', handleNativeUpdate);
|
|
396
|
+
}
|
|
397
|
+
return {
|
|
398
|
+
remove() {
|
|
399
|
+
updateListeners.delete(listener);
|
|
400
|
+
if (updateListeners.size === 0 && nativeUpdateSubscription) {
|
|
401
|
+
nativeUpdateSubscription.remove();
|
|
402
|
+
nativeUpdateSubscription = null;
|
|
403
|
+
}
|
|
404
|
+
},
|
|
405
|
+
};
|
|
354
406
|
}
|
|
355
407
|
export function useHealthKitUpdates() {
|
|
356
|
-
|
|
408
|
+
const [event, setEvent] = useState(null);
|
|
409
|
+
useEffect(() => {
|
|
410
|
+
const subscription = addUpdateListener((next) => setEvent(next));
|
|
411
|
+
return () => subscription.remove();
|
|
412
|
+
}, []);
|
|
413
|
+
return event;
|
|
357
414
|
}
|
|
358
415
|
const HealthKit = {
|
|
359
416
|
isAvailable,
|
|
@@ -388,6 +445,7 @@ const HealthKit = {
|
|
|
388
445
|
disableAllBackgroundDelivery,
|
|
389
446
|
observe,
|
|
390
447
|
clearObservers,
|
|
448
|
+
getObservedTypes,
|
|
391
449
|
addUpdateListener,
|
|
392
450
|
useHealthKitUpdates,
|
|
393
451
|
QuantityType,
|