react-native-rook-sdk 4.0.0-beta.2 → 5.0.0-beta.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.
Files changed (99) hide show
  1. package/RNRookSdk.podspec +1 -1
  2. package/android/build.gradle +6 -0
  3. package/android/src/main/java/com/rooksdk/RookSdkModule.kt +1850 -6
  4. package/android/src/main/java/com/rooksdk/broadcasts/AndroidPermissionsReceiverTransmitter.kt +62 -0
  5. package/android/src/main/java/com/rooksdk/broadcasts/HealthConnectPermissionsReceiverTransmitter.kt +64 -0
  6. package/android/src/main/java/com/rooksdk/broadcasts/SamsungHealthPermissionsReceiverTransmitter.kt +44 -0
  7. package/android/src/main/java/com/rooksdk/utils/DatasourceUtils.kt +35 -0
  8. package/android/src/main/java/com/rooksdk/utils/PermissionConvertions.kt +21 -0
  9. package/android/src/main/java/com/rooksdk/utils/ReadableToWritable.kt +144 -0
  10. package/android/src/main/java/com/rooksdk/utils/RookDateTime.kt +26 -0
  11. package/android/src/main/java/com/rooksdk/utils/RookGsonBuilder.kt +20 -0
  12. package/android/src/main/java/com/rooksdk/utils/SamsungAvailability.kt +22 -0
  13. package/android/src/main/java/com/rooksdk/utils/Source.kt +6 -0
  14. package/android/src/main/java/com/rooksdk/utils/StringToSyncType.kt +41 -0
  15. package/android/src/main/java/com/rooksdk/utils/serializers/InstantSerializer.kt +18 -0
  16. package/android/src/main/java/com/rooksdk/utils/serializers/LocalDateSerializer.kt +21 -0
  17. package/android/src/main/java/com/rooksdk/utils/serializers/ZoneDateTimeSerializer.kt +18 -0
  18. package/ios/EncodableSDKState.swift +95 -0
  19. package/ios/NutritionMapper.swift +114 -0
  20. package/ios/RookConfiguration.swift +13 -0
  21. package/ios/RookData.swift +29 -0
  22. package/ios/RookEntry.swift +5 -4
  23. package/ios/RookPermissions.swift +33 -9
  24. package/ios/RookSdk.h +1 -13
  25. package/ios/RookSdk.mm +44 -237
  26. package/lib/module/NativeRookSdk.js +98 -10
  27. package/lib/module/NativeRookSdk.js.map +1 -1
  28. package/lib/module/context/RookSyncGateProvider.js +29 -21
  29. package/lib/module/context/RookSyncGateProvider.js.map +1 -1
  30. package/lib/module/context/RookSyncGateReducer.js +12 -2
  31. package/lib/module/context/RookSyncGateReducer.js.map +1 -1
  32. package/lib/module/hooks/useRookConfiguration.js +20 -1
  33. package/lib/module/hooks/useRookConfiguration.js.map +1 -1
  34. package/lib/module/hooks/useRookData.js +13 -4
  35. package/lib/module/hooks/useRookData.js.map +1 -1
  36. package/lib/module/hooks/useRookPermissions.js +13 -1
  37. package/lib/module/hooks/useRookPermissions.js.map +1 -1
  38. package/lib/module/hooks/useRookSync.js +1 -1
  39. package/lib/module/hooks/useRookSync.js.map +1 -1
  40. package/lib/module/hooks/useRookVariables.js +16 -1
  41. package/lib/module/hooks/useRookVariables.js.map +1 -1
  42. package/lib/module/modules/components/RookStateManager.js +31 -0
  43. package/lib/module/modules/components/RookStateManager.js.map +1 -0
  44. package/lib/module/modules/hook/useRookAutoSync.js +5 -4
  45. package/lib/module/modules/hook/useRookAutoSync.js.map +1 -1
  46. package/lib/module/modules/hook/useRookEmitter.js +61 -0
  47. package/lib/module/modules/hook/useRookEmitter.js.map +1 -0
  48. package/lib/module/types/AppleHealthNutritionEvent.js +72 -0
  49. package/lib/module/types/AppleHealthNutritionEvent.js.map +1 -0
  50. package/lib/module/types/HCMealData.js +61 -0
  51. package/lib/module/types/HCMealData.js.map +1 -0
  52. package/lib/module/types/WriteNutrition.js +14 -0
  53. package/lib/module/types/WriteNutrition.js.map +1 -0
  54. package/lib/module/utils/isValidDate.js +20 -0
  55. package/lib/module/utils/isValidDate.js.map +1 -1
  56. package/lib/typescript/src/NativeRookSdk.d.ts +622 -33
  57. package/lib/typescript/src/NativeRookSdk.d.ts.map +1 -1
  58. package/lib/typescript/src/context/RookSyncGateProvider.d.ts.map +1 -1
  59. package/lib/typescript/src/context/RookSyncGateReducer.d.ts.map +1 -1
  60. package/lib/typescript/src/context/RookSyncGateTypes.d.ts +14 -4
  61. package/lib/typescript/src/context/RookSyncGateTypes.d.ts.map +1 -1
  62. package/lib/typescript/src/hooks/useRookConfiguration.d.ts +3 -1
  63. package/lib/typescript/src/hooks/useRookConfiguration.d.ts.map +1 -1
  64. package/lib/typescript/src/hooks/useRookData.d.ts +2 -2
  65. package/lib/typescript/src/hooks/useRookData.d.ts.map +1 -1
  66. package/lib/typescript/src/hooks/useRookPermissions.d.ts +2 -0
  67. package/lib/typescript/src/hooks/useRookPermissions.d.ts.map +1 -1
  68. package/lib/typescript/src/hooks/useRookVariables.d.ts +2 -0
  69. package/lib/typescript/src/hooks/useRookVariables.d.ts.map +1 -1
  70. package/lib/typescript/src/modules/components/RookStateManager.d.ts +10 -0
  71. package/lib/typescript/src/modules/components/RookStateManager.d.ts.map +1 -0
  72. package/lib/typescript/src/modules/hook/useRookAutoSync.d.ts.map +1 -1
  73. package/lib/typescript/src/modules/hook/useRookEmitter.d.ts +4 -0
  74. package/lib/typescript/src/modules/hook/useRookEmitter.d.ts.map +1 -0
  75. package/lib/typescript/src/types/AppleHealthNutritionEvent.d.ts +76 -0
  76. package/lib/typescript/src/types/AppleHealthNutritionEvent.d.ts.map +1 -0
  77. package/lib/typescript/src/types/HCMealData.d.ts +60 -0
  78. package/lib/typescript/src/types/HCMealData.d.ts.map +1 -0
  79. package/lib/typescript/src/types/WriteNutrition.d.ts +61 -0
  80. package/lib/typescript/src/types/WriteNutrition.d.ts.map +1 -0
  81. package/lib/typescript/src/utils/isValidDate.d.ts +8 -0
  82. package/lib/typescript/src/utils/isValidDate.d.ts.map +1 -1
  83. package/package.json +1 -1
  84. package/src/NativeRookSdk.ts +682 -117
  85. package/src/context/RookSyncGateProvider.tsx +20 -16
  86. package/src/context/RookSyncGateReducer.ts +6 -2
  87. package/src/context/RookSyncGateTypes.ts +9 -3
  88. package/src/hooks/useRookConfiguration.ts +26 -2
  89. package/src/hooks/useRookData.ts +18 -7
  90. package/src/hooks/useRookPermissions.ts +16 -0
  91. package/src/hooks/useRookSync.ts +1 -1
  92. package/src/hooks/useRookVariables.ts +22 -1
  93. package/src/modules/components/RookStateManager.tsx +41 -0
  94. package/src/modules/hook/useRookAutoSync.ts +6 -4
  95. package/src/modules/hook/useRookEmitter.ts +94 -0
  96. package/src/types/AppleHealthNutritionEvent.ts +142 -0
  97. package/src/types/HCMealData.ts +114 -0
  98. package/src/types/WriteNutrition.ts +66 -0
  99. package/src/utils/isValidDate.ts +24 -0
