@luciq/react-native 19.3.0-40271-SNAPSHOT → 19.4.0-44237-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 (119) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +118 -0
  3. package/RNLuciq.podspec +6 -2
  4. package/android/build.gradle +25 -0
  5. package/android/native.gradle +1 -1
  6. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqAPMModule.java +3 -12
  7. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqBugReportingModule.java +28 -24
  8. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqCrashReportingModule.java +18 -7
  9. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqFeatureRequestsModule.java +1 -2
  10. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqNetworkLoggerModule.java +29 -56
  11. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqReactnativeModule.java +121 -47
  12. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqReactnativePackage.java +2 -0
  13. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqRepliesModule.java +4 -16
  14. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqSessionReplayModule.java +5 -16
  15. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqSurveysModule.java +7 -15
  16. package/android/src/main/java/ai/luciq/reactlibrary/utils/EventEmitterModule.java +0 -7
  17. package/android/src/main/java/ai/luciq/reactlibrary/utils/ReportUtil.java +0 -7
  18. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqAPMBaseSpec.java +9 -0
  19. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqBaseSpec.java +33 -0
  20. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqBugReportingBaseSpec.java +33 -0
  21. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqCrashReportingBaseSpec.java +9 -0
  22. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqFeatureRequestsBaseSpec.java +9 -0
  23. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqNetworkLoggerBaseSpec.java +33 -0
  24. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqRepliesBaseSpec.java +33 -0
  25. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqSessionReplayBaseSpec.java +33 -0
  26. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqSurveysBaseSpec.java +33 -0
  27. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqAPMBaseSpec.java +11 -0
  28. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqBaseSpec.java +22 -0
  29. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqBugReportingBaseSpec.java +22 -0
  30. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqCrashReportingBaseSpec.java +10 -0
  31. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqFeatureRequestsBaseSpec.java +10 -0
  32. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqNetworkLoggerBaseSpec.java +22 -0
  33. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqRepliesBaseSpec.java +22 -0
  34. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqSessionReplayBaseSpec.java +22 -0
  35. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqSurveysBaseSpec.java +22 -0
  36. package/dist/modules/BugReporting.js +3 -3
  37. package/dist/modules/Luciq.d.ts +15 -0
  38. package/dist/modules/Luciq.js +23 -3
  39. package/dist/modules/NetworkLogger.d.ts +5 -0
  40. package/dist/modules/NetworkLogger.js +1 -9
  41. package/dist/modules/Replies.js +1 -1
  42. package/dist/modules/Surveys.js +2 -2
  43. package/dist/native/NativeBugReporting.d.ts +4 -4
  44. package/dist/native/NativeCrashReporting.d.ts +2 -2
  45. package/dist/native/NativeLuciq.d.ts +5 -3
  46. package/dist/native/NativePackage.js +25 -2
  47. package/dist/native/NativeReplies.d.ts +1 -1
  48. package/dist/native/NativeSurveys.d.ts +2 -2
  49. package/dist/native/specs/NativeAPM.d.ts +21 -0
  50. package/dist/native/specs/NativeAPM.js +2 -0
  51. package/dist/native/specs/NativeBugReporting.d.ts +29 -0
  52. package/dist/native/specs/NativeBugReporting.js +2 -0
  53. package/dist/native/specs/NativeCrashReporting.d.ts +12 -0
  54. package/dist/native/specs/NativeCrashReporting.js +2 -0
  55. package/dist/native/specs/NativeFeatureRequests.d.ts +8 -0
  56. package/dist/native/specs/NativeFeatureRequests.js +2 -0
  57. package/dist/native/specs/NativeLuciq.d.ts +80 -0
  58. package/dist/native/specs/NativeLuciq.js +2 -0
  59. package/dist/native/specs/NativeNetworkLogger.d.ts +16 -0
  60. package/dist/native/specs/NativeNetworkLogger.js +2 -0
  61. package/dist/native/specs/NativeReplies.d.ts +21 -0
  62. package/dist/native/specs/NativeReplies.js +2 -0
  63. package/dist/native/specs/NativeSessionReplay.d.ts +17 -0
  64. package/dist/native/specs/NativeSessionReplay.js +2 -0
  65. package/dist/native/specs/NativeSurveys.d.ts +18 -0
  66. package/dist/native/specs/NativeSurveys.js +2 -0
  67. package/dist/utils/Enums.js +3 -1
  68. package/dist/utils/FeatureFlags.d.ts +0 -6
  69. package/dist/utils/FeatureFlags.js +0 -35
  70. package/dist/utils/LuciqUtils.d.ts +1 -1
  71. package/dist/utils/LuciqUtils.js +0 -9
  72. package/dist/utils/XhrNetworkInterceptor.js +53 -85
  73. package/ios/RNLuciq/LuciqAPMBridge.h +5 -5
  74. package/ios/RNLuciq/{LuciqAPMBridge.m → LuciqAPMBridge.mm} +48 -39
  75. package/ios/RNLuciq/LuciqBugReportingBridge.h +6 -6
  76. package/ios/RNLuciq/LuciqBugReportingBridge.mm +234 -0
  77. package/ios/RNLuciq/LuciqCrashReportingBridge.h +16 -5
  78. package/ios/RNLuciq/LuciqCrashReportingBridge.mm +91 -0
  79. package/ios/RNLuciq/LuciqFeatureRequestsBridge.h +1 -1
  80. package/ios/RNLuciq/{LuciqFeatureRequestsBridge.m → LuciqFeatureRequestsBridge.mm} +21 -16
  81. package/ios/RNLuciq/LuciqNetworkLoggerBridge.h +1 -30
  82. package/ios/RNLuciq/{LuciqNetworkLoggerBridge.m → LuciqNetworkLoggerBridge.mm} +46 -77
  83. package/ios/RNLuciq/LuciqReactBridge.h +13 -13
  84. package/ios/RNLuciq/{LuciqReactBridge.m → LuciqReactBridge.mm} +95 -34
  85. package/ios/RNLuciq/LuciqRepliesBridge.h +3 -3
  86. package/ios/RNLuciq/LuciqRepliesBridge.mm +86 -0
  87. package/ios/RNLuciq/LuciqSessionReplayBridge.h +5 -5
  88. package/ios/RNLuciq/{LuciqSessionReplayBridge.m → LuciqSessionReplayBridge.mm} +35 -25
  89. package/ios/RNLuciq/LuciqSurveysBridge.h +5 -5
  90. package/ios/RNLuciq/{LuciqSurveysBridge.m → LuciqSurveysBridge.mm} +34 -35
  91. package/ios/native.rb +1 -1
  92. package/package.json +9 -1
  93. package/src/modules/BugReporting.ts +3 -3
  94. package/src/modules/Luciq.ts +26 -4
  95. package/src/modules/NetworkLogger.ts +1 -26
  96. package/src/modules/Replies.ts +1 -1
  97. package/src/modules/Surveys.ts +2 -2
  98. package/src/native/NativeBugReporting.ts +3 -6
  99. package/src/native/NativeCrashReporting.ts +2 -2
  100. package/src/native/NativeLuciq.ts +7 -3
  101. package/src/native/NativePackage.ts +52 -2
  102. package/src/native/NativeReplies.ts +1 -1
  103. package/src/native/NativeSurveys.ts +2 -2
  104. package/src/native/specs/NativeAPM.ts +47 -0
  105. package/src/native/specs/NativeBugReporting.ts +53 -0
  106. package/src/native/specs/NativeCrashReporting.ts +23 -0
  107. package/src/native/specs/NativeFeatureRequests.ts +10 -0
  108. package/src/native/specs/NativeLuciq.ts +137 -0
  109. package/src/native/specs/NativeNetworkLogger.ts +31 -0
  110. package/src/native/specs/NativeReplies.ts +27 -0
  111. package/src/native/specs/NativeSessionReplay.ts +20 -0
  112. package/src/native/specs/NativeSurveys.ts +23 -0
  113. package/src/utils/Enums.ts +4 -1
  114. package/src/utils/FeatureFlags.ts +0 -44
  115. package/src/utils/LuciqUtils.ts +1 -21
  116. package/src/utils/XhrNetworkInterceptor.ts +55 -128
  117. package/ios/RNLuciq/LuciqBugReportingBridge.m +0 -249
  118. package/ios/RNLuciq/LuciqCrashReportingBridge.m +0 -68
  119. package/ios/RNLuciq/LuciqRepliesBridge.m +0 -80
