react-native-rook-sdk 0.7.0 → 1.0.0-rc.1

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 (127) hide show
  1. package/android/src/main/java/com/rooksdk/RookSdkModule.kt +51 -597
  2. package/android/src/main/java/com/rooksdk/RookSdkPackage.kt +17 -1
  3. package/android/src/main/java/com/rooksdk/broadcasts/AndroidPermissionsReceiverTransmitter.kt +18 -0
  4. package/android/src/main/java/com/rooksdk/broadcasts/HealthConnectPermissionsReceiverTransmitter.kt +18 -0
  5. package/android/src/main/java/com/rooksdk/modules/RookConfigurationModule.kt +108 -0
  6. package/android/src/main/java/com/rooksdk/modules/RookPermissionsModule.kt +160 -0
  7. package/android/src/main/java/com/rooksdk/modules/RookStepsModule.kt +105 -0
  8. package/android/src/main/java/com/rooksdk/modules/RookSyncModule.kt +497 -0
  9. package/android/src/main/java/com/rooksdk/utils/DatasourcesUtils.kt +49 -0
  10. package/android/src/main/java/com/rooksdk/utils/ReadableToWritable.kt +20 -0
  11. package/android/src/main/java/com/rooksdk/utils/RookDateTime.kt +8 -0
  12. package/ios/RookSdk.mm +296 -8
  13. package/lib/commonjs/context/RookSyncGateContext.js +12 -0
  14. package/lib/commonjs/context/RookSyncGateContext.js.map +1 -1
  15. package/lib/commonjs/context/RookSyncGateProvider.js +12 -5
  16. package/lib/commonjs/context/RookSyncGateProvider.js.map +1 -1
  17. package/lib/commonjs/context/RookSyncGateReducer.js +15 -0
  18. package/lib/commonjs/context/RookSyncGateReducer.js.map +1 -1
  19. package/lib/commonjs/hooks/useRookAndroidBackgroundSteps.js +26 -41
  20. package/lib/commonjs/hooks/useRookAndroidBackgroundSteps.js.map +1 -1
  21. package/lib/commonjs/hooks/useRookAppleHealth.js +24 -10
  22. package/lib/commonjs/hooks/useRookAppleHealth.js.map +1 -1
  23. package/lib/commonjs/hooks/useRookAppleHealthVariables.js +22 -4
  24. package/lib/commonjs/hooks/useRookAppleHealthVariables.js.map +1 -1
  25. package/lib/commonjs/hooks/useRookConfiguration.js +32 -16
  26. package/lib/commonjs/hooks/useRookConfiguration.js.map +1 -1
  27. package/lib/commonjs/hooks/useRookDataSources.js +18 -5
  28. package/lib/commonjs/hooks/useRookDataSources.js.map +1 -1
  29. package/lib/commonjs/hooks/useRookEvents.js +61 -57
  30. package/lib/commonjs/hooks/useRookEvents.js.map +1 -1
  31. package/lib/commonjs/hooks/useRookPermissions.js +59 -28
  32. package/lib/commonjs/hooks/useRookPermissions.js.map +1 -1
  33. package/lib/commonjs/hooks/useRookSummaries.js +23 -30
  34. package/lib/commonjs/hooks/useRookSummaries.js.map +1 -1
  35. package/lib/commonjs/modules/hook/useRookAutoSync.js +100 -32
  36. package/lib/commonjs/modules/hook/useRookAutoSync.js.map +1 -1
  37. package/lib/commonjs/types/PermissionsType.js +2 -0
  38. package/lib/commonjs/types/PermissionsType.js.map +1 -0
  39. package/lib/commonjs/utils/getNativeModule.js +29 -0
  40. package/lib/commonjs/utils/getNativeModule.js.map +1 -0
  41. package/lib/commonjs/utils/getRookModule.js +7 -0
  42. package/lib/commonjs/utils/getRookModule.js.map +1 -1
  43. package/lib/commonjs/utils/isModuleReady.js +6 -0
  44. package/lib/commonjs/utils/isModuleReady.js.map +1 -1
  45. package/lib/commonjs/utils/isValidDate.js +6 -0
  46. package/lib/commonjs/utils/isValidDate.js.map +1 -1
  47. package/lib/commonjs/utils/nativeModules.js +19 -0
  48. package/lib/commonjs/utils/nativeModules.js.map +1 -0
  49. package/lib/module/context/RookSyncGateContext.js +12 -0
  50. package/lib/module/context/RookSyncGateContext.js.map +1 -1
  51. package/lib/module/context/RookSyncGateProvider.js +8 -1
  52. package/lib/module/context/RookSyncGateProvider.js.map +1 -1
  53. package/lib/module/context/RookSyncGateReducer.js +15 -0
  54. package/lib/module/context/RookSyncGateReducer.js.map +1 -1
  55. package/lib/module/hooks/useRookAndroidBackgroundSteps.js +14 -29
  56. package/lib/module/hooks/useRookAndroidBackgroundSteps.js.map +1 -1
  57. package/lib/module/hooks/useRookAppleHealth.js +15 -2
  58. package/lib/module/hooks/useRookAppleHealth.js.map +1 -1
  59. package/lib/module/hooks/useRookAppleHealthVariables.js +20 -2
  60. package/lib/module/hooks/useRookAppleHealthVariables.js.map +1 -1
  61. package/lib/module/hooks/useRookConfiguration.js +18 -3
  62. package/lib/module/hooks/useRookConfiguration.js.map +1 -1
  63. package/lib/module/hooks/useRookDataSources.js +14 -2
  64. package/lib/module/hooks/useRookDataSources.js.map +1 -1
  65. package/lib/module/hooks/useRookEvents.js +32 -28
  66. package/lib/module/hooks/useRookEvents.js.map +1 -1
  67. package/lib/module/hooks/useRookPermissions.js +39 -9
  68. package/lib/module/hooks/useRookPermissions.js.map +1 -1
  69. package/lib/module/hooks/useRookSummaries.js +16 -23
  70. package/lib/module/hooks/useRookSummaries.js.map +1 -1
  71. package/lib/module/modules/hook/useRookAutoSync.js +100 -33
  72. package/lib/module/modules/hook/useRookAutoSync.js.map +1 -1
  73. package/lib/module/types/PermissionsType.js +2 -0
  74. package/lib/module/types/PermissionsType.js.map +1 -0
  75. package/lib/module/utils/getNativeModule.js +23 -0
  76. package/lib/module/utils/getNativeModule.js.map +1 -0
  77. package/lib/module/utils/getRookModule.js +8 -0
  78. package/lib/module/utils/getRookModule.js.map +1 -1
  79. package/lib/module/utils/isModuleReady.js +6 -0
  80. package/lib/module/utils/isModuleReady.js.map +1 -1
  81. package/lib/module/utils/isValidDate.js +6 -0
  82. package/lib/module/utils/isValidDate.js.map +1 -1
  83. package/lib/module/utils/nativeModules.js +13 -0
  84. package/lib/module/utils/nativeModules.js.map +1 -0
  85. package/lib/typescript/src/context/RookSyncGateContext.d.ts +7 -0
  86. package/lib/typescript/src/context/RookSyncGateContext.d.ts.map +1 -1
  87. package/lib/typescript/src/context/RookSyncGateProvider.d.ts.map +1 -1
  88. package/lib/typescript/src/context/RookSyncGateReducer.d.ts +15 -0
  89. package/lib/typescript/src/context/RookSyncGateReducer.d.ts.map +1 -1
  90. package/lib/typescript/src/hooks/useRookAndroidBackgroundSteps.d.ts +6 -2
  91. package/lib/typescript/src/hooks/useRookAndroidBackgroundSteps.d.ts.map +1 -1
  92. package/lib/typescript/src/hooks/useRookAppleHealth.d.ts +1 -1
  93. package/lib/typescript/src/hooks/useRookAppleHealth.d.ts.map +1 -1
  94. package/lib/typescript/src/hooks/useRookAppleHealthVariables.d.ts +9 -0
  95. package/lib/typescript/src/hooks/useRookAppleHealthVariables.d.ts.map +1 -1
  96. package/lib/typescript/src/hooks/useRookConfiguration.d.ts +6 -0
  97. package/lib/typescript/src/hooks/useRookConfiguration.d.ts.map +1 -1
  98. package/lib/typescript/src/hooks/useRookDataSources.d.ts +6 -0
  99. package/lib/typescript/src/hooks/useRookDataSources.d.ts.map +1 -1
  100. package/lib/typescript/src/hooks/useRookEvents.d.ts +9 -1
  101. package/lib/typescript/src/hooks/useRookEvents.d.ts.map +1 -1
  102. package/lib/typescript/src/hooks/useRookPermissions.d.ts +10 -0
  103. package/lib/typescript/src/hooks/useRookPermissions.d.ts.map +1 -1
  104. package/lib/typescript/src/hooks/useRookSummaries.d.ts +6 -6
  105. package/lib/typescript/src/hooks/useRookSummaries.d.ts.map +1 -1
  106. package/lib/typescript/src/modules/hook/useRookAutoSync.d.ts +16 -0
  107. package/lib/typescript/src/modules/hook/useRookAutoSync.d.ts.map +1 -1
  108. package/lib/typescript/src/types/PermissionsType.d.ts +6 -0
  109. package/lib/typescript/src/types/PermissionsType.d.ts.map +1 -0
  110. package/lib/typescript/src/utils/getNativeModule.d.ts +10 -0
  111. package/lib/typescript/src/utils/getNativeModule.d.ts.map +1 -0
  112. package/lib/typescript/src/utils/getRookModule.d.ts +7 -0
  113. package/lib/typescript/src/utils/getRookModule.d.ts.map +1 -1
  114. package/lib/typescript/src/utils/isModuleReady.d.ts +6 -0
  115. package/lib/typescript/src/utils/isModuleReady.d.ts.map +1 -1
  116. package/lib/typescript/src/utils/isValidDate.d.ts +6 -0
  117. package/lib/typescript/src/utils/isValidDate.d.ts.map +1 -1
  118. package/lib/typescript/src/utils/nativeModules.d.ts +14 -0
  119. package/lib/typescript/src/utils/nativeModules.d.ts.map +1 -0
  120. package/package.json +1 -1
  121. package/react-native-rook-sdk.podspec +1 -1
  122. package/lib/commonjs/utils/index.js +0 -69
  123. package/lib/commonjs/utils/index.js.map +0 -1
  124. package/lib/module/utils/index.js +0 -9
  125. package/lib/module/utils/index.js.map +0 -1
  126. package/lib/typescript/src/utils/index.d.ts +0 -9
  127. package/lib/typescript/src/utils/index.d.ts.map +0 -1