@@ -1,46 +1,52 @@
1
1
  import type { TurboModule, CodegenTypes } from 'react-native';
2
- import { TurboModuleRegistry, NativeModules } from 'react-native';
2
+ import { TurboModuleRegistry } from 'react-native';
3
3
 
4
- type RookConfig = Readonly<{
4
+ type RookConfig = {
5
5
  environment: string;
6
6
  clientUUID: string;
7
- password: string;
7
+ secret: string;
8
+ bundleId?: string;
9
+ packageName?: string;
8
10
  enableLogs: boolean;
9
- enableEventsBackgroundSync: boolean;
10
11
  enableBackground: boolean;
11
- }>;
12
-
13
- type APIDataSource =
14
- | 'Garmin'
15
- | 'Oura'
16
- | 'Polar'
17
- | 'Fitbit'
18
- | 'Withings'
19
- | 'Whoop';
12
+ };
13
+
14
+ enum APIDataSource {
15
+ GARMIN = 'Garmin',
16
+ OURA = 'Oura',
17
+ POLAR = 'Polar',
18
+ FITBIT = 'Fitbit',
19
+ WITHINGS = 'Withings',
20
+ WHOOP = 'Whoop',
21
+ }
20
22
 
21
- type DataSourceProps = Readonly<{
23
+ type DataSourceProps = {
22
24
  userID: string;
23
25
  dataSource: APIDataSource;
24
26
  redirectURL?: string;
25
- }>;
27
+ };
26
28
 
27
- type DataSourceAuthorizer = Readonly<{
29
+ type DataSourceAuthorizer = {
28
30
  dataSource: string;
29
31
  authorized: boolean;
30
32
  authorizationUrl?: string;
31
- }>;
33
+ };
32
34
 
33
- type AuthorizedSource = Readonly<{
35
+ type AuthorizedSource = {
34
36
  name: string;
35
37
  imageUrl: string;
36
38
  authorized: boolean;
37
- }>;
39
+ };
38
40
 
39
- type SDKDataSource = 'HEALTH_CONNECT' | 'SAMSUNG_HEALTH' | 'APPLE_HEALTH';
41
+ enum SDKDataSource {
42
+ HEALTH_CONNECT = 'HEALTH_CONNECT',
43
+ SAMSUNG_HEALTH = 'SAMSUNG_HEALTH',
44
+ APPLE_HEALTH = 'APPLE_HEALTH',
45
+ }
40
46
 
41
47
  type RequestStatusPermissions = 'REQUEST_SENT' | 'ALREADY_GRANTED';
42
48
 
43
- type BackgroundStatus =
49
+ export type BackgroundStatus =
44
50
  | 'UNAVAILABLE'
45
51
  | 'PERMISSION_NOT_GRANTED'
46
52
  | 'PERMISSION_GRANTED';
@@ -58,86 +64,648 @@ type PermissionStatus =
58
64
  | 'PERMISSION_INDETERMINATE'
59
65
  | 'PERMISSION_GRANTED';
60
66
 
