react-native-mytatva-rn-sdk 1.2.73 → 1.2.75
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/libs/algorithm-release.aar +0 -0
- package/android/src/main/java/cgmblelib/ble/gattcallback/BleGattCallback.java +11 -7
- package/android/src/main/java/com/mytatvarnsdk/CgmTrackyLibModule.kt +346 -13
- package/ios/Database/KLTAppDelegate.m +0 -2
- package/ios/Database/KLTDatabaseHandler.m +17 -3
- package/ios/MyReactNativeBridge.m +6 -4
- package/ios/ViewControllers/AttachTransmitterViewController.swift +0 -1
- package/ios/ViewModel/FinalViewModel.swift +0 -2
- package/lib/commonjs/CGMConnect.js +8 -8
- package/lib/commonjs/CGMConnect.js.map +1 -1
- package/lib/module/CGMConnect.js +8 -8
- package/lib/module/CGMConnect.js.map +1 -1
- package/lib/typescript/CGMConnect.d.ts +4 -4
- package/package.json +1 -1
- package/src/CGMConnect.ts +31 -13
|
Binary file
|
|
@@ -359,21 +359,25 @@ public class BleGattCallback extends BluetoothGattCallback {
|
|
|
359
359
|
if (period > 3000 || period < 800) {
|
|
360
360
|
period = 800;
|
|
361
361
|
}
|
|
362
|
+
// Capture current characteristic to avoid null races inside the async lambda
|
|
363
|
+
final BluetoothGattCharacteristic characteristic = mCharacteristic;
|
|
364
|
+
|
|
362
365
|
mDisposable = Observable.intervalRange(1, count, initialDelay, period, TimeUnit.MILLISECONDS)
|
|
363
366
|
.observeOn(Schedulers.io())
|
|
364
367
|
.subscribe(aLong -> {
|
|
365
|
-
if (mBluetoothGatt != null &&
|
|
366
|
-
|
|
368
|
+
if (mBluetoothGatt != null && characteristic != null) {
|
|
369
|
+
byte[] value = characteristic.getValue();
|
|
370
|
+
MyLog.d("intervalRange循环 发送数据 次数 " + aLong + "数据 " + HexadecimalTools.ByteArrayToStrs16(value));
|
|
367
371
|
mBluetoothGatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_BALANCED);
|
|
368
|
-
mBluetoothGatt.writeCharacteristic(
|
|
372
|
+
mBluetoothGatt.writeCharacteristic(characteristic);
|
|
373
|
+
if (aLong >= 5 && value != null && value.length > 0 && value[0] != 0x17) {
|
|
374
|
+
MyLog.e("超出命令发送的最大限制 关闭连接");
|
|
375
|
+
closeGatt();
|
|
376
|
+
}
|
|
369
377
|
} else {
|
|
370
378
|
MyLog.w("intervalRange 循环没有数据发送 " + aLong);
|
|
371
379
|
dispose();
|
|
372
380
|
}
|
|
373
|
-
if (aLong >= 5 && mCharacteristic.getValue()[0] != 0x17) {
|
|
374
|
-
MyLog.e("超出命令发送的最大限制 关闭连接");
|
|
375
|
-
closeGatt();
|
|
376
|
-
}
|
|
377
381
|
}, throwable -> {
|
|
378
382
|
MyLog.w("intervalRange 异常 " + throwable.getMessage());
|
|
379
383
|
dispose();
|
|
@@ -23,13 +23,19 @@ import com.facebook.react.bridge.Promise
|
|
|
23
23
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
24
24
|
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
25
25
|
import com.facebook.react.bridge.ReactMethod
|
|
26
|
+
import com.facebook.react.bridge.ReadableMap
|
|
26
27
|
import com.facebook.react.bridge.WritableMap
|
|
27
28
|
import com.facebook.react.module.annotations.ReactModule
|
|
28
29
|
import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
29
30
|
import com.google.gson.Gson
|
|
30
31
|
import com.google.gson.GsonBuilder
|
|
31
|
-
import io.sentry.
|
|
32
|
+
import io.sentry.IScope
|
|
33
|
+
import io.sentry.IHub
|
|
32
34
|
import io.sentry.android.core.SentryAndroid
|
|
35
|
+
import io.sentry.android.core.SentryAndroidOptions
|
|
36
|
+
import io.sentry.Hub
|
|
37
|
+
import io.sentry.SentryLevel
|
|
38
|
+
import io.sentry.SentryEvent
|
|
33
39
|
import com.mytatvarnsdk.activity.HelpActivity
|
|
34
40
|
import com.mytatvarnsdk.activity.StartCGMActivity
|
|
35
41
|
import com.mytatvarnsdk.model.AllCGMLogRequest
|
|
@@ -85,6 +91,7 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
85
91
|
private val pendingDataQueue = ConcurrentLinkedQueue<PocGlucose>()
|
|
86
92
|
private val metadataLock = Mutex()
|
|
87
93
|
private var uploadJob: Job? = null
|
|
94
|
+
private var currentUserData: ReadableMap? = null
|
|
88
95
|
|
|
89
96
|
init {
|
|
90
97
|
mReactContext = reactContext
|
|
@@ -99,13 +106,141 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
99
106
|
}
|
|
100
107
|
|
|
101
108
|
private fun initSentryIfNeeded(context: ReactApplicationContext) {
|
|
109
|
+
// Create a separate Sentry Hub with SDK's own DSN
|
|
110
|
+
// This ensures we don't interfere with RN app's Sentry instance
|
|
111
|
+
// We create our own Hub WITHOUT calling SentryAndroid.init() to avoid overriding global Sentry
|
|
102
112
|
if (sentryInitialized.compareAndSet(false, true)) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
113
|
+
try {
|
|
114
|
+
Log.d("Sentry", "Initializing SDK Sentry with separate Hub and DSN (not affecting global Sentry)")
|
|
115
|
+
|
|
116
|
+
// Create SentryOptions with SDK's DSN
|
|
117
|
+
// Use SentryAndroidOptions for Android-specific configuration
|
|
118
|
+
val options = SentryAndroidOptions().apply {
|
|
119
|
+
dsn = "https://8c1585c04b41a8bdf3271d89c7361530@o4509755819294720.ingest.us.sentry.io/4510520864735232"
|
|
120
|
+
isDebug = true // remove or toggle for production
|
|
121
|
+
tracesSampleRate = 1.0
|
|
122
|
+
environment = env.ifEmpty { "development" }
|
|
123
|
+
// Configure Android-specific options
|
|
124
|
+
setAttachScreenshot(false)
|
|
125
|
+
setAttachViewHierarchy(false)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Set Android context - this is needed for Android integrations
|
|
129
|
+
// But we DON'T call SentryAndroid.init() to avoid overriding global Sentry
|
|
130
|
+
val androidContext = context.applicationContext
|
|
131
|
+
|
|
132
|
+
// Manually configure Android-specific settings if needed
|
|
133
|
+
// Note: Some Android integrations might not work without init(), but core functionality will
|
|
134
|
+
|
|
135
|
+
// Create a separate Hub for SDK use (doesn't affect global Sentry)
|
|
136
|
+
sdkSentryHub = Hub(options)
|
|
137
|
+
|
|
138
|
+
// Capture initial message after a brief delay to ensure Sentry is ready
|
|
139
|
+
Handler(Looper.getMainLooper()).postDelayed({
|
|
140
|
+
try {
|
|
141
|
+
val sentryMessage = io.sentry.protocol.Message().apply {
|
|
142
|
+
formatted = "Goodflip SDK started"
|
|
143
|
+
}
|
|
144
|
+
val event = SentryEvent().apply {
|
|
145
|
+
setMessage(sentryMessage)
|
|
146
|
+
level = SentryLevel.INFO
|
|
147
|
+
}
|
|
148
|
+
sdkSentryHub?.captureEvent(event)
|
|
149
|
+
Log.d("Sentry", "Goodflip SDK started message sent to SDK Sentry")
|
|
150
|
+
} catch (e: Exception) {
|
|
151
|
+
Log.e("Sentry", "Error sending initial message: ${e.message}", e)
|
|
152
|
+
}
|
|
153
|
+
}, 200)
|
|
154
|
+
} catch (e: Exception) {
|
|
155
|
+
Log.e("Sentry", "Error initializing SDK Sentry: ${e.message}", e)
|
|
156
|
+
sentryInitialized.set(false) // Reset on error so we can try again
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
private fun captureSentryMessage(message: String, extras: Map<String, String> = emptyMap()) {
|
|
162
|
+
try {
|
|
163
|
+
// Always try to use Sentry - it might be initialized by RN app even if our flag is false
|
|
164
|
+
// Ensure we're on main thread for Sentry operations
|
|
165
|
+
if (Looper.myLooper() == Looper.getMainLooper()) {
|
|
166
|
+
captureSentryMessageInternal(message, extras)
|
|
167
|
+
} else {
|
|
168
|
+
Handler(Looper.getMainLooper()).post {
|
|
169
|
+
captureSentryMessageInternal(message, extras)
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
} catch (e: Exception) {
|
|
173
|
+
Log.e("Sentry", "Error capturing Sentry message: ${e.message}", e)
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
private fun captureSentryMessageInternal(message: String, extras: Map<String, String> = emptyMap()) {
|
|
178
|
+
try {
|
|
179
|
+
val hub = sdkSentryHub
|
|
180
|
+
if (hub == null) {
|
|
181
|
+
Log.w("Sentry", "SDK Sentry Hub not initialized, skipping message: $message")
|
|
182
|
+
return
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
hub.withScope { scope ->
|
|
186
|
+
addContact(scope)
|
|
187
|
+
extras.forEach { (key, value) ->
|
|
188
|
+
scope.setExtra(key, value)
|
|
189
|
+
}
|
|
190
|
+
val msgText = message
|
|
191
|
+
val sentryMessage = io.sentry.protocol.Message().apply {
|
|
192
|
+
formatted = msgText
|
|
193
|
+
}
|
|
194
|
+
val event = SentryEvent().apply {
|
|
195
|
+
setMessage(sentryMessage)
|
|
196
|
+
level = SentryLevel.INFO
|
|
197
|
+
}
|
|
198
|
+
hub.captureEvent(event)
|
|
199
|
+
Log.d("Sentry", "Message captured to SDK Sentry: $msgText")
|
|
200
|
+
}
|
|
201
|
+
} catch (e: Exception) {
|
|
202
|
+
Log.e("Sentry", "Error in captureSentryMessageInternal: ${e.message}", e)
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
private fun captureSentryException(exception: Throwable, extras: Map<String, String> = emptyMap()) {
|
|
207
|
+
try {
|
|
208
|
+
// Always try to use Sentry - it might be initialized by RN app even if our flag is false
|
|
209
|
+
// Ensure we're on main thread for Sentry operations
|
|
210
|
+
if (Looper.myLooper() == Looper.getMainLooper()) {
|
|
211
|
+
captureSentryExceptionInternal(exception, extras)
|
|
212
|
+
} else {
|
|
213
|
+
Handler(Looper.getMainLooper()).post {
|
|
214
|
+
captureSentryExceptionInternal(exception, extras)
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
} catch (e: Exception) {
|
|
218
|
+
Log.e("Sentry", "Error capturing Sentry exception: ${e.message}", e)
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
private fun captureSentryExceptionInternal(exception: Throwable, extras: Map<String, String> = emptyMap()) {
|
|
223
|
+
try {
|
|
224
|
+
val hub = sdkSentryHub
|
|
225
|
+
if (hub == null) {
|
|
226
|
+
Log.w("Sentry", "SDK Sentry Hub not initialized, skipping exception: ${exception.message}")
|
|
227
|
+
return
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
hub.withScope { scope ->
|
|
231
|
+
addContact(scope)
|
|
232
|
+
extras.forEach { (key, value) ->
|
|
233
|
+
scope.setExtra(key, value)
|
|
234
|
+
}
|
|
235
|
+
val event = SentryEvent().apply {
|
|
236
|
+
throwable = exception
|
|
237
|
+
level = SentryLevel.ERROR
|
|
238
|
+
}
|
|
239
|
+
hub.captureEvent(event)
|
|
240
|
+
Log.d("Sentry", "Exception captured to SDK Sentry: ${exception.message}")
|
|
107
241
|
}
|
|
108
|
-
|
|
242
|
+
} catch (e: Exception) {
|
|
243
|
+
Log.e("Sentry", "Error in captureSentryExceptionInternal: ${e.message}", e)
|
|
109
244
|
}
|
|
110
245
|
}
|
|
111
246
|
|
|
@@ -115,12 +250,22 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
115
250
|
var userToken: String = ""
|
|
116
251
|
var env: String = ""
|
|
117
252
|
private val sentryInitialized = AtomicBoolean(false)
|
|
253
|
+
private var sdkSentryHub: IHub? = null
|
|
118
254
|
}
|
|
119
255
|
|
|
120
256
|
override fun getName(): String {
|
|
121
257
|
return "CgmTrackyLib"
|
|
122
258
|
}
|
|
123
259
|
|
|
260
|
+
private fun updateUserData(data: ReadableMap?) {
|
|
261
|
+
currentUserData = data
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
private fun addContact(scope: IScope) {
|
|
265
|
+
val contact = currentUserData?.getString("contact_no") ?: "unknown"
|
|
266
|
+
scope.setExtra("contact_no", contact)
|
|
267
|
+
}
|
|
268
|
+
|
|
124
269
|
@ReactMethod
|
|
125
270
|
fun observeDeviceStatus(token: String, envType: String) {
|
|
126
271
|
try {
|
|
@@ -149,9 +294,11 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
149
294
|
token: String,
|
|
150
295
|
apiResponse: String?,
|
|
151
296
|
patientId: String,
|
|
152
|
-
envType: String
|
|
297
|
+
envType: String,
|
|
298
|
+
userData: ReadableMap? = null
|
|
153
299
|
) {
|
|
154
300
|
try {
|
|
301
|
+
updateUserData(userData)
|
|
155
302
|
if (apiResponse != null && apiResponse.isNotEmpty()) {
|
|
156
303
|
env = envType
|
|
157
304
|
userToken = token
|
|
@@ -376,8 +523,9 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
376
523
|
}
|
|
377
524
|
|
|
378
525
|
@ReactMethod
|
|
379
|
-
fun startCgmTracky(token: String, envType: String) {
|
|
526
|
+
fun startCgmTracky(token: String, envType: String, userData: ReadableMap? = null) {
|
|
380
527
|
try {
|
|
528
|
+
updateUserData(userData)
|
|
381
529
|
userToken = token
|
|
382
530
|
env = envType.lowercase()
|
|
383
531
|
val intent = Intent(currentActivity, StartCGMActivity::class.java)
|
|
@@ -400,8 +548,9 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
400
548
|
}
|
|
401
549
|
|
|
402
550
|
@ReactMethod
|
|
403
|
-
fun reconnectCgmTracky(token: String, envType: String) {
|
|
551
|
+
fun reconnectCgmTracky(token: String, envType: String, userData: ReadableMap? = null) {
|
|
404
552
|
try {
|
|
553
|
+
updateUserData(userData)
|
|
405
554
|
userToken = token
|
|
406
555
|
env = envType.lowercase()
|
|
407
556
|
currentActivity?.startActivity(
|
|
@@ -427,8 +576,14 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
427
576
|
|
|
428
577
|
|
|
429
578
|
@ReactMethod
|
|
430
|
-
fun observeGlucoseData(
|
|
579
|
+
fun observeGlucoseData(
|
|
580
|
+
token: String,
|
|
581
|
+
isForClear: Boolean = false,
|
|
582
|
+
envType: String,
|
|
583
|
+
userData: ReadableMap? = null
|
|
584
|
+
) {
|
|
431
585
|
try {
|
|
586
|
+
updateUserData(userData)
|
|
432
587
|
userToken = token
|
|
433
588
|
env = envType
|
|
434
589
|
|
|
@@ -555,6 +710,15 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
555
710
|
try {
|
|
556
711
|
// Additional safety check
|
|
557
712
|
if (pocGlucose.glucoseId == null) {
|
|
713
|
+
val timeInMillis = pocGlucose.timeInMillis?.let { it.toString() } ?: "null"
|
|
714
|
+
captureSentryMessage(
|
|
715
|
+
"handleGlucoseData: glucoseId null, skipping",
|
|
716
|
+
mapOf(
|
|
717
|
+
"envType" to envType,
|
|
718
|
+
"glucoseId" to "null",
|
|
719
|
+
"timeInMillis" to timeInMillis
|
|
720
|
+
)
|
|
721
|
+
)
|
|
558
722
|
Log.w("handleGlucoseData", "Glucose ID is null, skipping processing")
|
|
559
723
|
return
|
|
560
724
|
}
|
|
@@ -573,6 +737,16 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
573
737
|
val json = gson.toJson(request)
|
|
574
738
|
|
|
575
739
|
Log.d("Glucose data 3 min==> ", "Glucose data 3 min==> final Json: $json")
|
|
740
|
+
val glucoseId = pocGlucose.glucoseId?.let { it.toString() } ?: "null"
|
|
741
|
+
val timeInMillis = pocGlucose.timeInMillis?.let { it.toString() } ?: "null"
|
|
742
|
+
captureSentryMessage(
|
|
743
|
+
"handleGlucoseData: single upload start",
|
|
744
|
+
mapOf(
|
|
745
|
+
"glucoseId" to glucoseId,
|
|
746
|
+
"timeInMillis" to timeInMillis,
|
|
747
|
+
"envType" to envType
|
|
748
|
+
)
|
|
749
|
+
)
|
|
576
750
|
|
|
577
751
|
authenticateSDKService.postCGMData(
|
|
578
752
|
environment = if (envType.lowercase() == "uat") TATVA_ENVIRONMENT.STAGE else TATVA_ENVIRONMENT.PROD,
|
|
@@ -580,11 +754,27 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
580
754
|
token = userToken,
|
|
581
755
|
responseListener = object : AuthenticateSDKService.ResponseListener {
|
|
582
756
|
override fun onResponseSuccess(response: String) {
|
|
757
|
+
val glucoseId = pocGlucose.glucoseId?.let { it.toString() } ?: "null"
|
|
758
|
+
captureSentryMessage(
|
|
759
|
+
"handleGlucoseData: single upload success",
|
|
760
|
+
mapOf(
|
|
761
|
+
"glucoseId" to glucoseId,
|
|
762
|
+
"envType" to envType
|
|
763
|
+
)
|
|
764
|
+
)
|
|
583
765
|
updateSyncMetadata(pocGlucose)
|
|
584
766
|
Log.d("CGM Data", "Single glucose data uploaded successfully")
|
|
585
767
|
}
|
|
586
768
|
|
|
587
769
|
override fun onResponseFail() {
|
|
770
|
+
val glucoseId = pocGlucose.glucoseId?.let { it.toString() } ?: "null"
|
|
771
|
+
captureSentryMessage(
|
|
772
|
+
"handleGlucoseData: single upload fail",
|
|
773
|
+
mapOf(
|
|
774
|
+
"glucoseId" to glucoseId,
|
|
775
|
+
"envType" to envType
|
|
776
|
+
)
|
|
777
|
+
)
|
|
588
778
|
Log.e("CGM Data", "Failed to upload single glucose data")
|
|
589
779
|
}
|
|
590
780
|
}
|
|
@@ -597,10 +787,26 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
597
787
|
)
|
|
598
788
|
} */
|
|
599
789
|
} else {
|
|
790
|
+
val glucoseId = pocGlucose.glucoseId?.let { it.toString() } ?: "null"
|
|
791
|
+
captureSentryMessage(
|
|
792
|
+
"handleGlucoseData: glucose error ${pocGlucose.errorCode}",
|
|
793
|
+
mapOf(
|
|
794
|
+
"envType" to envType,
|
|
795
|
+
"glucoseId" to glucoseId
|
|
796
|
+
)
|
|
797
|
+
)
|
|
600
798
|
Log.d("handleGlucoseData", "Glucose data has error: ${pocGlucose.errorCode}")
|
|
601
799
|
handleGlucoseError(pocGlucose, envType)
|
|
602
800
|
}
|
|
603
801
|
} catch (e: Exception) {
|
|
802
|
+
val glucoseId = pocGlucose.glucoseId?.let { it.toString() } ?: "null"
|
|
803
|
+
captureSentryException(
|
|
804
|
+
e,
|
|
805
|
+
mapOf(
|
|
806
|
+
"glucoseId" to glucoseId,
|
|
807
|
+
"envType" to envType
|
|
808
|
+
)
|
|
809
|
+
)
|
|
604
810
|
Log.e("handleGlucoseData", "Error handling glucose data: ${e.message}")
|
|
605
811
|
e.printStackTrace()
|
|
606
812
|
}
|
|
@@ -653,9 +859,17 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
653
859
|
}
|
|
654
860
|
|
|
655
861
|
@ReactMethod
|
|
656
|
-
fun observeAllGlucoseData(
|
|
862
|
+
fun observeAllGlucoseData(
|
|
863
|
+
token: String,
|
|
864
|
+
isForClear: Boolean = false,
|
|
865
|
+
envType: String,
|
|
866
|
+
userData: ReadableMap? = null
|
|
867
|
+
) {
|
|
657
868
|
Log.d("function call", "observeAllGlucoseData")
|
|
658
869
|
|
|
870
|
+
// Ensure Sentry is initialized
|
|
871
|
+
mReactContext?.let { initSentryIfNeeded(it) }
|
|
872
|
+
|
|
659
873
|
// Use atomic compareAndSet to prevent concurrent batch processing
|
|
660
874
|
if (!isBatchProcessing.compareAndSet(false, true)) {
|
|
661
875
|
Log.d("observeAllGlucoseData", "Batch processing already in progress, skipping duplicate call")
|
|
@@ -663,6 +877,7 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
663
877
|
}
|
|
664
878
|
|
|
665
879
|
userToken = token
|
|
880
|
+
updateUserData(userData)
|
|
666
881
|
env = envType
|
|
667
882
|
|
|
668
883
|
CoroutineScope(Dispatchers.IO).launch {
|
|
@@ -678,15 +893,43 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
678
893
|
}
|
|
679
894
|
|
|
680
895
|
val lastSyncData = prefsHelper?.lastSyncData
|
|
681
|
-
|
|
896
|
+
|
|
897
|
+
val lastSyncDataJson = Gson().toJson(lastSyncData).toString()
|
|
898
|
+
captureSentryMessage(
|
|
899
|
+
"observeAllGlucoseData method =====",
|
|
900
|
+
mapOf("lastSyncData" to lastSyncDataJson)
|
|
901
|
+
)
|
|
902
|
+
Log.d("lastSyncData: ", lastSyncDataJson)
|
|
682
903
|
|
|
683
904
|
val currentTime = System.currentTimeMillis()
|
|
684
905
|
val dataAge = if (lastSyncData != null) currentTime - lastSyncData.timeInMillis else 0L
|
|
685
906
|
|
|
907
|
+
captureSentryMessage(
|
|
908
|
+
"observeAllGlucoseData method",
|
|
909
|
+
mapOf(
|
|
910
|
+
"currentTime" to currentTime.toString(),
|
|
911
|
+
"dataAge" to dataAge.toString(),
|
|
912
|
+
"lastSyncData" to Gson().toJson(lastSyncData).toString()
|
|
913
|
+
)
|
|
914
|
+
)
|
|
915
|
+
|
|
686
916
|
if (lastSyncData != null && dataAge > 3 * 60 * 1000L) {
|
|
687
917
|
val glucoseData = mModel.getGlucoseBetweenTime(lastSyncData.timeInMillis)
|
|
688
918
|
|
|
689
|
-
|
|
919
|
+
val glucoseCount = glucoseData?.size ?: 0
|
|
920
|
+
val lastEntry = glucoseData?.lastOrNull()
|
|
921
|
+
val lastEntryGlucoseId = lastEntry?.glucoseId?.let { it.toString() } ?: "null"
|
|
922
|
+
val lastEntryTimeInMillis = lastEntry?.timeInMillis?.let { it.toString() } ?: "null"
|
|
923
|
+
captureSentryMessage(
|
|
924
|
+
"observeAllGlucoseData batch fetch",
|
|
925
|
+
mapOf(
|
|
926
|
+
"glucoseCount" to glucoseCount.toString(),
|
|
927
|
+
"lastEntry_glucoseId" to lastEntryGlucoseId,
|
|
928
|
+
"lastEntry_timeInMillis" to lastEntryTimeInMillis
|
|
929
|
+
)
|
|
930
|
+
)
|
|
931
|
+
|
|
932
|
+
Log.d("observeAllGlucoseData", "Retrieved ${glucoseCount} records from DB")
|
|
690
933
|
|
|
691
934
|
// Combine database data with pending queue data
|
|
692
935
|
val allData = mutableListOf<PocGlucose>()
|
|
@@ -714,12 +957,30 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
714
957
|
}
|
|
715
958
|
|
|
716
959
|
if (sortedGlucoseData.isNotEmpty()) {
|
|
960
|
+
captureSentryMessage(
|
|
961
|
+
"observeAllGlucoseData: got data",
|
|
962
|
+
mapOf(
|
|
963
|
+
"sortedCount" to sortedGlucoseData.size.toString(),
|
|
964
|
+
"oldestTime" to sortedGlucoseData.first().timeInMillis.toString(),
|
|
965
|
+
"newestTime" to sortedGlucoseData.last().timeInMillis.toString()
|
|
966
|
+
)
|
|
967
|
+
)
|
|
968
|
+
|
|
717
969
|
processBatchDataAndStartObserver(
|
|
718
970
|
sortedGlucoseData,
|
|
719
971
|
isForClear,
|
|
720
972
|
envType
|
|
721
973
|
)
|
|
722
974
|
} else {
|
|
975
|
+
val lastSyncTime = lastSyncData?.timeInMillis?.let { it.toString() } ?: "null"
|
|
976
|
+
captureSentryMessage(
|
|
977
|
+
"observeAllGlucoseData: No historical data found, starting live observation",
|
|
978
|
+
mapOf(
|
|
979
|
+
"pendingCount" to pendingData.size.toString(),
|
|
980
|
+
"lastSyncTime" to lastSyncTime
|
|
981
|
+
)
|
|
982
|
+
)
|
|
983
|
+
|
|
723
984
|
Log.d(
|
|
724
985
|
"observeAllGlucoseData",
|
|
725
986
|
"No historical data found, starting live observation"
|
|
@@ -733,6 +994,18 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
733
994
|
} else {
|
|
734
995
|
// No batch needed, but process pending data if any
|
|
735
996
|
if (pendingData.isNotEmpty()) {
|
|
997
|
+
val lastPending = pendingData.lastOrNull()
|
|
998
|
+
val lastPendingGlucoseId = lastPending?.glucoseId?.let { it.toString() } ?: "null"
|
|
999
|
+
val lastPendingTime = lastPending?.timeInMillis?.let { it.toString() } ?: "null"
|
|
1000
|
+
captureSentryMessage(
|
|
1001
|
+
"observeAllGlucoseData: no btach process, processing pending items",
|
|
1002
|
+
mapOf(
|
|
1003
|
+
"pendingCount" to pendingData.size.toString(),
|
|
1004
|
+
"lastPendingGlucoseId" to lastPendingGlucoseId,
|
|
1005
|
+
"lastPendingTime" to lastPendingTime
|
|
1006
|
+
)
|
|
1007
|
+
)
|
|
1008
|
+
|
|
736
1009
|
Log.d("observeAllGlucoseData", "Processing ${pendingData.size} pending items")
|
|
737
1010
|
pendingData.forEach { data ->
|
|
738
1011
|
val glucoseId = data.glucoseId
|
|
@@ -749,6 +1022,10 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
749
1022
|
}
|
|
750
1023
|
}
|
|
751
1024
|
} catch (e: Exception) {
|
|
1025
|
+
captureSentryException(
|
|
1026
|
+
e,
|
|
1027
|
+
mapOf("errorMessage" to "observeAllGlucoseData, Error in batch processing: ${e.message}")
|
|
1028
|
+
)
|
|
752
1029
|
Log.e("observeAllGlucoseData", "Error in batch processing: ${e.message}", e)
|
|
753
1030
|
} finally {
|
|
754
1031
|
// Always reset the flag
|
|
@@ -774,8 +1051,16 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
774
1051
|
|
|
775
1052
|
if (success) {
|
|
776
1053
|
Log.d("processBatchDataAndStartObserver", "Batch processing completed successfully")
|
|
1054
|
+
captureSentryMessage(
|
|
1055
|
+
"processBatchDataAndStartObserver: batch success",
|
|
1056
|
+
mapOf("dataListSize" to dataList.size.toString())
|
|
1057
|
+
)
|
|
777
1058
|
} else {
|
|
778
1059
|
Log.w("processBatchDataAndStartObserver", "Batch processing had failures")
|
|
1060
|
+
captureSentryMessage(
|
|
1061
|
+
"processBatchDataAndStartObserver: batch failures",
|
|
1062
|
+
mapOf("dataListSize" to dataList.size.toString())
|
|
1063
|
+
)
|
|
779
1064
|
}
|
|
780
1065
|
|
|
781
1066
|
// Don't reset flag here - it's reset in observeAllGlucoseData's finally block
|
|
@@ -797,6 +1082,10 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
797
1082
|
}
|
|
798
1083
|
|
|
799
1084
|
} catch (e: Exception) {
|
|
1085
|
+
captureSentryException(
|
|
1086
|
+
e,
|
|
1087
|
+
mapOf("dataListSize" to dataList.size.toString())
|
|
1088
|
+
)
|
|
800
1089
|
Log.e("processBatchDataAndStartObserver", "Error in batch processing: ${e.message}")
|
|
801
1090
|
// Start live observation even on error
|
|
802
1091
|
withContext(Dispatchers.Main) {
|
|
@@ -1016,9 +1305,23 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
1016
1305
|
if (uploadSuccessful) {
|
|
1017
1306
|
lastSyncedRecord = batch.lastOrNull()
|
|
1018
1307
|
// Update sync metadata after each successful batch
|
|
1308
|
+
captureSentryMessage(
|
|
1309
|
+
"Batch Upload: ✅ Batch $index uploaded and synced successfully",
|
|
1310
|
+
mapOf(
|
|
1311
|
+
"envType" to env,
|
|
1312
|
+
"lastSyncedRecord" to Gson().toJson(lastSyncedRecord ?: "null")
|
|
1313
|
+
)
|
|
1314
|
+
)
|
|
1019
1315
|
updateSyncMetadata(lastSyncedRecord)
|
|
1020
1316
|
Log.d("Batch Upload", "✅ Batch $index uploaded and synced successfully")
|
|
1021
1317
|
} else {
|
|
1318
|
+
captureSentryMessage(
|
|
1319
|
+
"Batch Upload: ❌ Batch $index failed",
|
|
1320
|
+
mapOf(
|
|
1321
|
+
"envType" to env,
|
|
1322
|
+
"lastSyncedRecord" to Gson().toJson(lastSyncedRecord ?: "null")
|
|
1323
|
+
)
|
|
1324
|
+
)
|
|
1022
1325
|
allBatchesSuccessful = false
|
|
1023
1326
|
Log.e("Batch Upload", "❌ Batch $index failed")
|
|
1024
1327
|
// Continue with next batch instead of breaking (optional based on your needs)
|
|
@@ -1029,6 +1332,15 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
1029
1332
|
delay(500L)
|
|
1030
1333
|
|
|
1031
1334
|
} catch (e: Exception) {
|
|
1335
|
+
captureSentryException(
|
|
1336
|
+
e,
|
|
1337
|
+
mapOf(
|
|
1338
|
+
"batchIndex" to index.toString(),
|
|
1339
|
+
"batchSize" to batch.size.toString(),
|
|
1340
|
+
"envType" to env,
|
|
1341
|
+
"lastSyncedRecord" to Gson().toJson(lastSyncedRecord ?: "null")
|
|
1342
|
+
)
|
|
1343
|
+
)
|
|
1032
1344
|
Log.e("Batch Upload", "❌ Batch $index exception: ${e.message}")
|
|
1033
1345
|
allBatchesSuccessful = false
|
|
1034
1346
|
// Continue processing other batches
|
|
@@ -1102,15 +1414,36 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
1102
1414
|
token = userToken,
|
|
1103
1415
|
responseListener = object : AuthenticateSDKService.ResponseListener {
|
|
1104
1416
|
override fun onResponseSuccess(response: String) {
|
|
1417
|
+
captureSentryMessage(
|
|
1418
|
+
"uploadBatchSynchronously: success",
|
|
1419
|
+
mapOf(
|
|
1420
|
+
"batchIndex" to batchIndex.toString(),
|
|
1421
|
+
"envType" to envType
|
|
1422
|
+
)
|
|
1423
|
+
)
|
|
1105
1424
|
continuation.resume(true)
|
|
1106
1425
|
}
|
|
1107
1426
|
|
|
1108
1427
|
override fun onResponseFail() {
|
|
1428
|
+
captureSentryMessage(
|
|
1429
|
+
"uploadBatchSynchronously: fail",
|
|
1430
|
+
mapOf(
|
|
1431
|
+
"batchIndex" to batchIndex.toString(),
|
|
1432
|
+
"envType" to envType
|
|
1433
|
+
)
|
|
1434
|
+
)
|
|
1109
1435
|
continuation.resume(false)
|
|
1110
1436
|
}
|
|
1111
1437
|
}
|
|
1112
1438
|
)
|
|
1113
1439
|
} catch (e: Exception) {
|
|
1440
|
+
captureSentryException(
|
|
1441
|
+
e,
|
|
1442
|
+
mapOf(
|
|
1443
|
+
"batchIndex" to batchIndex.toString(),
|
|
1444
|
+
"envType" to envType
|
|
1445
|
+
)
|
|
1446
|
+
)
|
|
1114
1447
|
Log.e("uploadBatchSynchronously", "Exception in batch $batchIndex: ${e.message}")
|
|
1115
1448
|
continuation.resume(false)
|
|
1116
1449
|
}
|
|
@@ -57,11 +57,9 @@
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
// Create the coordinator and store
|
|
60
|
-
|
|
61
60
|
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
|
|
62
61
|
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"KaiLiTe.sqlite"];
|
|
63
62
|
NSError *error = nil;
|
|
64
|
-
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
|
|
65
63
|
NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],
|
|
66
64
|
NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES],
|
|
67
65
|
NSInferMappingModelAutomaticallyOption, nil];
|
|
@@ -31,9 +31,23 @@
|
|
|
31
31
|
+ (KLTDatabaseHandler *)shared {
|
|
32
32
|
static KLTDatabaseHandler *handler;
|
|
33
33
|
static dispatch_once_t onceToken;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
|
|
35
|
+
// IMPORTANT:
|
|
36
|
+
// CoreData context in this SDK is NSMainQueueConcurrencyType.
|
|
37
|
+
// If `shared` is first initialized from a background queue, CoreBluetooth can later call
|
|
38
|
+
// `willRestoreState` on the main queue and block waiting on dispatch_once, producing an ANR.
|
|
39
|
+
// Force initialization to happen on the main thread to avoid dispatch_once contention/deadlock.
|
|
40
|
+
if ([NSThread isMainThread]) {
|
|
41
|
+
dispatch_once(&onceToken, ^{
|
|
42
|
+
handler = [[self alloc] init];
|
|
43
|
+
});
|
|
44
|
+
} else {
|
|
45
|
+
dispatch_sync(dispatch_get_main_queue(), ^{
|
|
46
|
+
dispatch_once(&onceToken, ^{
|
|
47
|
+
handler = [[self alloc] init];
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
37
51
|
return handler;
|
|
38
52
|
}
|
|
39
53
|
|
|
@@ -534,16 +534,18 @@ RCT_EXPORT_METHOD(openHelpSupport)
|
|
|
534
534
|
|
|
535
535
|
RCT_EXPORT_METHOD(observeAllGlucoseData:(NSString *)token isForClearData:(BOOL)isForClearData envType:(NSString *)envType)
|
|
536
536
|
{
|
|
537
|
-
if (isForClearData == YES) {
|
|
538
|
-
[[KLTDatabaseHandler shared].appDelegate deleteAllCoreData];
|
|
539
|
-
}
|
|
540
|
-
|
|
541
537
|
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
|
542
538
|
[defaults setObject:token forKey:@"authToken"];
|
|
543
539
|
[defaults setObject:envType forKey:@"envType"];
|
|
544
540
|
[defaults synchronize];
|
|
545
541
|
|
|
542
|
+
// CRITICAL: CoreData context is NSMainQueueConcurrencyType, so ALL CoreData operations
|
|
543
|
+
// must happen on the main thread. React Native native modules are often called from
|
|
544
|
+
// background threads, so we must dispatch to main queue.
|
|
546
545
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
546
|
+
if (isForClearData == YES) {
|
|
547
|
+
[[KLTDatabaseHandler shared].appDelegate deleteAllCoreData];
|
|
548
|
+
}
|
|
547
549
|
UIWindow *keyWindow = [UIApplication sharedApplication].delegate.window;
|
|
548
550
|
UIViewController *rootVC = keyWindow.rootViewController;
|
|
549
551
|
|
|
@@ -69,7 +69,6 @@ class AttachTransmitterViewController: UIViewController {
|
|
|
69
69
|
|
|
70
70
|
|
|
71
71
|
let data = KLTDatabaseHandler.shared().queryAllReceiveData() as! [ReceiveData]
|
|
72
|
-
print(data)
|
|
73
72
|
print("===> all data count: ", data.count)
|
|
74
73
|
// KLTDatabaseHandler.shared().reloadQueryHistoryData()
|
|
75
74
|
|
|
@@ -54,31 +54,31 @@ function removeCGMEventListener() {
|
|
|
54
54
|
eventSubscription = null;
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
-
const startCGM = async (token, envType) => {
|
|
57
|
+
const startCGM = async (token, envType, userData) => {
|
|
58
58
|
console.log('startCGM===');
|
|
59
59
|
try {
|
|
60
|
-
const result = await cgmLib.startCgmTracky(token, envType);
|
|
60
|
+
const result = _reactNative.Platform.OS === 'android' ? await cgmLib.startCgmTracky(token, envType, userData) : await cgmLib.startCgmTracky(token, envType);
|
|
61
61
|
console.log(result);
|
|
62
62
|
} catch (error) {
|
|
63
63
|
console.error(error);
|
|
64
64
|
}
|
|
65
65
|
};
|
|
66
66
|
exports.startCGM = startCGM;
|
|
67
|
-
const reconnectCGM = async (token, envType) => {
|
|
67
|
+
const reconnectCGM = async (token, envType, userData) => {
|
|
68
68
|
console.log('reconnectCGM====');
|
|
69
69
|
try {
|
|
70
|
-
const result = await cgmLib.reconnectCgmTracky(token, envType);
|
|
70
|
+
const result = _reactNative.Platform.OS === 'android' ? await cgmLib.reconnectCgmTracky(token, envType, userData) : await cgmLib.reconnectCgmTracky(token, envType);
|
|
71
71
|
console.log(result);
|
|
72
72
|
} catch (error) {
|
|
73
73
|
console.error(error);
|
|
74
74
|
}
|
|
75
75
|
};
|
|
76
76
|
exports.reconnectCGM = reconnectCGM;
|
|
77
|
-
const observeAllGlucoseDataHandler = async (token, isCleanData, envType) => {
|
|
77
|
+
const observeAllGlucoseDataHandler = async (token, isCleanData, envType, userData) => {
|
|
78
78
|
console.log('observeAllGlucoseDataHandler====');
|
|
79
79
|
try {
|
|
80
80
|
if (_reactNative.Platform.OS === 'android') {
|
|
81
|
-
const result = await cgmLib.observeAllGlucoseData(token, isCleanData, envType);
|
|
81
|
+
const result = await cgmLib.observeAllGlucoseData(token, isCleanData, envType, userData);
|
|
82
82
|
const deviceStatus = await cgmLib.observeDeviceStatus(token, envType);
|
|
83
83
|
console.log(result);
|
|
84
84
|
console.log(deviceStatus);
|
|
@@ -102,10 +102,10 @@ const helpCGM = async (token, envType) => {
|
|
|
102
102
|
}
|
|
103
103
|
};
|
|
104
104
|
exports.helpCGM = helpCGM;
|
|
105
|
-
const observeTransmitterUnbindStatusHandler = async (token, apiResponse, patientId, envType) => {
|
|
105
|
+
const observeTransmitterUnbindStatusHandler = async (token, apiResponse, patientId, envType, userData) => {
|
|
106
106
|
console.log('observeTransmitterUnbindStatusHandler====');
|
|
107
107
|
try {
|
|
108
|
-
const result = await cgmLib.observeTransmitterUnbindStatus(token, apiResponse, patientId, envType);
|
|
108
|
+
const result = _reactNative.Platform.OS === 'android' ? await cgmLib.observeTransmitterUnbindStatus(token, apiResponse, patientId, envType, userData) : await cgmLib.observeTransmitterUnbindStatus(token, apiResponse, patientId, envType);
|
|
109
109
|
console.log(result);
|
|
110
110
|
} catch (error) {
|
|
111
111
|
console.error(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","eventSubscription","LINKING_ERROR","Platform","select","ios","default","cgmLib","NativeModules","CgmTrackyLib","Proxy","get","Error","initializeCGMEventListener","callback","iosEventEmitter","NativeEventEmitter","remove","OS","DeviceEventEmitter","addListener","eventData","status","removeCGMEventListener","startCGM","token","envType","console","log","result","startCgmTracky","error","exports","reconnectCGM","reconnectCgmTracky","observeAllGlucoseDataHandler","isCleanData","observeAllGlucoseData","deviceStatus","observeDeviceStatus","helpCGM","openHelpSupport","observeTransmitterUnbindStatusHandler","apiResponse","patientId","observeTransmitterUnbindStatus","observeResetLogoutHandler","resetCgmState","getSqliteDBPath","getTrackLibDbPath","stopCGM","getCgmLogFilePaths","getCgmLogFiles","length"],"sources":["CGMConnect.ts"],"sourcesContent":["import {\n DeviceEventEmitter,\n EmitterSubscription,\n NativeEventEmitter,\n NativeModules,\n Platform,\n} from 'react-native';\n\nlet eventSubscription: EmitterSubscription | null = null;\n\nconst LINKING_ERROR =\n `The package 'react-native-mytatva-rn-sdk' doesn't seem to be linked. Make sure: \\n\\n` +\n Platform.select({ ios: \"- You have run 'pod install'\\n\", default: '' }) +\n '- You rebuilt the app after installing the package\\n' +\n '- You are not using Expo Go\\n';\n\nconst cgmLib = NativeModules.CgmTrackyLib\n ? NativeModules.CgmTrackyLib\n : new Proxy(\n {},\n {\n get() {\n throw new Error(LINKING_ERROR);\n },\n }\n );\n\nfunction initializeCGMEventListener(callback: (eventData: any) => void) {\n const iosEventEmitter = new NativeEventEmitter(cgmLib);\n if (eventSubscription) {\n eventSubscription.remove();\n }\n\n if (Platform.OS === 'android') {\n eventSubscription = DeviceEventEmitter.addListener(\n 'cgmDeviceEvent',\n (eventData: any) => {\n const { status } = eventData;\n if (status === 'WARM_PERIOD_STARTED') {\n callback(eventData);\n } else {\n callback(eventData);\n }\n }\n );\n } else if (Platform.OS === 'ios' && iosEventEmitter) {\n eventSubscription = iosEventEmitter.addListener(\n 'cgmDeviceEvent',\n (eventData: any) => {\n const { status } = eventData;\n if (status === 'WARM_PERIOD_STARTED') {\n callback(eventData);\n } else {\n callback(eventData);\n }\n }\n );\n }\n}\n\nfunction removeCGMEventListener() {\n if (eventSubscription) {\n eventSubscription.remove();\n eventSubscription = null;\n }\n}\n\nconst startCGM = async (token: string, envType: string) => {\n console.log('startCGM===');\n try {\n const result = await cgmLib.startCgmTracky(token, envType);\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst reconnectCGM = async (token: string, envType: string) => {\n console.log('reconnectCGM====');\n try {\n const result = await cgmLib.reconnectCgmTracky(token, envType);\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst observeAllGlucoseDataHandler = async (\n token: string,\n isCleanData: boolean,\n envType: string\n) => {\n console.log('observeAllGlucoseDataHandler====');\n try {\n if (Platform.OS === 'android') {\n const result = await cgmLib.observeAllGlucoseData(\n token,\n isCleanData,\n envType\n );\n const deviceStatus = await cgmLib.observeDeviceStatus(token, envType);\n console.log(result);\n console.log(deviceStatus);\n } else if (Platform.OS === 'ios') {\n const result = await cgmLib.observeAllGlucoseData(\n token,\n isCleanData,\n envType\n );\n console.log(result);\n }\n } catch (error) {\n console.log('error====', error);\n console.error(error);\n }\n};\n\nconst helpCGM = async (token: string, envType: string) => {\n console.log('helpCGM====');\n try {\n const result = await cgmLib.openHelpSupport();\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst observeTransmitterUnbindStatusHandler = async (\n token: string,\n apiResponse: string,\n patientId: string,\n envType: string\n) => {\n console.log('observeTransmitterUnbindStatusHandler====');\n try {\n const result = await cgmLib.observeTransmitterUnbindStatus(\n token,\n apiResponse,\n patientId,\n envType\n );\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst observeResetLogoutHandler = async () => {\n console.log('observeResetLogoutHandler====');\n try {\n const result = await cgmLib.resetCgmState();\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst getSqliteDBPath = async (): Promise<string> => {\n const result = await cgmLib.getTrackLibDbPath();\n return result;\n};\n\nconst stopCGM = async () => {\n // Implementation\n};\n\n/**\n * Get all CGM log file paths\n * Returns array of absolute file paths to CGM log files (CSV format)\n * Use react-native-fs or similar in your main app to read these files\n *\n * @returns Promise<string[]> - Array of absolute file paths\n *\n * @example\n * const logPaths = await getCgmLogFilePaths();\n * // Android: ['/storage/emulated/0/Android/data/.../Documents/12345_POCTech.csv']\n * // iOS: ['/var/mobile/Containers/Data/Application/.../Documents/runLog/1_SensorID.csv']\n */\nconst getCgmLogFilePaths = async (): Promise<string[]> => {\n try {\n const result = await cgmLib.getCgmLogFiles();\n console.log(`CGM Log Files: ${result.length} files found`);\n return result;\n } catch (error) {\n console.error('Error getting CGM log file paths:', error);\n throw error;\n }\n};\n\nexport {\n startCGM,\n stopCGM,\n initializeCGMEventListener,\n removeCGMEventListener,\n observeAllGlucoseDataHandler,\n reconnectCGM,\n helpCGM,\n observeTransmitterUnbindStatusHandler,\n observeResetLogoutHandler,\n getSqliteDBPath,\n getCgmLogFilePaths,\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_reactNative","require","eventSubscription","LINKING_ERROR","Platform","select","ios","default","cgmLib","NativeModules","CgmTrackyLib","Proxy","get","Error","initializeCGMEventListener","callback","iosEventEmitter","NativeEventEmitter","remove","OS","DeviceEventEmitter","addListener","eventData","status","removeCGMEventListener","startCGM","token","envType","userData","console","log","result","startCgmTracky","error","exports","reconnectCGM","reconnectCgmTracky","observeAllGlucoseDataHandler","isCleanData","observeAllGlucoseData","deviceStatus","observeDeviceStatus","helpCGM","openHelpSupport","observeTransmitterUnbindStatusHandler","apiResponse","patientId","observeTransmitterUnbindStatus","observeResetLogoutHandler","resetCgmState","getSqliteDBPath","getTrackLibDbPath","stopCGM","getCgmLogFilePaths","getCgmLogFiles","length"],"sources":["CGMConnect.ts"],"sourcesContent":["import {\n DeviceEventEmitter,\n EmitterSubscription,\n NativeEventEmitter,\n NativeModules,\n Platform,\n} from 'react-native';\n\nlet eventSubscription: EmitterSubscription | null = null;\n\nconst LINKING_ERROR =\n `The package 'react-native-mytatva-rn-sdk' doesn't seem to be linked. Make sure: \\n\\n` +\n Platform.select({ ios: \"- You have run 'pod install'\\n\", default: '' }) +\n '- You rebuilt the app after installing the package\\n' +\n '- You are not using Expo Go\\n';\n\nconst cgmLib = NativeModules.CgmTrackyLib\n ? NativeModules.CgmTrackyLib\n : new Proxy(\n {},\n {\n get() {\n throw new Error(LINKING_ERROR);\n },\n }\n );\n\nfunction initializeCGMEventListener(callback: (eventData: any) => void) {\n const iosEventEmitter = new NativeEventEmitter(cgmLib);\n if (eventSubscription) {\n eventSubscription.remove();\n }\n\n if (Platform.OS === 'android') {\n eventSubscription = DeviceEventEmitter.addListener(\n 'cgmDeviceEvent',\n (eventData: any) => {\n const { status } = eventData;\n if (status === 'WARM_PERIOD_STARTED') {\n callback(eventData);\n } else {\n callback(eventData);\n }\n }\n );\n } else if (Platform.OS === 'ios' && iosEventEmitter) {\n eventSubscription = iosEventEmitter.addListener(\n 'cgmDeviceEvent',\n (eventData: any) => {\n const { status } = eventData;\n if (status === 'WARM_PERIOD_STARTED') {\n callback(eventData);\n } else {\n callback(eventData);\n }\n }\n );\n }\n}\n\nfunction removeCGMEventListener() {\n if (eventSubscription) {\n eventSubscription.remove();\n eventSubscription = null;\n }\n}\n\nconst startCGM = async (token: string, envType: string, userData: any) => {\n console.log('startCGM===');\n try {\n const result =\n Platform.OS === 'android'\n ? await cgmLib.startCgmTracky(token, envType, userData)\n : await cgmLib.startCgmTracky(token, envType);\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst reconnectCGM = async (token: string, envType: string, userData: any) => {\n console.log('reconnectCGM====');\n try {\n const result =\n Platform.OS === 'android'\n ? await cgmLib.reconnectCgmTracky(token, envType, userData)\n : await cgmLib.reconnectCgmTracky(token, envType);\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst observeAllGlucoseDataHandler = async (\n token: string,\n isCleanData: boolean,\n envType: string,\n userData: any\n) => {\n console.log('observeAllGlucoseDataHandler====');\n try {\n if (Platform.OS === 'android') {\n const result = await cgmLib.observeAllGlucoseData(\n token,\n isCleanData,\n envType,\n userData\n );\n const deviceStatus = await cgmLib.observeDeviceStatus(token, envType);\n console.log(result);\n console.log(deviceStatus);\n } else if (Platform.OS === 'ios') {\n const result = await cgmLib.observeAllGlucoseData(\n token,\n isCleanData,\n envType\n );\n console.log(result);\n }\n } catch (error) {\n console.log('error====', error);\n console.error(error);\n }\n};\n\nconst helpCGM = async (token: string, envType: string) => {\n console.log('helpCGM====');\n try {\n const result = await cgmLib.openHelpSupport();\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst observeTransmitterUnbindStatusHandler = async (\n token: string,\n apiResponse: string,\n patientId: string,\n envType: string,\n userData: any\n) => {\n console.log('observeTransmitterUnbindStatusHandler====');\n try {\n const result =\n Platform.OS === 'android'\n ? await cgmLib.observeTransmitterUnbindStatus(\n token,\n apiResponse,\n patientId,\n envType,\n userData\n )\n : await cgmLib.observeTransmitterUnbindStatus(\n token,\n apiResponse,\n patientId,\n envType\n );\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst observeResetLogoutHandler = async () => {\n console.log('observeResetLogoutHandler====');\n try {\n const result = await cgmLib.resetCgmState();\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst getSqliteDBPath = async (): Promise<string> => {\n const result = await cgmLib.getTrackLibDbPath();\n return result;\n};\n\nconst stopCGM = async () => {\n // Implementation\n};\n\n/**\n * Get all CGM log file paths\n * Returns array of absolute file paths to CGM log files (CSV format)\n * Use react-native-fs or similar in your main app to read these files\n *\n * @returns Promise<string[]> - Array of absolute file paths\n *\n * @example\n * const logPaths = await getCgmLogFilePaths();\n * // Android: ['/storage/emulated/0/Android/data/.../Documents/12345_POCTech.csv']\n * // iOS: ['/var/mobile/Containers/Data/Application/.../Documents/runLog/1_SensorID.csv']\n */\nconst getCgmLogFilePaths = async (): Promise<string[]> => {\n try {\n const result = await cgmLib.getCgmLogFiles();\n console.log(`CGM Log Files: ${result.length} files found`);\n return result;\n } catch (error) {\n console.error('Error getting CGM log file paths:', error);\n throw error;\n }\n};\n\nexport {\n startCGM,\n stopCGM,\n initializeCGMEventListener,\n removeCGMEventListener,\n observeAllGlucoseDataHandler,\n reconnectCGM,\n helpCGM,\n observeTransmitterUnbindStatusHandler,\n observeResetLogoutHandler,\n getSqliteDBPath,\n getCgmLogFilePaths,\n};\n"],"mappings":"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","ignoreList":[]}
|
package/lib/module/CGMConnect.js
CHANGED
|
@@ -44,29 +44,29 @@ function removeCGMEventListener() {
|
|
|
44
44
|
eventSubscription = null;
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
|
-
const startCGM = async (token, envType) => {
|
|
47
|
+
const startCGM = async (token, envType, userData) => {
|
|
48
48
|
console.log('startCGM===');
|
|
49
49
|
try {
|
|
50
|
-
const result = await cgmLib.startCgmTracky(token, envType);
|
|
50
|
+
const result = Platform.OS === 'android' ? await cgmLib.startCgmTracky(token, envType, userData) : await cgmLib.startCgmTracky(token, envType);
|
|
51
51
|
console.log(result);
|
|
52
52
|
} catch (error) {
|
|
53
53
|
console.error(error);
|
|
54
54
|
}
|
|
55
55
|
};
|
|
56
|
-
const reconnectCGM = async (token, envType) => {
|
|
56
|
+
const reconnectCGM = async (token, envType, userData) => {
|
|
57
57
|
console.log('reconnectCGM====');
|
|
58
58
|
try {
|
|
59
|
-
const result = await cgmLib.reconnectCgmTracky(token, envType);
|
|
59
|
+
const result = Platform.OS === 'android' ? await cgmLib.reconnectCgmTracky(token, envType, userData) : await cgmLib.reconnectCgmTracky(token, envType);
|
|
60
60
|
console.log(result);
|
|
61
61
|
} catch (error) {
|
|
62
62
|
console.error(error);
|
|
63
63
|
}
|
|
64
64
|
};
|
|
65
|
-
const observeAllGlucoseDataHandler = async (token, isCleanData, envType) => {
|
|
65
|
+
const observeAllGlucoseDataHandler = async (token, isCleanData, envType, userData) => {
|
|
66
66
|
console.log('observeAllGlucoseDataHandler====');
|
|
67
67
|
try {
|
|
68
68
|
if (Platform.OS === 'android') {
|
|
69
|
-
const result = await cgmLib.observeAllGlucoseData(token, isCleanData, envType);
|
|
69
|
+
const result = await cgmLib.observeAllGlucoseData(token, isCleanData, envType, userData);
|
|
70
70
|
const deviceStatus = await cgmLib.observeDeviceStatus(token, envType);
|
|
71
71
|
console.log(result);
|
|
72
72
|
console.log(deviceStatus);
|
|
@@ -88,10 +88,10 @@ const helpCGM = async (token, envType) => {
|
|
|
88
88
|
console.error(error);
|
|
89
89
|
}
|
|
90
90
|
};
|
|
91
|
-
const observeTransmitterUnbindStatusHandler = async (token, apiResponse, patientId, envType) => {
|
|
91
|
+
const observeTransmitterUnbindStatusHandler = async (token, apiResponse, patientId, envType, userData) => {
|
|
92
92
|
console.log('observeTransmitterUnbindStatusHandler====');
|
|
93
93
|
try {
|
|
94
|
-
const result = await cgmLib.observeTransmitterUnbindStatus(token, apiResponse, patientId, envType);
|
|
94
|
+
const result = Platform.OS === 'android' ? await cgmLib.observeTransmitterUnbindStatus(token, apiResponse, patientId, envType, userData) : await cgmLib.observeTransmitterUnbindStatus(token, apiResponse, patientId, envType);
|
|
95
95
|
console.log(result);
|
|
96
96
|
} catch (error) {
|
|
97
97
|
console.error(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DeviceEventEmitter","NativeEventEmitter","NativeModules","Platform","eventSubscription","LINKING_ERROR","select","ios","default","cgmLib","CgmTrackyLib","Proxy","get","Error","initializeCGMEventListener","callback","iosEventEmitter","remove","OS","addListener","eventData","status","removeCGMEventListener","startCGM","token","envType","console","log","result","startCgmTracky","error","reconnectCGM","reconnectCgmTracky","observeAllGlucoseDataHandler","isCleanData","observeAllGlucoseData","deviceStatus","observeDeviceStatus","helpCGM","openHelpSupport","observeTransmitterUnbindStatusHandler","apiResponse","patientId","observeTransmitterUnbindStatus","observeResetLogoutHandler","resetCgmState","getSqliteDBPath","getTrackLibDbPath","stopCGM","getCgmLogFilePaths","getCgmLogFiles","length"],"sources":["CGMConnect.ts"],"sourcesContent":["import {\n DeviceEventEmitter,\n EmitterSubscription,\n NativeEventEmitter,\n NativeModules,\n Platform,\n} from 'react-native';\n\nlet eventSubscription: EmitterSubscription | null = null;\n\nconst LINKING_ERROR =\n `The package 'react-native-mytatva-rn-sdk' doesn't seem to be linked. Make sure: \\n\\n` +\n Platform.select({ ios: \"- You have run 'pod install'\\n\", default: '' }) +\n '- You rebuilt the app after installing the package\\n' +\n '- You are not using Expo Go\\n';\n\nconst cgmLib = NativeModules.CgmTrackyLib\n ? NativeModules.CgmTrackyLib\n : new Proxy(\n {},\n {\n get() {\n throw new Error(LINKING_ERROR);\n },\n }\n );\n\nfunction initializeCGMEventListener(callback: (eventData: any) => void) {\n const iosEventEmitter = new NativeEventEmitter(cgmLib);\n if (eventSubscription) {\n eventSubscription.remove();\n }\n\n if (Platform.OS === 'android') {\n eventSubscription = DeviceEventEmitter.addListener(\n 'cgmDeviceEvent',\n (eventData: any) => {\n const { status } = eventData;\n if (status === 'WARM_PERIOD_STARTED') {\n callback(eventData);\n } else {\n callback(eventData);\n }\n }\n );\n } else if (Platform.OS === 'ios' && iosEventEmitter) {\n eventSubscription = iosEventEmitter.addListener(\n 'cgmDeviceEvent',\n (eventData: any) => {\n const { status } = eventData;\n if (status === 'WARM_PERIOD_STARTED') {\n callback(eventData);\n } else {\n callback(eventData);\n }\n }\n );\n }\n}\n\nfunction removeCGMEventListener() {\n if (eventSubscription) {\n eventSubscription.remove();\n eventSubscription = null;\n }\n}\n\nconst startCGM = async (token: string, envType: string) => {\n console.log('startCGM===');\n try {\n const result = await cgmLib.startCgmTracky(token, envType);\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst reconnectCGM = async (token: string, envType: string) => {\n console.log('reconnectCGM====');\n try {\n const result = await cgmLib.reconnectCgmTracky(token, envType);\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst observeAllGlucoseDataHandler = async (\n token: string,\n isCleanData: boolean,\n envType: string\n) => {\n console.log('observeAllGlucoseDataHandler====');\n try {\n if (Platform.OS === 'android') {\n const result = await cgmLib.observeAllGlucoseData(\n token,\n isCleanData,\n envType\n );\n const deviceStatus = await cgmLib.observeDeviceStatus(token, envType);\n console.log(result);\n console.log(deviceStatus);\n } else if (Platform.OS === 'ios') {\n const result = await cgmLib.observeAllGlucoseData(\n token,\n isCleanData,\n envType\n );\n console.log(result);\n }\n } catch (error) {\n console.log('error====', error);\n console.error(error);\n }\n};\n\nconst helpCGM = async (token: string, envType: string) => {\n console.log('helpCGM====');\n try {\n const result = await cgmLib.openHelpSupport();\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst observeTransmitterUnbindStatusHandler = async (\n token: string,\n apiResponse: string,\n patientId: string,\n envType: string\n) => {\n console.log('observeTransmitterUnbindStatusHandler====');\n try {\n const result = await cgmLib.observeTransmitterUnbindStatus(\n token,\n apiResponse,\n patientId,\n envType\n );\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst observeResetLogoutHandler = async () => {\n console.log('observeResetLogoutHandler====');\n try {\n const result = await cgmLib.resetCgmState();\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst getSqliteDBPath = async (): Promise<string> => {\n const result = await cgmLib.getTrackLibDbPath();\n return result;\n};\n\nconst stopCGM = async () => {\n // Implementation\n};\n\n/**\n * Get all CGM log file paths\n * Returns array of absolute file paths to CGM log files (CSV format)\n * Use react-native-fs or similar in your main app to read these files\n *\n * @returns Promise<string[]> - Array of absolute file paths\n *\n * @example\n * const logPaths = await getCgmLogFilePaths();\n * // Android: ['/storage/emulated/0/Android/data/.../Documents/12345_POCTech.csv']\n * // iOS: ['/var/mobile/Containers/Data/Application/.../Documents/runLog/1_SensorID.csv']\n */\nconst getCgmLogFilePaths = async (): Promise<string[]> => {\n try {\n const result = await cgmLib.getCgmLogFiles();\n console.log(`CGM Log Files: ${result.length} files found`);\n return result;\n } catch (error) {\n console.error('Error getting CGM log file paths:', error);\n throw error;\n }\n};\n\nexport {\n startCGM,\n stopCGM,\n initializeCGMEventListener,\n removeCGMEventListener,\n observeAllGlucoseDataHandler,\n reconnectCGM,\n helpCGM,\n observeTransmitterUnbindStatusHandler,\n observeResetLogoutHandler,\n getSqliteDBPath,\n getCgmLogFilePaths,\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["DeviceEventEmitter","NativeEventEmitter","NativeModules","Platform","eventSubscription","LINKING_ERROR","select","ios","default","cgmLib","CgmTrackyLib","Proxy","get","Error","initializeCGMEventListener","callback","iosEventEmitter","remove","OS","addListener","eventData","status","removeCGMEventListener","startCGM","token","envType","userData","console","log","result","startCgmTracky","error","reconnectCGM","reconnectCgmTracky","observeAllGlucoseDataHandler","isCleanData","observeAllGlucoseData","deviceStatus","observeDeviceStatus","helpCGM","openHelpSupport","observeTransmitterUnbindStatusHandler","apiResponse","patientId","observeTransmitterUnbindStatus","observeResetLogoutHandler","resetCgmState","getSqliteDBPath","getTrackLibDbPath","stopCGM","getCgmLogFilePaths","getCgmLogFiles","length"],"sources":["CGMConnect.ts"],"sourcesContent":["import {\n DeviceEventEmitter,\n EmitterSubscription,\n NativeEventEmitter,\n NativeModules,\n Platform,\n} from 'react-native';\n\nlet eventSubscription: EmitterSubscription | null = null;\n\nconst LINKING_ERROR =\n `The package 'react-native-mytatva-rn-sdk' doesn't seem to be linked. Make sure: \\n\\n` +\n Platform.select({ ios: \"- You have run 'pod install'\\n\", default: '' }) +\n '- You rebuilt the app after installing the package\\n' +\n '- You are not using Expo Go\\n';\n\nconst cgmLib = NativeModules.CgmTrackyLib\n ? NativeModules.CgmTrackyLib\n : new Proxy(\n {},\n {\n get() {\n throw new Error(LINKING_ERROR);\n },\n }\n );\n\nfunction initializeCGMEventListener(callback: (eventData: any) => void) {\n const iosEventEmitter = new NativeEventEmitter(cgmLib);\n if (eventSubscription) {\n eventSubscription.remove();\n }\n\n if (Platform.OS === 'android') {\n eventSubscription = DeviceEventEmitter.addListener(\n 'cgmDeviceEvent',\n (eventData: any) => {\n const { status } = eventData;\n if (status === 'WARM_PERIOD_STARTED') {\n callback(eventData);\n } else {\n callback(eventData);\n }\n }\n );\n } else if (Platform.OS === 'ios' && iosEventEmitter) {\n eventSubscription = iosEventEmitter.addListener(\n 'cgmDeviceEvent',\n (eventData: any) => {\n const { status } = eventData;\n if (status === 'WARM_PERIOD_STARTED') {\n callback(eventData);\n } else {\n callback(eventData);\n }\n }\n );\n }\n}\n\nfunction removeCGMEventListener() {\n if (eventSubscription) {\n eventSubscription.remove();\n eventSubscription = null;\n }\n}\n\nconst startCGM = async (token: string, envType: string, userData: any) => {\n console.log('startCGM===');\n try {\n const result =\n Platform.OS === 'android'\n ? await cgmLib.startCgmTracky(token, envType, userData)\n : await cgmLib.startCgmTracky(token, envType);\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst reconnectCGM = async (token: string, envType: string, userData: any) => {\n console.log('reconnectCGM====');\n try {\n const result =\n Platform.OS === 'android'\n ? await cgmLib.reconnectCgmTracky(token, envType, userData)\n : await cgmLib.reconnectCgmTracky(token, envType);\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst observeAllGlucoseDataHandler = async (\n token: string,\n isCleanData: boolean,\n envType: string,\n userData: any\n) => {\n console.log('observeAllGlucoseDataHandler====');\n try {\n if (Platform.OS === 'android') {\n const result = await cgmLib.observeAllGlucoseData(\n token,\n isCleanData,\n envType,\n userData\n );\n const deviceStatus = await cgmLib.observeDeviceStatus(token, envType);\n console.log(result);\n console.log(deviceStatus);\n } else if (Platform.OS === 'ios') {\n const result = await cgmLib.observeAllGlucoseData(\n token,\n isCleanData,\n envType\n );\n console.log(result);\n }\n } catch (error) {\n console.log('error====', error);\n console.error(error);\n }\n};\n\nconst helpCGM = async (token: string, envType: string) => {\n console.log('helpCGM====');\n try {\n const result = await cgmLib.openHelpSupport();\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst observeTransmitterUnbindStatusHandler = async (\n token: string,\n apiResponse: string,\n patientId: string,\n envType: string,\n userData: any\n) => {\n console.log('observeTransmitterUnbindStatusHandler====');\n try {\n const result =\n Platform.OS === 'android'\n ? await cgmLib.observeTransmitterUnbindStatus(\n token,\n apiResponse,\n patientId,\n envType,\n userData\n )\n : await cgmLib.observeTransmitterUnbindStatus(\n token,\n apiResponse,\n patientId,\n envType\n );\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst observeResetLogoutHandler = async () => {\n console.log('observeResetLogoutHandler====');\n try {\n const result = await cgmLib.resetCgmState();\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst getSqliteDBPath = async (): Promise<string> => {\n const result = await cgmLib.getTrackLibDbPath();\n return result;\n};\n\nconst stopCGM = async () => {\n // Implementation\n};\n\n/**\n * Get all CGM log file paths\n * Returns array of absolute file paths to CGM log files (CSV format)\n * Use react-native-fs or similar in your main app to read these files\n *\n * @returns Promise<string[]> - Array of absolute file paths\n *\n * @example\n * const logPaths = await getCgmLogFilePaths();\n * // Android: ['/storage/emulated/0/Android/data/.../Documents/12345_POCTech.csv']\n * // iOS: ['/var/mobile/Containers/Data/Application/.../Documents/runLog/1_SensorID.csv']\n */\nconst getCgmLogFilePaths = async (): Promise<string[]> => {\n try {\n const result = await cgmLib.getCgmLogFiles();\n console.log(`CGM Log Files: ${result.length} files found`);\n return result;\n } catch (error) {\n console.error('Error getting CGM log file paths:', error);\n throw error;\n }\n};\n\nexport {\n startCGM,\n stopCGM,\n initializeCGMEventListener,\n removeCGMEventListener,\n observeAllGlucoseDataHandler,\n reconnectCGM,\n helpCGM,\n observeTransmitterUnbindStatusHandler,\n observeResetLogoutHandler,\n getSqliteDBPath,\n getCgmLogFilePaths,\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare function initializeCGMEventListener(callback: (eventData: any) => void): void;
|
|
2
2
|
declare function removeCGMEventListener(): void;
|
|
3
|
-
declare const startCGM: (token: string, envType: string) => Promise<void>;
|
|
4
|
-
declare const reconnectCGM: (token: string, envType: string) => Promise<void>;
|
|
5
|
-
declare const observeAllGlucoseDataHandler: (token: string, isCleanData: boolean, envType: string) => Promise<void>;
|
|
3
|
+
declare const startCGM: (token: string, envType: string, userData: any) => Promise<void>;
|
|
4
|
+
declare const reconnectCGM: (token: string, envType: string, userData: any) => Promise<void>;
|
|
5
|
+
declare const observeAllGlucoseDataHandler: (token: string, isCleanData: boolean, envType: string, userData: any) => Promise<void>;
|
|
6
6
|
declare const helpCGM: (token: string, envType: string) => Promise<void>;
|
|
7
|
-
declare const observeTransmitterUnbindStatusHandler: (token: string, apiResponse: string, patientId: string, envType: string) => Promise<void>;
|
|
7
|
+
declare const observeTransmitterUnbindStatusHandler: (token: string, apiResponse: string, patientId: string, envType: string, userData: any) => Promise<void>;
|
|
8
8
|
declare const observeResetLogoutHandler: () => Promise<void>;
|
|
9
9
|
declare const getSqliteDBPath: () => Promise<string>;
|
|
10
10
|
declare const stopCGM: () => Promise<void>;
|
package/package.json
CHANGED
package/src/CGMConnect.ts
CHANGED
|
@@ -65,20 +65,26 @@ function removeCGMEventListener() {
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
const startCGM = async (token: string, envType: string) => {
|
|
68
|
+
const startCGM = async (token: string, envType: string, userData: any) => {
|
|
69
69
|
console.log('startCGM===');
|
|
70
70
|
try {
|
|
71
|
-
const result =
|
|
71
|
+
const result =
|
|
72
|
+
Platform.OS === 'android'
|
|
73
|
+
? await cgmLib.startCgmTracky(token, envType, userData)
|
|
74
|
+
: await cgmLib.startCgmTracky(token, envType);
|
|
72
75
|
console.log(result);
|
|
73
76
|
} catch (error) {
|
|
74
77
|
console.error(error);
|
|
75
78
|
}
|
|
76
79
|
};
|
|
77
80
|
|
|
78
|
-
const reconnectCGM = async (token: string, envType: string) => {
|
|
81
|
+
const reconnectCGM = async (token: string, envType: string, userData: any) => {
|
|
79
82
|
console.log('reconnectCGM====');
|
|
80
83
|
try {
|
|
81
|
-
const result =
|
|
84
|
+
const result =
|
|
85
|
+
Platform.OS === 'android'
|
|
86
|
+
? await cgmLib.reconnectCgmTracky(token, envType, userData)
|
|
87
|
+
: await cgmLib.reconnectCgmTracky(token, envType);
|
|
82
88
|
console.log(result);
|
|
83
89
|
} catch (error) {
|
|
84
90
|
console.error(error);
|
|
@@ -88,7 +94,8 @@ const reconnectCGM = async (token: string, envType: string) => {
|
|
|
88
94
|
const observeAllGlucoseDataHandler = async (
|
|
89
95
|
token: string,
|
|
90
96
|
isCleanData: boolean,
|
|
91
|
-
envType: string
|
|
97
|
+
envType: string,
|
|
98
|
+
userData: any
|
|
92
99
|
) => {
|
|
93
100
|
console.log('observeAllGlucoseDataHandler====');
|
|
94
101
|
try {
|
|
@@ -96,7 +103,8 @@ const observeAllGlucoseDataHandler = async (
|
|
|
96
103
|
const result = await cgmLib.observeAllGlucoseData(
|
|
97
104
|
token,
|
|
98
105
|
isCleanData,
|
|
99
|
-
envType
|
|
106
|
+
envType,
|
|
107
|
+
userData
|
|
100
108
|
);
|
|
101
109
|
const deviceStatus = await cgmLib.observeDeviceStatus(token, envType);
|
|
102
110
|
console.log(result);
|
|
@@ -129,16 +137,26 @@ const observeTransmitterUnbindStatusHandler = async (
|
|
|
129
137
|
token: string,
|
|
130
138
|
apiResponse: string,
|
|
131
139
|
patientId: string,
|
|
132
|
-
envType: string
|
|
140
|
+
envType: string,
|
|
141
|
+
userData: any
|
|
133
142
|
) => {
|
|
134
143
|
console.log('observeTransmitterUnbindStatusHandler====');
|
|
135
144
|
try {
|
|
136
|
-
const result =
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
145
|
+
const result =
|
|
146
|
+
Platform.OS === 'android'
|
|
147
|
+
? await cgmLib.observeTransmitterUnbindStatus(
|
|
148
|
+
token,
|
|
149
|
+
apiResponse,
|
|
150
|
+
patientId,
|
|
151
|
+
envType,
|
|
152
|
+
userData
|
|
153
|
+
)
|
|
154
|
+
: await cgmLib.observeTransmitterUnbindStatus(
|
|
155
|
+
token,
|
|
156
|
+
apiResponse,
|
|
157
|
+
patientId,
|
|
158
|
+
envType
|
|
159
|
+
);
|
|
142
160
|
console.log(result);
|
|
143
161
|
} catch (error) {
|
|
144
162
|
console.error(error);
|