@@ -18,6 +18,7 @@ import com.rookmotion.rook.sdk.RookPermissionsManager
18
18
  import com.rookmotion.rook.sdk.RookStepsManager
19
19
  import com.rookmotion.rook.sdk.RookSummaryManager
20
20
  import com.rookmotion.rook.sdk.RookYesterdaySyncManager
21
+ import com.rookmotion.rook.sdk.domain.enums.DataSourceType
21
22
  import com.rookmotion.rook.sdk.domain.enums.HealthConnectAvailability
22
23
  import com.rookmotion.rook.sdk.domain.environment.RookAndroidClass
23
24
  import com.rookmotion.rook.sdk.domain.environment.RookEnvironment
@@ -37,31 +38,41 @@ import kotlinx.coroutines.SupervisorJob
37
38
  import kotlinx.coroutines.cancel
38
39
  import kotlinx.coroutines.launch
39
40
 
40
- class RookSdkModule(reactContext: ReactApplicationContext) :
41
- ReactContextBaseJavaModule(reactContext) {
41
+ /**
42
+ * The `RookSdkHealthConnectModule` class is a React Native module that interfaces
43
+ * with the Rook SDK for managing and syncing health data using Android's Health Connect.
44
+ * It provides methods for initializing the SDK, handling user configuration, syncing
45
+ * health data, and managing permissions.
46
+ *
47
+ * Main Responsibilities:
48
+ * - Initialize and configure the Rook SDK.
49
+ * - Manage user-related information such as user ID.
50
+ * - Sync health-related summaries and events (e.g., sleep, body metrics, physical activities).
51
+ * - Handle Health Connect permissions and check availability.
52
+ * - Transmit permission changes through Android and Health Connect.
53
+ * - Provide the ability to listen to permission changes using Android broadcast receivers.
54
+ * - Expose methods to JavaScript for requesting or syncing data.
55
+ *
56
+ * Key Components:
57
+ * - `RookConfigurationManager`: Manages configuration settings for the SDK.
58
+ * - `RookSummaryManager`: Handles syncing health data summaries (e.g., sleep, physical, body).
59
+ * - `RookEventManager`: Manages the synchronization of health-related events (e.g., physical activities, blood pressure, etc.).
60
+ * - `RookPermissionsManager`: Handles permission management and availability checks for Health Connect.
61
+ * - `RookStepsManager`: Manages steps data synchronization.
62
+ * - `CoroutineScope`: Used to launch asynchronous operations.
63
+ */
64
+ class RookSdkModule(
65
+ reactContext: ReactApplicationContext,
66
+ private val rookConfigurationManager: RookConfigurationManager
67
+ ): ReactContextBaseJavaModule(reactContext) {
42
68
 
43
- private val rookConfigurationManager = RookConfigurationManager(reactApplicationContext)
44
- private val rookSummaryManager = RookSummaryManager(rookConfigurationManager)
45
- private val rookEventManager = RookEventManager(rookConfigurationManager)
46
69
  private var scope: CoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
47
70
  private var listenerCount = 0
48
71
 
49
- private val rookSynManager: RookYesterdaySyncManager by lazy {
50
- RookYesterdaySyncManager(reactApplicationContext)
51
- }
52
-
53
72
  private val stepsScope: CoroutineScope by lazy {
54
73
  CoroutineScope(SupervisorJob() + Dispatchers.Main)
55
74
  }
56
75
 
57
- private val rookStepsManager: RookStepsManager by lazy {
58
- RookStepsManager(reactApplicationContext)
59
- }
60
-
61
- private val rookPermissionsManager: RookPermissionsManager by lazy {
62
- RookPermissionsManager(reactApplicationContext)
63
- }
64
-
65
76
  private val androidPermissionsReceiverTransmitter: AndroidPermissionsReceiverTransmitter by lazy {
66
77
  AndroidPermissionsReceiverTransmitter()
67
78
  }
@@ -109,106 +120,22 @@ class RookSdkModule(reactContext: ReactApplicationContext) :
109
120
  }
110
121
  }