61
- type SamsungHealthPermission =
62
- | 'ACTIVITY_SUMMARY'
63
- | 'BODY_TEMPERATURE'
64
- | 'BLOOD_GLUCOSE'
65
- | 'BLOOD_OXYGEN'
66
- | 'BLOOD_PRESSURE'
67
- | 'BODY_COMPOSITION'
68
- | 'EXERCISE'
69
- | 'EXERCISE_LOCATION'
70
- | 'FLOORS_CLIMBED'
71
- | 'HEART_RATE'
72
- | 'NUTRITION'
73
- | 'SLEEP'
74
- | 'STEPS'
75
- | 'WATER_INTAKE';
76
-
77
- type AppleHealthPermission =
78
- | 'appleExerciseTime'
79
- | 'appleMoveTime'
80
- | 'appleStandTime'
81
- | 'basalEnergyBurned'
82
- | 'activeEnergyBurned'
83
- | 'stepCount'
84
- | 'distanceCycling'
85
- | 'distanceWalkingRunning'
86
- | 'distanceSwimming'
87
- | 'swimmingStrokeCount'
88
- | 'flightsClimbed'
89
- | 'walkingSpeed'
90
- | 'walkingStepLength'
91
- | 'runningPower'
92
- | 'runningSpeed'
93
- | 'height'
94
- | 'bodyMass'
95
- | 'bodyMassIndex'
96
- | 'waistCircumference'
97
- | 'bodyFatPercentage'
98
- | 'bodyTemperature'
99
- | 'basalBodyTemperature'
100
- | 'appleSleepingWristTemperature'
101
- | 'heartRate'
102
- | 'restingHeartRate'
103
- | 'walkingHeartRateAverage'
104
- | 'heartRateVariabilitySDNN'
105
- | 'electrocardiogram'
106
- | 'workout'
107
- | 'sleepAnalysis'
108
- | 'vo2Max'
109
- | 'oxygenSaturation'
110
- | 'respiratoryRate'
111
- | 'uvExposure'
112
- | 'biologicalSex'
113
- | 'dateOfBirth'
114
- | 'bloodPressureSystolic'
115
- | 'bloodPressureDiastolic'
116
- | 'bloodGlucose'
117
- | 'dietaryEnergyConsumed'
118
- | 'dietaryProtein'
119
- | 'dietarySugar'
120
- | 'dietaryFatTotal'
121
- | 'dietaryCarbohydrates'
122
- | 'dietaryFiber'
123
- | 'dietarySodium'
124
- | 'dietaryCholesterol';
125
-
126
- type Calories = Readonly<{
67
+ enum SamsungHealthPermission {
68
+ ACTIVITY_SUMMARY = 'ACTIVITY_SUMMARY',
69
+ BODY_TEMPERATURE = 'BODY_TEMPERATURE',
70
+ BLOOD_GLUCOSE = 'BLOOD_GLUCOSE',
71
+ BLOOD_OXYGEN = 'BLOOD_OXYGEN',
72
+ BLOOD_PRESSURE = 'BLOOD_PRESSURE',
73
+ BODY_COMPOSITION = 'BODY_COMPOSITION',
74
+ EXERCISE = 'EXERCISE',
75
+ EXERCISE_LOCATION = 'EXERCISE_LOCATION',
76
+ FLOORS_CLIMBED = 'FLOORS_CLIMBED',
77
+ HEART_RATE = 'HEART_RATE',
78
+ NUTRITION = 'NUTRITION',
79
+ SLEEP = 'SLEEP',
80
+ STEPS = 'STEPS',
81
+ WATER_INTAKE = 'WATER_INTAKE',
82
+ }
83
+
84
+ enum AppleHealthPermission {
85
+ APPLE_EXERCISE_TIME = 'appleExerciseTime',
86
+ APPLE_MOVE_TIME = 'appleMoveTime',
87
+ APPLE_STAND_TIME = 'appleStandTime',
88
+ BASAL_ENERGY_BURNED = 'basalEnergyBurned',
89
+ ACTIVE_ENERGY_BURNED = 'activeEnergyBurned',
90
+ STEP_COUNT = 'stepCount',
91
+ DISTANCE_CYCLING = 'distanceCycling',
92
+ DISTANCE_WALKING_RUNNING = 'distanceWalkingRunning',
93
+ DISTANCE_SWIMMING = 'distanceSwimming',
94
+ SWIMMING_STROKE_COUNT = 'swimmingStrokeCount',
95
+ FLIGHTS_CLIMBED = 'flightsClimbed',
96
+ WALKING_SPEED = 'walkingSpeed',
97
+ WALKING_STEP_LENGTH = 'walkingStepLength',
98
+ RUNNING_POWER = 'runningPower',
99
+ RUNNING_SPEED = 'runningSpeed',
100
+ HEIGHT = 'height',
101
+ BODY_MASS = 'bodyMass',
102
+ BODY_MASS_INDEX = 'bodyMassIndex',
103
+ WAIST_CIRCUMFERENCE = 'waistCircumference',
104
+ BODY_FAT_PERCENTAGE = 'bodyFatPercentage',
105
+ BODY_TEMPERATURE = 'bodyTemperature',
106
+ BASAL_BODY_TEMPERATURE = 'basalBodyTemperature',
107
+ APPLE_SLEEPING_WRIST_TEMPERATURE = 'appleSleepingWristTemperature',
108
+ HEART_RATE = 'heartRate',
109
+ RESTING_HEART_RATE = 'restingHeartRate',
110
+ WALKING_HEART_RATE_AVERAGE = 'walkingHeartRateAverage',
111
+ HEART_RATE_VARIABILITY_SDNN = 'heartRateVariabilitySDNN',
112
+ ELECTROCARDIOGRAM = 'electrocardiogram',
113
+ WORKOUT = 'workout',
114
+ SLEEP_ANALYSIS = 'sleepAnalysis',
115
+ VO2_MAX = 'vo2Max',
116
+ OXYGEN_SATURATION = 'oxygenSaturation',
117
+ RESPIRATORY_RATE = 'respiratoryRate',
118
+ UV_EXPOSURE = 'uvExposure',
119
+ BIOLOGICAL_SEX = 'biologicalSex',
120
+ DATE_OF_BIRTH = 'dateOfBirth',
121
+ BLOOD_PRESSURE_SYSTOLIC = 'bloodPressureSystolic',
122
+ BLOOD_PRESSURE_DIASTOLIC = 'bloodPressureDiastolic',
123
+ BLOOD_GLUCOSE = 'bloodGlucose',
124
+ DIETARY_ENERGY_CONSUMED = 'dietaryEnergyConsumed',
125
+ DIETARY_PROTEIN = 'dietaryProtein',
126
+ DIETARY_SUGAR = 'dietarySugar',
127
+ DIETARY_FAT_TOTAL = 'dietaryFatTotal',
128
+ DIETARY_CARBOHYDRATES = 'dietaryCarbohydrates',
129
+ DIETARY_FIBER = 'dietaryFiber',
130
+ DIETARY_SODIUM = 'dietarySodium',
131
+ DIETARY_CHOLESTEROL = 'dietaryCholesterol',
132
+ }
133
+
134
+ type Calories = {
127
135
  active: number;
128
136
  basal: number;
129
- }>;
137
+ };
130
138
 