@@ -19,7 +19,6 @@ import com.facebook.react.bridge.WritableNativeMap;
19
19
  import ai.luciq.apm.InternalAPM;
20
20
  import ai.luciq.apm.sanitization.OnCompleteCallback;
21
21
  import ai.luciq.library.logging.listeners.networklogs.NetworkLogSnapshot;
22
- import ai.luciq.reactlibrary.utils.EventEmitterModule;
23
22
  import ai.luciq.reactlibrary.utils.MainThreadHandler;
24
23
 
25
24
  import org.json.JSONException;
@@ -30,9 +29,7 @@ import java.util.Map;
30
29
  import java.util.concurrent.ConcurrentHashMap;
31
30
 
32
31
 
33
- public class RNLuciqNetworkLoggerModule extends EventEmitterModule {
34
-
35
- private static final String NET_TAG = "LCQ-RN-NET";
32
+ public class RNLuciqNetworkLoggerModule extends RNLuciqNetworkLoggerBaseSpec {
36
33
 
37
34
  public final ConcurrentHashMap<String, OnCompleteCallback<NetworkLogSnapshot>> callbackMap = new ConcurrentHashMap<String, OnCompleteCallback<NetworkLogSnapshot>>();
38
35
 
@@ -48,20 +45,8 @@ public class RNLuciqNetworkLoggerModule extends EventEmitterModule {
48
45
  }
49
46
 
50
47
 
51
- @ReactMethod
52
- public void addListener(String event) {
53
- super.addListener(event);
54
- }
55
-
56
- @ReactMethod
57
- public void removeListeners(Integer count) {
58
- super.removeListeners(count);
59
- }
60
-
61
48
  private boolean getFlagValue(String key) {
62
- boolean value = InternalAPM._isFeatureEnabledCP(key, "");
63
- Log.d(NET_TAG, "[getFlagValue] key=" + key + ", value=" + value);
64
- return value;
49
+ return InternalAPM._isFeatureEnabledCP(key, "");
65
50
  }
66
51
 
67
52
  private WritableMap convertFromMapToWritableMap(Map<String, Object> map) {
@@ -88,24 +73,14 @@ public class RNLuciqNetworkLoggerModule extends EventEmitterModule {
88
73
  /**
89
74
  * Get first time Value of [cp_native_interception_enabled] flag
90
75
  */
91
- @ReactMethod
92
- public void isNativeInterceptionEnabled(Promise promise) {
93
- Log.d(NET_TAG, "[isNativeInterceptionEnabled] Querying CP_NATIVE_INTERCEPTION_ENABLED flag");
94
- MainThreadHandler.runOnMainThread(new Runnable() {
95
- @Override
96
- public void run() {
97
- try {
98
- boolean enabled = getFlagValue(CP_NATIVE_INTERCEPTION_ENABLED);
99
- Log.d(NET_TAG, "[isNativeInterceptionEnabled] Result=" + enabled);
100
- promise.resolve(enabled);
101
- } catch (Exception e) {
102
- Log.e(NET_TAG, "[isNativeInterceptionEnabled] Error — falling back to false (JS interceptor)", e);
103
- e.printStackTrace();
104
- promise.resolve(false);
105
- }
106
-
107
- }
108
- });
76
+ @ReactMethod(isBlockingSynchronousMethod = true)
77
+ public boolean isNativeInterceptionEnabled() {
78
+ try {
79
+ return getFlagValue(CP_NATIVE_INTERCEPTION_ENABLED);
80
+ } catch (Exception e) {
81
+ e.printStackTrace();
82
+ return false; // Will rollback to JS interceptor
83
+ }
109
84
  }
110
85
 
111
86
  /**
@@ -115,18 +90,14 @@ public class RNLuciqNetworkLoggerModule extends EventEmitterModule {
115
90
  */
116
91
  @ReactMethod
117
92
  public void hasAPMNetworkPlugin(Promise promise) {
118
- Log.d(NET_TAG, "[hasAPMNetworkPlugin] Querying APM_NETWORK_PLUGIN_INSTALLED flag");
119
93
  MainThreadHandler.runOnMainThread(new Runnable() {
120
94
  @Override
121
95
  public void run() {
122
96
  try {
123
- boolean hasPlugin = getFlagValue(APM_NETWORK_PLUGIN_INSTALLED);
124
- Log.d(NET_TAG, "[hasAPMNetworkPlugin] Result=" + hasPlugin);
125
- promise.resolve(hasPlugin);
97
+ promise.resolve(getFlagValue(APM_NETWORK_PLUGIN_INSTALLED));
126
98
  } catch (Exception e) {
127
- Log.e(NET_TAG, "[hasAPMNetworkPlugin] Error — falling back to false", e);
128
99
  e.printStackTrace();
129
- promise.resolve(false);
100
+ promise.resolve(false); // Will rollback to JS interceptor
130
101
  }
131
102
 
132
103
  }
@@ -135,15 +106,13 @@ public class RNLuciqNetworkLoggerModule extends EventEmitterModule {
135
106
 
136
107
 
137
108
  @ReactMethod
138
- public void registerNetworkLogsListener() {
139
- Log.d(NET_TAG, "[registerNetworkLogsListener] Registering network log sanitizer");
109
+ public void registerNetworkLogsListener(@androidx.annotation.Nullable String type) {
140
110
  MainThreadHandler.runOnMainThread(new Runnable() {
141
111
  @Override
142
112
  public void run() {
143
113
  InternalAPM._registerNetworkLogSanitizer((networkLogSnapshot, onCompleteCallback) -> {
144
114
  final String id = String.valueOf(onCompleteCallback.hashCode());
145
115
  callbackMap.put(id, onCompleteCallback);
146
- Log.d(NET_TAG, "[NetworkLogSanitizer] Received snapshot — id=" + id + ", url=" + networkLogSnapshot.getUrl() + ", responseCode=" + networkLogSnapshot.getResponseCode() + ", callbackMapSize=" + callbackMap.size());
147
116
 
148
117
  WritableMap networkSnapshotParams = Arguments.createMap();
149
118
  networkSnapshotParams.putString("id", id);
@@ -161,7 +130,6 @@ public class RNLuciqNetworkLoggerModule extends EventEmitterModule {
161
130
  }
162
131
 
163
132
  sendEvent(Constants.LCQ_NETWORK_LOGGER_HANDLER, networkSnapshotParams);
164
- Log.d(NET_TAG, "[NetworkLogSanitizer] Sent event to JS: " + Constants.LCQ_NETWORK_LOGGER_HANDLER + " for " + networkLogSnapshot.getUrl());
165
133
  });
166
134
  }
167
135
  });
@@ -169,12 +137,10 @@ public class RNLuciqNetworkLoggerModule extends EventEmitterModule {
169
137
 
170
138
  @ReactMethod
171
139
  public void resetNetworkLogsListener() {
172
- Log.d(NET_TAG, "[resetNetworkLogsListener] Clearing network log sanitizer, callbackMapSize=" + callbackMap.size());
173
140
  MainThreadHandler.runOnMainThread(new Runnable() {
174
141
  @Override
175
142
  public void run() {
176
143
  InternalAPM._registerNetworkLogSanitizer(null);
177
- Log.d(NET_TAG, "[resetNetworkLogsListener] Sanitizer cleared");
178
144
  }
179
145
  });
180
146
  }
@@ -185,33 +151,40 @@ public class RNLuciqNetworkLoggerModule extends EventEmitterModule {
185
151
  String callbackID,
186
152
  String requestBody,
187
153
  String responseBody,
188
- int responseCode,
154
+ double responseCode,
189
155
  ReadableMap requestHeaders,
190
156
  ReadableMap responseHeaders
191
157
  ) {
192
- Log.d(NET_TAG, "[updateNetworkLogSnapshot] callbackID=" + callbackID + ", url=" + url + ", responseCode=" + responseCode + ", callbackMapSize=" + callbackMap.size());
193
158
  try {
159
+ // Convert ReadableMap to a Java Map for easier handling
194
160
  Map<String, Object> requestHeadersMap = convertReadableMapToMap(requestHeaders);
195
161
  Map<String, Object> responseHeadersMap = convertReadableMapToMap(responseHeaders);
196
162
 
197
163
  NetworkLogSnapshot modifiedSnapshot = null;
198
164
  if (!url.isEmpty()) {
199
- modifiedSnapshot = new NetworkLogSnapshot(url, requestHeadersMap, requestBody, responseHeadersMap, responseBody, responseCode);
200
- } else {
201
- Log.d(NET_TAG, "[updateNetworkLogSnapshot] Empty URL — snapshot will be null (request filtered/removed)");
165
+ modifiedSnapshot = new NetworkLogSnapshot(url, requestHeadersMap, requestBody, responseHeadersMap, responseBody, (int) responseCode);
202
166
  }
203
167
 
204
168
  final OnCompleteCallback<NetworkLogSnapshot> callback = callbackMap.get(callbackID);
205
169
  if (callback != null) {
206
170
  callback.onComplete(modifiedSnapshot);
207
171
  callbackMap.remove(callbackID);
208
- Log.d(NET_TAG, "[updateNetworkLogSnapshot] Callback invoked and removed for " + callbackID + ", remaining=" + callbackMap.size());
209
- } else {
210
- Log.e(NET_TAG, "[updateNetworkLogSnapshot] No callback found for callbackID=" + callbackID + " — possible leak or duplicate call, mapKeys=" + callbackMap.keySet());
211
172
  }
212
173
  } catch (Exception e) {
213
- Log.e(NET_TAG, "[updateNetworkLogSnapshot] Exception processing snapshot: " + e.getMessage() + " for callbackID=" + callbackID, e);
174
+ // Reject the promise to indicate an error occurred
214
175
  Log.e("IB-CP-Bridge", "LuciqNetworkLogger.updateNetworkLogSnapshot failed to parse the network snapshot object.");
215
176
  }
216
177
  }
178
+
179
+ @ReactMethod
180
+ public void setNetworkLoggingRequestFilterPredicateIOS(String id, boolean value) {
181
+ }
182
+
183
+ @ReactMethod
184
+ public void forceStartNetworkLoggingIOS() {
185
+ }
186
+
187
+ @ReactMethod
188
+ public void forceStopNetworkLoggingIOS() {
189
+ }
217
190
  }
@@ -83,10 +83,9 @@ import javax.annotation.Nullable;
83
83
  /**
84
84
  * The type Rn luciq reactnative module.
85
85
  */
86
- public class RNLuciqReactnativeModule extends EventEmitterModule {
86
+ public class RNLuciqReactnativeModule extends RNLuciqBaseSpec {
87
87
 
88
88
  private static final String TAG = "Luciq-RN-Core";
89
- private static final String NET_TAG = "LCQ-RN-NET";
90
89
 
91
90
  private LuciqCustomTextPlaceHolder placeHolders;
92
91
  private static Report currentReport;
@@ -112,16 +111,6 @@ public class RNLuciqReactnativeModule extends EventEmitterModule {
112
111
  }
113
112
 
114
113
 
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
-
125
114
  /**
126
115
  * Enables or disables Luciq functionality.
127
116
  * @param isEnabled A boolean to enable/disable Luciq.
@@ -164,7 +153,6 @@ public class RNLuciqReactnativeModule extends EventEmitterModule {
164
153
 
165
154
 
166
155
  ) {
167
- Log.d(NET_TAG, "[init] Called — logLevel=" + logLevel + ", useNativeNetworkInterception=" + useNativeNetworkInterception + ", codePushVersion=" + codePushVersion + ", appVariant=" + appVariant);
168
156
  MainThreadHandler.runOnMainThread(new Runnable() {
169
157
  @Override
170
158
  public void run() {
@@ -206,7 +194,6 @@ public class RNLuciqReactnativeModule extends EventEmitterModule {
206
194
  }
207
195
 
208
196
  builder.build();
209
- Log.d(NET_TAG, "[init] SDK build complete");
210
197
  }
211
198
  });
212
199
  }
@@ -706,7 +693,7 @@ public class RNLuciqReactnativeModule extends EventEmitterModule {
706
693
  * report.
707
694
  */
708
695
  @ReactMethod
709
- public void setPreSendingHandler(final Callback preSendingHandler) {
696
+ public void setPreSendingHandler() {
710
697
  MainThreadHandler.runOnMainThread(new Runnable() {
711
698
  @Override
712
699
  public void run() {
@@ -972,7 +959,6 @@ public class RNLuciqReactnativeModule extends EventEmitterModule {
972
959
  final String requestHeaders,
973
960
  final String responseHeaders,
974
961
  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));
976
962
  try {
977
963
  final String date = String.valueOf(System.currentTimeMillis());
978
964
 
@@ -989,14 +975,11 @@ public class RNLuciqReactnativeModule extends EventEmitterModule {
989
975
  networkLog.setRequestHeaders(requestHeaders);
990
976
  networkLog.setResponseHeaders(responseHeaders);
991
977
  } catch (OutOfMemoryError | Exception exception) {
992
- Log.e(NET_TAG, "[networkLogAndroid-Core] OOM/Error setting log contents: " + exception.getMessage() + " for " + method + " " + url);
993
978
  Log.d(TAG, "Error: " + exception.getMessage() + "while trying to set network log contents (request body, response body, request headers, and response headers).");
994
979
  }
995
980
 
996
981
  networkLog.insert();
997
- Log.d(NET_TAG, "[networkLogAndroid-Core] Successfully inserted NetworkLog: " + method + " " + url);
998
982
  } catch (OutOfMemoryError | Exception exception) {
999
- Log.e(NET_TAG, "[networkLogAndroid-Core] OOM/Error inserting network log: " + exception.getMessage() + " for " + method + " " + url);
1000
983
  Log.d(TAG, "Error: " + exception.getMessage() + "while trying to insert a network log");
1001
984
  }
1002
985
  }
@@ -1024,12 +1007,14 @@ public class RNLuciqReactnativeModule extends EventEmitterModule {
1024
1007
 
1025
1008
 
1026
1009
  @ReactMethod
1027
- public void addPrivateView(final int reactTag) {
1010
+ public void addPrivateView(@Nullable final Double reactTag) {
1011
+ if (reactTag == null) return;
1012
+ final int tag = reactTag.intValue();
1028
1013
  MainThreadHandler.runOnMainThread(new Runnable() {
1029
1014
  @Override
1030
1015
  public void run() {
1031
1016
  try {
1032
- final View view = resolveReactView(reactTag);
1017
+ final View view = resolveReactView(tag);
1033
1018
 
1034
1019
  if(view !=null){
1035
1020
  Luciq.addPrivateViews(view);
@@ -1042,12 +1027,14 @@ public class RNLuciqReactnativeModule extends EventEmitterModule {
1042
1027
  }
1043
1028
 
1044
1029
  @ReactMethod
1045
- public void removePrivateView(final int reactTag) {
1030
+ public void removePrivateView(@Nullable final Double reactTag) {
1031
+ if (reactTag == null) return;
1032
+ final int tag = reactTag.intValue();
1046
1033
  MainThreadHandler.runOnMainThread(new Runnable() {
1047
1034
  @Override
1048
1035
  public void run() {
1049
1036
  try {
1050
- final View view = resolveReactView(reactTag);
1037
+ final View view = resolveReactView(tag);
1051
1038
  if(view !=null){
1052
1039
 
1053
1040
  Luciq.removePrivateViews(view);
@@ -1177,7 +1164,7 @@ public class RNLuciqReactnativeModule extends EventEmitterModule {
1177
1164
  */
1178
1165
  @ReactMethod
1179
1166
  public void registerFeatureFlagsChangeListener() {
1180
- Log.d(NET_TAG, "[registerFeatureFlagsChangeListener] Registering native feature flags listener");
1167
+
1181
1168
  MainThreadHandler.runOnMainThread(new Runnable() {
1182
1169
  @Override
1183
1170
  public void run() {
@@ -1185,7 +1172,6 @@ public class RNLuciqReactnativeModule extends EventEmitterModule {
1185
1172
  InternalCore.INSTANCE._setFeaturesStateListener(new FeaturesStateListener() {
1186
1173
  @Override
1187
1174
  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());
1189
1175
  WritableMap params = Arguments.createMap();
1190
1176
  params.putBoolean("isW3ExternalTraceIDEnabled", featuresState.isW3CExternalTraceIdEnabled());
1191
1177
  params.putBoolean("isW3ExternalGeneratedHeaderEnabled", featuresState.isAttachingGeneratedHeaderEnabled());
@@ -1193,11 +1179,9 @@ public class RNLuciqReactnativeModule extends EventEmitterModule {
1193
1179
  params.putInt("networkBodyLimit",featuresState.getNetworkLogCharLimit());
1194
1180
 
1195
1181
  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);
1197
1182
  }
1198
1183
  });
1199
1184
  } catch (Exception e) {
1200
- Log.e(NET_TAG, "[registerFeatureFlagsChangeListener] Failed to register listener", e);
1201
1185
  e.printStackTrace();
1202
1186
  }
1203
1187
 
@@ -1212,16 +1196,13 @@ public class RNLuciqReactnativeModule extends EventEmitterModule {
1212
1196
  */
1213
1197
  @ReactMethod
1214
1198
  public void isW3ExternalTraceIDEnabled(Promise promise) {
1215
- Log.d(NET_TAG, "[isW3ExternalTraceIDEnabled] Querying native flag");
1199
+
1216
1200
  MainThreadHandler.runOnMainThread(new Runnable() {
1217
1201
  @Override
1218
1202
  public void run() {
1219
1203
  try {
1220
- boolean enabled = InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_EXTERNAL_TRACE_ID);
1221
- Log.d(NET_TAG, "[isW3ExternalTraceIDEnabled] Result=" + enabled);
1222
- promise.resolve(enabled);
1204
+ promise.resolve(InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_EXTERNAL_TRACE_ID));
1223
1205
  } catch (Exception e) {
1224
- Log.e(NET_TAG, "[isW3ExternalTraceIDEnabled] Error querying flag", e);
1225
1206
  e.printStackTrace();
1226
1207
  promise.resolve(false);
1227
1208
  }
@@ -1237,16 +1218,13 @@ public class RNLuciqReactnativeModule extends EventEmitterModule {
1237
1218
  */
1238
1219
  @ReactMethod
1239
1220
  public void isW3ExternalGeneratedHeaderEnabled(Promise promise) {
1240
- Log.d(NET_TAG, "[isW3ExternalGeneratedHeaderEnabled] Querying native flag");
1221
+
1241
1222
  MainThreadHandler.runOnMainThread(new Runnable() {
1242
1223
  @Override
1243
1224
  public void run() {
1244
1225
  try {
1245
- boolean enabled = InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_ATTACHING_GENERATED_HEADER);
1246
- Log.d(NET_TAG, "[isW3ExternalGeneratedHeaderEnabled] Result=" + enabled);
1247
- promise.resolve(enabled);
1226
+ promise.resolve(InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_ATTACHING_GENERATED_HEADER));
1248
1227
  } catch (Exception e) {
1249
- Log.e(NET_TAG, "[isW3ExternalGeneratedHeaderEnabled] Error querying flag", e);
1250
1228
  e.printStackTrace();
1251
1229
  promise.resolve(false);
1252
1230
  }
@@ -1261,16 +1239,13 @@ public class RNLuciqReactnativeModule extends EventEmitterModule {
1261
1239
  */
1262
1240
  @ReactMethod
1263
1241
  public void isW3CaughtHeaderEnabled(Promise promise) {
1264
- Log.d(NET_TAG, "[isW3CaughtHeaderEnabled] Querying native flag");
1242
+
1265
1243
  MainThreadHandler.runOnMainThread(new Runnable() {
1266
1244
  @Override
1267
1245
  public void run() {
1268
1246
  try {
1269
- boolean enabled = InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_ATTACHING_CAPTURED_HEADER);
1270
- Log.d(NET_TAG, "[isW3CaughtHeaderEnabled] Result=" + enabled);
1271
- promise.resolve(enabled);
1247
+ promise.resolve(InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_ATTACHING_CAPTURED_HEADER));
1272
1248
  } catch (Exception e) {
1273
- Log.e(NET_TAG, "[isW3CaughtHeaderEnabled] Error querying flag", e);
1274
1249
  e.printStackTrace();
1275
1250
  promise.resolve(false);
1276
1251
  }
@@ -1300,6 +1275,15 @@ public class RNLuciqReactnativeModule extends EventEmitterModule {
1300
1275
  return constants;
1301
1276
  }
1302
1277
 
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
+
1303
1287
 
1304
1288
  @ReactMethod
1305
1289
  public void setOnFeaturesUpdatedListener() {
@@ -1364,16 +1348,13 @@ public class RNLuciqReactnativeModule extends EventEmitterModule {
1364
1348
  */
1365
1349
  @ReactMethod
1366
1350
  public void getNetworkBodyMaxSize(Promise promise) {
1367
- Log.d(NET_TAG, "[getNetworkBodyMaxSize] Querying network body size limit");
1351
+
1368
1352
  MainThreadHandler.runOnMainThread(new Runnable() {
1369
1353
  @Override
1370
1354
  public void run() {
1371
1355
  try {
1372
- Object limit = InternalCore.INSTANCE.get_networkLogCharLimit();
1373
- Log.d(NET_TAG, "[getNetworkBodyMaxSize] Result=" + limit);
1374
- promise.resolve(limit);
1356
+ promise.resolve(InternalCore.INSTANCE.get_networkLogCharLimit());
1375
1357
  } catch (Exception e) {
1376
- Log.e(NET_TAG, "[getNetworkBodyMaxSize] Error querying limit", e);
1377
1358
  e.printStackTrace();
1378
1359
  promise.resolve(false);
1379
1360
  }
@@ -1395,6 +1376,49 @@ public class RNLuciqReactnativeModule extends EventEmitterModule {
1395
1376
  e.printStackTrace();
1396
1377
  }
1397
1378
  }
1379
+
1380
+ /**
1381
+ * Enables or disables WebView monitoring.
1382
+ *
1383
+ * @param isEnabled A boolean to enable/disable WebView monitoring.
1384
+ */
1385
+ @ReactMethod
1386
+ public void setWebViewMonitoringEnabled(final boolean isEnabled) {
1387
+ try {
1388
+ Luciq.setWebViewMonitoringEnabled(isEnabled);
1389
+ } catch (Exception e) {
1390
+ e.printStackTrace();
1391
+ }
1392
+ }
1393
+
1394
+ /**
1395
+ * Enables or disables WebView network tracking.
1396
+ *
1397
+ * @param isEnabled A boolean to enable/disable WebView network tracking.
1398
+ */
1399
+ @ReactMethod
1400
+ public void setWebViewNetworkTrackingEnabled(final boolean isEnabled) {
1401
+ try {
1402
+ Luciq.setWebViewNetworkTrackingEnabled(isEnabled);
1403
+ } catch (Exception e) {
1404
+ e.printStackTrace();
1405
+ }
1406
+ }
1407
+
1408
+ /**
1409
+ * Enables or disables WebView user interactions tracking.
1410
+ *
1411
+ * @param isEnabled A boolean to enable/disable WebView user interactions tracking.
1412
+ */
1413
+ @ReactMethod
1414
+ public void setWebViewUserInteractionsTrackingEnabled(final boolean isEnabled) {
1415
+ try {
1416
+ Luciq.setWebViewUserInteractionsTrackingEnabled(isEnabled);
1417
+ } catch (Exception e) {
1418
+ e.printStackTrace();
1419
+ }
1420
+ }
1421
+
1398
1422
  /**
1399
1423
  * Sets the theme for Luciq using a configuration object.
1400
1424
  *
@@ -1650,4 +1674,54 @@ private String getFileName(String path) {
1650
1674
  }
1651
1675
  });
1652
1676
  }
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
+ }
1653
1727
  }
@@ -20,6 +20,8 @@ public class RNLuciqReactnativePackage implements ReactPackage {
20
20
  @NonNull
21
21
  @Override
22
22
  public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {
23
+ RNLuciq.getInstance().setCurrentPlatform();
24
+
23
25
  List<NativeModule> modules = new ArrayList<>();
24
26
  modules.add(new RNLuciqReactnativeModule(reactContext));
25
27
  modules.add(new RNLuciqBugReportingModule(reactContext));
@@ -1,6 +1,5 @@
1
1
  package ai.luciq.reactlibrary;
2
2
 
3
- import com.facebook.react.bridge.Callback;
4
3
  import com.facebook.react.bridge.Promise;
5
4
  import com.facebook.react.bridge.ReactApplicationContext;
6
5
  import com.facebook.react.bridge.ReactMethod;
@@ -9,14 +8,13 @@ import com.facebook.react.bridge.ReadableType;
9
8
  import com.facebook.react.bridge.ReadableMapKeySetIterator;
10
9
  import ai.luciq.chat.Replies;
11
10
  import ai.luciq.library.Feature;
12
- import ai.luciq.reactlibrary.utils.EventEmitterModule;
13
11
  import ai.luciq.reactlibrary.utils.MainThreadHandler;
14
12
 
15
13
  import javax.annotation.Nonnull;
16
14
  import java.util.HashMap;
17
15
  import java.util.Map;
18
16
 
19
- public class RNLuciqRepliesModule extends EventEmitterModule {
17
+ public class RNLuciqRepliesModule extends RNLuciqRepliesBaseSpec {
20
18
 
21
19
  public RNLuciqRepliesModule(ReactApplicationContext reactApplicationContext) {
22
20
  super(reactApplicationContext);
@@ -28,16 +26,6 @@ public class RNLuciqRepliesModule extends EventEmitterModule {
28
26
  return "LCQReplies";
29
27
  }
30
28
 
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
-
41
29
  @ReactMethod
42
30
  public void setEnabled(final boolean isEnabled) {
43
31
  MainThreadHandler.runOnMainThread(new Runnable() {
@@ -222,12 +210,12 @@ public class RNLuciqRepliesModule extends EventEmitterModule {
222
210
  * @param notificationIcon the notification icon resource ID
223
211
  */
224
212
  @ReactMethod
225
- public void setNotificationIcon(final int notificationIcon) {
213
+ public void setNotificationIcon(final double notificationIcon) {
226
214
  MainThreadHandler.runOnMainThread(new Runnable() {
227
215
  @Override
228
216
  public void run() {
229
217
  try {
230
- Replies.setNotificationIcon(notificationIcon);
218
+ Replies.setNotificationIcon((int) notificationIcon);
231
219
  } catch (Exception e) {
232
220
  e.printStackTrace();
233
221
  }
@@ -277,7 +265,7 @@ public class RNLuciqRepliesModule extends EventEmitterModule {
277
265
  }
278
266
 
279
267
  @ReactMethod
280
- public void setOnNewReplyReceivedHandler(final Callback onNewReplyReceivedCallback) {
268
+ public void setOnNewReplyReceivedHandler() {
281
269
  MainThreadHandler.runOnMainThread(new Runnable() {
282
270
  @Override
283
271
  public void run() {
@@ -16,7 +16,6 @@ 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;
20
19
  import ai.luciq.reactlibrary.utils.MainThreadHandler;
21
20
  import android.util.Log;
22
21
  import java.util.ArrayList;
@@ -25,22 +24,12 @@ import java.util.concurrent.CountDownLatch;
25
24
 
26
25
  import javax.annotation.Nonnull;
27
26
 
28
- public class RNLuciqSessionReplayModule extends EventEmitterModule {
27
+ public class RNLuciqSessionReplayModule extends RNLuciqSessionReplayBaseSpec {
29
28
 
30
29
  public RNLuciqSessionReplayModule(ReactApplicationContext reactApplicationContext) {
31
30
  super(reactApplicationContext);
32
31
  }
33
32
 
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
-
44
33
  @Nonnull
45
34
  @Override
46
35
  public String getName() {
@@ -168,7 +157,7 @@ public class RNLuciqSessionReplayModule extends EventEmitterModule {
168
157
  private boolean shouldSync = true;
169
158
  private CountDownLatch latch;
170
159
  @ReactMethod
171
- public void setSyncCallback() {
160
+ public void setSyncCallback(final Promise promise) {
172
161
  MainThreadHandler.runOnMainThread(new Runnable() {
173
162
  @Override
174
163
  public void run() {
@@ -195,7 +184,7 @@ public class RNLuciqSessionReplayModule extends EventEmitterModule {
195
184
  catch(Exception e){
196
185
  e.printStackTrace();
197
186
  }
198
-
187
+ promise.resolve(null);
199
188
  }
200
189
  });
201
190
  }
@@ -248,12 +237,12 @@ public class RNLuciqSessionReplayModule extends EventEmitterModule {
248
237
  }
249
238
 
250
239
  @ReactMethod
251
- public void setScreenshotCaptureInterval(final int intervalMs) {
240
+ public void setScreenshotCaptureInterval(final double intervalMs) {
252
241
  MainThreadHandler.runOnMainThread(new Runnable() {
253
242
  @Override
254
243
  public void run() {
255
244
  try {
256
- SessionReplay.setScreenshotCaptureInterval(intervalMs);
245
+ SessionReplay.setScreenshotCaptureInterval((int) intervalMs);
257
246
  } catch (Exception e) {
258
247
  e.printStackTrace();
259
248
  }