111
122
 
112
- private fun determineSummaryValue(summaryString: String): HealthDataType {
113
- return when (summaryString) {
114
- "SLEEP" -> HealthDataType.SLEEP_SUMMARY
115
- "PHYSICAL" -> HealthDataType.PHYSICAL_SUMMARY
116
- "BODY" -> HealthDataType.BODY_SUMMARY
117
- "BLOOD_GLUCOSE_EVENT" -> HealthDataType.BLOOD_GLUCOSE_BODY_EVENT
118
- "BLOOD_PRESSURE_EVENT" -> HealthDataType.BLOOD_PRESSURE_BODY_EVENT
119
- "BODY_METRICS_EVENT" -> HealthDataType.BODY_METRICS_EVENT
120
- "HEART_RATE_EVENT" -> HealthDataType.HEART_RATE_BODY_EVENT
121
- "HYDRATION_EVENT" -> HealthDataType.HYDRATION_BODY_EVENT
122
- "NUTRITION_EVENT" -> HealthDataType.NUTRITION_BODY_EVENT
123
- "OXYGENATION_EVENT" -> HealthDataType.OXYGENATION_BODY_EVENT
124
- "PHYSICAL_EVENT" -> HealthDataType.PHYSICAL_EVENT
125
- "TEMPERATURE_EVENT" -> HealthDataType.TEMPERATURE_BODY_EVENT
126
- else -> HealthDataType.SLEEP_SUMMARY
127
- }
128
- }
129
-
130
- private fun dataSourcesToWritableArray(dataSources: List<DataSource>): WritableArray {
131
- val array = Arguments.createArray()
132
- for (dataSource in dataSources) {
133
- val map = Arguments.createMap()
134
- map.putString("name", dataSource.name)
135
- map.putString("description", dataSource.description)
136
- map.putString("imageUrl", dataSource.image)
137
- map.putBoolean("connected", dataSource.connected)
138
- dataSource.authorizationUrl?.let {
139
- map.putString("authorizationUrl", it)
140
- }
141
- array.pushMap(map)
142
- }
143
- return array
144
- }
145
-
146
- @ReactMethod
147
- fun getUserID(promise: Promise) {
148
- scope.launch {
149
- try {
150
- promise.resolve(rookConfigurationManager.getUserID())
151
- }
152
- catch (e: Exception) {
153
- promise.reject(e)
154
- }
155
- }
156
- }
157
-
158
- @ReactMethod
159
- fun updateUserID(userID: String, promise: Promise) {
160
- scope.launch {
161
- rookConfigurationManager.updateUserID(userID)
162
- .fold({
163
- promise.resolve(true)
164
- }, {
165
- promise.reject(it)
166
- })
167
- }
168
- }
169
-
170
- @ReactMethod
171
- fun clearUserID(promise: Promise) {
172
- scope.launch {
173
- rookConfigurationManager.clearUserID().fold({
174
- promise.resolve(true)
175
- }, {
176
- promise.reject(it)
177
- })
178
- }
179
- }
180
-
181
- @ReactMethod
182
- fun removeUserFromRook(promise: Promise) {
183
- scope.launch {
184
- val result = rookConfigurationManager.deleteUserFromRook()
185
-
186
- result.fold({
187
- promise.resolve(true)
188
- }, {
189
- promise.reject(it)
190
- })
191
- }
192
- }
193
-
194
- @ReactMethod
195
- fun syncUserTimeZone(promise: Promise) {
196
- scope.launch {
197
- val result = rookConfigurationManager.syncUserTimeZone()
198
-
199
- result.fold({
200
- promise.resolve(true)
201
- }, {
202
- promise.reject(it)
203
- })
204
- }
205
- }
206
-
207
-
208
-
123
+ /**
124
+ * Initializes the Rook SDK with the specified configuration settings (environment, clientUUID, secretKey).
125
+ * This is required before any data synchronization or user management can occur.
126
+ * @param config A map containing the environment, clientUUID, secretKey, and other settings.
127
+ * @param promise A promise object to handle the result (resolved on success, rejected on failure).
128
+ */
209
129
  @ReactMethod