131
- type RookError = Readonly<{
139
+ type RookError = {
132
140
  code: string;
133
141
  message: string;
134
- }>;
142
+ };
135
143
 
136
- type Message = Readonly<{
144
+ type Message = {
137
145
  type: string;
138
146
  value: boolean;
139
147
  message?: string;
140
- }>;
148
+ };
149
+
150
+ export type DiagnosticsPermissionStatus = 'REQUESTED' | 'GRANTED' | 'NONE';
151
+
152
+ export interface SyncStatus {
153
+ enabled: boolean;
154
+ lastSync: string; // Or Date, if you plan to hydrate the string into a Date object
155
+ }
156
+
157
+ export interface DiagnosticState {
158
+ isConfigured: boolean;
159
+ userIdentified: boolean;
160
+ permissions: DiagnosticsPermissionStatus;
161
+ backgroundSync: SyncStatus;
162
+ manualSync: SyncStatus;
163
+ }
164
+
165
+ export enum MealDataType {
166
+ BREAKFAST = 'BREAKFAST',
167
+ LUNCH = 'LUNCH',
168
+ DINNER = 'DINNER',
169
+ SNACK = 'SNACK',
170
+ }
171
+
172
+ export interface WriteNutrition {
173
+ // Metadata
174
+ name: string;
175
+ date: string; // Must be ISO-8601
176
+ mealType?: MealDataType;
177
+
178
+ // Apple Health specific root values
179
+ amount?: number;
180
+ unit?: number;
181
+
182
+ // Unified Nutrients (Flat list)
183
+ biotin?: number;
184
+ caffeine?: number;
185
+ calcium?: number;
186
+ calories?: number;
187
+ caloriesFromFat?: number;
188
+ chloride?: number;
189
+ cholesterol?: number;
190
+ chromium?: number;
191
+ copper?: number;
192
+ dietaryFiber?: number;
193
+ folate?: number;
194
+ folicAcid?: number;
195
+ iodine?: number;
196
+ iron?: number;
197
+ magnesium?: number;
198
+ manganese?: number;
199
+ molybdenum?: number;
200
+ monounsaturatedFat?: number;
201
+ niacin?: number;
202
+ pantothenicAcid?: number;
203
+ phosphorus?: number;
204
+ polyunsaturatedFat?: number;
205
+ potassium?: number;
206
+ protein?: number;
207
+ riboflavin?: number;
208
+ saturatedFat?: number;
209
+ selenium?: number;
210
+ sodium?: number;
211
+ sugar?: number;
212
+ thiamin?: number;
213
+ totalCarbohydrates?: number;
214
+ totalFat?: number;
215
+ transFat?: number;
216
+ unsaturatedFat?: number;
217
+ vitaminA?: number;
218
+ vitaminB12?: number;
219
+ vitaminB6?: number;
220
+ vitaminC?: number;
221
+ vitaminD?: number;
222
+ vitaminE?: number;
223
+ vitaminK?: number;
224
+ water?: number; // iOS specific
225
+ zinc?: number;
226
+ }
227
+
228
+ export interface ActivityLevelGranularData {
229
+ dateTime: string;
230
+ activityLevel: number;
231
+ }
232
+
233
+ export interface ElevationGranularData {
234
+ dateTime: string;
235
+ intervalDurationSeconds: number;
236
+ elevationChangeMeters: number;
237
+ }
238
+
239
+ export interface FloorsClimbedGranularData {
240
+ dateTime: string;
241
+ intervalDurationSeconds: number;
242
+ floorsClimbed: number;
243
+ }
244
+
245
+ export interface HrGranularData {
246
+ dateTime: string;
247
+ hrBpm: number;
248
+ }
249
+
250
+ export interface HrvSdnnGranularData {
251
+ dateTime: string;
252
+ hrvSdnn: number;
253
+ }
254
+
255
+ export interface HrvRmssdGranularData {
256
+ dateTime: string;
257
+ hrvRmssd: number;
258
+ }
259
+
260
+ export interface SaturationGranularData {
261
+ dateTime: string;
262
+ saturationPercentage: number;
263
+ }
264
+
265
+ export interface Vo2GranularData {
266
+ dateTime: string;
267
+ vo2MlPerMinPerKg: number;
268
+ }
269
+
270
+ export interface TemperatureObject {
271
+ temperatureCelsius: number;
272
+ measurementType: string;
273
+ }
274
+
275
+ export interface TemperatureGranularData {
276
+ dateTime: string;
277
+ temperatureCelsius: number;
278
+ measurementType: string;
279
+ }
280
+
281
+ export interface TraveledDistanceGranularData {
282
+ dateTime: string;
283
+ intervalDurationSeconds: number;
284
+ traveledDistanceMeters: number;
285
+ }
286
+
287
+ export interface StepsGranularData {
288
+ dateTime: string;
289
+ intervalDurationSeconds: number;
290
+ steps: number;
291
+ }
292
+
293
+ export interface SwimmingDistanceGranularData {
294
+ dateTime: string;
295
+ intervalDurationSeconds: number;
296
+ swimmingDistanceMeters: number;
297
+ }
298
+
299
+ export interface BreathingGranularData {
300
+ dateTime: string;
301
+ breathsPerMin: number;
302
+ }
303
+
304
+ export interface SnoringGranularData {
305
+ dateTime: string;
306
+ intervalDurationSeconds: number;
307
+ snoringEventsCount: number;
308
+ }
309
+
310
+ export interface SleepSummary {
311
+ dateTime: string;
312
+ sourceOfData: string;
313
+ wasTheUserUnderPhysicalActivity: boolean;
314
+ sleepStartDateTime: string;
315
+ sleepEndDateTime: string;
316
+ sleepDate: string;
317
+ sleepDurationSeconds: number | null;
318
+ timeInBedSeconds: number | null;
319
+ lightSleepDurationSeconds: number | null;
320
+ remSleepDurationSeconds: number | null;
321
+ deepSleepDurationSeconds: number | null;
322
+ timeToFallAsleepSeconds: number | null;
323
+ timeAwakeDuringSleepSeconds: number | null;
324
+ sleepQualityRating1To5Score: number | null;
325
+ sleepEfficiency1To100Score: number | null;
326
+ sleepGoalSeconds: number | null;
327
+ sleepContinuity1To5Score: number | null;
328
+ sleepContinuity1To5Rating: number | null;
329
+ hrMaximumBpm: number | null;
330
+ hrMinimumBpm: number | null;
331
+ hrAvgBpm: number | null;
332
+ hrRestingBpm: number | null;
333
+ hrBasalBpm: number | null;
334
+ hrGranularData: HrGranularData[] | null;
335
+ hrvAvgRmssd: number | null;
336
+ hrvAvgSdnn: number | null;
337
+ hrvSdnnGranularData: HrvSdnnGranularData[] | null;
338
+ hrvRmssdGranularData: HrvRmssdGranularData[] | null;
339
+ temperatureMinimum: TemperatureObject | null;
340
+ temperatureAvg: TemperatureObject | null;
341
+ temperatureMaximum: TemperatureObject | null;
342
+ temperatureGranularData: TemperatureGranularData[] | null;
343
+ temperatureDelta: TemperatureObject | null;
344
+ breathsMinimumPerMin: number | null;
345
+ breathsAvgPerMin: number | null;
346
+ breathsMaximumPerMin: number | null;
347
+ breathingGranularData: BreathingGranularData[] | null;
348
+ snoringEventsCount: number | null;
349
+ snoringDurationTotalSeconds: number | null;
350
+ snoringGranularData: SnoringGranularData[] | null;
351
+ saturationAvgPercentage: number | null;
352
+ saturationMinimumPercentage: number | null;
353
+ saturationMaximumPercentage: number | null;
354
+ saturationGranularData: SaturationGranularData[] | null;
355
+ }
356
+
357
+ export interface ActiveStepsGranularData {
358
+ dateTime: string;
359
+ intervalDurationSeconds: number;
360
+ activeSteps: number;
361
+ }
362
+
363
+ export interface StressGranularData {
364
+ dateTime: string;
365
+ stressScore: number;
366
+ }
367
+
368
+ export interface PhysicalSummary {
369
+ dateTime: string;
370
+ sourceOfData: string;
371
+ wasTheUserUnderPhysicalActivity: boolean;
372
+ activeSeconds: number | null;
373
+ restSeconds: number | null;
374
+ lowIntensitySeconds: number | null;
375
+ moderateIntensitySeconds: number | null;
376
+ vigorousIntensitySeconds: number | null;
377
+ inactivitySeconds: number | null;
378
+ activityLevelGranularData: ActivityLevelGranularData[] | null;
379
+ continuousInactivePeriods: number | null;
380
+ caloriesNetIntakeKcal: number | null;
381
+ caloriesExpenditureKcal: number | null;
382
+ caloriesNetActiveKcal: number | null;
383
+ caloriesBasalMetabolicRateKcal: number | null;
384
+ steps: number | null;
385
+ stepsGranularData: StepsGranularData[] | null;
386
+ activeSteps: number | null;
387
+ activeStepsGranularData: ActiveStepsGranularData[] | null;
388
+ walkedDistanceMeters: number | null;
389
+ traveledDistanceMeters: number | null;
390
+ traveledDistanceGranularData: TraveledDistanceGranularData[] | null;
391
+ floorsClimbed: number | null;
392
+ floorsClimbedGranularData: FloorsClimbedGranularData[] | null;
393
+ elevationAvgAltitudeMeters: number | null;
394
+ elevationMinimumAltitudeMeters: number | null;
395
+ elevationMaximumAltitudeMeters: number | null;
396
+ elevationLossActualAltitudeMeters: number | null;
397
+ elevationGainActualAltitudeMeters: number | null;
398
+ elevationPlannedGainMeters: number | null;
399
+ elevationGranularData: ElevationGranularData[] | null;
400
+ swimmingNumStrokes: number | null;
401
+ swimmingNumLaps: number | null;
402
+ swimmingPoolLengthMeters: number | null;
403
+ swimmingTotalDistanceMeters: number | null;
404
+ swimmingDistanceGranularData: SwimmingDistanceGranularData[] | null;
405
+ hrMaximumBpm: number | null;
406
+ hrMinimumBpm: number | null;
407
+ hrAvgBpm: number | null;
408
+ hrRestingBpm: number | null;
409
+ hrGranularData: HrGranularData[] | null;
410
+ hrvAvgRmssd: number | null;
411
+ hrvAvgSdnn: number | null;
412
+ hrvSdnnGranularData: HrvSdnnGranularData[] | null;
413
+ hrvRmssdGranularData: HrvRmssdGranularData[] | null;
414
+ saturationAvgPercentage: number | null;
415
+ saturationGranularData: SaturationGranularData[] | null;
416
+ vo2MaxMlPerMinPerKg: number | null;
417
+ vo2GranularData: Vo2GranularData[] | null;
418
+ stressAtRestDurationSeconds: number | null;
419
+ stressDurationSeconds: number | null;
420
+ lowStressDurationSeconds: number | null;
421
+ mediumStressDurationSeconds: number | null;
422
+ highStressDurationSeconds: number | null;
423
+ stressGranularData: StressGranularData[] | null;
424
+ stressAvgLevel: number | null;
425
+ stressMaximumLevel: number | null;
426
+ }
427
+
428
+ export interface BloodGlucoseGranularData {
429
+ dateTime: string;
430
+ bloodGlucoseMgPerDl: number;
431
+ }
432
+
433
+ export interface BloodPressureObject {
434
+ systolicMmHg: number;
435
+ diastolicMmHg: number;
436
+ }
437
+
438
+ export interface BloodPressureGranularData {
439
+ dateTime: string;
440
+ systolicMmHg: number;
441
+ diastolicMmHg: number;
442
+ }
443
+
444
+ export interface HydrationAmountGranularData {
445
+ dateTime: string;
446
+ intervalDurationSeconds: number;
447
+ hydrationAmountMl: number;
448
+ }
449
+
450
+ export interface HydrationLevelGranularData {
451
+ dateTime: string;
452
+ intervalDurationSeconds: number;
453
+ hydrationLevelPercentage: number;
454
+ }
455
+
456
+ export interface MoodGranularData {
457
+ dateTime: string;
458
+ intervalDurationSeconds: number;
459
+ moodScale: number;
460
+ }
461
+
462
+ export interface MenstruationFlowGranularData {
463
+ dateTime: string;
464
+ flowMl: number;
465
+ }
466
+
467
+ // --- Interfaz SHBodySummary Completa ---
468
+ export interface BodySummary {
469
+ dateTime: string;
470
+ sourceOfData: string;
471
+ wasTheUserUnderPhysicalActivity: boolean;
472
+ waistCircumferenceCm: number | null;
473
+ hipCircumferenceCm: number | null;
474
+ chestCircumferenceCm: number | null;
475
+ boneCompositionPercentage: number | null;
476
+ muscleCompositionPercentage: number | null;
477
+ waterCompositionPercentage: number | null;
478
+ weightKg: number | null;
479
+ heightCm: number | null;
480
+ bmi: number | null;
481
+ bloodGlucoseAvgMgPerDl: number | null;
482
+ bloodGlucoseGranularData: BloodGlucoseGranularData[] | null;
483
+ bloodPressureAvg: BloodPressureObject | null;
484
+ bloodPressureGranularData: BloodPressureGranularData[] | null;
485
+ waterTotalConsumptionMl: number | null;
486
+ hydrationAmountGranularData: HydrationAmountGranularData[] | null;
487
+ hydrationLevelGranularData: HydrationLevelGranularData[] | null;
488
+ hrMaximumBpm: number | null;
489
+ hrMinimumBpm: number | null;
490
+ hrAvgBpm: number | null;
491
+ hrRestingBpm: number | null;
492
+ hrGranularData: HrGranularData[] | null;
493
+ hrvAvgRmssd: number | null;
494
+ hrvAvgSdnn: number | null;
495
+ hrvSdnnGranularData: HrvSdnnGranularData[] | null;
496
+ hrvRmssdGranularData: HrvRmssdGranularData[] | null;
497
+ moodMinimumScale: number | null;
498
+ moodAvgScale: number | null;
499
+ moodMaximumScale: number | null;
500
+ moodGranularData: MoodGranularData[] | null;
501
+ moodDeltaScale: number | null;
502
+ foodIntake: number | null;
503
+ caloriesIntakeKcal: number | null;
504
+ proteinIntakeG: number | null;
505
+ sugarIntakeG: number | null;
506
+ fatIntakeG: number | null;
507
+ transFatIntakeG: number | null;
508
+ carbohydratesIntakeG: number | null;
509
+ fiberIntakeG: number | null;
510
+ alcoholIntakeG: number | null;
511
+ sodiumIntakeMg: number | null;
512
+ cholesterolIntakeMg: number | null;
513
+ saturationAvgPercentage: number | null;
514
+ saturationGranularData: SaturationGranularData[] | null;
515
+ vo2MaxMlPerMinPerKg: number | null;
516
+ vo2GranularData: Vo2GranularData[] | null;
517
+ temperatureMinimum: TemperatureObject | null;
518
+ temperatureAvg: TemperatureObject | null;
519
+ temperatureMaximum: TemperatureObject | null;
520
+ temperatureGranularData: TemperatureGranularData[] | null;
521
+ temperatureDelta: TemperatureObject | null;
522
+ lastUpdatedDatetime: string | null;
523
+ periodStartDate: string | null;
524
+ cycleDay: number | null;
525
+ cycleLengthDays: number | null;
526
+ predictedCycleLengthDays: number | null;
527
+ currentPhase: string | null;
528
+ lengthOfCurrentPhaseDays: number | null;
529
+ daysUntilNextPhase: number | null;
530
+ isAPredictedCycle: boolean | null;
531
+ menstruationFlowGranularData: MenstruationFlowGranularData[] | null;
532
+ }
533
+
534
+ export interface SpeedGranularData {
535
+ dateTime: string;
536
+ intervalDurationSeconds: number;
537
+ speedMetersPerSecond: number;
538
+ }
539
+
540
+ export interface VelocityObject {
541
+ speedMetersPerSecond: number;
542
+ direction: string;
543
+ }
544
+
545
+ export interface CadenceGranularData {
546
+ dateTime: string;
547
+ intervalDurationSeconds: number;
548
+ cadenceRpm: number;
549
+ }
550
+
551
+ export interface TorqueGranularData {
552
+ dateTime: string;
553
+ intervalDurationSeconds: number;
554
+ torqueNewtonMeters: number;
555
+ }
556
+
557
+ export interface LapGranularData {
558
+ dateTime: string;
559
+ intervalDurationSeconds: number;
560
+ laps: number;
561
+ }
562
+
563
+ export interface PositionObject {
564
+ latDeg: number;
565
+ lngDeg: number;
566
+ }
567
+
568
+ export interface PositionGranularData {
569
+ dateTime: string;
570
+ intervalDurationSeconds: number;
571
+ latDeg: number;
572
+ lngDeg: number;
573
+ }
574
+
575
+ export interface PowerGranularData {
576
+ dateTime: string;
577
+ intervalDurationSeconds: number;
578
+ powerWatts: number;
579
+ }
580
+
581
+ export interface TssGranularData {
582
+ dateTime: string;
583
+ intervalDurationSeconds: number;
584
+ tssScore: number;
585
+ }
586
+
587
+ // --- Interfaz SHActivityEvent Completa ---
588
+ export interface ActivityEvent {
589
+ dateTime: string;
590
+ sourceOfData: string;
591
+ wasTheUserUnderPhysicalActivity: boolean;
592
+ activityStartDateTime: string;
593
+ activityEndDateTime: string;
594
+ activityDurationSeconds: number;
595
+ activityTypeName: string;
596
+ activeSeconds: number | null;
597
+ restSeconds: number | null;
598
+ lowIntensitySeconds: number | null;
599
+ moderateIntensitySeconds: number | null;
600
+ vigorousIntensitySeconds: number | null;
601
+ inactivitySeconds: number | null;
602
+ activityLevelGranularData: ActivityLevelGranularData[] | null;
603
+ continuousInactivePeriods: number | null;
604
+ activityStrainLevel: number | null;
605
+ activityWorkKilojoules: number | null;
606
+ activityEnergyKilojoules: number | null;
607
+ activityEnergyPlannedKilojoules: number | null;
608
+ caloriesNetIntakeKcal: number | null;
609
+ caloriesExpenditureKcal: number | null;
610
+ caloriesNetActiveKcal: number | null;
611
+ caloriesBasalMetabolicRateKcal: number | null;
612
+ fatPercentageOfCalories: number | null;
613
+ carbohydratePercentageOfCalories: number | null;
614
+ proteinPercentageOfCalories: number | null;
615
+ steps: number | null;
616
+ stepsGranularData: StepsGranularData[] | null;
617
+ walkedDistanceMeters: number | null;
618
+ traveledDistanceMeters: number | null;
619
+ traveledDistanceGranularData: TraveledDistanceGranularData[] | null;
620
+ floorsClimbed: number | null;
621
+ floorsClimbedGranularData: FloorsClimbedGranularData[] | null;
622
+ elevationAvgAltitudeMeters: number | null;
623
+ elevationMinimumAltitudeMeters: number | null;
624
+ elevationMaximumAltitudeMeters: number | null;
625
+ elevationLossActualAltitudeMeters: number | null;
626
+ elevationGainActualAltitudeMeters: number | null;
627
+ elevationPlannedGainMeters: number | null;
628
+ elevationGranularData: ElevationGranularData[] | null;
629
+ swimmingNumStrokes: number | null;
630
+ swimmingNumLaps: number | null;
631
+ swimmingPoolLengthMeters: number | null;
632
+ swimmingTotalDistanceMeters: number | null;
633
+ swimmingDistanceGranularData: SwimmingDistanceGranularData[] | null;
634
+ hrMaximumBpm: number | null;
635
+ hrMinimumBpm: number | null;
636
+ hrAvgBpm: number | null;
637
+ hrRestingBpm: number | null;
638
+ hrGranularData: HrGranularData[] | null;
639
+ hrvAvgRmssd: number | null;
640
+ hrvAvgSdnn: number | null;
641
+ hrvSdnnGranularData: HrvSdnnGranularData[] | null;
642
+ hrvRmssdGranularData: HrvRmssdGranularData[] | null;
643
+ speedNormalizedMetersPerSecond: number | null;
644
+ speedAvgMetersPerSecond: number | null;
645
+ speedMaximumMetersPerSecond: number | null;
646
+ speedGranularData: SpeedGranularData[] | null;
647
+ velocityAvg: VelocityObject | null;
648
+ velocityMaximum: VelocityObject | null;
649
+ paceAvgMinPerKm: number | null;
650
+ paceMaximumMinPerKm: number | null;
651
+ cadenceAvgRpm: number | null;
652
+ cadenceMaximumRpm: number | null;
653
+ cadenceGranularData: CadenceGranularData[] | null;
654
+ torqueAvgNewtonMeters: number | null;
655
+ torqueMaximumNewtonMeters: number | null;
656
+ torqueGranularData: TorqueGranularData[] | null;
657
+ lapGranularData: LapGranularData[] | null;
658
+ saturationAvgPercentage: number | null;
659
+ saturationGranularData: SaturationGranularData[] | null;
660
+ vo2MaxMlPerMinPerKg: number | null;
661
+ vo2GranularData: Vo2GranularData[] | null;
662
+ positionStart: PositionObject | null;
663
+ positionCentroid: PositionObject | null;
664
+ positionEnd: PositionObject | null;
665
+ positionGranularData: PositionGranularData[] | null;
666
+ positionPolylineMapDataSummary: string | null;
667
+ powerAvgWatts: number | null;
668
+ powerMaximumWatts: number | null;
669
+ powerGranularData: PowerGranularData[] | null;
670
+ stressAtRestDurationSeconds: number | null;
671
+ stressDurationSeconds: number | null;
672
+ lowStressDurationSeconds: number | null;
673
+ mediumStressDurationSeconds: number | null;
674
+ highStressDurationSeconds: number | null;
675
+ tssGranularData: TssGranularData[] | null;
676
+ stressAvgLevel: number | null;
677
+ stressMaximumLevel: number | null;
678
+ }
679
+
680
+ export interface HrGranularDataItem {
681
+ dateTime: string;
682
+ hrBPM: number;
683
+ }
684
+
685
+ export interface HrvSDNNGranularData {
686
+ dateTime: string;
687
+ hrvSDNN: number;
688
+ }
689
+
690
+ export interface HrvRMSSDGranularData {
691
+ dateTime: string;
692
+ hrvRmssd: number;
693
+ }
694
+
695
+ export interface HeartRateData {
696
+ hrAverageBPM: number;
697
+ hrvSDNNGranularData: HrvSDNNGranularData[] | null;
698
+ hrGranularData: HrGranularDataItem[];
699
+ hrMinimumBPM: number;
700
+ hrRestingBPM: number | null;
701
+ hrMaximumBPM: number;
702
+ hrvAverageSDNN: number | null;
703
+ hrvRMSSDGranularData: HrvRMSSDGranularData[] | null;
704
+ hrvAverageRMSSD: number | null;
705
+ }
706
+
707
+ // Mock of the full object
708
+ interface HCMealData {}
141
709
 
142
710
  export interface Spec extends TurboModule {
143
711
  initRook: (options: RookConfig) => Promise<boolean>;
@@ -154,6 +722,9 @@ export interface Spec extends TurboModule {
154
722
  updateUserID: (userID: string) => Promise<boolean>;
155
723
  removeUserFromRook: (sources: SDKDataSource[]) => Promise<boolean>;
156
724
  syncUserTimeZone: () => Promise<boolean>;
725
+ getHealthConnectDiagnosticState: () => Promise<string>;
726
+ getSamsungHealthDiagnosticState: () => Promise<string>;
727
+ getDiagnosticState: () => Promise<DiagnosticState>;
157
728
 
158
729
  // bg android steps
159
730
  isStepsAvailable: () => Promise<boolean>;
@@ -161,7 +732,6 @@ export interface Spec extends TurboModule {
161
732
  disableBackgroundAndroidSteps: () => Promise<boolean>;
162
733
  isBackgroundAndroidStepsActive: () => Promise<boolean>;
163
734
  syncTodayAndroidStepsCount: () => Promise<string>;
164
- syncTodayHealthConnectStepsCount: () => Promise<string>;
165
735
 
166
736
  //Apple health hook
167
737
  enableBackGroundUpdates: () => Promise<boolean>;
@@ -169,15 +739,20 @@ export interface Spec extends TurboModule {
169
739
  isBackgroundUpdatesEnabled: () => Promise<boolean>;
170
740
 
171
741
  // Permissions
172
- checkHealthConnectAvailability: () => Promise<CheckAvailabilityResponse>;
173
- checkSamsungAvailability: () => Promise<CheckAvailabilityResponse>;
174
- healthConnectHasPermissions: () => Promise<boolean>;
175
- healthConnectHasPartialPermissions: () => Promise<boolean>;
742
+ androidHasBackgroundPermissions: () => Promise<boolean>;
176
743
  appleHealthHasPermissions: (
177
744
  param: AppleHealthPermission
178
745
  ) => Promise<PermissionStatus>;
746
+ checkHealthConnectAvailability: () => Promise<CheckAvailabilityResponse>;
747
+ checkHealthConnectBackgroundReadStatus: () => Promise<BackgroundStatus>;
748
+ checkSamsungAvailability: () => Promise<CheckAvailabilityResponse>;
749
+ healthConnectHasPartialPermissions: () => Promise<boolean>;
750
+ healthConnectHasPermissions: () => Promise<boolean>;
179
751
  samsungHealthHasPermissions: () => Promise<boolean>;
180
752
  samsungHealthHasPartialPermissions: () => Promise<boolean>;
753
+ openAppleHealthSettings: () => Promise<void>;
754
+ openHealthConnectSettings: () => Promise<void>;
755
+ requestAndroidBackgroundPermissions: () => Promise<RequestStatusPermissions>;
181
756
  requestHealthConnectPermissions: () => Promise<RequestStatusPermissions>;
182
757
  requestAppleHealthPermissions: (
183
758
  permissions?: AppleHealthPermission[]
@@ -185,14 +760,11 @@ export interface Spec extends TurboModule {
185
760
  requestSamsungHealthPermissions: (
186
761
  permissions?: SamsungHealthPermission[]
187
762
  ) => Promise<RequestStatusPermissions>;
188
- openAppleHealthSettings: () => Promise<void>;
189
- openHealthConnectSettings: () => Promise<void>;
190
- requestAndroidBackgroundPermissions: () => Promise<RequestStatusPermissions>;
191
- androidHasBackgroundPermissions: () => Promise<boolean>;
192
- checkHealthConnectBackgroundReadStatus: () => Promise<BackgroundStatus>;
763
+ requestAppleWriteNutritionPermission: () => Promise<void>;
193
764
  revokeHealthConnectPermissions: () => Promise<boolean>;
765
+ shouldRequestAndroidBackgroundPermissions: () => Promise<boolean>;
194
766
 
195
- // Local data any in the response to avoid paste the complete object
767
+ // data hook
196
768
  getAppleHealthSleepSummary: (date: string) => Promise<any[]>;
197
769
  getHealthConnectSleepSummary: (date: string) => Promise<string>;
198
770
  getSamsungSleepSummary: (date: string) => Promise<string>;
@@ -209,7 +781,8 @@ export interface Spec extends TurboModule {
209
781
  getHealthConnectActivityEvents: (date: string) => Promise<string>;
210
782
  getSamsungActivityEvents: (date: string) => Promise<string>;
211
783
 
212
- getTodayHeartRate: () => Promise<any>;
784
+ writeHealthConnectMealData: (meal: HCMealData) => Promise<boolean>;
785
+ writeAppleHealthMealData: (meal: Object) => Promise<boolean>;
213
786
 
214
787
  // samsung hook
215
788
  enableSamsungSync: () => Promise<boolean>;
@@ -217,15 +790,18 @@ export interface Spec extends TurboModule {
217
790
  isSamsungSyncEnabled: () => Promise<boolean>;
218
791
 
219
792
  // health connect hook
220
- scheduleBackgroundSync: (enableLogs: boolean) => Promise<boolean>;
793
+ scheduleBackgroundSync: (enableLogs?: boolean) => Promise<boolean>;
221
794
  cancelBackgroundSync: () => Promise<boolean>;
222
795
  isBackgroundSyncEnabled: () => Promise<boolean>;
223
796
 
224
797
  // variables
225
798
  syncTodaySamsungHealthStepsCount: () => Promise<string>;
226
799
  getTodayAppleHealthSteps: () => Promise<string>;
800
+ syncTodayHealthConnectStepsCount: () => Promise<string>;
227
801
  syncTodayCaloriesCount: () => Promise<Calories>;
228
802
  syncSHTodayCaloriesCount: () => Promise<Calories>;
803
+ getTodayHeartRate: () => Promise<HeartRateData>;
804
+ getSHTodayHeartRate: () => Promise<HeartRateData>;
229
805
 
230
806
  // sync
231
807
  sync: (cb: (error: RookError, result: boolean) => void) => void;
@@ -259,16 +835,5 @@ export interface Spec extends TurboModule {
259
835
  sendMessage: (message: Message) => Promise<boolean>;
260
836
  readonly onRookMessage: CodegenTypes.EventEmitter<Message>;
261
837
  }
262
- const turboModule = TurboModuleRegistry.get<Spec>('RNRookSdk');
263
-
264
- console.log({ exists: turboModule !== null });
265
-
266
- const RookSdk = turboModule ? turboModule : NativeModules.RNRookSdk;
267
-
268
- if (!RookSdk) {
269
- throw new Error(
270
- 'RNRookSdk module not found. Ensure you have linked the library and rebuilt the app.'
271
- );
272
- }
273
838
 
274
- export default RookSdk;
839
+ export default TurboModuleRegistry.getEnforcing<Spec>('RNRookSdk');