@kingstinct/react-native-healthkit 8.5.0 → 8.7.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/ios/Helpers.swift +145 -0
- package/ios/ReactNativeHealthkit.m +19 -0
- package/ios/ReactNativeHealthkit.swift +219 -25
- package/lib/commonjs/hooks/useHealthkitAuthorization.test.js +1 -2
- package/lib/commonjs/hooks/useHealthkitAuthorization.test.js.map +1 -1
- package/lib/commonjs/hooks/useIsHealthDataAvailable.test.js +1 -2
- package/lib/commonjs/hooks/useIsHealthDataAvailable.test.js.map +1 -1
- package/lib/commonjs/index.ios.js +29 -3
- package/lib/commonjs/index.ios.js.map +1 -1
- package/lib/commonjs/index.js +1 -2
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.native.js +10 -1
- package/lib/commonjs/index.native.js.map +1 -1
- package/lib/commonjs/index.web.js +1 -2
- package/lib/commonjs/index.web.js.map +1 -1
- package/lib/commonjs/native-types.js +727 -5
- package/lib/commonjs/native-types.js.map +1 -1
- package/lib/commonjs/test-setup.js +4 -1
- package/lib/commonjs/test-setup.js.map +1 -1
- package/lib/commonjs/utils/deleteWorkoutSample.js +11 -0
- package/lib/commonjs/utils/deleteWorkoutSample.js.map +1 -0
- package/lib/commonjs/utils/deserializeCategorySample.test.js +1 -2
- package/lib/commonjs/utils/deserializeCategorySample.test.js.map +1 -1
- package/lib/commonjs/utils/getPreferredUnitsTyped.js +1 -2
- package/lib/commonjs/utils/getPreferredUnitsTyped.js.map +1 -1
- package/lib/commonjs/utils/saveStateOfMindSample.js +17 -0
- package/lib/commonjs/utils/saveStateOfMindSample.js.map +1 -0
- package/lib/commonjs/utils/subscribeToChanges.js +1 -2
- package/lib/commonjs/utils/subscribeToChanges.js.map +1 -1
- package/lib/commonjs/utils/workoutSessionMirroringStartHandler.js +17 -0
- package/lib/commonjs/utils/workoutSessionMirroringStartHandler.js.map +1 -0
- package/lib/module/index.ios.js +7 -1
- package/lib/module/index.ios.js.map +1 -1
- package/lib/module/index.native.js +7 -1
- package/lib/module/index.native.js.map +1 -1
- package/lib/module/native-types.js +727 -4
- package/lib/module/native-types.js.map +1 -1
- package/lib/module/test-setup.js +4 -1
- package/lib/module/test-setup.js.map +1 -1
- package/lib/module/utils/deleteWorkoutSample.js +4 -0
- package/lib/module/utils/deleteWorkoutSample.js.map +1 -0
- package/lib/module/utils/saveStateOfMindSample.js +10 -0
- package/lib/module/utils/saveStateOfMindSample.js.map +1 -0
- package/lib/module/utils/subscribeToChanges.js.map +1 -1
- package/lib/module/utils/workoutSessionMirroringStartHandler.js +11 -0
- package/lib/module/utils/workoutSessionMirroringStartHandler.js.map +1 -0
- package/lib/typescript/src/index.ios.d.ts +14 -8
- package/lib/typescript/src/index.native.d.ts +2 -2
- package/lib/typescript/src/native-types.d.ts +177 -135
- package/lib/typescript/src/utils/deleteWorkoutSample.d.ts +3 -0
- package/lib/typescript/src/utils/ensureUnit.d.ts +1 -1
- package/lib/typescript/src/utils/queryStateOfMindSamples.d.ts +4 -4
- package/lib/typescript/src/utils/queryStatisticsForQuantity.d.ts +1 -1
- package/lib/typescript/src/utils/saveStateOfMindSample.d.ts +11 -0
- package/lib/typescript/src/utils/workoutSessionMirroringStartHandler.d.ts +8 -0
- package/package.json +19 -19
- package/src/index.ios.tsx +9 -0
- package/src/index.native.tsx +9 -0
- package/src/native-types.ts +61 -3
- package/src/test-setup.ts +3 -0
- package/src/utils/deleteWorkoutSample.ts +7 -0
- package/src/utils/saveStateOfMindSample.ts +38 -0
- package/src/utils/subscribeToChanges.ts +1 -1
- package/src/utils/workoutSessionMirroringStartHandler.ts +11 -0
package/ios/Helpers.swift
CHANGED
|
@@ -71,6 +71,14 @@ func sampleTypeFromString(typeIdentifier: String) -> HKSampleType? {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
+
#if compiler(>=6)
|
|
75
|
+
if #available(iOS 18, *) {
|
|
76
|
+
if typeIdentifier == HKStateOfMindTypeIdentifier {
|
|
77
|
+
return HKObjectType.stateOfMindType()
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
#endif
|
|
81
|
+
|
|
74
82
|
if typeIdentifier == HKWorkoutTypeIdentifier {
|
|
75
83
|
return HKSampleType.workoutType()
|
|
76
84
|
}
|
|
@@ -247,3 +255,140 @@ func parseWorkoutConfiguration(_ dict: NSDictionary) -> HKWorkoutConfiguration {
|
|
|
247
255
|
|
|
248
256
|
return configuration
|
|
249
257
|
}
|
|
258
|
+
|
|
259
|
+
#if compiler(>=6)
|
|
260
|
+
@available(iOS 18.0, *)
|
|
261
|
+
extension HKStateOfMind.Kind: @retroactive CaseIterable, @retroactive CustomStringConvertible {
|
|
262
|
+
public var description: String {
|
|
263
|
+
switch self {
|
|
264
|
+
case .dailyMood: "Daily mood"
|
|
265
|
+
case .momentaryEmotion: "Momentary Emotion"
|
|
266
|
+
@unknown default: "Unknown"
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
public static var allCases: [HKStateOfMind.Kind] {
|
|
271
|
+
[.dailyMood, .momentaryEmotion]
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
static func convertToStateOfMindKind(int: Int) -> HKStateOfMind.Kind {
|
|
275
|
+
// default to .dailyMood if we receive an int out of bounds
|
|
276
|
+
return HKStateOfMind.Kind(rawValue: int) ?? .dailyMood
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
#endif
|
|
280
|
+
|
|
281
|
+
#if compiler(>=6)
|
|
282
|
+
@available(iOS 18.0, *)
|
|
283
|
+
extension HKStateOfMind.Label: @retroactive CaseIterable, @retroactive CustomStringConvertible {
|
|
284
|
+
public var description: String {
|
|
285
|
+
switch self {
|
|
286
|
+
case .amazed: "Amazed"
|
|
287
|
+
case .amused: "Amused"
|
|
288
|
+
case .angry: "Angry"
|
|
289
|
+
case .anxious: "Anxious"
|
|
290
|
+
case .ashamed: "Ashamed"
|
|
291
|
+
case .brave: "Brave"
|
|
292
|
+
case .calm: "Calm"
|
|
293
|
+
case .content: "Content"
|
|
294
|
+
case .disappointed: "Disappointed"
|
|
295
|
+
case .discouraged: "Discouraged"
|
|
296
|
+
case .disgusted: "Disgusted"
|
|
297
|
+
case .embarrassed: "Embarrassed"
|
|
298
|
+
case .excited: "Excited"
|
|
299
|
+
case .frustrated: "Frustrated"
|
|
300
|
+
case .grateful: "Grateful"
|
|
301
|
+
case .guilty: "Guilty"
|
|
302
|
+
case .happy: "Happy"
|
|
303
|
+
case .hopeless: "Hopeless"
|
|
304
|
+
case .irritated: "Irritated"
|
|
305
|
+
case .jealous: "Jealous"
|
|
306
|
+
case .joyful: "Joyful"
|
|
307
|
+
case .lonely: "Lonely"
|
|
308
|
+
case .passionate: "Passionate"
|
|
309
|
+
case .peaceful: "Peaceful"
|
|
310
|
+
case .proud: "Proud"
|
|
311
|
+
case .relieved: "Relieved"
|
|
312
|
+
case .sad: "Sad"
|
|
313
|
+
case .scared: "Scared"
|
|
314
|
+
case .stressed: "Stressed"
|
|
315
|
+
case .surprised: "Surprised"
|
|
316
|
+
case .worried: "Worried"
|
|
317
|
+
case .annoyed: "Annoyed"
|
|
318
|
+
case .confident: "Confident"
|
|
319
|
+
case .drained: "Drained"
|
|
320
|
+
case .hopeful: "Hopeful"
|
|
321
|
+
case .indifferent: "Indifferent"
|
|
322
|
+
case .overwhelmed: "Overwhelmed"
|
|
323
|
+
case .satisfied: "Satisfied"
|
|
324
|
+
@unknown default: "Unknown"
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
public static var allCases: [HKStateOfMind.Label] {
|
|
329
|
+
[
|
|
330
|
+
.amazed, .amused, .angry, .anxious, .ashamed,
|
|
331
|
+
.brave, .calm, .content, .disappointed, .discouraged,
|
|
332
|
+
.disgusted, .embarrassed, .excited, .frustrated, .grateful,
|
|
333
|
+
.guilty, .happy, .hopeless, .irritated, .jealous,
|
|
334
|
+
.joyful, .lonely, .passionate, .peaceful, .proud,
|
|
335
|
+
.relieved, .sad, .scared, .stressed, .surprised,
|
|
336
|
+
.worried, .annoyed, .confident, .drained, .hopeful,
|
|
337
|
+
.indifferent, .overwhelmed, .satisfied
|
|
338
|
+
]
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
static func convertToStateOfMindLabels(intArray: [Int]) -> [HKStateOfMind.Label] {
|
|
342
|
+
return intArray.compactMap { index in
|
|
343
|
+
// if any int are out of bounds return nil instead of crashing
|
|
344
|
+
guard index >= 0 && index < HKStateOfMind.Label.allCases.count else { return nil }
|
|
345
|
+
return HKStateOfMind.Label(rawValue: index)
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
#endif
|
|
350
|
+
|
|
351
|
+
#if compiler(>=6)
|
|
352
|
+
@available(iOS 18.0, *)
|
|
353
|
+
extension HKStateOfMind.Association: @retroactive CaseIterable, @retroactive CustomStringConvertible {
|
|
354
|
+
public var description: String {
|
|
355
|
+
switch self {
|
|
356
|
+
case .community: "Community"
|
|
357
|
+
case .currentEvents: "Current Events"
|
|
358
|
+
case .dating: "Dating"
|
|
359
|
+
case .education: "Education"
|
|
360
|
+
case .family: "Family"
|
|
361
|
+
case .fitness: "Fitness"
|
|
362
|
+
case .friends: "Friends"
|
|
363
|
+
case .health: "Health"
|
|
364
|
+
case .hobbies: "Hobbies"
|
|
365
|
+
case .identity: "Identity"
|
|
366
|
+
case .money: "Money"
|
|
367
|
+
case .partner: "Partner"
|
|
368
|
+
case .selfCare: "Self Care"
|
|
369
|
+
case .spirituality: "Spirituality"
|
|
370
|
+
case .tasks: "Tasks"
|
|
371
|
+
case .travel: "Travel"
|
|
372
|
+
case .work: "Work"
|
|
373
|
+
case .weather: "Weather"
|
|
374
|
+
@unknown default: "Unknown"
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
public static var allCases: [HKStateOfMind.Association] {
|
|
379
|
+
[
|
|
380
|
+
.community, .currentEvents, .dating, .education, .family,
|
|
381
|
+
.fitness, .friends, .health, .hobbies, .identity,
|
|
382
|
+
.money, .partner, .selfCare, .spirituality, .tasks,
|
|
383
|
+
.travel, .work, .weather
|
|
384
|
+
]
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
static func convertToStateOfMindAssociations(intArray: [Int]) -> [HKStateOfMind.Association] {
|
|
388
|
+
return intArray.compactMap { index in
|
|
389
|
+
guard index >= 0 && index < HKStateOfMind.Association.allCases.count else { return nil }
|
|
390
|
+
return HKStateOfMind.Association(rawValue: index)
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
#endif
|
|
@@ -75,6 +75,11 @@ RCT_EXTERN_METHOD(deleteSamples:(NSString)typeIdentifier
|
|
|
75
75
|
reject:(RCTPromiseRejectBlock)reject
|
|
76
76
|
)
|
|
77
77
|
|
|
78
|
+
RCT_EXTERN_METHOD(deleteWorkoutSample:(NSString)uuid
|
|
79
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
80
|
+
reject:(RCTPromiseRejectBlock)reject
|
|
81
|
+
)
|
|
82
|
+
|
|
78
83
|
RCT_EXTERN_METHOD(subscribeToObserverQuery:(NSString)typeIdentifier
|
|
79
84
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
80
85
|
reject:(RCTPromiseRejectBlock)reject
|
|
@@ -88,6 +93,16 @@ RCT_EXTERN_METHOD(saveCategorySample:(NSString)typeIdentifier
|
|
|
88
93
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
89
94
|
reject:(RCTPromiseRejectBlock)reject
|
|
90
95
|
)
|
|
96
|
+
RCT_EXTERN_METHOD(saveStateOfMindSample:(NSDate)date
|
|
97
|
+
kind:(NSInteger)kind
|
|
98
|
+
valence:(double)valence
|
|
99
|
+
labels:(NSArray)labels
|
|
100
|
+
associations:(NSArray)associations
|
|
101
|
+
metadata:(NSDictionary)metadata
|
|
102
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
103
|
+
reject:(RCTPromiseRejectBlock)reject
|
|
104
|
+
)
|
|
105
|
+
|
|
91
106
|
|
|
92
107
|
RCT_EXTERN_METHOD(queryWorkoutSamplesWithAnchor:(NSString)energyUnitString
|
|
93
108
|
distanceUnitString:(NSString)distanceUnitString
|
|
@@ -253,4 +268,8 @@ RCT_EXTERN_METHOD(queryStateOfMindSamples:(NSDate)from
|
|
|
253
268
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
254
269
|
reject:(RCTPromiseRejectBlock)reject)
|
|
255
270
|
|
|
271
|
+
RCT_EXTERN_METHOD(workoutSessionMirroringStartHandler:(RCTPromiseResolveBlock)resolve
|
|
272
|
+
reject:(RCTPromiseRejectBlock)reject
|
|
273
|
+
)
|
|
274
|
+
|
|
256
275
|
@end
|
|
@@ -13,6 +13,15 @@ class ReactNativeHealthkit: RCTEventEmitter {
|
|
|
13
13
|
var _dateFormatter: ISO8601DateFormatter
|
|
14
14
|
var _hasListeners = false
|
|
15
15
|
|
|
16
|
+
#if os(iOS)
|
|
17
|
+
@available(iOS 17.0, *)
|
|
18
|
+
var _workoutSession: HKWorkoutSession? {
|
|
19
|
+
get { return __session as? HKWorkoutSession }
|
|
20
|
+
set { __session = newValue }
|
|
21
|
+
}
|
|
22
|
+
private var __session: Any?
|
|
23
|
+
#endif
|
|
24
|
+
|
|
16
25
|
override init() {
|
|
17
26
|
self._runningQueries = [String: HKQuery]()
|
|
18
27
|
self._dateFormatter = ISO8601DateFormatter()
|
|
@@ -335,6 +344,30 @@ class ReactNativeHealthkit: RCTEventEmitter {
|
|
|
335
344
|
}
|
|
336
345
|
}
|
|
337
346
|
|
|
347
|
+
@objc(deleteWorkoutSample:resolve:reject:)
|
|
348
|
+
func deleteWorkoutSample(
|
|
349
|
+
uuid: String,
|
|
350
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
351
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
352
|
+
) {
|
|
353
|
+
guard let store = _store else {
|
|
354
|
+
return reject(INIT_ERROR, INIT_ERROR_MESSAGE, nil)
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
guard let workoutUUID = UUID.init(uuidString: uuid) else {
|
|
358
|
+
return reject(TYPE_IDENTIFIER_ERROR, "Failed to initialize UUID from string", nil)
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
let samplePredicate = HKQuery.predicateForObject(with: workoutUUID)
|
|
362
|
+
|
|
363
|
+
store.deleteObjects(of: HKObjectType.workoutType(), predicate: samplePredicate) { (success: Bool, _: Int, error: Error?) in
|
|
364
|
+
guard let err = error else {
|
|
365
|
+
return resolve(success)
|
|
366
|
+
}
|
|
367
|
+
reject(GENERIC_ERROR, err.localizedDescription, error)
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
338
371
|
@objc(saveCorrelationSample:samples:start:end:metadata:resolve:reject:)
|
|
339
372
|
func saveCorrelationSample(
|
|
340
373
|
typeIdentifier: String,
|
|
@@ -646,6 +679,52 @@ class ReactNativeHealthkit: RCTEventEmitter {
|
|
|
646
679
|
}
|
|
647
680
|
}
|
|
648
681
|
|
|
682
|
+
@objc(saveStateOfMindSample:kind:valence:labels:associations:metadata:resolve:reject:)
|
|
683
|
+
func saveStateOfMindSample(
|
|
684
|
+
_ date: Date,
|
|
685
|
+
kind: Int,
|
|
686
|
+
valence: Double, // non-integer number, ie 0.5
|
|
687
|
+
labels: [Int],
|
|
688
|
+
associations: [Int],
|
|
689
|
+
metadata: NSDictionary,
|
|
690
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
691
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
692
|
+
) {
|
|
693
|
+
guard let store = _store else {
|
|
694
|
+
return reject(INIT_ERROR, INIT_ERROR_MESSAGE, nil)
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
#if compiler(>=6)
|
|
698
|
+
if #available(iOS 18.0, *) {
|
|
699
|
+
|
|
700
|
+
// ensures valence does not exceed -1.0 and 1.0
|
|
701
|
+
let safeValence = max(-1.0, min(1.0, valence))
|
|
702
|
+
|
|
703
|
+
let sample = HKStateOfMind(
|
|
704
|
+
date: date,
|
|
705
|
+
kind: HKStateOfMind.Kind.convertToStateOfMindKind(int: kind),
|
|
706
|
+
valence: safeValence,
|
|
707
|
+
labels: HKStateOfMind.Label.convertToStateOfMindLabels(intArray: labels),
|
|
708
|
+
associations: HKStateOfMind.Association.convertToStateOfMindAssociations(intArray: associations),
|
|
709
|
+
metadata: metadata as? [String: Any]
|
|
710
|
+
)
|
|
711
|
+
|
|
712
|
+
store.save(sample) { (success: Bool, error: Error?) in
|
|
713
|
+
guard let err = error else {
|
|
714
|
+
return resolve(success)
|
|
715
|
+
}
|
|
716
|
+
reject(GENERIC_ERROR, err.localizedDescription, error)
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
} else {
|
|
720
|
+
reject("STATE_OF_MIND_ERROR", "State of Mind features require iOS 18.0 or later", nil)
|
|
721
|
+
}
|
|
722
|
+
#else
|
|
723
|
+
reject(
|
|
724
|
+
"STATE_OF_MIND_ERROR", "State of Mind features require Xcode 16 or later to compile", nil)
|
|
725
|
+
#endif
|
|
726
|
+
}
|
|
727
|
+
|
|
649
728
|
@objc(saveCategorySample:value:start:end:metadata:resolve:reject:)
|
|
650
729
|
func saveCategorySample(
|
|
651
730
|
typeIdentifier: String,
|
|
@@ -683,7 +762,13 @@ class ReactNativeHealthkit: RCTEventEmitter {
|
|
|
683
762
|
}
|
|
684
763
|
|
|
685
764
|
override func supportedEvents() -> [String]! {
|
|
686
|
-
return [
|
|
765
|
+
return [
|
|
766
|
+
"onChange",
|
|
767
|
+
"onRemoteWorkoutStateChange",
|
|
768
|
+
"onRemoteWorkoutError",
|
|
769
|
+
"onRemoteWorkoutDataReceived",
|
|
770
|
+
"onRemoteWorkoutEventReceived"
|
|
771
|
+
]
|
|
687
772
|
}
|
|
688
773
|
|
|
689
774
|
@objc(enableBackgroundDelivery:updateFrequency:resolve:reject:)
|
|
@@ -779,7 +864,7 @@ class ReactNativeHealthkit: RCTEventEmitter {
|
|
|
779
864
|
) {
|
|
780
865
|
if error == nil {
|
|
781
866
|
DispatchQueue.main.async {
|
|
782
|
-
if self.
|
|
867
|
+
if self._hasListeners {
|
|
783
868
|
self.sendEvent(
|
|
784
869
|
withName: "onChange",
|
|
785
870
|
body: [
|
|
@@ -2138,29 +2223,6 @@ class ReactNativeHealthkit: RCTEventEmitter {
|
|
|
2138
2223
|
}
|
|
2139
2224
|
}
|
|
2140
2225
|
|
|
2141
|
-
@available(iOS 17.0.0, *)
|
|
2142
|
-
@objc(startWatchAppWithWorkoutConfiguration:resolve:reject:)
|
|
2143
|
-
func startWatchAppWithWorkoutConfiguration(
|
|
2144
|
-
_ workoutConfiguration: NSDictionary,
|
|
2145
|
-
resolve: @escaping RCTPromiseResolveBlock,
|
|
2146
|
-
reject: @escaping RCTPromiseRejectBlock
|
|
2147
|
-
) {
|
|
2148
|
-
guard let store = _store else {
|
|
2149
|
-
return reject(INIT_ERROR, INIT_ERROR_MESSAGE, nil)
|
|
2150
|
-
}
|
|
2151
|
-
|
|
2152
|
-
let configuration = parseWorkoutConfiguration(workoutConfiguration)
|
|
2153
|
-
|
|
2154
|
-
store.startWatchApp(with: configuration) { success, error in
|
|
2155
|
-
if let error {
|
|
2156
|
-
reject(INIT_ERROR, INIT_ERROR_MESSAGE, error)
|
|
2157
|
-
return
|
|
2158
|
-
}
|
|
2159
|
-
|
|
2160
|
-
resolve(success)
|
|
2161
|
-
}
|
|
2162
|
-
}
|
|
2163
|
-
|
|
2164
2226
|
@objc(queryStateOfMindSamples:to:limit:ascending:resolve:reject:)
|
|
2165
2227
|
func queryStateOfMindSamples(
|
|
2166
2228
|
from: Date,
|
|
@@ -2253,4 +2315,136 @@ class ReactNativeHealthkit: RCTEventEmitter {
|
|
|
2253
2315
|
"STATE_OF_MIND_ERROR", "State of Mind features require Xcode 16 or later to compile", nil)
|
|
2254
2316
|
#endif
|
|
2255
2317
|
}
|
|
2318
|
+
|
|
2319
|
+
@available(iOS 17.0.0, *)
|
|
2320
|
+
@objc(startWatchAppWithWorkoutConfiguration:resolve:reject:)
|
|
2321
|
+
func startWatchAppWithWorkoutConfiguration(
|
|
2322
|
+
_ workoutConfiguration: NSDictionary,
|
|
2323
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
2324
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
2325
|
+
) {
|
|
2326
|
+
guard let store = _store else {
|
|
2327
|
+
return reject(INIT_ERROR, INIT_ERROR_MESSAGE, nil)
|
|
2328
|
+
}
|
|
2329
|
+
|
|
2330
|
+
let configuration = parseWorkoutConfiguration(workoutConfiguration)
|
|
2331
|
+
|
|
2332
|
+
store.startWatchApp(with: configuration) { success, error in
|
|
2333
|
+
if let error {
|
|
2334
|
+
reject(GENERIC_ERROR, error.localizedDescription, error)
|
|
2335
|
+
return
|
|
2336
|
+
}
|
|
2337
|
+
|
|
2338
|
+
resolve(success)
|
|
2339
|
+
}
|
|
2340
|
+
}
|
|
2341
|
+
|
|
2342
|
+
@available(iOS 17.0.0, *)
|
|
2343
|
+
@objc(workoutSessionMirroringStartHandler:reject:)
|
|
2344
|
+
func workoutSessionMirroringStartHandler(
|
|
2345
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
2346
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
2347
|
+
) {
|
|
2348
|
+
guard let store = _store else {
|
|
2349
|
+
return reject(INIT_ERROR, INIT_ERROR_MESSAGE, nil)
|
|
2350
|
+
}
|
|
2351
|
+
|
|
2352
|
+
store.workoutSessionMirroringStartHandler = { [weak self] mirroringSession in
|
|
2353
|
+
self?._workoutSession = mirroringSession
|
|
2354
|
+
self?._workoutSession?.delegate = self
|
|
2355
|
+
}
|
|
2356
|
+
|
|
2357
|
+
resolve(true)
|
|
2358
|
+
}
|
|
2359
|
+
|
|
2360
|
+
}
|
|
2361
|
+
|
|
2362
|
+
// MARK: - HKWorkoutSessionDelegate
|
|
2363
|
+
|
|
2364
|
+
extension ReactNativeHealthkit: HKWorkoutSessionDelegate {
|
|
2365
|
+
|
|
2366
|
+
@available(iOS 17.0.0, *)
|
|
2367
|
+
func workoutSession(
|
|
2368
|
+
_ workoutSession: HKWorkoutSession,
|
|
2369
|
+
didChangeTo toState: HKWorkoutSessionState,
|
|
2370
|
+
from fromState: HKWorkoutSessionState,
|
|
2371
|
+
date: Date
|
|
2372
|
+
) {
|
|
2373
|
+
Task { @MainActor [weak self] in
|
|
2374
|
+
guard let self = self else { return }
|
|
2375
|
+
|
|
2376
|
+
if self._hasListeners {
|
|
2377
|
+
self.sendEvent(withName: "onRemoteWorkoutStateChange", body: [
|
|
2378
|
+
"toState": toState.rawValue,
|
|
2379
|
+
"fromState": fromState.rawValue,
|
|
2380
|
+
"date": self._dateFormatter.string(from: date)
|
|
2381
|
+
])
|
|
2382
|
+
}
|
|
2383
|
+
}
|
|
2384
|
+
}
|
|
2385
|
+
|
|
2386
|
+
@available(iOS 17.0.0, *)
|
|
2387
|
+
func workoutSession(_ workoutSession: HKWorkoutSession, didFailWithError error: any Error) {
|
|
2388
|
+
Task { @MainActor [weak self] in
|
|
2389
|
+
guard let self = self else { return }
|
|
2390
|
+
|
|
2391
|
+
if self._hasListeners {
|
|
2392
|
+
self.sendEvent(
|
|
2393
|
+
withName: "onRemoteWorkoutError",
|
|
2394
|
+
body: ["error": error.localizedDescription]
|
|
2395
|
+
)
|
|
2396
|
+
}
|
|
2397
|
+
}
|
|
2398
|
+
}
|
|
2399
|
+
|
|
2400
|
+
@available(iOS 17.0.0, *)
|
|
2401
|
+
func workoutSession(
|
|
2402
|
+
_ workoutSession: HKWorkoutSession,
|
|
2403
|
+
didReceiveDataFromRemoteWorkoutSession data: [Data]
|
|
2404
|
+
) {
|
|
2405
|
+
Task { [weak self] in
|
|
2406
|
+
guard let self = self else { return }
|
|
2407
|
+
|
|
2408
|
+
do {
|
|
2409
|
+
let serializedData = try data.compactMap { dataItem -> [String: Any]? in
|
|
2410
|
+
guard let json = try? JSONSerialization.jsonObject(with: dataItem) as? [String: Any] else {
|
|
2411
|
+
return nil
|
|
2412
|
+
}
|
|
2413
|
+
return json
|
|
2414
|
+
}
|
|
2415
|
+
|
|
2416
|
+
await MainActor.run { [weak self] in
|
|
2417
|
+
guard let self = self else { return }
|
|
2418
|
+
|
|
2419
|
+
if self._hasListeners {
|
|
2420
|
+
self.sendEvent(
|
|
2421
|
+
withName: "onRemoteWorkoutDataReceived",
|
|
2422
|
+
body: ["data": serializedData]
|
|
2423
|
+
)
|
|
2424
|
+
}
|
|
2425
|
+
}
|
|
2426
|
+
} catch {
|
|
2427
|
+
await MainActor.run { [weak self] in
|
|
2428
|
+
guard let self = self else { return }
|
|
2429
|
+
|
|
2430
|
+
if self._hasListeners {
|
|
2431
|
+
self.sendEvent(
|
|
2432
|
+
withName: "onRemoteWorkoutError",
|
|
2433
|
+
body: ["error": error.localizedDescription]
|
|
2434
|
+
)
|
|
2435
|
+
}
|
|
2436
|
+
}
|
|
2437
|
+
}
|
|
2438
|
+
}
|
|
2439
|
+
}
|
|
2440
|
+
|
|
2441
|
+
@available(iOS 17.0, *)
|
|
2442
|
+
func workoutSession(_ workoutSession: HKWorkoutSession, didGenerate event: HKWorkoutEvent) {
|
|
2443
|
+
if self._hasListeners {
|
|
2444
|
+
self.sendEvent(
|
|
2445
|
+
withName: "onRemoteWorkoutEventReceived",
|
|
2446
|
+
body: ["type": event.type.rawValue]
|
|
2447
|
+
)
|
|
2448
|
+
}
|
|
2449
|
+
}
|
|
2256
2450
|
}
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
var _reactNative = require("@testing-library/react-native");
|
|
4
4
|
var _testUtils = _interopRequireDefault(require("../test-utils"));
|
|
5
5
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
-
function
|
|
7
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
6
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
8
7
|
describe('useHealthkitAuthorization', () => {
|
|
9
8
|
let NativeTypes;
|
|
10
9
|
let useHealthkitAuthorization;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_testUtils","_interopRequireDefault","e","__esModule","default","
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_testUtils","_interopRequireDefault","e","__esModule","default","_interopRequireWildcard","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","describe","NativeTypes","useHealthkitAuthorization","beforeAll","Promise","resolve","then","test","HKAuthorizationRequestStatus","HKCategoryTypeIdentifier","Native","jest","spyOn","mockReturnValue","shouldRequest","result","renderHook","abdominalCramps","waitForNextUpdate","expect","current","toBe","spy","unnecessary","retVal","act"],"sources":["useHealthkitAuthorization.test.ts"],"sourcesContent":["import { renderHook, act } from '@testing-library/react-native'\n\nimport waitForNextUpdate from '../test-utils'\n\ndescribe('useHealthkitAuthorization', () => {\n let NativeTypes: typeof import('../native-types')\n let useHealthkitAuthorization: typeof import('./useHealthkitAuthorization').default\n beforeAll(async () => {\n NativeTypes = await import('../native-types')\n useHealthkitAuthorization = (await import('./useHealthkitAuthorization')).default\n })\n\n test('should return shouldRequest', async () => {\n const { HKAuthorizationRequestStatus, HKCategoryTypeIdentifier, default: Native } = NativeTypes\n\n jest.spyOn(Native, 'getRequestStatusForAuthorization').mockReturnValue(Promise.resolve(HKAuthorizationRequestStatus.shouldRequest))\n\n const { result } = renderHook(() => useHealthkitAuthorization([HKCategoryTypeIdentifier.abdominalCramps]))\n\n await waitForNextUpdate()\n\n expect(result.current[0]).toBe(HKAuthorizationRequestStatus.shouldRequest)\n })\n\n test('should request permissions', async () => {\n const { HKAuthorizationRequestStatus, HKCategoryTypeIdentifier, default: Native } = NativeTypes\n\n const spy = jest.spyOn(Native, 'getRequestStatusForAuthorization').mockReturnValue(Promise.resolve(HKAuthorizationRequestStatus.shouldRequest))\n jest.spyOn(Native, 'requestAuthorization').mockReturnValue(Promise.resolve(true))\n\n const { result } = renderHook(() => useHealthkitAuthorization([HKCategoryTypeIdentifier.abdominalCramps]))\n\n await waitForNextUpdate()\n\n spy.mockReturnValue(Promise.resolve(HKAuthorizationRequestStatus.unnecessary))\n\n let retVal: typeof HKAuthorizationRequestStatus | undefined\n await act(async () => {\n const r = await result.current[1]() as unknown as typeof HKAuthorizationRequestStatus\n retVal = r\n })\n\n expect(result.current[0]).toBe(HKAuthorizationRequestStatus.unnecessary)\n expect(retVal).toBe(HKAuthorizationRequestStatus.unnecessary)\n })\n\n test('should return unnecessary', async () => {\n const { HKAuthorizationRequestStatus, HKCategoryTypeIdentifier, default: Native } = NativeTypes\n\n jest.spyOn(Native, 'getRequestStatusForAuthorization').mockReturnValue(Promise.resolve(HKAuthorizationRequestStatus.unnecessary))\n\n const { result } = renderHook(() => useHealthkitAuthorization([HKCategoryTypeIdentifier.abdominalCramps]))\n\n await waitForNextUpdate()\n\n expect(result.current[0]).toBe(HKAuthorizationRequestStatus.unnecessary)\n })\n\n test('should return null before initalizing', async () => {\n const { HKCategoryTypeIdentifier } = NativeTypes\n\n const { result } = renderHook(() => useHealthkitAuthorization([HKCategoryTypeIdentifier.abdominalCramps]))\n\n expect(result.current[0]).toBe(null)\n\n await waitForNextUpdate()\n })\n})\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
var _reactNative = require("@testing-library/react-native");
|
|
4
4
|
var _testUtils = _interopRequireDefault(require("../test-utils"));
|
|
5
5
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
-
function
|
|
7
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
6
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
8
7
|
describe('useIsHealthDataAvailable', () => {
|
|
9
8
|
test('should return false', async () => {
|
|
10
9
|
const useIsHealthDataAvailable = (await Promise.resolve().then(() => _interopRequireWildcard(require('./useIsHealthDataAvailable')))).default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_testUtils","_interopRequireDefault","e","__esModule","default","
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_testUtils","_interopRequireDefault","e","__esModule","default","_interopRequireWildcard","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","describe","test","useIsHealthDataAvailable","Promise","resolve","then","Native","jest","spyOn","mockReturnValue","result","renderHook","waitForNextUpdate","expect","current","toBe"],"sources":["useIsHealthDataAvailable.test.ts"],"sourcesContent":["import { renderHook } from '@testing-library/react-native'\n\nimport waitForNextUpdate from '../test-utils'\n\ndescribe('useIsHealthDataAvailable', () => {\n test('should return false', async () => {\n const useIsHealthDataAvailable = (await import('./useIsHealthDataAvailable')).default\n const { default: Native } = await import('../native-types')\n jest.spyOn(Native, 'isHealthDataAvailable').mockReturnValue(Promise.resolve(false))\n\n const { result } = renderHook(useIsHealthDataAvailable)\n\n await waitForNextUpdate()\n\n expect(result.current).toBe(false)\n })\n\n test('should return true', async () => {\n const useIsHealthDataAvailable = (await import('./useIsHealthDataAvailable')).default\n const { default: Native } = await import('../native-types')\n jest.spyOn(Native, 'isHealthDataAvailable').mockReturnValue(Promise.resolve(true))\n\n const { result } = renderHook(useIsHealthDataAvailable)\n\n await waitForNextUpdate()\n\n expect(result.current).toBe(true)\n })\n\n test('should return null before initalizing', async () => {\n const useIsHealthDataAvailable = (await import('./useIsHealthDataAvailable')).default\n const { result } = renderHook(useIsHealthDataAvailable)\n\n expect(result.current).toBe(null)\n\n await waitForNextUpdate()\n })\n})\n"],"mappings":";;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEA,IAAAC,UAAA,GAAAC,sBAAA,CAAAF,OAAA;AAA6C,SAAAE,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAG,wBAAAH,CAAA,EAAAI,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,uBAAA,YAAAA,CAAAH,CAAA,EAAAI,CAAA,SAAAA,CAAA,IAAAJ,CAAA,IAAAA,CAAA,CAAAC,UAAA,SAAAD,CAAA,MAAAQ,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAT,OAAA,EAAAF,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAU,CAAA,MAAAF,CAAA,GAAAJ,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAE,CAAA,CAAAI,GAAA,CAAAZ,CAAA,UAAAQ,CAAA,CAAAK,GAAA,CAAAb,CAAA,GAAAQ,CAAA,CAAAM,GAAA,CAAAd,CAAA,EAAAU,CAAA,gBAAAN,CAAA,IAAAJ,CAAA,gBAAAI,CAAA,OAAAW,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAI,CAAA,OAAAK,CAAA,IAAAD,CAAA,GAAAS,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAnB,CAAA,EAAAI,CAAA,OAAAK,CAAA,CAAAI,GAAA,IAAAJ,CAAA,CAAAK,GAAA,IAAAN,CAAA,CAAAE,CAAA,EAAAN,CAAA,EAAAK,CAAA,IAAAC,CAAA,CAAAN,CAAA,IAAAJ,CAAA,CAAAI,CAAA,WAAAM,CAAA,KAAAV,CAAA,EAAAI,CAAA;AAE7CgB,QAAQ,CAAC,0BAA0B,EAAE,MAAM;EACzCC,IAAI,CAAC,qBAAqB,EAAE,YAAY;IACtC,MAAMC,wBAAwB,GAAG,CAAC,MAAAC,OAAA,CAAAC,OAAA,GAAAC,IAAA,OAAAtB,uBAAA,CAAAN,OAAA,CAAa,4BAA4B,GAAC,EAAEK,OAAO;IACrF,MAAM;MAAEA,OAAO,EAAEwB;IAAO,CAAC,GAAG,MAAAH,OAAA,CAAAC,OAAA,GAAAC,IAAA,OAAAtB,uBAAA,CAAAN,OAAA,CAAa,iBAAiB,GAAC;IAC3D8B,IAAI,CAACC,KAAK,CAACF,MAAM,EAAE,uBAAuB,CAAC,CAACG,eAAe,CAACN,OAAO,CAACC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEnF,MAAM;MAAEM;IAAO,CAAC,GAAG,IAAAC,uBAAU,EAACT,wBAAwB,CAAC;IAEvD,MAAM,IAAAU,kBAAiB,EAAC,CAAC;IAEzBC,MAAM,CAACH,MAAM,CAACI,OAAO,CAAC,CAACC,IAAI,CAAC,KAAK,CAAC;EACpC,CAAC,CAAC;EAEFd,IAAI,CAAC,oBAAoB,EAAE,YAAY;IACrC,MAAMC,wBAAwB,GAAG,CAAC,MAAAC,OAAA,CAAAC,OAAA,GAAAC,IAAA,OAAAtB,uBAAA,CAAAN,OAAA,CAAa,4BAA4B,GAAC,EAAEK,OAAO;IACrF,MAAM;MAAEA,OAAO,EAAEwB;IAAO,CAAC,GAAG,MAAAH,OAAA,CAAAC,OAAA,GAAAC,IAAA,OAAAtB,uBAAA,CAAAN,OAAA,CAAa,iBAAiB,GAAC;IAC3D8B,IAAI,CAACC,KAAK,CAACF,MAAM,EAAE,uBAAuB,CAAC,CAACG,eAAe,CAACN,OAAO,CAACC,OAAO,CAAC,IAAI,CAAC,CAAC;IAElF,MAAM;MAAEM;IAAO,CAAC,GAAG,IAAAC,uBAAU,EAACT,wBAAwB,CAAC;IAEvD,MAAM,IAAAU,kBAAiB,EAAC,CAAC;IAEzBC,MAAM,CAACH,MAAM,CAACI,OAAO,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC;EACnC,CAAC,CAAC;EAEFd,IAAI,CAAC,uCAAuC,EAAE,YAAY;IACxD,MAAMC,wBAAwB,GAAG,CAAC,MAAAC,OAAA,CAAAC,OAAA,GAAAC,IAAA,OAAAtB,uBAAA,CAAAN,OAAA,CAAa,4BAA4B,GAAC,EAAEK,OAAO;IACrF,MAAM;MAAE4B;IAAO,CAAC,GAAG,IAAAC,uBAAU,EAACT,wBAAwB,CAAC;IAEvDW,MAAM,CAACH,MAAM,CAACI,OAAO,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC;IAEjC,MAAM,IAAAH,kBAAiB,EAAC,CAAC;EAC3B,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|