210
130
  fun initRook(config: ReadableMap,promise: Promise) {
211
131
  try {
132
+ val clientUUID = config.getString("clientUUID")?.trim() ?: ""
133
+ val secretKey = config.getString("password")?.trim() ?: ""
134
+
135
+ if (clientUUID.isBlank() || secretKey.isBlank()) {
136
+ promise.reject("Invalid Credentials", "Invalid credentials")
137
+ return
138
+ }
212
139
 
213
140
  var environment = RookEnvironment.SANDBOX
214
141
 
@@ -220,8 +147,8 @@ class RookSdkModule(reactContext: ReactApplicationContext) :
220
147
 
221
148
  val rookConfiguration = RookConfiguration(
222
149
  environment = environment,
223
- clientUUID = config.getString("clientUUID") ?: "",
224
- secretKey = config.getString("password") ?: ""
150
+ clientUUID = clientUUID,
151
+ secretKey = secretKey
225
152
  )
226
153
 
227
154
  val enableLogs = config.getBoolean("enableLogs")
@@ -248,487 +175,14 @@ class RookSdkModule(reactContext: ReactApplicationContext) :
248
175
 
249
176
  }
250
177
 
251
- // MARK: - Permissions
252
- @ReactMethod
253
- fun shouldRequestPermissions(promise: Promise) {
254
- val activity = reactApplicationContext.currentActivity
255
-
256
- if (activity == null) {
257
- promise.reject(Exception("Error trying to request permissions"))
258
- return
259
- }
260
-
261
- try {
262
- val r = RookPermissionsManager.shouldRequestAndroidPermissions(activity)
263
- promise.resolve(r)
264
- }
265
- catch (e: Exception) {
266
- promise.reject(e)
267
- }
268
- }
269
-
270
- @ReactMethod
271
- fun checkAvailability(promise: Promise) {
272
-
273
- val r = rookPermissionsManager.checkHealthConnectAvailability()
274
-
275
- when(r) {
276
- HealthConnectAvailability.INSTALLED -> promise.resolve("INSTALED")
277
- HealthConnectAvailability.NOT_INSTALLED -> promise.resolve("NOT_INSTALED")
278
- HealthConnectAvailability.NOT_SUPPORTED -> promise.resolve("NOT_SUPPORTED")
279
- }
280
-
281
- }
282
-
283
- @ReactMethod
284
- fun openHealthConnectSettings(promise: Promise) {
285
- scope.launch {
286
-
287
- val result = rookPermissionsManager.openHealthConnectSettings()
288
-
289
- result.fold({
290
- promise.resolve(true)
291
- },{
292
- promise.reject(it)
293
- })
294
-
295
- }
296
- }
297
-
298
- @ReactMethod
299
- fun checkPermissions(promise: Promise) {
300
- scope.launch {
301
- val result = rookPermissionsManager.checkHealthConnectPermissions()
302
-
303
- result.fold({
304
- promise.resolve(it)
305
- }, {
306
- promise.reject(it)
307
- })
308
- }
309
- }
310
-
311
- @ReactMethod
312
- fun requestPermissions(promise: Promise) {
313
- scope.launch {
314
- rookPermissionsManager.requestHealthConnectPermissions().fold({
315
- when(it) {
316
- RequestPermissionsStatus.REQUEST_SENT -> {
317
- promise.resolve("REQUEST_SENT")
318
- }
319
- RequestPermissionsStatus .ALREADY_GRANTED -> {
320
- promise.resolve("ALREADY_GRANTED")
321
- }
322
- }
323
- }, {
324
- promise.reject(it)
325
- })
326
- }
327
- }
328
-
329
- // MARK: - Sync Summaries
330
- @ReactMethod
331
- fun shouldSyncFor(summaryString: String, date: String,promise: Promise) {
332
- scope.launch {
333
- RookHelpers.shouldSyncFor(
334
- healthDataType = determineSummaryValue(summaryString),
335
- localDate = RookDateTime.stringToLocalDate(date)
336
- ).fold({
337
- promise.resolve(it)
338
- },{
339
- promise.reject(it)
340
- })
341
- }
342
- }
343
-
344
- @ReactMethod
345
- fun syncSleepSummary(date: String, promise: Promise) {
346
- scope.launch {
347
- val result = rookSummaryManager.syncSleepSummary(RookDateTime.stringToLocalDate(date))
348
-
349
- result.fold({
350
- if (it == SyncStatus.SYNCED) promise.resolve(true)
351
- else promise.resolve(false)
352
- }, {
353
- promise.reject(it)
354
- })
355
- }
356
- }
357
-
358
- // Body
359
- @ReactMethod
360
- fun syncBodySummary(date: String, promise: Promise) {
361
- scope.launch {
362
- val result = rookSummaryManager.syncBodySummary(RookDateTime.stringToLocalDate(date))
363
-
364
- result.fold({
365
- if (it == SyncStatus.SYNCED) promise.resolve(true)
366
- else promise.resolve(false)
367
- }, {
368
- promise.reject(it)
369
- })
370
- }
371
- }
372
-
373
- // Physical
374
- @ReactMethod
375
- fun syncPhysicalSummary(date: String, promise: Promise) {
376
- scope.launch {
377
- val result = rookSummaryManager.syncPhysicalSummary(RookDateTime.stringToLocalDate(date))
378
-
379
- result.fold({
380
- if (it == SyncStatus.SYNCED) promise.resolve(true)
381
- else promise.resolve(false)
382
- }, {
383
- promise.reject(it)
384
- })
385
- }
386
- }
387
-
388
- @ReactMethod
389
- fun syncPendingSummaries(promise: Promise) {
390
- scope.launch {
391
- val result = rookSummaryManager.syncPendingSummaries()
392
-
393
- result.fold({
394
- promise.resolve(true)
395
- }, {
396
- promise.reject(it)
397
- })
398
- }
399
- }
400
-
401
- // MARK: - Events
402
- @ReactMethod
403
- fun syncPhysicalEvents(date: String, promise: Promise) {
404
- scope.launch {
405
- val result = rookEventManager.syncPhysicalEvents(RookDateTime.stringToLocalDate(date))
406
-
407
- result.fold({
408
- if (it == SyncStatus.SYNCED) promise.resolve(true)
409
- else promise.resolve(false)
410
- }, {
411
- promise.reject(it)
412
- })
413
- }
414
- }
415
-
416
- @ReactMethod
417
- fun syncBloodGlucoseEvents(date: String, promise: Promise) {
418
- scope.launch {
419
- val result = rookEventManager.syncBloodGlucoseEvents(RookDateTime.stringToLocalDate(date))
420
-
421
- result.fold({
422
- if (it == SyncStatus.SYNCED) promise.resolve(true)
423
- else promise.resolve(false)
424
- }, {
425
- promise.reject(it)
426
- })
427
- }
428
- }
429
-
430
- @ReactMethod
431
- fun syncBloodPressureEvents(date: String, promise: Promise) {
432
- scope.launch {
433
- val result = rookEventManager.syncBloodPressureEvents(RookDateTime.stringToLocalDate(date))
434
-
435
- result.fold({
436
- if (it == SyncStatus.SYNCED) promise.resolve(true)
437
- else promise.resolve(false)
438
- }, {
439
- promise.reject(it)
440
- })
441
- }
442
- }
443
-
444
- @ReactMethod
445
- fun syncBodyMetricsEvent(date: String, promise: Promise) {
446
- scope.launch {
447
- val result = rookEventManager.syncBodyMetricsEvents(RookDateTime.stringToLocalDate(date))
448
-
449
- result.fold({
450
- if (it == SyncStatus.SYNCED) promise.resolve(true)
451
- else promise.resolve(false)
452
- }, {
453
- promise.reject(it)
454
- })
455
- }
456
- }
457
-
458
- @ReactMethod
459
- fun syncBodyHeartRateEvent(date: String, promise: Promise) {
460
- scope.launch {
461
- val result = rookEventManager.syncBodyHeartRateEvents(RookDateTime.stringToLocalDate(date))
462
-
463
- result.fold({
464
- if (it == SyncStatus.SYNCED) promise.resolve(true)
465
- else promise.resolve(false)
466
- }, {
467
- promise.reject(it)
468
- })
469
- }
470
- }
471
-
472
- @ReactMethod
473
- fun syncPhysicalHeartRateEvent(date: String, promise: Promise) {
474
- scope.launch {
475
- val result = rookEventManager.syncPhysicalHeartRateEvents(RookDateTime.stringToLocalDate(date))
476
-
477
- result.fold({
478
- if (it == SyncStatus.SYNCED) promise.resolve(true)
479
- else promise.resolve(false)
480
- }, {
481
- promise.reject(it)
482
- })
483
- }
484
- }
485
-
486
- @ReactMethod
487
- fun syncNutritionEvents(date: String, promise: Promise) {
488
- scope.launch {
489
- val result = rookEventManager.syncNutritionEvents(RookDateTime.stringToLocalDate(date))
490
-
491
- result.fold({
492
- if (it == SyncStatus.SYNCED) promise.resolve(true)
493
- else promise.resolve(false)
494
- }, {
495
- promise.reject(it)
496
- })
497
- }
498
- }
499
-
500
- @ReactMethod
501
- fun syncHydrationEvents(date: String, promise: Promise) {
502
- scope.launch {
503
- val result = rookEventManager.syncHydrationEvents(RookDateTime.stringToLocalDate(date))
504
-
505
- result.fold({
506
- if (it == SyncStatus.SYNCED) promise.resolve(true)
507
- else promise.resolve(false)
508
- }, {
509
- promise.reject(it)
510
- })
511
- }
512
- }
513
- @ReactMethod
514
- fun syncPhysicalOxygenationEvent(date: String, promise: Promise) {
515
- scope.launch {
516
- val result = rookEventManager.syncPhysicalOxygenationEvents(RookDateTime.stringToLocalDate(date))
517
-
518
- result.fold({
519
- if (it == SyncStatus.SYNCED) promise.resolve(true)
520
- else promise.resolve(false)
521
- }, {
522
- promise.reject(it)
523
- })
524
- }
525
- }
526
-
527
- @ReactMethod
528
- fun syncBodyOxygenationEvent(date: String, promise: Promise) {
529
- scope.launch {
530
- val result = rookEventManager.syncBodyOxygenationEvents(RookDateTime.stringToLocalDate(date))
531
-
532
- result.fold({
533
- if (it == SyncStatus.SYNCED) promise.resolve(true)
534
- else promise.resolve(false)
535
- }, {
536
- promise.reject(it)
537
- })
538
- }
539
- }
540
-
541
- @ReactMethod
542
- fun syncTemperatureEvent(date: String, promise: Promise) {
543
- scope.launch {
544
- val result = rookEventManager
545
- .syncTemperatureEvents(RookDateTime.stringToLocalDate(date))
546
-
547
- result.fold({
548
- if (it == SyncStatus.SYNCED) promise.resolve(true)
549
- else promise.resolve(false)
550
- }, {
551
- promise.reject(it)
552
- })
553
- }
554
- }
555
-
556
- @ReactMethod
557
- fun syncPendingEvents(promise: Promise) {
558
- scope.launch {
559
- val result = rookEventManager.syncPendingEvents()
560
-
561
- result.fold({
562
- promise.resolve(true)
563
- }, {
564
- promise.reject(it)
565
- })
566
- }
567
- }
568
-
569
- // MARK: - Health Connect Background
570
- @ReactMethod
571
- fun scheduleYesterdaySync(config: ReadableMap, promise: Promise) {
572
- scope.launch {
573
- try {
574
- var environment = RookEnvironment.SANDBOX
575
-
576
- if (config.getString("environment") == "production")
577
- environment = RookEnvironment.PRODUCTION
578
-
579
- rookSynManager.scheduleYesterdaySync(
580
- enableLogs = true,
581
- clientUUID = config.getString("clientUUID") ?: "",
582
- secretKey = config.getString(",") ?: "",
583
- environment = environment,
584
- )
585
-
586
- promise.resolve(true)
587
-
588
- }
589
- catch (e: Exception) {
590
- promise.reject(e)
591
- }
592
- }
593
-
594
- }
595
-
596
- @ReactMethod
597
- fun requestAndroidBackgroundPermissions(promise: Promise) {
598
- try {
599
- val response = rookPermissionsManager.requestAndroidPermissions()
600
-
601
- if (response == RequestPermissionsStatus.REQUEST_SENT)
602
- promise.resolve("REQUEST_SENT")
603
- else promise.resolve("ALREADY_GRANTED")
604
- }
605
- catch (e: Exception) {
606
- promise.reject(e)
607
- }
608
- }
609
-
610
- @ReactMethod
611
- fun hasAndroidBackgroundPermissions(promise: Promise) {
612
- try {
613
- val result = rookPermissionsManager.checkAndroidPermissions()
614
- promise.resolve(result)
615
- }
616
- catch (e: Exception) {
617
- promise.reject(e)
618
- }
619
- }
620
-
621
- // MARK: - Steps
622
- @ReactMethod
623
- fun isStepsAvailable(promise: Promise) {
624
- promise.resolve(rookStepsManager.isAvailable())
625
- }
626
-
627
- @ReactMethod
628
- fun hasStepsPermissions(promise: Promise) {
629
- promise.resolve(rookPermissionsManager.checkAndroidPermissions())
630
- }
631
-
632
- @ReactMethod
633
- fun enableBackgroundAndroidSteps(promise: Promise) {
634
- rookStepsManager.enableBackgroundAndroidSteps().fold({
635
- promise.resolve(true)
636
- }, {
637
- promise.reject(it)
638
- })
639
- }
640
-
641
- @ReactMethod
642
- fun disableBackgroundAndroidSteps(promise: Promise) {
643
- rookStepsManager
644
- .disableBackgroundAndroidSteps()
645
- .fold({
646
- stepsScope.cancel()
647
- promise.resolve(true)
648
- }, {
649
- promise.reject(it)
650
- })
651
- }
652
-
653
- @ReactMethod
654
- fun isBackgroundAndroidStepsActive(promise: Promise) {
655
- scope.launch {
656
- val response = rookStepsManager.isBackgroundAndroidStepsActive()
657
- promise.resolve(response)
658
- }
659
- }
660
-
661
- @ReactMethod
662
- fun syncTodayAndroidStepsCount(promise: Promise) {
663
- scope.launch {
664
- rookStepsManager
665
- .syncTodayAndroidStepsCount()
666
- .fold({
667
- promise.resolve(it.toString())
668
- }, {
669
- promise.reject(it)
670
- })
671
- }
672
- }
673
-
674
- @ReactMethod
675
- fun syncTodayHealthConnectStepsCount(promise: Promise) {
676
- scope.launch {
677
- rookEventManager.syncTodayHealthConnectStepsCount().fold(
678
- {
679
- when (it) {
680
- SyncStatusWithData.RecordsNotFound -> {
681
- promise.reject("syncTodayHealthConnect", "Records Not Found")
682
- }
683
-
684
- is SyncStatusWithData.Synced -> {
685
- val steps = it.data
686
- promise.resolve(steps)
687
- }
688
- }
689
- },
690
- {
691
- promise.reject(it)
692
- }
693
- )
694
- }
695
- }
696
-
697
- // MARK: - Datasources
698
- @ReactMethod
699
- fun getAvailableDataSources(options: ReadableMap?, promise: Promise) {
700
- val rookDataSources = RookDataSources(reactApplicationContext)
701
- println(options)
702
- var redirectURL: String? = null
703
-
704
- if (options !== null) redirectURL = options.getString("redirectURL")
705
-
706
- scope.launch {
707
- rookDataSources.getAvailableDataSources(redirectURL).fold(
708
- { dataSources ->
709
- promise.resolve(dataSourcesToWritableArray(dataSources))
710
- },
711
- {
712
- promise.reject(it)
713
- },
714
- )
715
- }
716
- }
717
-
718
- @ReactMethod
719
- fun presentDataSourceView(options: ReadableMap?, promise: Promise) {
720
- val rookDataSources = RookDataSources(reactApplicationContext)
721
- var redirectURL: String? = null
722
-
723
- if (options !== null) redirectURL = options.getString("redirectURL")
724
-
725
- rookDataSources.presentDataSourceView(redirectURL).fold({
726
- promise.resolve(true)
727
- }, {
728
- promise.reject(it)
729
- })
730
- }
731
-
178
+ /**
179
+ * Sends a broadcast message to the React Native layer.
180
+ * This method emits a message event to the React Native side via the
181
+ * `ROOK_NOTIFICATION` channel, allowing communication from the native module.
182
+ *
183
+ * @param message A ReadableMap containing the message data to send.
184
+ * @param promise A promise object that resolves with true if the message was sent successfully.
185
+ */
732
186
  @ReactMethod
733
187
  fun sendMessageToBroadcast(message: ReadableMap, promise: Promise) {
734
188
  if (listenerCount <= 0) return
@@ -4,11 +4,27 @@ import com.facebook.react.ReactPackage
4
4
  import com.facebook.react.bridge.NativeModule
5
5
  import com.facebook.react.bridge.ReactApplicationContext
6
6
  import com.facebook.react.uimanager.ViewManager
7
+ import com.rookmotion.rook.sdk.RookConfigurationManager
8
+ import com.rooksdk.modules.RookConfigurationModule
9
+ import com.rooksdk.modules.RookPermissionsModule
10
+ import com.rooksdk.modules.RookStepsModule
11
+ import com.rooksdk.modules.RookSyncModule
7
12
 
8
13
 
9
14
  class RookSdkPackage : ReactPackage {
15
+ private var rookConfigurationManager: RookConfigurationManager? = null
16
+
10
17
  override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
11
- return listOf(RookSdkModule(reactContext))
18
+ if (rookConfigurationManager == null)
19
+ rookConfigurationManager = RookConfigurationManager(reactContext)
20
+
21
+ return listOf(
22
+ RookSdkModule(reactContext, rookConfigurationManager!!),
23
+ RookPermissionsModule(reactContext),
24
+ RookConfigurationModule(reactContext, rookConfigurationManager!!),
25
+ RookSyncModule(reactContext, rookConfigurationManager!!),
26
+ RookStepsModule(reactContext)
27
+ )
12
28
  }
13
29
 
14
30
  override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {