react-native-rook-sdk 0.6.2 → 1.0.0-rc.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 (146) hide show
  1. package/android/build.gradle +1 -1
  2. package/android/src/main/AndroidManifestNew.xml +0 -8
  3. package/android/src/main/java/com/rooksdk/RookSdkModule.kt +94 -580
  4. package/android/src/main/java/com/rooksdk/RookSdkPackage.kt +17 -1
  5. package/android/src/main/java/com/rooksdk/broadcasts/AndroidPermissionsReceiverTransmitter.kt +54 -0
  6. package/android/src/main/java/com/rooksdk/broadcasts/HealthConnectPermissionsReceiverTransmitter.kt +53 -0
  7. package/android/src/main/java/com/rooksdk/modules/RookConfigurationModule.kt +108 -0
  8. package/android/src/main/java/com/rooksdk/modules/RookPermissionsModule.kt +160 -0
  9. package/android/src/main/java/com/rooksdk/modules/RookStepsModule.kt +105 -0
  10. package/android/src/main/java/com/rooksdk/modules/RookSyncModule.kt +497 -0
  11. package/android/src/main/java/com/rooksdk/utils/DatasourcesUtils.kt +49 -0
  12. package/android/src/main/java/com/rooksdk/utils/ReadableToWritable.kt +64 -0
  13. package/android/src/main/java/com/rooksdk/utils/RookDateTime.kt +20 -0
  14. package/ios/RookSdk.mm +393 -42
  15. package/lib/commonjs/context/RookSyncGateContext.js +12 -0
  16. package/lib/commonjs/context/RookSyncGateContext.js.map +1 -1
  17. package/lib/commonjs/context/RookSyncGateProvider.js +14 -6
  18. package/lib/commonjs/context/RookSyncGateProvider.js.map +1 -1
  19. package/lib/commonjs/context/RookSyncGateReducer.js +15 -0
  20. package/lib/commonjs/context/RookSyncGateReducer.js.map +1 -1
  21. package/lib/commonjs/hooks/useRookAndroidBackgroundSteps.js +26 -38
  22. package/lib/commonjs/hooks/useRookAndroidBackgroundSteps.js.map +1 -1
  23. package/lib/commonjs/hooks/useRookAppleHealth.js +24 -10
  24. package/lib/commonjs/hooks/useRookAppleHealth.js.map +1 -1
  25. package/lib/commonjs/hooks/useRookAppleHealthVariables.js +22 -4
  26. package/lib/commonjs/hooks/useRookAppleHealthVariables.js.map +1 -1
  27. package/lib/commonjs/hooks/useRookConfiguration.js +32 -16
  28. package/lib/commonjs/hooks/useRookConfiguration.js.map +1 -1
  29. package/lib/commonjs/hooks/useRookDataSources.js +30 -5
  30. package/lib/commonjs/hooks/useRookDataSources.js.map +1 -1
  31. package/lib/commonjs/hooks/useRookEvents.js +61 -57
  32. package/lib/commonjs/hooks/useRookEvents.js.map +1 -1
  33. package/lib/commonjs/hooks/useRookPermissions.js +79 -37
  34. package/lib/commonjs/hooks/useRookPermissions.js.map +1 -1
  35. package/lib/commonjs/hooks/useRookSummaries.js +23 -29
  36. package/lib/commonjs/hooks/useRookSummaries.js.map +1 -1
  37. package/lib/commonjs/index.js +20 -8
  38. package/lib/commonjs/index.js.map +1 -1
  39. package/lib/commonjs/modules/hook/useRookAutoSync.js +133 -27
  40. package/lib/commonjs/modules/hook/useRookAutoSync.js.map +1 -1
  41. package/lib/commonjs/modules/types/sendMessageBroadcast.js +2 -0
  42. package/lib/commonjs/modules/types/sendMessageBroadcast.js.map +1 -0
  43. package/lib/commonjs/types/PermissionsType.js +2 -0
  44. package/lib/commonjs/types/PermissionsType.js.map +1 -0
  45. package/lib/commonjs/utils/getNativeModule.js +29 -0
  46. package/lib/commonjs/utils/getNativeModule.js.map +1 -0
  47. package/lib/commonjs/utils/getRookModule.js +7 -0
  48. package/lib/commonjs/utils/getRookModule.js.map +1 -1
  49. package/lib/commonjs/utils/isModuleReady.js +6 -0
  50. package/lib/commonjs/utils/isModuleReady.js.map +1 -1
  51. package/lib/commonjs/utils/isValidDate.js +6 -0
  52. package/lib/commonjs/utils/isValidDate.js.map +1 -1
  53. package/lib/commonjs/utils/nativeModules.js +19 -0
  54. package/lib/commonjs/utils/nativeModules.js.map +1 -0
  55. package/lib/module/context/RookSyncGateContext.js +12 -0
  56. package/lib/module/context/RookSyncGateContext.js.map +1 -1
  57. package/lib/module/context/RookSyncGateProvider.js +10 -2
  58. package/lib/module/context/RookSyncGateProvider.js.map +1 -1
  59. package/lib/module/context/RookSyncGateReducer.js +15 -0
  60. package/lib/module/context/RookSyncGateReducer.js.map +1 -1
  61. package/lib/module/hooks/useRookAndroidBackgroundSteps.js +14 -26
  62. package/lib/module/hooks/useRookAndroidBackgroundSteps.js.map +1 -1
  63. package/lib/module/hooks/useRookAppleHealth.js +15 -2
  64. package/lib/module/hooks/useRookAppleHealth.js.map +1 -1
  65. package/lib/module/hooks/useRookAppleHealthVariables.js +20 -2
  66. package/lib/module/hooks/useRookAppleHealthVariables.js.map +1 -1
  67. package/lib/module/hooks/useRookConfiguration.js +18 -3
  68. package/lib/module/hooks/useRookConfiguration.js.map +1 -1
  69. package/lib/module/hooks/useRookDataSources.js +27 -3
  70. package/lib/module/hooks/useRookDataSources.js.map +1 -1
  71. package/lib/module/hooks/useRookEvents.js +32 -28
  72. package/lib/module/hooks/useRookEvents.js.map +1 -1
  73. package/lib/module/hooks/useRookPermissions.js +63 -22
  74. package/lib/module/hooks/useRookPermissions.js.map +1 -1
  75. package/lib/module/hooks/useRookSummaries.js +16 -22
  76. package/lib/module/hooks/useRookSummaries.js.map +1 -1
  77. package/lib/module/index.js +2 -1
  78. package/lib/module/index.js.map +1 -1
  79. package/lib/module/modules/hook/useRookAutoSync.js +133 -28
  80. package/lib/module/modules/hook/useRookAutoSync.js.map +1 -1
  81. package/lib/module/modules/types/sendMessageBroadcast.js +2 -0
  82. package/lib/module/modules/types/sendMessageBroadcast.js.map +1 -0
  83. package/lib/module/types/PermissionsType.js +2 -0
  84. package/lib/module/types/PermissionsType.js.map +1 -0
  85. package/lib/module/utils/getNativeModule.js +23 -0
  86. package/lib/module/utils/getNativeModule.js.map +1 -0
  87. package/lib/module/utils/getRookModule.js +8 -0
  88. package/lib/module/utils/getRookModule.js.map +1 -1
  89. package/lib/module/utils/isModuleReady.js +6 -0
  90. package/lib/module/utils/isModuleReady.js.map +1 -1
  91. package/lib/module/utils/isValidDate.js +6 -0
  92. package/lib/module/utils/isValidDate.js.map +1 -1
  93. package/lib/module/utils/nativeModules.js +13 -0
  94. package/lib/module/utils/nativeModules.js.map +1 -0
  95. package/lib/typescript/src/context/RookSyncGateContext.d.ts +7 -0
  96. package/lib/typescript/src/context/RookSyncGateContext.d.ts.map +1 -1
  97. package/lib/typescript/src/context/RookSyncGateProvider.d.ts.map +1 -1
  98. package/lib/typescript/src/context/RookSyncGateReducer.d.ts +15 -0
  99. package/lib/typescript/src/context/RookSyncGateReducer.d.ts.map +1 -1
  100. package/lib/typescript/src/hooks/useRookAndroidBackgroundSteps.d.ts +6 -2
  101. package/lib/typescript/src/hooks/useRookAndroidBackgroundSteps.d.ts.map +1 -1
  102. package/lib/typescript/src/hooks/useRookAppleHealth.d.ts +1 -1
  103. package/lib/typescript/src/hooks/useRookAppleHealth.d.ts.map +1 -1
  104. package/lib/typescript/src/hooks/useRookAppleHealthVariables.d.ts +9 -0
  105. package/lib/typescript/src/hooks/useRookAppleHealthVariables.d.ts.map +1 -1
  106. package/lib/typescript/src/hooks/useRookConfiguration.d.ts +7 -1
  107. package/lib/typescript/src/hooks/useRookConfiguration.d.ts.map +1 -1
  108. package/lib/typescript/src/hooks/useRookDataSources.d.ts +8 -1
  109. package/lib/typescript/src/hooks/useRookDataSources.d.ts.map +1 -1
  110. package/lib/typescript/src/hooks/useRookEvents.d.ts +9 -1
  111. package/lib/typescript/src/hooks/useRookEvents.d.ts.map +1 -1
  112. package/lib/typescript/src/hooks/useRookPermissions.d.ts +16 -3
  113. package/lib/typescript/src/hooks/useRookPermissions.d.ts.map +1 -1
  114. package/lib/typescript/src/hooks/useRookSummaries.d.ts +6 -6
  115. package/lib/typescript/src/hooks/useRookSummaries.d.ts.map +1 -1
  116. package/lib/typescript/src/index.d.ts +2 -1
  117. package/lib/typescript/src/index.d.ts.map +1 -1
  118. package/lib/typescript/src/modules/hook/useRookAutoSync.d.ts +18 -1
  119. package/lib/typescript/src/modules/hook/useRookAutoSync.d.ts.map +1 -1
  120. package/lib/typescript/src/modules/types/sendMessageBroadcast.d.ts +6 -0
  121. package/lib/typescript/src/modules/types/sendMessageBroadcast.d.ts.map +1 -0
  122. package/lib/typescript/src/types/DataSource.d.ts +1 -0
  123. package/lib/typescript/src/types/DataSource.d.ts.map +1 -1
  124. package/lib/typescript/src/types/PermissionsType.d.ts +6 -0
  125. package/lib/typescript/src/types/PermissionsType.d.ts.map +1 -0
  126. package/lib/typescript/src/utils/getNativeModule.d.ts +10 -0
  127. package/lib/typescript/src/utils/getNativeModule.d.ts.map +1 -0
  128. package/lib/typescript/src/utils/getRookModule.d.ts +7 -0
  129. package/lib/typescript/src/utils/getRookModule.d.ts.map +1 -1
  130. package/lib/typescript/src/utils/isModuleReady.d.ts +6 -0
  131. package/lib/typescript/src/utils/isModuleReady.d.ts.map +1 -1
  132. package/lib/typescript/src/utils/isValidDate.d.ts +6 -0
  133. package/lib/typescript/src/utils/isValidDate.d.ts.map +1 -1
  134. package/lib/typescript/src/utils/nativeModules.d.ts +14 -0
  135. package/lib/typescript/src/utils/nativeModules.d.ts.map +1 -0
  136. package/package.json +1 -1
  137. package/react-native-rook-sdk.podspec +1 -1
  138. package/android/src/main/java/com/rooksdk/HealthConnectPermissionsActivity.kt +0 -40
  139. package/android/src/main/java/com/rooksdk/RookDateTime.kt +0 -12
  140. package/android/src/main/res/layout/activity_health_connect_permissions.xml +0 -15
  141. package/lib/commonjs/utils/index.js +0 -69
  142. package/lib/commonjs/utils/index.js.map +0 -1
  143. package/lib/module/utils/index.js +0 -9
  144. package/lib/module/utils/index.js.map +0 -1
  145. package/lib/typescript/src/utils/index.d.ts +0 -9
  146. package/lib/typescript/src/utils/index.d.ts.map +0 -1
@@ -1,5 +1,7 @@
1
1
  package com.rooksdk
2
2
 
3
+ import android.content.IntentFilter
4
+ import androidx.core.content.ContextCompat
3
5
  import com.facebook.react.bridge.Arguments
4
6
  import com.facebook.react.bridge.Promise
5
7
  import com.facebook.react.bridge.ReactApplicationContext
@@ -11,47 +13,72 @@ import com.facebook.react.modules.core.DeviceEventManagerModule
11
13
  import com.rookmotion.rook.sdk.RookConfigurationManager
12
14
  import com.rookmotion.rook.sdk.RookDataSources
13
15
  import com.rookmotion.rook.sdk.RookEventManager
14
- import com.rookmotion.rook.sdk.RookHealthPermissionsManager
15
16
  import com.rookmotion.rook.sdk.RookHelpers
17
+ import com.rookmotion.rook.sdk.RookPermissionsManager
16
18
  import com.rookmotion.rook.sdk.RookStepsManager
17
- import com.rookmotion.rook.sdk.RookStepsPermissions
18
19
  import com.rookmotion.rook.sdk.RookSummaryManager
19
20
  import com.rookmotion.rook.sdk.RookYesterdaySyncManager
20
- import com.rookmotion.rook.sdk.RookYesterdaySyncPermissions
21
+ import com.rookmotion.rook.sdk.domain.enums.DataSourceType
22
+ import com.rookmotion.rook.sdk.domain.enums.HealthConnectAvailability
21
23
  import com.rookmotion.rook.sdk.domain.environment.RookAndroidClass
22
24
  import com.rookmotion.rook.sdk.domain.environment.RookEnvironment
23
25
  import com.rookmotion.rook.sdk.domain.model.RookConfiguration
24
26
  import com.rookmotion.rook.sdk.domain.enums.HealthDataType
25
- import com.rookmotion.rook.sdk.domain.enums.SyncInstruction
27
+ import com.rookmotion.rook.sdk.domain.enums.RequestPermissionsStatus
26
28
  import com.rookmotion.rook.sdk.domain.enums.SyncStatus
27
29
  import com.rookmotion.rook.sdk.domain.model.DataSource
28
30
  import com.rookmotion.rook.sdk.domain.model.SyncStatusWithData
31
+ import com.rooksdk.broadcasts.AndroidPermissionsReceiverTransmitter
32
+ import com.rooksdk.broadcasts.HealthConnectPermissionsReceiverTransmitter
33
+ import com.rooksdk.utils.ReadableToWritable
34
+ import com.rooksdk.utils.RookDateTime
29
35
  import kotlinx.coroutines.CoroutineScope
30
36
  import kotlinx.coroutines.Dispatchers
31
37
  import kotlinx.coroutines.SupervisorJob
32
38
  import kotlinx.coroutines.cancel
33
39
  import kotlinx.coroutines.launch
34
40
 
35
- class RookSdkModule(reactContext: ReactApplicationContext) :
36
- 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) {
37
68
 
38
- private val rookConfigurationManager = RookConfigurationManager(reactApplicationContext)
39
- private val rookHealthPermissionsManager = RookHealthPermissionsManager(rookConfigurationManager)
40
- private val rookSummaryManager = RookSummaryManager(rookConfigurationManager)
41
- private val rookEventManager = RookEventManager(rookConfigurationManager)
42
69
  private var scope: CoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
43
70
  private var listenerCount = 0
44
71
 
45
- private val rookSynManager: RookYesterdaySyncManager by lazy {
46
- RookYesterdaySyncManager(reactApplicationContext)
47
- }
48
-
49
72
  private val stepsScope: CoroutineScope by lazy {
50
73
  CoroutineScope(SupervisorJob() + Dispatchers.Main)
51
74
  }
52
75
 
53
- private val rookStepsManager: RookStepsManager by lazy {
54
- RookStepsManager(reactApplicationContext)
76
+ private val androidPermissionsReceiverTransmitter: AndroidPermissionsReceiverTransmitter by lazy {
77
+ AndroidPermissionsReceiverTransmitter()
78
+ }
79
+
80
+ private val hcPermissionsReceiverTransmitter: HealthConnectPermissionsReceiverTransmitter by lazy {
81
+ HealthConnectPermissionsReceiverTransmitter()
55
82
  }
56
83
 
57
84
  override fun getName(): String {
@@ -60,6 +87,25 @@ class RookSdkModule(reactContext: ReactApplicationContext) :
60
87
 
61
88
  @ReactMethod
62
89
  fun addListener(eventName: String) {
90
+ if (listenerCount == 0) {
91
+ androidPermissionsReceiverTransmitter.setReactApplicationContext(reactApplicationContext)
92
+ hcPermissionsReceiverTransmitter.setReactApplicationContext(reactApplicationContext)
93
+
94
+ ContextCompat.registerReceiver(
95
+ reactApplicationContext,
96
+ androidPermissionsReceiverTransmitter,
97
+ IntentFilter(RookPermissionsManager.ACTION_ANDROID_PERMISSIONS),
98
+ ContextCompat.RECEIVER_EXPORTED
99
+ )
100
+
101
+ ContextCompat.registerReceiver(
102
+ reactApplicationContext,
103
+ hcPermissionsReceiverTransmitter,
104
+ IntentFilter(RookPermissionsManager.ACTION_HEALTH_CONNECT_PERMISSIONS),
105
+ ContextCompat.RECEIVER_EXPORTED,
106
+ )
107
+ }
108
+
63
109
  listenerCount += 1
64
110
  }
65
111
 
@@ -68,115 +114,28 @@ class RookSdkModule(reactContext: ReactApplicationContext) :
68
114
  listenerCount -= count
69
115
  if (listenerCount == 0) {
70
116
  stepsScope.cancel()
71
- }
72
- }
73
-
74
- private fun determineSummaryValue(summaryString: String): HealthDataType {
75
- return when (summaryString) {
76
- "SLEEP" -> HealthDataType.SLEEP_SUMMARY
77
- "PHYSICAL" -> HealthDataType.PHYSICAL_SUMMARY
78
- "BODY" -> HealthDataType.BODY_SUMMARY
79
- "BLOOD_GLUCOSE_EVENT" -> HealthDataType.BLOOD_GLUCOSE_BODY_EVENT
80
- "BLOOD_PRESSURE_EVENT" -> HealthDataType.BLOOD_PRESSURE_BODY_EVENT
81
- "BODY_METRICS_EVENT" -> HealthDataType.BODY_METRICS_EVENT
82
- "HEART_RATE_EVENT" -> HealthDataType.HEART_RATE_BODY_EVENT
83
- "HYDRATION_EVENT" -> HealthDataType.HYDRATION_BODY_EVENT
84
- "NUTRITION_EVENT" -> HealthDataType.NUTRITION_BODY_EVENT
85
- "OXYGENATION_EVENT" -> HealthDataType.OXYGENATION_BODY_EVENT
86
- "PHYSICAL_EVENT" -> HealthDataType.PHYSICAL_EVENT
87
- "TEMPERATURE_EVENT" -> HealthDataType.TEMPERATURE_BODY_EVENT
88
- else -> HealthDataType.SLEEP_SUMMARY
89
- }
90
- }
91
-
92
- private fun dataSourcesToWritableArray(dataSources: List<DataSource>): WritableArray {
93
- val array = Arguments.createArray()
94
- for (dataSource in dataSources) {
95
- val map = Arguments.createMap()
96
- map.putString("name", dataSource.name)
97
- map.putString("description", dataSource.description)
98
- map.putString("image", dataSource.image)
99
- map.putBoolean("connected", dataSource.connected)
100
- dataSource.authorizationUrl?.let {
101
- map.putString("authorizationUrl", it)
102
- }
103
- array.pushMap(map)
104
- }
105
- return array
106
- }
107
-
108
- private fun determineDoEndValue(permissionString: String): SyncInstruction {
109
- return when (permissionString) {
110
- "oldest" -> SyncInstruction.SYNC_OLDEST
111
- "latest" -> SyncInstruction.SYNC_LATEST
112
- else -> SyncInstruction.NOTHING
113
- }
114
- }
115
-
116
- @ReactMethod
117
- fun getUserID(promise: Promise) {
118
- try {
119
- promise.resolve(rookConfigurationManager.getUserID())
120
- }
121
- catch (e: Exception) {
122
- promise.reject(e)
123
- }
124
- }
125
-
126
- @ReactMethod
127
- fun updateUserID(userID: String, promise: Promise) {
128
- scope.launch {
129
- rookConfigurationManager.updateUserID(userID)
130
- .fold({
131
- promise.resolve(true)
132
- }, {
133
- promise.reject(it)
134
- })
135
- }
136
- }
137
117
 
138
- @ReactMethod
139
- fun clearUserID(promise: Promise) {
140
- scope.launch {
141
- rookConfigurationManager.clearUserID().fold({
142
- promise.resolve(true)
143
- }, {
144
- promise.reject(it)
145
- })
118
+ reactApplicationContext.unregisterReceiver(hcPermissionsReceiverTransmitter)
119
+ reactApplicationContext.unregisterReceiver(androidPermissionsReceiverTransmitter)
146
120
  }
147
121
  }
148
122
 
149
- @ReactMethod
150
- fun removeUserFromRook(promise: Promise) {
151
- scope.launch {
152
- val result = rookConfigurationManager.deleteUserFromRook()
153
-
154
- result.fold({
155
- promise.resolve(true)
156
- }, {
157
- promise.reject(it)
158
- })
159
- }
160
- }
161
-
162
- @ReactMethod
163
- fun syncUserTimeZone(promise: Promise) {
164
- scope.launch {
165
- val result = rookConfigurationManager.syncUserTimeZone()
166
-
167
- result.fold({
168
- promise.resolve(true)
169
- }, {
170
- promise.reject(it)
171
- })
172
- }
173
- }
174
-
175
-
176
-
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
+ */
177
129
  @ReactMethod
178
130
  fun initRook(config: ReadableMap,promise: Promise) {
179
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
+ }
180
139
 
181
140
  var environment = RookEnvironment.SANDBOX
182
141
 
@@ -188,8 +147,8 @@ class RookSdkModule(reactContext: ReactApplicationContext) :
188
147
 
189
148
  val rookConfiguration = RookConfiguration(
190
149
  environment = environment,
191
- clientUUID = config.getString("clientUUID") ?: "",
192
- secretKey = config.getString("password") ?: ""
150
+ clientUUID = clientUUID,
151
+ secretKey = secretKey
193
152
  )
194
153
 
195
154
  val enableLogs = config.getBoolean("enableLogs")
@@ -216,473 +175,28 @@ class RookSdkModule(reactContext: ReactApplicationContext) :
216
175
 
217
176
  }
218
177
 
219
- // MARK: - Permissions
220
- @ReactMethod
221
- fun checkAvailability(promise: Promise) {
222
-
223
- promise.resolve(RookHealthPermissionsManager.checkAvailability(reactApplicationContext).toString())
224
-
225
- }
226
-
227
- @ReactMethod
228
- fun openHealthConnectSettings(promise: Promise) {
229
- scope.launch {
230
-
231
- val result = rookHealthPermissionsManager.openHealthConnectSettings()
232
-
233
- result.fold({
234
- promise.resolve(true)
235
- },{
236
- promise.reject(it)
237
- })
238
-
239
- }
240
- }
241
-
242
- @ReactMethod
243
- fun checkPermissions(promise: Promise) {
244
- scope.launch {
245
- val result = rookHealthPermissionsManager.checkPermissions();
246
-
247
- result.fold({
248
- promise.resolve(it)
249
- }, {
250
- promise.reject(it)
251
- })
252
- }
253
- }
254
-
255
- @ReactMethod
256
- fun requestPermissions(promise: Promise) {
257
- val activity = reactApplicationContext.currentActivity
258
-
259
- if (activity == null) {
260
- promise.reject(Exception("Error trying to request permissions"))
261
- return
262
- }
263
-
264
- try {
265
-
266
- HealthConnectPermissionsActivity.launch(activity)
267
- promise.resolve(true)
268
-
269
- }
270
- catch (e: Exception) {
271
- promise.reject(e)
272
- }
273
-
274
- }
275
-
276
-
277
- // MARK: - Sync Summaries
278
- @ReactMethod
279
- fun shouldSyncFor(summaryString: String, date: String,promise: Promise) {
280
- scope.launch {
281
- RookHelpers.shouldSyncFor(
282
- healthDataType = determineSummaryValue(summaryString),
283
- localDate = RookDateTime.stringToLocalDate(date)
284
- ).fold({
285
- promise.resolve(it)
286
- },{
287
- promise.reject(it)
288
- })
289
- }
290
- }
291
-
292
- @ReactMethod
293
- fun syncSleepSummary(date: String, promise: Promise) {
294
- scope.launch {
295
- val result = rookSummaryManager.syncSleepSummary(RookDateTime.stringToLocalDate(date))
296
-
297
- result.fold({
298
- if (it == SyncStatus.SYNCED) promise.resolve(true)
299
- else promise.resolve(false)
300
- }, {
301
- promise.reject(it)
302
- })
303
- }
304
- }
305
-
306
- // Body
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
+ */
307
186
  @ReactMethod
308
- fun syncBodySummary(date: String, promise: Promise) {
309
- scope.launch {
310
- val result = rookSummaryManager.syncBodySummary(RookDateTime.stringToLocalDate(date))
187
+ fun sendMessageToBroadcast(message: ReadableMap, promise: Promise) {
188
+ if (listenerCount <= 0) return
311
189
 
312
- result.fold({
313
- if (it == SyncStatus.SYNCED) promise.resolve(true)
314
- else promise.resolve(false)
315
- }, {
316
- promise.reject(it)
317
- })
318
- }
319
- }
190
+ val hash = ReadableToWritable.readableMapToHashMap(message)
191
+ val writable = ReadableToWritable.hashMapToWritableMap(hash)
320
192
 
321
- // Physical
322
- @ReactMethod
323
- fun syncPhysicalSummary(date: String, promise: Promise) {
324
- scope.launch {
325
- val result = rookSummaryManager.syncPhysicalSummary(RookDateTime.stringToLocalDate(date))
193
+ reactApplicationContext
194
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
195
+ .emit("ROOK_NOTIFICATION", writable)
326
196
 
327
- result.fold({
328
- if (it == SyncStatus.SYNCED) promise.resolve(true)
329
- else promise.resolve(false)
330
- }, {
331
- promise.reject(it)
332
- })
333
- }
334
- }
335
-
336
- @ReactMethod
337
- fun syncPendingSummaries(promise: Promise) {
338
- scope.launch {
339
- val result = rookSummaryManager.syncPendingSummaries()
340
-
341
- result.fold({
342
- promise.resolve(true)
343
- }, {
344
- promise.reject(it)
345
- })
346
- }
347
- }
348
-
349
- // MARK: - Events
350
- @ReactMethod
351
- fun syncPhysicalEvents(date: String, promise: Promise) {
352
- scope.launch {
353
- val result = rookEventManager.syncPhysicalEvents(RookDateTime.stringToLocalDate(date))
354
-
355
- result.fold({
356
- if (it == SyncStatus.SYNCED) promise.resolve(true)
357
- else promise.resolve(false)
358
- }, {
359
- promise.reject(it)
360
- })
361
- }
362
- }
363
-
364
- @ReactMethod
365
- fun syncBloodGlucoseEvents(date: String, promise: Promise) {
366
- scope.launch {
367
- val result = rookEventManager.syncBloodGlucoseEvents(RookDateTime.stringToLocalDate(date))
368
-
369
- result.fold({
370
- if (it == SyncStatus.SYNCED) promise.resolve(true)
371
- else promise.resolve(false)
372
- }, {
373
- promise.reject(it)
374
- })
375
- }
376
- }
377
-
378
- @ReactMethod
379
- fun syncBloodPressureEvents(date: String, promise: Promise) {
380
- scope.launch {
381
- val result = rookEventManager.syncBloodPressureEvents(RookDateTime.stringToLocalDate(date))
382
-
383
- result.fold({
384
- if (it == SyncStatus.SYNCED) promise.resolve(true)
385
- else promise.resolve(false)
386
- }, {
387
- promise.reject(it)
388
- })
389
- }
390
- }
391
-
392
- @ReactMethod
393
- fun syncBodyMetricsEvent(date: String, promise: Promise) {
394
- scope.launch {
395
- val result = rookEventManager.syncBodyMetricsEvents(RookDateTime.stringToLocalDate(date))
396
-
397
- result.fold({
398
- if (it == SyncStatus.SYNCED) promise.resolve(true)
399
- else promise.resolve(false)
400
- }, {
401
- promise.reject(it)
402
- })
403
- }
404
- }
405
-
406
- @ReactMethod
407
- fun syncBodyHeartRateEvent(date: String, promise: Promise) {
408
- scope.launch {
409
- val result = rookEventManager.syncBodyHeartRateEvents(RookDateTime.stringToLocalDate(date))
410
-
411
- result.fold({
412
- if (it == SyncStatus.SYNCED) promise.resolve(true)
413
- else promise.resolve(false)
414
- }, {
415
- promise.reject(it)
416
- })
417
- }
418
- }
419
-
420
- @ReactMethod
421
- fun syncPhysicalHeartRateEvent(date: String, promise: Promise) {
422
- scope.launch {
423
- val result = rookEventManager.syncPhysicalHeartRateEvents(RookDateTime.stringToLocalDate(date))
424
-
425
- result.fold({
426
- if (it == SyncStatus.SYNCED) promise.resolve(true)
427
- else promise.resolve(false)
428
- }, {
429
- promise.reject(it)
430
- })
431
- }
432
- }
433
-
434
- @ReactMethod
435
- fun syncNutritionEvents(date: String, promise: Promise) {
436
- scope.launch {
437
- val result = rookEventManager.syncNutritionEvents(RookDateTime.stringToLocalDate(date))
438
-
439
- result.fold({
440
- if (it == SyncStatus.SYNCED) promise.resolve(true)
441
- else promise.resolve(false)
442
- }, {
443
- promise.reject(it)
444
- })
445
- }
446
- }
447
-
448
- @ReactMethod
449
- fun syncHydrationEvents(date: String, promise: Promise) {
450
- scope.launch {
451
- val result = rookEventManager.syncHydrationEvents(RookDateTime.stringToLocalDate(date))
452
-
453
- result.fold({
454
- if (it == SyncStatus.SYNCED) promise.resolve(true)
455
- else promise.resolve(false)
456
- }, {
457
- promise.reject(it)
458
- })
459
- }
460
- }
461
- @ReactMethod
462
- fun syncPhysicalOxygenationEvent(date: String, promise: Promise) {
463
- scope.launch {
464
- val result = rookEventManager.syncPhysicalOxygenationEvents(RookDateTime.stringToLocalDate(date))
465
-
466
- result.fold({
467
- if (it == SyncStatus.SYNCED) promise.resolve(true)
468
- else promise.resolve(false)
469
- }, {
470
- promise.reject(it)
471
- })
472
- }
473
- }
474
-
475
- @ReactMethod
476
- fun syncBodyOxygenationEvent(date: String, promise: Promise) {
477
- scope.launch {
478
- val result = rookEventManager.syncBodyOxygenationEvents(RookDateTime.stringToLocalDate(date))
479
-
480
- result.fold({
481
- if (it == SyncStatus.SYNCED) promise.resolve(true)
482
- else promise.resolve(false)
483
- }, {
484
- promise.reject(it)
485
- })
486
- }
487
- }
488
-
489
- @ReactMethod
490
- fun syncTemperatureEvent(date: String, promise: Promise) {
491
- scope.launch {
492
- val result = rookEventManager
493
- .syncTemperatureEvents(RookDateTime.stringToLocalDate(date))
494
-
495
- result.fold({
496
- if (it == SyncStatus.SYNCED) promise.resolve(true)
497
- else promise.resolve(false)
498
- }, {
499
- promise.reject(it)
500
- })
501
- }
502
- }
503
-
504
- @ReactMethod
505
- fun syncPendingEvents(promise: Promise) {
506
- scope.launch {
507
- val result = rookEventManager.syncPendingEvents()
508
-
509
- result.fold({
510
- promise.resolve(true)
511
- }, {
512
- promise.reject(it)
513
- })
514
- }
515
- }
516
-
517
- // MARK: - Health Connect Background
518
- @ReactMethod
519
- fun scheduleYesterdaySync(config: ReadableMap, promise: Promise) {
520
- scope.launch {
521
- try {
522
- var environment = RookEnvironment.SANDBOX
523
-
524
- if (config.getString("environment") == "production")
525
- environment = RookEnvironment.PRODUCTION
526
-
527
- val doEnd = determineDoEndValue(config.getString("doOnEnd") ?: "")
528
-
529
- rookSynManager.scheduleYesterdaySync(
530
- enableLogs = true,
531
- clientUUID = config.getString("clientUUID") ?: "",
532
- secretKey = config.getString(",") ?: "",
533
- environment = environment,
534
- doOnEnd = doEnd
535
- )
536
-
537
- promise.resolve(true)
538
-
539
- }
540
- catch (e: Exception) {
541
- promise.reject(e)
542
- }
543
- }
544
-
545
- }
546
-
547
- @ReactMethod
548
- fun requestAndroidBackgroundPermissions(promise: Promise) {
549
- try {
550
- RookYesterdaySyncPermissions.requestAndroidPermissions(reactApplicationContext)
551
- promise.resolve(true)
552
- }
553
- catch (e: Exception) {
554
- promise.reject(e)
555
- }
556
- }
557
-
558
- @ReactMethod
559
- fun hasAndroidBackgroundPermissions(promise: Promise) {
560
- try {
561
- val result = RookYesterdaySyncPermissions.hasAndroidPermissions(reactApplicationContext)
562
- promise.resolve(result)
563
- }
564
- catch (e: Exception) {
565
- promise.reject(e)
566
- }
567
- }
568
-
569
- // MARK: - Steps
570
- @ReactMethod
571
- fun isStepsAvailable(promise: Promise) {
572
- promise.resolve(RookStepsPermissions.isAvailable(reactApplicationContext))
573
- }
574
-
575
- @ReactMethod
576
- fun hasStepsPermissions(promise: Promise) {
577
- promise.resolve(RookStepsPermissions.hasPermissions(reactApplicationContext))
578
- }
579
-
580
- @ReactMethod
581
- fun requestStepsPermissions(promise: Promise) {
582
- RookStepsPermissions.requestPermissions(reactApplicationContext)
583
197
  promise.resolve(true)
584
198
  }
585
199
 
586
- @ReactMethod
587
- fun enableBackgroundAndroidSteps(promise: Promise) {
588
- rookStepsManager.enableBackgroundAndroidSteps().fold({
589
- promise.resolve(true)
590
- }, {
591
- promise.reject(it)
592
- })
593
- }
594
-
595
- @ReactMethod
596
- fun disableBackgroundAndroidSteps(promise: Promise) {
597
- rookStepsManager
598
- .disableBackgroundAndroidSteps()
599
- .fold({
600
- stepsScope.cancel()
601
- promise.resolve(true)
602
- }, {
603
- promise.reject(it)
604
- })
605
- }
606
-
607
- @ReactMethod
608
- fun isBackgroundAndroidStepsActive(promise: Promise) {
609
- scope.launch {
610
- val response = rookStepsManager.isBackgroundAndroidStepsActive()
611
- promise.resolve(response)
612
- }
613
- }
614
-
615
- @ReactMethod
616
- fun syncTodayAndroidStepsCount(promise: Promise) {
617
- scope.launch {
618
- rookStepsManager
619
- .syncTodayAndroidStepsCount()
620
- .fold({
621
- promise.resolve(it.toString())
622
- }, {
623
- promise.reject(it)
624
- })
625
- }
626
- }
627
-
628
- @ReactMethod
629
- fun syncTodayHealthConnectStepsCount(promise: Promise) {
630
- scope.launch {
631
- rookEventManager.syncTodayHealthConnectStepsCount().fold(
632
- {
633
- when (it) {
634
- SyncStatusWithData.RecordsNotFound -> {
635
- promise.reject("syncTodayHealthConnect", "Records Not Found")
636
- }
637
-
638
- is SyncStatusWithData.Synced -> {
639
- val steps = it.data
640
- promise.resolve(steps)
641
- }
642
- }
643
- },
644
- {
645
- promise.reject(it)
646
- }
647
- )
648
- }
649
- }
650
-
651
- // MARK: - Datasources
652
- @ReactMethod
653
- fun getAvailableDataSources(options: ReadableMap?, promise: Promise) {
654
- val rookDataSources = RookDataSources(reactApplicationContext)
655
- println(options)
656
- var redirectURL: String? = null
657
-
658
- if (options !== null) redirectURL = options.getString("redirectURL")
659
-
660
- scope.launch {
661
- rookDataSources.getAvailableDataSources(redirectURL).fold(
662
- { dataSources ->
663
- promise.resolve(dataSourcesToWritableArray(dataSources))
664
- },
665
- {
666
- promise.reject(it)
667
- },
668
- )
669
- }
670
- }
671
-
672
- @ReactMethod
673
- fun presentDataSourceView(options: ReadableMap?, promise: Promise) {
674
- val rookDataSources = RookDataSources(reactApplicationContext)
675
- var redirectURL: String? = null
676
-
677
- if (options !== null) redirectURL = options.getString("redirectURL")
678
-
679
- rookDataSources.presentDataSourceView(redirectURL).fold({
680
- promise.resolve(true)
681
- }, {
682
- promise.reject(it)
683
- })
684
- }
685
-
686
200
  companion object {
687
201
  const val NAME = "RookSdk"
688
202
  }