@luciq/react-native 19.4.0-44237-SNAPSHOT → 19.4.0-47504-SNAPSHOT

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 (116) hide show
  1. package/README.md +0 -118
  2. package/RNLuciq.podspec +2 -6
  3. package/android/build.gradle +0 -25
  4. package/android/proguard-rules.txt +1 -1
  5. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqAPMModule.java +12 -3
  6. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqBugReportingModule.java +24 -28
  7. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqCrashReportingModule.java +7 -18
  8. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqFeatureRequestsModule.java +2 -1
  9. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqNetworkLoggerModule.java +56 -29
  10. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqReactnativeModule.java +47 -78
  11. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqRepliesModule.java +16 -4
  12. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqSessionReplayModule.java +16 -5
  13. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqSurveysModule.java +15 -7
  14. package/android/src/main/java/ai/luciq/reactlibrary/utils/EventEmitterModule.java +7 -0
  15. package/dist/modules/BugReporting.js +3 -3
  16. package/dist/modules/Luciq.js +3 -2
  17. package/dist/modules/NetworkLogger.d.ts +0 -5
  18. package/dist/modules/NetworkLogger.js +9 -1
  19. package/dist/modules/Replies.js +1 -1
  20. package/dist/modules/Surveys.js +2 -2
  21. package/dist/native/NativeBugReporting.d.ts +4 -4
  22. package/dist/native/NativeCrashReporting.d.ts +2 -2
  23. package/dist/native/NativeLuciq.d.ts +3 -2
  24. package/dist/native/NativePackage.js +2 -25
  25. package/dist/native/NativeReplies.d.ts +1 -1
  26. package/dist/native/NativeSurveys.d.ts +2 -2
  27. package/dist/utils/Enums.js +1 -3
  28. package/dist/utils/FeatureFlags.d.ts +6 -0
  29. package/dist/utils/FeatureFlags.js +35 -0
  30. package/dist/utils/LuciqUtils.d.ts +1 -1
  31. package/dist/utils/LuciqUtils.js +9 -0
  32. package/dist/utils/XhrNetworkInterceptor.js +85 -53
  33. package/ios/RNLuciq/LuciqAPMBridge.h +5 -5
  34. package/ios/RNLuciq/{LuciqAPMBridge.mm → LuciqAPMBridge.m} +39 -48
  35. package/ios/RNLuciq/LuciqBugReportingBridge.h +6 -6
  36. package/ios/RNLuciq/LuciqBugReportingBridge.m +249 -0
  37. package/ios/RNLuciq/LuciqCrashReportingBridge.h +5 -16
  38. package/ios/RNLuciq/LuciqCrashReportingBridge.m +68 -0
  39. package/ios/RNLuciq/LuciqFeatureRequestsBridge.h +1 -1
  40. package/ios/RNLuciq/{LuciqFeatureRequestsBridge.mm → LuciqFeatureRequestsBridge.m} +16 -21
  41. package/ios/RNLuciq/LuciqNetworkLoggerBridge.h +30 -1
  42. package/ios/RNLuciq/{LuciqNetworkLoggerBridge.mm → LuciqNetworkLoggerBridge.m} +77 -46
  43. package/ios/RNLuciq/LuciqReactBridge.h +13 -13
  44. package/ios/RNLuciq/{LuciqReactBridge.mm → LuciqReactBridge.m} +34 -83
  45. package/ios/RNLuciq/LuciqRepliesBridge.h +3 -3
  46. package/ios/RNLuciq/LuciqRepliesBridge.m +80 -0
  47. package/ios/RNLuciq/LuciqSessionReplayBridge.h +5 -5
  48. package/ios/RNLuciq/{LuciqSessionReplayBridge.mm → LuciqSessionReplayBridge.m} +25 -35
  49. package/ios/RNLuciq/LuciqSurveysBridge.h +5 -5
  50. package/ios/RNLuciq/{LuciqSurveysBridge.mm → LuciqSurveysBridge.m} +35 -34
  51. package/package.json +1 -9
  52. package/scripts/get-github-app-token.sh +70 -0
  53. package/scripts/notify-github.sh +17 -8
  54. package/src/modules/BugReporting.ts +3 -3
  55. package/src/modules/Luciq.ts +4 -2
  56. package/src/modules/NetworkLogger.ts +26 -1
  57. package/src/modules/Replies.ts +1 -1
  58. package/src/modules/Surveys.ts +2 -2
  59. package/src/native/NativeBugReporting.ts +6 -3
  60. package/src/native/NativeCrashReporting.ts +2 -2
  61. package/src/native/NativeLuciq.ts +3 -2
  62. package/src/native/NativePackage.ts +2 -52
  63. package/src/native/NativeReplies.ts +1 -1
  64. package/src/native/NativeSurveys.ts +2 -2
  65. package/src/utils/Enums.ts +1 -4
  66. package/src/utils/FeatureFlags.ts +44 -0
  67. package/src/utils/LuciqUtils.ts +21 -1
  68. package/src/utils/XhrNetworkInterceptor.ts +128 -55
  69. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqAPMBaseSpec.java +0 -9
  70. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqBaseSpec.java +0 -33
  71. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqBugReportingBaseSpec.java +0 -33
  72. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqCrashReportingBaseSpec.java +0 -9
  73. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqFeatureRequestsBaseSpec.java +0 -9
  74. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqNetworkLoggerBaseSpec.java +0 -33
  75. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqRepliesBaseSpec.java +0 -33
  76. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqSessionReplayBaseSpec.java +0 -33
  77. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqSurveysBaseSpec.java +0 -33
  78. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqAPMBaseSpec.java +0 -11
  79. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqBaseSpec.java +0 -22
  80. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqBugReportingBaseSpec.java +0 -22
  81. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqCrashReportingBaseSpec.java +0 -10
  82. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqFeatureRequestsBaseSpec.java +0 -10
  83. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqNetworkLoggerBaseSpec.java +0 -22
  84. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqRepliesBaseSpec.java +0 -22
  85. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqSessionReplayBaseSpec.java +0 -22
  86. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqSurveysBaseSpec.java +0 -22
  87. package/dist/native/specs/NativeAPM.d.ts +0 -21
  88. package/dist/native/specs/NativeAPM.js +0 -2
  89. package/dist/native/specs/NativeBugReporting.d.ts +0 -29
  90. package/dist/native/specs/NativeBugReporting.js +0 -2
  91. package/dist/native/specs/NativeCrashReporting.d.ts +0 -12
  92. package/dist/native/specs/NativeCrashReporting.js +0 -2
  93. package/dist/native/specs/NativeFeatureRequests.d.ts +0 -8
  94. package/dist/native/specs/NativeFeatureRequests.js +0 -2
  95. package/dist/native/specs/NativeLuciq.d.ts +0 -80
  96. package/dist/native/specs/NativeLuciq.js +0 -2
  97. package/dist/native/specs/NativeNetworkLogger.d.ts +0 -16
  98. package/dist/native/specs/NativeNetworkLogger.js +0 -2
  99. package/dist/native/specs/NativeReplies.d.ts +0 -21
  100. package/dist/native/specs/NativeReplies.js +0 -2
  101. package/dist/native/specs/NativeSessionReplay.d.ts +0 -17
  102. package/dist/native/specs/NativeSessionReplay.js +0 -2
  103. package/dist/native/specs/NativeSurveys.d.ts +0 -18
  104. package/dist/native/specs/NativeSurveys.js +0 -2
  105. package/ios/RNLuciq/LuciqBugReportingBridge.mm +0 -234
  106. package/ios/RNLuciq/LuciqCrashReportingBridge.mm +0 -91
  107. package/ios/RNLuciq/LuciqRepliesBridge.mm +0 -86
  108. package/src/native/specs/NativeAPM.ts +0 -47
  109. package/src/native/specs/NativeBugReporting.ts +0 -53
  110. package/src/native/specs/NativeCrashReporting.ts +0 -23
  111. package/src/native/specs/NativeFeatureRequests.ts +0 -10
  112. package/src/native/specs/NativeLuciq.ts +0 -137
  113. package/src/native/specs/NativeNetworkLogger.ts +0 -31
  114. package/src/native/specs/NativeReplies.ts +0 -27
  115. package/src/native/specs/NativeSessionReplay.ts +0 -20
  116. package/src/native/specs/NativeSurveys.ts +0 -23
@@ -83,9 +83,10 @@ import javax.annotation.Nullable;
83
83
  /**
84
84
  * The type Rn luciq reactnative module.
85
85
  */
86
- public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
86
+ public class RNLuciqReactnativeModule extends EventEmitterModule {
87
87
 
88
88
  private static final String TAG = "Luciq-RN-Core";
89
+ private static final String NET_TAG = "LCQ-RN-NET";
89
90
 
90
91
  private LuciqCustomTextPlaceHolder placeHolders;
91
92
  private static Report currentReport;
@@ -111,6 +112,16 @@ public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
111
112
  }
112
113
 
113
114
 
115
+ @ReactMethod
116
+ public void addListener(String event) {
117
+ super.addListener(event);
118
+ }
119
+
120
+ @ReactMethod
121
+ public void removeListeners(Integer count) {
122
+ super.removeListeners(count);
123
+ }
124
+
114
125
  /**
115
126
  * Enables or disables Luciq functionality.
116
127
  * @param isEnabled A boolean to enable/disable Luciq.
@@ -153,6 +164,7 @@ public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
153
164
 
154
165
 
155
166
  ) {
167
+ Log.d(NET_TAG, "[init] Called — logLevel=" + logLevel + ", useNativeNetworkInterception=" + useNativeNetworkInterception + ", codePushVersion=" + codePushVersion + ", appVariant=" + appVariant);
156
168
  MainThreadHandler.runOnMainThread(new Runnable() {
157
169
  @Override
158
170
  public void run() {
@@ -194,6 +206,7 @@ public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
194
206
  }
195
207
 
196
208
  builder.build();
209
+ Log.d(NET_TAG, "[init] SDK build complete");
197
210
  }
198
211
  });
199
212
  }
@@ -693,7 +706,7 @@ public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
693
706
  * report.
694
707
  */
695
708
  @ReactMethod
696
- public void setPreSendingHandler() {
709
+ public void setPreSendingHandler(final Callback preSendingHandler) {
697
710
  MainThreadHandler.runOnMainThread(new Runnable() {
698
711
  @Override
699
712
  public void run() {
@@ -959,6 +972,7 @@ public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
959
972
  final String requestHeaders,
960
973
  final String responseHeaders,
961
974
  final double duration) {
975
+ Log.d(NET_TAG, "[networkLogAndroid-Core] Received from JS: " + method + " " + url + ", status=" + (int) responseCode + ", duration=" + (long) duration + "ms, reqBodyLen=" + (requestBody != null ? requestBody.length() : 0) + ", resBodyLen=" + (responseBody != null ? responseBody.length() : 0));
962
976
  try {
963
977
  final String date = String.valueOf(System.currentTimeMillis());
964
978
 
@@ -975,11 +989,14 @@ public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
975
989
  networkLog.setRequestHeaders(requestHeaders);
976
990
  networkLog.setResponseHeaders(responseHeaders);
977
991
  } catch (OutOfMemoryError | Exception exception) {
992
+ Log.e(NET_TAG, "[networkLogAndroid-Core] OOM/Error setting log contents: " + exception.getMessage() + " for " + method + " " + url);
978
993
  Log.d(TAG, "Error: " + exception.getMessage() + "while trying to set network log contents (request body, response body, request headers, and response headers).");
979
994
  }
980
995
 
981
996
  networkLog.insert();
997
+ Log.d(NET_TAG, "[networkLogAndroid-Core] Successfully inserted NetworkLog: " + method + " " + url);
982
998
  } catch (OutOfMemoryError | Exception exception) {
999
+ Log.e(NET_TAG, "[networkLogAndroid-Core] OOM/Error inserting network log: " + exception.getMessage() + " for " + method + " " + url);
983
1000
  Log.d(TAG, "Error: " + exception.getMessage() + "while trying to insert a network log");
984
1001
  }
985
1002
  }
@@ -1007,14 +1024,12 @@ public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
1007
1024
 
1008
1025
 
1009
1026
  @ReactMethod
1010
- public void addPrivateView(@Nullable final Double reactTag) {
1011
- if (reactTag == null) return;
1012
- final int tag = reactTag.intValue();
1027
+ public void addPrivateView(final int reactTag) {
1013
1028
  MainThreadHandler.runOnMainThread(new Runnable() {
1014
1029
  @Override
1015
1030
  public void run() {
1016
1031
  try {
1017
- final View view = resolveReactView(tag);
1032
+ final View view = resolveReactView(reactTag);
1018
1033
 
1019
1034
  if(view !=null){
1020
1035
  Luciq.addPrivateViews(view);
@@ -1027,14 +1042,12 @@ public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
1027
1042
  }
1028
1043
 
1029
1044
  @ReactMethod
1030
- public void removePrivateView(@Nullable final Double reactTag) {
1031
- if (reactTag == null) return;
1032
- final int tag = reactTag.intValue();
1045
+ public void removePrivateView(final int reactTag) {
1033
1046
  MainThreadHandler.runOnMainThread(new Runnable() {
1034
1047
  @Override
1035
1048
  public void run() {
1036
1049
  try {
1037
- final View view = resolveReactView(tag);
1050
+ final View view = resolveReactView(reactTag);
1038
1051
  if(view !=null){
1039
1052
 
1040
1053
  Luciq.removePrivateViews(view);
@@ -1164,7 +1177,7 @@ public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
1164
1177
  */
1165
1178
  @ReactMethod
1166
1179
  public void registerFeatureFlagsChangeListener() {
1167
-
1180
+ Log.d(NET_TAG, "[registerFeatureFlagsChangeListener] Registering native feature flags listener");
1168
1181
  MainThreadHandler.runOnMainThread(new Runnable() {
1169
1182
  @Override
1170
1183
  public void run() {
@@ -1172,6 +1185,7 @@ public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
1172
1185
  InternalCore.INSTANCE._setFeaturesStateListener(new FeaturesStateListener() {
1173
1186
  @Override
1174
1187
  public void invoke(@NonNull CoreFeaturesState featuresState) {
1188
+ Log.d(NET_TAG, "[FeatureFlagsListener] Received update — W3CTraceID=" + featuresState.isW3CExternalTraceIdEnabled() + ", generatedHeader=" + featuresState.isAttachingGeneratedHeaderEnabled() + ", caughtHeader=" + featuresState.isAttachingCapturedHeaderEnabled() + ", networkBodyLimit=" + featuresState.getNetworkLogCharLimit());
1175
1189
  WritableMap params = Arguments.createMap();
1176
1190
  params.putBoolean("isW3ExternalTraceIDEnabled", featuresState.isW3CExternalTraceIdEnabled());
1177
1191
  params.putBoolean("isW3ExternalGeneratedHeaderEnabled", featuresState.isAttachingGeneratedHeaderEnabled());
@@ -1179,9 +1193,11 @@ public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
1179
1193
  params.putInt("networkBodyLimit",featuresState.getNetworkLogCharLimit());
1180
1194
 
1181
1195
  sendEvent(Constants.LCQ_ON_FEATURE_FLAGS_UPDATE_RECEIVED_CALLBACK, params);
1196
+ Log.d(NET_TAG, "[FeatureFlagsListener] Sent event to JS: " + Constants.LCQ_ON_FEATURE_FLAGS_UPDATE_RECEIVED_CALLBACK);
1182
1197
  }
1183
1198
  });
1184
1199
  } catch (Exception e) {
1200
+ Log.e(NET_TAG, "[registerFeatureFlagsChangeListener] Failed to register listener", e);
1185
1201
  e.printStackTrace();
1186
1202
  }
1187
1203
 
@@ -1196,13 +1212,16 @@ public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
1196
1212
  */
1197
1213
  @ReactMethod
1198
1214
  public void isW3ExternalTraceIDEnabled(Promise promise) {
1199
-
1215
+ Log.d(NET_TAG, "[isW3ExternalTraceIDEnabled] Querying native flag");
1200
1216
  MainThreadHandler.runOnMainThread(new Runnable() {
1201
1217
  @Override
1202
1218
  public void run() {
1203
1219
  try {
1204
- promise.resolve(InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_EXTERNAL_TRACE_ID));
1220
+ boolean enabled = InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_EXTERNAL_TRACE_ID);
1221
+ Log.d(NET_TAG, "[isW3ExternalTraceIDEnabled] Result=" + enabled);
1222
+ promise.resolve(enabled);
1205
1223
  } catch (Exception e) {
1224
+ Log.e(NET_TAG, "[isW3ExternalTraceIDEnabled] Error querying flag", e);
1206
1225
  e.printStackTrace();
1207
1226
  promise.resolve(false);
1208
1227
  }
@@ -1218,13 +1237,16 @@ public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
1218
1237
  */
1219
1238
  @ReactMethod
1220
1239
  public void isW3ExternalGeneratedHeaderEnabled(Promise promise) {
1221
-
1240
+ Log.d(NET_TAG, "[isW3ExternalGeneratedHeaderEnabled] Querying native flag");
1222
1241
  MainThreadHandler.runOnMainThread(new Runnable() {
1223
1242
  @Override
1224
1243
  public void run() {
1225
1244
  try {
1226
- promise.resolve(InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_ATTACHING_GENERATED_HEADER));
1245
+ boolean enabled = InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_ATTACHING_GENERATED_HEADER);
1246
+ Log.d(NET_TAG, "[isW3ExternalGeneratedHeaderEnabled] Result=" + enabled);
1247
+ promise.resolve(enabled);
1227
1248
  } catch (Exception e) {
1249
+ Log.e(NET_TAG, "[isW3ExternalGeneratedHeaderEnabled] Error querying flag", e);
1228
1250
  e.printStackTrace();
1229
1251
  promise.resolve(false);
1230
1252
  }
@@ -1239,13 +1261,16 @@ public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
1239
1261
  */
1240
1262
  @ReactMethod
1241
1263
  public void isW3CaughtHeaderEnabled(Promise promise) {
1242
-
1264
+ Log.d(NET_TAG, "[isW3CaughtHeaderEnabled] Querying native flag");
1243
1265
  MainThreadHandler.runOnMainThread(new Runnable() {
1244
1266
  @Override
1245
1267
  public void run() {
1246
1268
  try {
1247
- promise.resolve(InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_ATTACHING_CAPTURED_HEADER));
1269
+ boolean enabled = InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_ATTACHING_CAPTURED_HEADER);
1270
+ Log.d(NET_TAG, "[isW3CaughtHeaderEnabled] Result=" + enabled);
1271
+ promise.resolve(enabled);
1248
1272
  } catch (Exception e) {
1273
+ Log.e(NET_TAG, "[isW3CaughtHeaderEnabled] Error querying flag", e);
1249
1274
  e.printStackTrace();
1250
1275
  promise.resolve(false);
1251
1276
  }
@@ -1275,15 +1300,6 @@ public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
1275
1300
  return constants;
1276
1301
  }
1277
1302
 
1278
- @ReactMethod(isBlockingSynchronousMethod = true)
1279
- public WritableMap getAllConstants() {
1280
- final WritableMap map = Arguments.createMap();
1281
- for (Map.Entry<String, Object> entry : getConstants().entrySet()) {
1282
- map.putString(entry.getKey(), String.valueOf(entry.getValue()));
1283
- }
1284
- return map;
1285
- }
1286
-
1287
1303
 
1288
1304
  @ReactMethod
1289
1305
  public void setOnFeaturesUpdatedListener() {
@@ -1348,13 +1364,16 @@ public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
1348
1364
  */
1349
1365
  @ReactMethod
1350
1366
  public void getNetworkBodyMaxSize(Promise promise) {
1351
-
1367
+ Log.d(NET_TAG, "[getNetworkBodyMaxSize] Querying network body size limit");
1352
1368
  MainThreadHandler.runOnMainThread(new Runnable() {
1353
1369
  @Override
1354
1370
  public void run() {
1355
1371
  try {
1356
- promise.resolve(InternalCore.INSTANCE.get_networkLogCharLimit());
1372
+ Object limit = InternalCore.INSTANCE.get_networkLogCharLimit();
1373
+ Log.d(NET_TAG, "[getNetworkBodyMaxSize] Result=" + limit);
1374
+ promise.resolve(limit);
1357
1375
  } catch (Exception e) {
1376
+ Log.e(NET_TAG, "[getNetworkBodyMaxSize] Error querying limit", e);
1358
1377
  e.printStackTrace();
1359
1378
  promise.resolve(false);
1360
1379
  }
@@ -1674,54 +1693,4 @@ private String getFileName(String path) {
1674
1693
  }
1675
1694
  });
1676
1695
  }
1677
-
1678
- @ReactMethod
1679
- public void setLCQLogPrintsToConsole(boolean printsToConsole) {
1680
- }
1681
-
1682
- @ReactMethod
1683
- public void setPrimaryColor(@Nullable Double color) {
1684
- }
1685
-
1686
- @ReactMethod
1687
- public void networkLogIOS(String url,
1688
- String method,
1689
- @Nullable String requestBody,
1690
- double requestBodySize,
1691
- @Nullable String responseBody,
1692
- double responseBodySize,
1693
- double responseCode,
1694
- ReadableMap requestHeaders,
1695
- ReadableMap responseHeaders,
1696
- String contentType,
1697
- String errorDomain,
1698
- double errorCode,
1699
- double startTime,
1700
- double duration,
1701
- @Nullable String gqlQueryName,
1702
- @Nullable String serverErrorMessage,
1703
- ReadableMap w3cExternalTraceAttributes) {
1704
- }
1705
-
1706
- @ReactMethod
1707
- public void setNetworkLoggingEnabled(boolean isEnabled) {
1708
- }
1709
-
1710
- @ReactMethod
1711
- public void setTrackUserSteps(final boolean isEnabled) {
1712
- MainThreadHandler.runOnMainThread(new Runnable() {
1713
- @Override
1714
- public void run() {
1715
- try {
1716
- if (isEnabled) {
1717
- Luciq.setTrackingUserStepsState(Feature.State.ENABLED);
1718
- } else {
1719
- Luciq.setTrackingUserStepsState(Feature.State.DISABLED);
1720
- }
1721
- } catch (Exception e) {
1722
- e.printStackTrace();
1723
- }
1724
- }
1725
- });
1726
- }
1727
1696
  }
@@ -1,5 +1,6 @@
1
1
  package ai.luciq.reactlibrary;
2
2
 
3
+ import com.facebook.react.bridge.Callback;
3
4
  import com.facebook.react.bridge.Promise;
4
5
  import com.facebook.react.bridge.ReactApplicationContext;
5
6
  import com.facebook.react.bridge.ReactMethod;
@@ -8,13 +9,14 @@ import com.facebook.react.bridge.ReadableType;
8
9
  import com.facebook.react.bridge.ReadableMapKeySetIterator;
9
10
  import ai.luciq.chat.Replies;
10
11
  import ai.luciq.library.Feature;
12
+ import ai.luciq.reactlibrary.utils.EventEmitterModule;
11
13
  import ai.luciq.reactlibrary.utils.MainThreadHandler;
12
14
 
13
15
  import javax.annotation.Nonnull;
14
16
  import java.util.HashMap;
15
17
  import java.util.Map;
16
18
 
17
- public class RNLuciqRepliesModule extends RNLuciqRepliesBaseSpec {
19
+ public class RNLuciqRepliesModule extends EventEmitterModule {
18
20
 
19
21
  public RNLuciqRepliesModule(ReactApplicationContext reactApplicationContext) {
20
22
  super(reactApplicationContext);
@@ -26,6 +28,16 @@ public class RNLuciqRepliesModule extends RNLuciqRepliesBaseSpec {
26
28
  return "LCQReplies";
27
29
  }
28
30
 
31
+ @ReactMethod
32
+ public void addListener(String event) {
33
+ super.addListener(event);
34
+ }
35
+
36
+ @ReactMethod
37
+ public void removeListeners(Integer count) {
38
+ super.removeListeners(count);
39
+ }
40
+
29
41
  @ReactMethod
30
42
  public void setEnabled(final boolean isEnabled) {
31
43
  MainThreadHandler.runOnMainThread(new Runnable() {
@@ -210,12 +222,12 @@ public class RNLuciqRepliesModule extends RNLuciqRepliesBaseSpec {
210
222
  * @param notificationIcon the notification icon resource ID
211
223
  */
212
224
  @ReactMethod
213
- public void setNotificationIcon(final double notificationIcon) {
225
+ public void setNotificationIcon(final int notificationIcon) {
214
226
  MainThreadHandler.runOnMainThread(new Runnable() {
215
227
  @Override
216
228
  public void run() {
217
229
  try {
218
- Replies.setNotificationIcon((int) notificationIcon);
230
+ Replies.setNotificationIcon(notificationIcon);
219
231
  } catch (Exception e) {
220
232
  e.printStackTrace();
221
233
  }
@@ -265,7 +277,7 @@ public class RNLuciqRepliesModule extends RNLuciqRepliesBaseSpec {
265
277
  }
266
278
 
267
279
  @ReactMethod
268
- public void setOnNewReplyReceivedHandler() {
280
+ public void setOnNewReplyReceivedHandler(final Callback onNewReplyReceivedCallback) {
269
281
  MainThreadHandler.runOnMainThread(new Runnable() {
270
282
  @Override
271
283
  public void run() {
@@ -16,6 +16,7 @@ import ai.luciq.library.OnSessionReplayLinkReady;
16
16
  import ai.luciq.library.SessionSyncListener;
17
17
  import ai.luciq.library.sessionreplay.SessionReplay;
18
18
  import ai.luciq.library.sessionreplay.model.SessionMetadata;
19
+ import ai.luciq.reactlibrary.utils.EventEmitterModule;
19
20
  import ai.luciq.reactlibrary.utils.MainThreadHandler;
20
21
  import android.util.Log;
21
22
  import java.util.ArrayList;
@@ -24,12 +25,22 @@ import java.util.concurrent.CountDownLatch;
24
25
 
25
26
  import javax.annotation.Nonnull;
26
27
 
27
- public class RNLuciqSessionReplayModule extends RNLuciqSessionReplayBaseSpec {
28
+ public class RNLuciqSessionReplayModule extends EventEmitterModule {
28
29
 
29
30
  public RNLuciqSessionReplayModule(ReactApplicationContext reactApplicationContext) {
30
31
  super(reactApplicationContext);
31
32
  }
32
33
 
34
+ @ReactMethod
35
+ public void addListener(String event) {
36
+ super.addListener(event);
37
+ }
38
+
39
+ @ReactMethod
40
+ public void removeListeners(Integer count) {
41
+ super.removeListeners(count);
42
+ }
43
+
33
44
  @Nonnull
34
45
  @Override
35
46
  public String getName() {
@@ -157,7 +168,7 @@ public class RNLuciqSessionReplayModule extends RNLuciqSessionReplayBaseSpec {
157
168
  private boolean shouldSync = true;
158
169
  private CountDownLatch latch;
159
170
  @ReactMethod
160
- public void setSyncCallback(final Promise promise) {
171
+ public void setSyncCallback() {
161
172
  MainThreadHandler.runOnMainThread(new Runnable() {
162
173
  @Override
163
174
  public void run() {
@@ -184,7 +195,7 @@ public class RNLuciqSessionReplayModule extends RNLuciqSessionReplayBaseSpec {
184
195
  catch(Exception e){
185
196
  e.printStackTrace();
186
197
  }
187
- promise.resolve(null);
198
+
188
199
  }
189
200
  });
190
201
  }
@@ -237,12 +248,12 @@ public class RNLuciqSessionReplayModule extends RNLuciqSessionReplayBaseSpec {
237
248
  }
238
249
 
239
250
  @ReactMethod
240
- public void setScreenshotCaptureInterval(final double intervalMs) {
251
+ public void setScreenshotCaptureInterval(final int intervalMs) {
241
252
  MainThreadHandler.runOnMainThread(new Runnable() {
242
253
  @Override
243
254
  public void run() {
244
255
  try {
245
- SessionReplay.setScreenshotCaptureInterval((int) intervalMs);
256
+ SessionReplay.setScreenshotCaptureInterval(intervalMs);
246
257
  } catch (Exception e) {
247
258
  e.printStackTrace();
248
259
  }
@@ -1,12 +1,14 @@
1
1
  package ai.luciq.reactlibrary;
2
2
 
3
3
  import com.facebook.react.bridge.Arguments;
4
+ import com.facebook.react.bridge.Callback;
4
5
  import com.facebook.react.bridge.Promise;
5
6
  import com.facebook.react.bridge.ReactApplicationContext;
6
7
  import com.facebook.react.bridge.ReactMethod;
7
8
  import com.facebook.react.bridge.WritableArray;
8
9
  import ai.luciq.library.Feature;
9
10
  import ai.luciq.reactlibrary.utils.ArrayUtil;
11
+ import ai.luciq.reactlibrary.utils.EventEmitterModule;
10
12
  import ai.luciq.reactlibrary.utils.LuciqUtil;
11
13
  import ai.luciq.reactlibrary.utils.MainThreadHandler;
12
14
  import ai.luciq.survey.callbacks.*;
@@ -19,7 +21,7 @@ import java.util.List;
19
21
 
20
22
  import javax.annotation.Nonnull;
21
23
 
22
- public class RNLuciqSurveysModule extends RNLuciqSurveysBaseSpec {
24
+ public class RNLuciqSurveysModule extends EventEmitterModule {
23
25
 
24
26
  public RNLuciqSurveysModule(ReactApplicationContext reactContext) {
25
27
  super(reactContext);
@@ -31,6 +33,16 @@ public class RNLuciqSurveysModule extends RNLuciqSurveysBaseSpec {
31
33
  return "LCQSurveys";
32
34
  }
33
35
 
36
+ @ReactMethod
37
+ public void addListener(String event) {
38
+ super.addListener(event);
39
+ }
40
+
41
+ @ReactMethod
42
+ public void removeListeners(Integer count) {
43
+ super.removeListeners(count);
44
+ }
45
+
34
46
  /**
35
47
  * Returns true if the survey with a specific token was answered before.
36
48
  * Will return false if the token does not exist or if the survey was not answered before.
@@ -127,7 +139,7 @@ public class RNLuciqSurveysModule extends RNLuciqSurveysBaseSpec {
127
139
  * @param handler to run on the UI thread before showing any valid survey
128
140
  */
129
141
  @ReactMethod
130
- public void setOnShowHandler() {
142
+ public void setOnShowHandler(final Callback handler) {
131
143
  MainThreadHandler.runOnMainThread(new Runnable() {
132
144
  @Override
133
145
  public void run() {
@@ -149,7 +161,7 @@ public class RNLuciqSurveysModule extends RNLuciqSurveysBaseSpec {
149
161
  * @param handler to run on the UI thread after showing any valid survey
150
162
  */
151
163
  @ReactMethod
152
- public void setOnDismissHandler() {
164
+ public void setOnDismissHandler(final Callback handler) {
153
165
  MainThreadHandler.runOnMainThread(new Runnable() {
154
166
  @Override
155
167
  public void run() {
@@ -222,8 +234,4 @@ public class RNLuciqSurveysModule extends RNLuciqSurveysBaseSpec {
222
234
  }
223
235
  });
224
236
  }
225
-
226
- @ReactMethod
227
- public void setAppStoreURL(String appStoreURL) {
228
- }
229
237
  }
@@ -1,5 +1,7 @@
1
1
  package ai.luciq.reactlibrary.utils;
2
2
 
3
+ import android.util.Log;
4
+
3
5
  import androidx.annotation.Nullable;
4
6
  import androidx.annotation.VisibleForTesting;
5
7
 
@@ -10,6 +12,7 @@ import com.facebook.react.bridge.WritableMap;
10
12
  import com.facebook.react.modules.core.DeviceEventManagerModule;
11
13
 
12
14
  public abstract class EventEmitterModule extends ReactContextBaseJavaModule {
15
+ private static final String NET_TAG = "LCQ-RN-NET";
13
16
  private int listenerCount = 0;
14
17
 
15
18
  public EventEmitterModule(ReactApplicationContext context) {
@@ -22,14 +25,18 @@ public abstract class EventEmitterModule extends ReactContextBaseJavaModule {
22
25
  getReactApplicationContext()
23
26
  .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
24
27
  .emit(event, params);
28
+ } else {
29
+ Log.w(NET_TAG, "[EventEmitter] Event DROPPED (no JS listeners): event=" + event + ", module=" + getName() + ", listenerCount=0");
25
30
  }
26
31
  }
27
32
 
28
33
  protected void addListener(String ignoredEvent) {
29
34
  listenerCount++;
35
+ Log.d(NET_TAG, "[EventEmitter] addListener — module=" + getName() + ", event=" + ignoredEvent + ", listenerCount=" + listenerCount);
30
36
  }
31
37
 
32
38
  protected void removeListeners(Integer count) {
33
39
  listenerCount -= count;
40
+ Log.d(NET_TAG, "[EventEmitter] removeListeners — module=" + getName() + ", removed=" + count + ", listenerCount=" + listenerCount);
34
41
  }
35
42
  }
@@ -31,7 +31,7 @@ export const setOptions = (options) => {
31
31
  */
32
32
  export const onInvokeHandler = (handler) => {
33
33
  emitter.addListener(NativeEvents.ON_INVOKE_HANDLER, handler);
34
- NativeBugReporting.setOnInvokeHandler();
34
+ NativeBugReporting.setOnInvokeHandler(handler);
35
35
  };
36
36
  /**
37
37
  * Sets a block of code to be executed right after the SDK's UI is dismissed.
@@ -43,7 +43,7 @@ export const onSDKDismissedHandler = (handler) => {
43
43
  emitter.addListener(NativeEvents.ON_DISMISS_HANDLER, (payload) => {
44
44
  handler(payload.dismissType, payload.reportType);
45
45
  });
46
- NativeBugReporting.setOnSDKDismissedHandler();
46
+ NativeBugReporting.setOnSDKDismissedHandler(handler);
47
47
  };
48
48
  /**
49
49
  * Sets the threshold value of the shake gesture for iPhone/iPod Touch
@@ -160,7 +160,7 @@ export const setDidSelectPromptOptionHandler = (handler) => {
160
160
  emitter.addListener(NativeEvents.DID_SELECT_PROMPT_OPTION_HANDLER, (payload) => {
161
161
  handler(payload.promptOption);
162
162
  });
163
- NativeBugReporting.setDidSelectPromptOptionHandler();
163
+ NativeBugReporting.setDidSelectPromptOptionHandler(handler);
164
164
  };
165
165
  /**
166
166
  * Sets the default edge and offset from the top at which the floating button
@@ -1,7 +1,7 @@
1
1
  import { AppState, findNodeHandle, Platform } from 'react-native';
2
2
  import Report from '../models/Report';
3
3
  import { emitter, NativeEvents, NativeLuciq } from '../native/NativeLuciq';
4
- import { registerFeatureFlagsListener } from '../utils/FeatureFlags';
4
+ import { registerFeatureFlagsListener, initFeatureFlagsCache } from '../utils/FeatureFlags';
5
5
  import { LogLevel, NetworkInterceptionMode, ReproStepsMode, StringKey, } from '../utils/Enums';
6
6
  import LuciqUtils, { checkNetworkRequestHandlers, resetNativeObfuscationListener, setApmNetworkFlagsIfChanged, stringifyIfNotString, } from '../utils/LuciqUtils';
7
7
  import * as NetworkLogger from './NetworkLogger';
@@ -50,6 +50,7 @@ function reportCurrentViewForAndroid(screenName) {
50
50
  * @param config SDK configurations. See {@link LuciqConfig} for more info.
51
51
  */
52
52
  export const init = (config) => {
53
+ initFeatureFlagsCache();
53
54
  if (Platform.OS === 'android') {
54
55
  // Add android feature flags listener for android
55
56
  registerFeatureFlagsListener();
@@ -644,7 +645,7 @@ export const onReportSubmitHandler = (handler) => {
644
645
  const reportObj = new Report(tags, consoleLogs, luciqLogs, userAttributes, fileAttachments);
645
646
  handler && handler(reportObj);
646
647
  });
647
- NativeLuciq.setPreSendingHandler();
648
+ NativeLuciq.setPreSendingHandler(handler);
648
649
  };
649
650
  export const onNavigationStateChange = (prevState, currentState, _action) => {
650
651
  const currentScreen = LuciqUtils.getActiveRouteName(currentState);
@@ -3,11 +3,6 @@ import { NetworkData, ProgressCallback } from '../utils/XhrNetworkInterceptor';
3
3
  import { NetworkListenerType } from '../native/NativeNetworkLogger';
4
4
  export type { NetworkData };
5
5
  export type NetworkDataObfuscationHandler = (data: NetworkData) => Promise<NetworkData>;
6
- /**
7
- * Sets whether network logs should be sent with bug reports.
8
- * It is enabled by default.
9
- * @param isEnabled
10
- */
11
6
  export declare const setEnabled: (isEnabled: boolean) => void;
12
7
  /**
13
8
  * @internal
@@ -20,21 +20,25 @@ function getPortFromUrl(url) {
20
20
  * It is enabled by default.
21
21
  * @param isEnabled
22
22
  */
23
+ const NET_TAG = 'LCQ-RN-NET:';
23
24
  export const setEnabled = (isEnabled) => {
24
25
  if (isEnabled) {
25
26
  xhr.enableInterception();
26
27
  xhr.setOnDoneCallback(async (network) => {
28
+ Logger.debug(NET_TAG, `[NetworkLogger] onDoneCallback received: ${network.method} ${network.url}, status=${network.responseCode}`);
27
29
  // eslint-disable-next-line no-new-func
28
30
  const predicate = Function('network', 'return ' + _requestFilterExpression);
29
31
  if (!predicate(network)) {
30
32
  const MAX_NETWORK_BODY_SIZE_IN_BYTES = await NativeLuciq.getNetworkBodyMaxSize();
31
33
  try {
32
34
  if (_networkDataObfuscationHandler) {
35
+ Logger.debug(NET_TAG, `[NetworkLogger] Running obfuscation handler for ${network.url}`);
33
36
  network = await _networkDataObfuscationHandler(network);
34
37
  }
35
38
  if (__DEV__) {
36
39
  const urlPort = getPortFromUrl(network.url);
37
40
  if (urlPort === LuciqRNConfig.metroDevServerPort) {
41
+ Logger.debug(NET_TAG, `[NetworkLogger] Skipping Metro dev server request: ${network.url}`);
38
42
  return;
39
43
  }
40
44
  }
@@ -54,12 +58,16 @@ export const setEnabled = (isEnabled) => {
54
58
  network.responseBody = `Body is omitted because content type ${network.contentType} isn't supported`;
55
59
  Logger.warn(`LCQ-RN: The response body for the network request with URL ${network.url} has been omitted because the content type ${network.contentType} isn't supported.`);
56
60
  }
61
+ Logger.debug(NET_TAG, `[NetworkLogger] Reporting network log to native: ${network.method} ${network.url}`);
57
62
  reportNetworkLog(network);
58
63
  }
59
64
  catch (e) {
60
- Logger.error(e);
65
+ Logger.error(NET_TAG, `[NetworkLogger] Error processing network log for ${network.url}:`, e);
61
66
  }
62
67
  }
68
+ else {
69
+ Logger.debug(NET_TAG, `[NetworkLogger] Request filtered out by predicate: ${network.method} ${network.url}, expression="${_requestFilterExpression}"`);
70
+ }
63
71
  });
64
72
  }
65
73
  else {
@@ -26,7 +26,7 @@ export const show = () => {
26
26
  */
27
27
  export const setOnNewReplyReceivedHandler = (handler) => {
28
28
  emitter.addListener(NativeEvents.ON_REPLY_RECEIVED_HANDLER, handler);
29
- NativeReplies.setOnNewReplyReceivedHandler();
29
+ NativeReplies.setOnNewReplyReceivedHandler(handler);
30
30
  };
31
31
  /**
32
32
  * Returns the number of unread messages the user currently has.
@@ -45,7 +45,7 @@ export const setAutoShowingEnabled = (autoShowingSurveysEnabled) => {
45
45
  */
46
46
  export const setOnShowHandler = (onShowHandler) => {
47
47
  emitter.addListener(NativeEvents.WILL_SHOW_SURVEY_HANDLER, onShowHandler);
48
- NativeSurveys.setOnShowHandler();
48
+ NativeSurveys.setOnShowHandler(onShowHandler);
49
49
  };
50
50
  /**
51
51
  * Sets a block of code to be executed right after the survey's UI is dismissed.
@@ -56,7 +56,7 @@ export const setOnShowHandler = (onShowHandler) => {
56
56
  */
57
57
  export const setOnDismissHandler = (onDismissHandler) => {
58
58
  emitter.addListener(NativeEvents.DID_DISMISS_SURVEY_HANDLER, onDismissHandler);
59
- NativeSurveys.setOnDismissHandler();
59
+ NativeSurveys.setOnDismissHandler(onDismissHandler);
60
60
  };
61
61
  /**
62
62
  * Shows survey with a specific token.
@@ -1,5 +1,5 @@
1
1
  import { NativeEventEmitter, NativeModule } from 'react-native';
2
- import type { ExtendedBugReportMode, FloatingButtonPosition, InvocationEvent, InvocationOption, RecordingButtonPosition, ReportType, userConsentActionType } from '../utils/Enums';
2
+ import type { DismissType, ExtendedBugReportMode, FloatingButtonPosition, InvocationEvent, InvocationOption, RecordingButtonPosition, ReportType, userConsentActionType } from '../utils/Enums';
3
3
  export interface BugReportingNativeModule extends NativeModule {
4
4
  setEnabled(isEnabled: boolean): void;
5
5
  show(type: ReportType, options: InvocationOption[]): void;
@@ -18,9 +18,9 @@ export interface BugReportingNativeModule extends NativeModule {
18
18
  setShakingThresholdForiPhone(threshold: number): void;
19
19
  setShakingThresholdForiPad(threshold: number): void;
20
20
  setShakingThresholdForAndroid(threshold: number): void;
21
- setOnInvokeHandler(): void;
22
- setDidSelectPromptOptionHandler(): void;
23
- setOnSDKDismissedHandler(): void;
21
+ setOnInvokeHandler(handler: () => void): void;
22
+ setDidSelectPromptOptionHandler(handler: (promptOption: string) => void): void;
23
+ setOnSDKDismissedHandler(handler: (dismissType: DismissType, reportType: ReportType) => void): void;
24
24
  addUserConsent(key: string, description: string, mandatory: boolean, checked: boolean, actionType?: userConsentActionType): void;
25
25
  setProactiveReportingConfigurations(enabled: boolean, gapBetweenModals: number, modalDelayAfterDetection: number): void;
26
26
  }