react-native-inapp-inspector 1.1.24 โ†’ 1.1.26

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 (114) hide show
  1. package/android/build.gradle +36 -0
  2. package/android/src/main/AndroidManifest.xml +3 -0
  3. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.java +114 -0
  4. package/android/src/main/java/com/inappinspector/NetworkInspectorPackage.java +28 -0
  5. package/dist/commonjs/components/AnalyticsEventCard.js +94 -88
  6. package/dist/commonjs/components/ConsoleLogCard.js +49 -25
  7. package/dist/commonjs/components/ErrorBoundary.d.ts +1 -1
  8. package/dist/commonjs/components/ErrorBoundary.js +9 -145
  9. package/dist/commonjs/components/Inspector/AnalyticsFilterModal.d.ts +7 -0
  10. package/dist/commonjs/components/Inspector/AnalyticsFilterModal.js +1002 -0
  11. package/dist/commonjs/components/Inspector/AnalyticsTab.js +637 -10
  12. package/dist/commonjs/components/Inspector/BundleTab.d.ts +1 -1
  13. package/dist/commonjs/components/Inspector/BundleTab.js +826 -406
  14. package/dist/commonjs/components/Inspector/CrashDetail.d.ts +3 -0
  15. package/dist/commonjs/components/Inspector/CrashDetail.js +796 -0
  16. package/dist/commonjs/components/Inspector/CrashFilterModal.d.ts +20 -0
  17. package/dist/commonjs/components/Inspector/CrashFilterModal.js +597 -0
  18. package/dist/commonjs/components/Inspector/CrashTab.d.ts +3 -0
  19. package/dist/commonjs/components/Inspector/CrashTab.js +727 -0
  20. package/dist/commonjs/components/Inspector/InspectorContext.js +6 -1
  21. package/dist/commonjs/components/Inspector/InspectorHeader.js +65 -28
  22. package/dist/commonjs/components/Inspector/LogDetail.js +227 -114
  23. package/dist/commonjs/components/Inspector/MainScreen.js +13 -4
  24. package/dist/commonjs/components/Inspector/NetworkDetail.js +131 -81
  25. package/dist/commonjs/components/Inspector/PerformanceTab.js +20 -10
  26. package/dist/commonjs/components/Inspector/SettingsPanel.js +90 -1
  27. package/dist/commonjs/components/Inspector/TabBar.js +15 -3
  28. package/dist/commonjs/components/NetworkIcons.d.ts +25 -0
  29. package/dist/commonjs/components/NetworkIcons.js +188 -1
  30. package/dist/commonjs/components/SegmentedTabs.js +33 -23
  31. package/dist/commonjs/components/TreeNode.js +13 -12
  32. package/dist/commonjs/constants/version.d.ts +1 -1
  33. package/dist/commonjs/constants/version.js +1 -1
  34. package/dist/commonjs/customHooks/analyticsLogger.js +70 -44
  35. package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +5 -1
  36. package/dist/commonjs/customHooks/bundleAnalyzer.js +497 -126
  37. package/dist/commonjs/customHooks/consoleLogger.d.ts +1 -0
  38. package/dist/commonjs/customHooks/consoleLogger.js +153 -51
  39. package/dist/commonjs/customHooks/crashHandler.d.ts +64 -0
  40. package/dist/commonjs/customHooks/crashHandler.js +681 -0
  41. package/dist/commonjs/customHooks/networkLogger.js +74 -49
  42. package/dist/commonjs/customHooks/performanceTracker.d.ts +8 -0
  43. package/dist/commonjs/customHooks/performanceTracker.js +44 -3
  44. package/dist/commonjs/decorators/index.d.ts +49 -0
  45. package/dist/commonjs/decorators/index.js +142 -0
  46. package/dist/commonjs/helpers/gaAnalyticsRegistry.d.ts +18 -0
  47. package/dist/commonjs/helpers/gaAnalyticsRegistry.js +174 -0
  48. package/dist/commonjs/helpers/index.d.ts +7 -4
  49. package/dist/commonjs/helpers/index.js +102 -64
  50. package/dist/commonjs/i18n/locales/en.json +182 -4
  51. package/dist/commonjs/index.d.ts +6 -0
  52. package/dist/commonjs/index.js +310 -8
  53. package/dist/commonjs/styles/index.d.ts +4 -1
  54. package/dist/commonjs/styles/index.js +22 -19
  55. package/dist/commonjs/types/enums.d.ts +156 -9
  56. package/dist/commonjs/types/enums.js +139 -2
  57. package/dist/commonjs/types/interfaces.d.ts +70 -1
  58. package/dist/esm/components/AnalyticsEventCard.js +95 -89
  59. package/dist/esm/components/ConsoleLogCard.js +49 -25
  60. package/dist/esm/components/ErrorBoundary.d.ts +1 -1
  61. package/dist/esm/components/ErrorBoundary.js +10 -113
  62. package/dist/esm/components/Inspector/AnalyticsFilterModal.d.ts +7 -0
  63. package/dist/esm/components/Inspector/AnalyticsFilterModal.js +964 -0
  64. package/dist/esm/components/Inspector/AnalyticsTab.js +639 -12
  65. package/dist/esm/components/Inspector/BundleTab.d.ts +1 -1
  66. package/dist/esm/components/Inspector/BundleTab.js +827 -407
  67. package/dist/esm/components/Inspector/CrashDetail.d.ts +3 -0
  68. package/dist/esm/components/Inspector/CrashDetail.js +758 -0
  69. package/dist/esm/components/Inspector/CrashFilterModal.d.ts +20 -0
  70. package/dist/esm/components/Inspector/CrashFilterModal.js +557 -0
  71. package/dist/esm/components/Inspector/CrashTab.d.ts +3 -0
  72. package/dist/esm/components/Inspector/CrashTab.js +689 -0
  73. package/dist/esm/components/Inspector/InspectorContext.js +1 -0
  74. package/dist/esm/components/Inspector/InspectorHeader.js +66 -29
  75. package/dist/esm/components/Inspector/LogDetail.js +227 -114
  76. package/dist/esm/components/Inspector/MainScreen.js +14 -5
  77. package/dist/esm/components/Inspector/NetworkDetail.js +132 -49
  78. package/dist/esm/components/Inspector/PerformanceTab.js +20 -10
  79. package/dist/esm/components/Inspector/SettingsPanel.js +91 -2
  80. package/dist/esm/components/Inspector/TabBar.js +16 -4
  81. package/dist/esm/components/NetworkIcons.d.ts +25 -0
  82. package/dist/esm/components/NetworkIcons.js +161 -0
  83. package/dist/esm/components/SegmentedTabs.js +33 -23
  84. package/dist/esm/components/TreeNode.js +13 -12
  85. package/dist/esm/constants/version.d.ts +1 -1
  86. package/dist/esm/constants/version.js +1 -1
  87. package/dist/esm/customHooks/analyticsLogger.js +70 -44
  88. package/dist/esm/customHooks/bundleAnalyzer.d.ts +5 -1
  89. package/dist/esm/customHooks/bundleAnalyzer.js +493 -125
  90. package/dist/esm/customHooks/consoleLogger.d.ts +1 -0
  91. package/dist/esm/customHooks/consoleLogger.js +151 -50
  92. package/dist/esm/customHooks/crashHandler.d.ts +64 -0
  93. package/dist/esm/customHooks/crashHandler.js +659 -0
  94. package/dist/esm/customHooks/networkLogger.js +74 -49
  95. package/dist/esm/customHooks/performanceTracker.d.ts +8 -0
  96. package/dist/esm/customHooks/performanceTracker.js +38 -1
  97. package/dist/esm/decorators/index.d.ts +49 -0
  98. package/dist/esm/decorators/index.js +137 -0
  99. package/dist/esm/helpers/gaAnalyticsRegistry.d.ts +18 -0
  100. package/dist/esm/helpers/gaAnalyticsRegistry.js +169 -0
  101. package/dist/esm/helpers/index.d.ts +7 -4
  102. package/dist/esm/helpers/index.js +100 -63
  103. package/dist/esm/i18n/locales/en.json +182 -4
  104. package/dist/esm/index.d.ts +6 -0
  105. package/dist/esm/index.js +262 -8
  106. package/dist/esm/styles/index.d.ts +4 -1
  107. package/dist/esm/styles/index.js +22 -19
  108. package/dist/esm/types/enums.d.ts +156 -9
  109. package/dist/esm/types/enums.js +138 -3
  110. package/dist/esm/types/interfaces.d.ts +70 -1
  111. package/ios/NetworkInspectorModule.h +6 -0
  112. package/ios/NetworkInspectorModule.m +125 -0
  113. package/package.json +5 -2
  114. package/react-native-inapp-inspector.podspec +18 -0
@@ -0,0 +1,36 @@
1
+ buildscript {
2
+ repositories {
3
+ google()
4
+ mavenCentral()
5
+ }
6
+ dependencies {
7
+ classpath 'com.android.tools.build:gradle:8.0.2'
8
+ }
9
+ }
10
+
11
+ apply plugin: 'com.android.library'
12
+
13
+ android {
14
+ compileSdkVersion 34
15
+
16
+ defaultConfig {
17
+ minSdkVersion 21
18
+ targetSdkVersion 34
19
+ versionCode 1
20
+ versionName "1.1.25"
21
+ }
22
+
23
+ lintOptions {
24
+ abortOnError false
25
+ }
26
+ }
27
+
28
+ repositories {
29
+ google()
30
+ mavenCentral()
31
+ }
32
+
33
+ dependencies {
34
+ //noinspection GradleDynamicVersion
35
+ implementation 'com.facebook.react:react-native:+'
36
+ }
@@ -0,0 +1,3 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
+ package="com.inappinspector">
3
+ </manifest>
@@ -0,0 +1,114 @@
1
+ package com.inappinspector;
2
+
3
+ import android.os.Handler;
4
+ import android.os.Looper;
5
+ import android.util.Log;
6
+
7
+ import androidx.annotation.NonNull;
8
+ import androidx.annotation.Nullable;
9
+
10
+ import com.facebook.react.bridge.Arguments;
11
+ import com.facebook.react.bridge.Promise;
12
+ import com.facebook.react.bridge.ReactApplicationContext;
13
+ import com.facebook.react.bridge.ReactContextBaseJavaModule;
14
+ import com.facebook.react.bridge.ReactMethod;
15
+ import com.facebook.react.bridge.WritableMap;
16
+ import com.facebook.react.modules.core.DeviceEventManagerModule;
17
+
18
+ import java.io.PrintWriter;
19
+ import java.io.StringWriter;
20
+
21
+ public class NetworkInspectorModule extends ReactContextBaseJavaModule {
22
+ private static final String MODULE_NAME = "NetworkInspectorModule";
23
+ private static final String TAG = "NetworkInspector";
24
+ private final ReactApplicationContext reactContext;
25
+ private Thread.UncaughtExceptionHandler defaultHandler;
26
+ private boolean isProtectionEnabled = false;
27
+
28
+ public NetworkInspectorModule(ReactApplicationContext reactContext) {
29
+ super(reactContext);
30
+ this.reactContext = reactContext;
31
+ setupNativeCrashProtection();
32
+ }
33
+
34
+ @NonNull
35
+ @Override
36
+ public String getName() {
37
+ return MODULE_NAME;
38
+ }
39
+
40
+ private void setupNativeCrashProtection() {
41
+ if (isProtectionEnabled) return;
42
+ isProtectionEnabled = true;
43
+
44
+ try {
45
+ defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
46
+ Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
47
+ @Override
48
+ public void uncaughtException(@NonNull Thread thread, @NonNull Throwable throwable) {
49
+ try {
50
+ StringWriter sw = new StringWriter();
51
+ PrintWriter pw = new PrintWriter(sw);
52
+ throwable.printStackTrace(pw);
53
+ String stackTrace = sw.toString();
54
+ String message = throwable.getMessage() != null ? throwable.getMessage() : throwable.toString();
55
+
56
+ Log.e(TAG, "Intercepted Android Native Crash: " + message, throwable);
57
+
58
+ sendCrashEventToJS(message, stackTrace, thread.getName());
59
+ } catch (Exception e) {
60
+ Log.e(TAG, "Failed to dispatch native crash event", e);
61
+ }
62
+
63
+ // Keep main looper processing to prevent instant process exit
64
+ if (Looper.myLooper() != null) {
65
+ while (true) {
66
+ try {
67
+ Looper.loop();
68
+ } catch (Throwable inner) {
69
+ Log.e(TAG, "Caught inner loop exception", inner);
70
+ }
71
+ }
72
+ }
73
+ }
74
+ });
75
+ } catch (Exception e) {
76
+ Log.e(TAG, "Error installing uncaught exception handler", e);
77
+ }
78
+ }
79
+
80
+ private void sendCrashEventToJS(String message, String stackTrace, String threadName) {
81
+ try {
82
+ if (reactContext != null && reactContext.hasActiveReactInstance()) {
83
+ WritableMap params = Arguments.createMap();
84
+ params.putString("platform", "android");
85
+ params.putString("message", message);
86
+ params.putString("stack", stackTrace);
87
+ params.putString("thread", threadName);
88
+ params.putDouble("timestamp", System.currentTimeMillis());
89
+
90
+ reactContext
91
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
92
+ .emit("onNativeCrash", params);
93
+ }
94
+ } catch (Exception e) {
95
+ Log.e(TAG, "Failed to emit onNativeCrash to JS", e);
96
+ }
97
+ }
98
+
99
+ @ReactMethod
100
+ public void enableNativeCrashProtection(Promise promise) {
101
+ setupNativeCrashProtection();
102
+ promise.resolve(true);
103
+ }
104
+
105
+ @ReactMethod
106
+ public void addListener(String eventName) {
107
+ // Required for RN built-in Event Emitter
108
+ }
109
+
110
+ @ReactMethod
111
+ public void removeListeners(double count) {
112
+ // Required for RN built-in Event Emitter
113
+ }
114
+ }
@@ -0,0 +1,28 @@
1
+ package com.inappinspector;
2
+
3
+ import androidx.annotation.NonNull;
4
+
5
+ import com.facebook.react.ReactPackage;
6
+ import com.facebook.react.bridge.NativeModule;
7
+ import com.facebook.react.bridge.ReactApplicationContext;
8
+ import com.facebook.react.uimanager.ViewManager;
9
+
10
+ import java.util.ArrayList;
11
+ import java.util.Collections;
12
+ import java.util.List;
13
+
14
+ public class NetworkInspectorPackage implements ReactPackage {
15
+ @NonNull
16
+ @Override
17
+ public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {
18
+ List<NativeModule> modules = new ArrayList<>();
19
+ modules.add(new NetworkInspectorModule(reactContext));
20
+ return modules;
21
+ }
22
+
23
+ @NonNull
24
+ @Override
25
+ public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext reactContext) {
26
+ return Collections.emptyList();
27
+ }
28
+ }
@@ -53,6 +53,8 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
53
53
  const userPropCount = event.userProperties
54
54
  ? Object.keys(event.userProperties).length
55
55
  : 0;
56
+ const catKey = (0, helpers_1.getEventCategory)(event.name);
57
+ const tagColors = (0, helpers_1.getCategoryColors)(catKey);
56
58
  // Flash animation for newly logged events
57
59
  const flashOpacity = (0, react_1.useRef)(new react_native_1.Animated.Value(isNew ? 1 : 0)).current;
58
60
  (0, react_1.useEffect)(() => {
@@ -65,20 +67,29 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
65
67
  }
66
68
  }, [isNew]);
67
69
  const showGap = msSincePrev != null && msSincePrev >= 2000;
70
+ const categoryLabel = catKey === 'page_view'
71
+ ? t('analytics.pageViewCategory')
72
+ : catKey === 'ecommerce'
73
+ ? t('analytics.ecommerceCategory')
74
+ : catKey === 'system'
75
+ ? t('analytics.systemCategory')
76
+ : t('analytics.customCategory');
68
77
  return (<react_native_1.View style={cardStyles.container}>
69
78
  {/* โ”€โ”€ Gap Indicator โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */}
70
79
  {showGap && (<react_native_1.View style={cardStyles.gapContainer}>
80
+ <react_native_1.View style={cardStyles.gapLine}/>
71
81
  <react_native_1.Text style={[cardStyles.gapText, { color: AppColors_1.AppColors.grayTextWeak }]}>
72
- {(0, helpers_1.formatGap)(msSincePrev)}
82
+ +{(0, helpers_1.formatGap)(msSincePrev)}
73
83
  </react_native_1.Text>
84
+ <react_native_1.View style={cardStyles.gapLine}/>
74
85
  </react_native_1.View>)}
75
86
 
76
87
  {/* โ”€โ”€ Main Card โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */}
77
88
  <TouchableScale_1.default onPress={onPress} style={[
78
89
  cardStyles.modernCard,
79
90
  {
80
- backgroundColor: AppColors_1.AppColors.primaryLight,
81
- borderColor: AppColors_1.AppColors.grayBorderSecondary,
91
+ borderLeftWidth: 3.5,
92
+ borderLeftColor: tagColors.text,
82
93
  },
83
94
  ]}>
84
95
  <react_native_1.Animated.View style={[
@@ -92,37 +103,32 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
92
103
  },
93
104
  ]}/>
94
105
 
95
- {/* Top Row: Event Name & Timestamp */}
106
+ {/* Top Row: Icon Badge, Event Name, Category Badge & Timestamp */}
96
107
  <react_native_1.View style={cardStyles.cardHeader}>
97
- <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
108
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 7, flex: 1 }}>
109
+ {/* Category Icon Badge */}
98
110
  <react_native_1.View style={[
99
- cardStyles.nameBadge,
100
- { backgroundColor: `${color}1A`, borderColor: `${color}30` },
111
+ cardStyles.iconBadge,
112
+ { backgroundColor: tagColors.bg, borderColor: tagColors.border },
101
113
  ]}>
102
- <HighlightText_1.default text={event.name} search={searchStr} style={[cardStyles.eventName, { color: color }]} highlightStyle={cardStyles.highlight}/>
114
+ {catKey === 'ecommerce' ? (<NetworkIcons_1.CartIcon color={tagColors.text} size={12}/>) : catKey === 'page_view' ? (<NetworkIcons_1.GlobeIcon color={tagColors.text} size={12}/>) : catKey === 'system' ? (<NetworkIcons_1.BoltIcon color={tagColors.text} size={12}/>) : (<NetworkIcons_1.SparkleIcon color={tagColors.text} size={12}/>)}
103
115
  </react_native_1.View>
104
116
 
105
- {(() => {
106
- const catKey = (0, helpers_1.getEventCategory)(event.name);
107
- const tagColors = (0, helpers_1.getCategoryColors)(catKey);
108
- const categoryLabel = catKey === 'page_view'
109
- ? t('analytics.pageViewCategory')
110
- : catKey === 'ecommerce'
111
- ? t('analytics.ecommerceCategory')
112
- : catKey === 'system'
113
- ? t('analytics.systemCategory')
114
- : t('analytics.customCategory');
115
- return (<react_native_1.View style={[
116
- cardStyles.categoryBadge,
117
- { backgroundColor: tagColors.bg, borderColor: tagColors.border },
118
- ]}>
119
- <react_native_1.Text style={[cardStyles.categoryText, { color: tagColors.text }]}>
120
- {categoryLabel}
121
- </react_native_1.Text>
122
- </react_native_1.View>);
123
- })()}
117
+ {/* Event Name */}
118
+ <HighlightText_1.default text={event.name} search={searchStr} style={[cardStyles.eventName, { color: AppColors_1.AppColors.primaryBlack }]} highlightStyle={cardStyles.highlight} numberOfLines={1}/>
119
+
120
+ {/* Category Pill Tag */}
121
+ <react_native_1.View style={[
122
+ cardStyles.categoryBadge,
123
+ { backgroundColor: tagColors.bg, borderColor: tagColors.border },
124
+ ]}>
125
+ <react_native_1.Text style={[cardStyles.categoryText, { color: tagColors.text }]}>
126
+ {categoryLabel}
127
+ </react_native_1.Text>
128
+ </react_native_1.View>
124
129
 
125
- {event.count !== undefined ? (<react_native_1.View style={[
130
+ {/* Duplicate Multiplier */}
131
+ {event.count !== undefined && event.count > 0 ? (<react_native_1.View style={[
126
132
  cardStyles.duplicateBadge,
127
133
  event.count === 1 && {
128
134
  backgroundColor: AppColors_1.AppColors.grayBackground,
@@ -134,16 +140,20 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
134
140
  event.count === 1 && { color: AppColors_1.AppColors.grayTextStrong },
135
141
  ]}>
136
142
  {event.count}ร—
137
- {event.count > 1 ? ` ${t('analytics.duplicate')}` : ''}
138
143
  </react_native_1.Text>
139
144
  </react_native_1.View>) : null}
140
145
  </react_native_1.View>
141
- <react_native_1.Text style={[cardStyles.timestamp, { color: AppColors_1.AppColors.grayTextWeak }]}>
142
- {(0, helpers_1.formatTime)(event.timestamp)}
143
- </react_native_1.Text>
146
+
147
+ {/* Timestamp */}
148
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 3 }}>
149
+ <NetworkIcons_1.ClockIcon color={AppColors_1.AppColors.grayTextWeak} size={10}/>
150
+ <react_native_1.Text style={[cardStyles.timestamp, { color: AppColors_1.AppColors.grayTextWeak }]}>
151
+ {(0, helpers_1.formatTime)(event.timestamp)}
152
+ </react_native_1.Text>
153
+ </react_native_1.View>
144
154
  </react_native_1.View>
145
155
 
146
- {/* Bottom Row: Metadata Chips & Sparkline */}
156
+ {/* Bottom Row: Metadata Chips (Screen, Params, Value) */}
147
157
  <react_native_1.View style={cardStyles.cardBody}>
148
158
  <react_native_1.View style={cardStyles.chipsRow}>
149
159
  {(() => {
@@ -160,12 +170,12 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
160
170
  return (<react_native_1.View style={[
161
171
  cardStyles.chip,
162
172
  {
163
- backgroundColor: AppColors_1.AppColors.grayBackground,
164
- borderColor: AppColors_1.AppColors.grayBorderSecondary,
173
+ backgroundColor: `${AppColors_1.AppColors.amber500}12`,
174
+ borderColor: `${AppColors_1.AppColors.amber500}2E`,
165
175
  },
166
176
  ]}>
167
- <react_native_1.View style={[cardStyles.screenDot, { backgroundColor: color }]}/>
168
- <react_native_1.Text style={[cardStyles.chipText, { color: AppColors_1.AppColors.grayText }]} numberOfLines={1}>
177
+ <react_native_1.View style={[cardStyles.screenDot, { backgroundColor: AppColors_1.AppColors.amber500 }]}/>
178
+ <react_native_1.Text style={[cardStyles.chipText, { color: AppColors_1.AppColors.amber700, fontFamily: AppFonts_1.AppFonts.interBold }]} numberOfLines={1}>
169
179
  {screenNameStr}
170
180
  </react_native_1.Text>
171
181
  </react_native_1.View>);
@@ -186,11 +196,11 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
186
196
  {userPropCount > 0 && (<react_native_1.View style={[
187
197
  cardStyles.chip,
188
198
  {
189
- backgroundColor: AppColors_1.AppColors.grayBackground,
190
- borderColor: AppColors_1.AppColors.grayBorderSecondary,
199
+ backgroundColor: `${AppColors_1.AppColors.brandPurple}10`,
200
+ borderColor: `${AppColors_1.AppColors.brandPurple}25`,
191
201
  },
192
202
  ]}>
193
- <react_native_1.Text style={[cardStyles.chipText, { color: AppColors_1.AppColors.grayText }]}>
203
+ <react_native_1.Text style={[cardStyles.chipText, { color: AppColors_1.AppColors.brandPurple, fontFamily: AppFonts_1.AppFonts.interBold }]}>
194
204
  โ˜… {userPropCount} {t('analytics.props')}
195
205
  </react_native_1.Text>
196
206
  </react_native_1.View>)}
@@ -205,7 +215,7 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
205
215
  borderColor: AppColors_1.AppColors.amberBorder,
206
216
  },
207
217
  ]}>
208
- <NetworkIcons_1.CartIcon color={AppColors_1.AppColors.amber700} size={12}/>
218
+ <NetworkIcons_1.CartIcon color={AppColors_1.AppColors.amber700} size={11}/>
209
219
  <react_native_1.Text style={[
210
220
  cardStyles.chipText,
211
221
  {
@@ -227,18 +237,18 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
227
237
  const val = event.params?.value ?? event.params?.price;
228
238
  const currency = event.params?.currency ?? '';
229
239
  const isPrimitive = typeof val === 'string' || typeof val === 'number';
230
- if (isPrimitive) {
231
- const currencyStr = typeof currency === 'string' || typeof currency === 'number'
232
- ? String(currency)
240
+ if (val != null && isPrimitive && String(val).trim() !== '') {
241
+ const currencyStr = typeof currency === 'string' && currency.trim() !== ''
242
+ ? currency.toUpperCase()
233
243
  : '';
234
244
  return (<react_native_1.View style={[
235
245
  cardStyles.chip,
236
246
  {
237
- backgroundColor: AppColors_1.AppColors.emeraldBg,
238
- borderColor: AppColors_1.AppColors.emeraldBorder,
247
+ backgroundColor: `${AppColors_1.AppColors.emerald500}15`,
248
+ borderColor: `${AppColors_1.AppColors.emerald500}35`,
239
249
  },
240
250
  ]}>
241
- <NetworkIcons_1.MoneyIcon color={AppColors_1.AppColors.emerald600} size={12}/>
251
+ <NetworkIcons_1.MoneyIcon color={AppColors_1.AppColors.emerald600} size={11}/>
242
252
  <react_native_1.Text style={[
243
253
  cardStyles.chipText,
244
254
  {
@@ -260,52 +270,63 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
260
270
  // โ”€โ”€โ”€ Styles โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
261
271
  const cardStyles = react_native_1.StyleSheet.create({
262
272
  container: {
263
- paddingHorizontal: 12,
273
+ paddingHorizontal: 10,
264
274
  paddingVertical: 3,
265
275
  },
266
276
  gapContainer: {
277
+ flexDirection: 'row',
267
278
  alignItems: 'center',
268
- marginVertical: 4,
279
+ justifyContent: 'center',
280
+ marginVertical: 6,
281
+ gap: 8,
282
+ },
283
+ gapLine: {
284
+ flex: 1,
285
+ height: 1,
286
+ backgroundColor: `${AppColors_1.AppColors.dividerColor}`,
269
287
  },
270
288
  gapText: {
271
- fontFamily: AppFonts_1.AppFonts.interMedium,
272
- fontSize: 10,
289
+ fontFamily: AppFonts_1.AppFonts.interBold,
290
+ fontSize: 9.5,
273
291
  color: AppColors_1.AppColors.grayTextWeak,
274
292
  letterSpacing: 0.5,
275
293
  },
276
294
  modernCard: {
277
295
  backgroundColor: AppColors_1.AppColors.white,
278
- borderRadius: 8,
296
+ borderRadius: 10,
279
297
  borderWidth: 1,
280
298
  borderColor: AppColors_1.AppColors.dividerColor,
281
- padding: 8,
299
+ padding: 10,
282
300
  shadowColor: AppColors_1.AppColors.black,
283
301
  shadowOpacity: 0.03,
284
302
  shadowRadius: 3,
285
303
  shadowOffset: { width: 0, height: 1 },
286
304
  elevation: 1,
287
305
  overflow: 'hidden',
306
+ gap: 8,
288
307
  },
289
308
  cardHeader: {
290
309
  flexDirection: 'row',
291
310
  justifyContent: 'space-between',
292
311
  alignItems: 'center',
293
- marginBottom: 6,
294
312
  },
295
- nameBadge: {
296
- paddingHorizontal: 6,
297
- paddingVertical: 2.5,
313
+ iconBadge: {
314
+ width: 22,
315
+ height: 22,
298
316
  borderRadius: 6,
299
317
  borderWidth: 1,
318
+ alignItems: 'center',
319
+ justifyContent: 'center',
300
320
  },
301
321
  eventName: {
302
322
  fontFamily: AppFonts_1.AppFonts.interBold,
303
- fontSize: 12,
304
- letterSpacing: 0.2,
323
+ fontSize: 13,
324
+ letterSpacing: 0.1,
325
+ color: AppColors_1.AppColors.primaryBlack,
305
326
  },
306
327
  timestamp: {
307
328
  fontFamily: AppFonts_1.AppFonts.interMedium,
308
- fontSize: 11,
329
+ fontSize: 10,
309
330
  color: AppColors_1.AppColors.grayTextWeak,
310
331
  },
311
332
  highlight: {
@@ -315,25 +336,24 @@ const cardStyles = react_native_1.StyleSheet.create({
315
336
  },
316
337
  cardBody: {
317
338
  flexDirection: 'row',
318
- alignItems: 'flex-end',
339
+ alignItems: 'center',
319
340
  justifyContent: 'space-between',
320
341
  },
321
342
  chipsRow: {
322
343
  flexDirection: 'row',
323
344
  alignItems: 'center',
324
345
  flexWrap: 'wrap',
325
- gap: 8,
346
+ gap: 6,
326
347
  flex: 1,
327
348
  },
328
349
  chip: {
329
350
  flexDirection: 'row',
330
351
  alignItems: 'center',
331
- backgroundColor: AppColors_1.AppColors.grayBackground,
332
- paddingHorizontal: 5,
333
- paddingVertical: 2,
334
- borderRadius: 4,
352
+ paddingHorizontal: 6,
353
+ paddingVertical: 2.5,
354
+ borderRadius: 5,
335
355
  borderWidth: 1,
336
- borderColor: AppColors_1.AppColors.grayBorderSecondary,
356
+ gap: 3.5,
337
357
  },
338
358
  chipText: {
339
359
  fontFamily: AppFonts_1.AppFonts.interMedium,
@@ -341,17 +361,16 @@ const cardStyles = react_native_1.StyleSheet.create({
341
361
  color: AppColors_1.AppColors.grayText,
342
362
  },
343
363
  screenDot: {
344
- width: 6,
345
- height: 6,
346
- borderRadius: 3,
347
- marginRight: 4,
364
+ width: 5,
365
+ height: 5,
366
+ borderRadius: 2.5,
348
367
  },
349
368
  duplicateBadge: {
350
369
  backgroundColor: AppColors_1.AppColors.roseBg,
351
370
  borderColor: AppColors_1.AppColors.roseBorder,
352
371
  borderWidth: 1,
353
372
  paddingHorizontal: 5,
354
- paddingVertical: 2,
373
+ paddingVertical: 1.5,
355
374
  borderRadius: 4,
356
375
  },
357
376
  duplicateText: {
@@ -359,31 +378,18 @@ const cardStyles = react_native_1.StyleSheet.create({
359
378
  fontSize: 9,
360
379
  color: AppColors_1.AppColors.rose600,
361
380
  textTransform: 'uppercase',
362
- letterSpacing: 0.5,
363
381
  },
364
382
  categoryBadge: {
365
383
  borderWidth: 1,
366
384
  paddingHorizontal: 5,
367
- paddingVertical: 2,
385
+ paddingVertical: 1.5,
368
386
  borderRadius: 4,
369
387
  },
370
388
  categoryText: {
371
389
  fontFamily: AppFonts_1.AppFonts.interBold,
372
- fontSize: 9,
390
+ fontSize: 8.5,
373
391
  textTransform: 'uppercase',
374
- letterSpacing: 0.5,
375
- },
376
- miniGraphWrapper: {
377
- flexDirection: 'row',
378
- alignItems: 'flex-end',
379
- height: 18,
380
- gap: 2,
381
- marginLeft: 12,
382
- },
383
- miniGraphBar: {
384
- width: 4,
385
- borderRadius: 2,
386
- opacity: 0.7,
392
+ letterSpacing: 0.4,
387
393
  },
388
394
  });
389
395
  exports.default = AnalyticsEventCard;
@@ -23,36 +23,57 @@ const getLogMessageWithBadges = (message, searchStr, textStyle, highlightStyle,
23
23
  const fullPrefix = match[1];
24
24
  const remainingText = message.substring(fullPrefix.length);
25
25
  const tags = fullPrefix.match(/\[[^\]]+\]/g) || [];
26
- const getTagColor = (tag) => {
27
- const cleanTag = tag
28
- .replace(/[\[\]]/g, '')
29
- .trim()
30
- .toUpperCase();
31
- if (cleanTag === 'API')
32
- return AppColors_1.AppColors.sky600;
33
- if (cleanTag === 'TEST')
34
- return AppColors_1.AppColors.green600;
35
- if (cleanTag === 'APP')
36
- return AppColors_1.AppColors.indigo600;
37
- if (cleanTag === 'WARN')
38
- return AppColors_1.AppColors.darkOrange || AppColors_1.AppColors.lightOrange;
39
- if (cleanTag === 'ERROR')
40
- return AppColors_1.AppColors.errorColor;
41
- return AppColors_1.AppColors.slate600;
26
+ const getTagDecorator = (tag) => {
27
+ const clean = tag.replace(/[\[\]]/g, '').trim().toUpperCase();
28
+ if (clean === 'AXIOS') {
29
+ return { color: '#059669', icon: 'โšก', label: 'AXIOS' };
30
+ }
31
+ if (clean === 'API' || clean === 'FETCH' || clean === 'HTTP' || clean === 'NETWORK') {
32
+ return { color: '#0284C7', icon: '๐ŸŒ', label: clean };
33
+ }
34
+ if (clean === 'SAMPLE' || clean === 'BATCH') {
35
+ return { color: '#4F46E5', icon: '๐ŸŽฒ', label: clean };
36
+ }
37
+ if (clean === 'REDUX' || clean === 'STORE' || clean === 'STATE') {
38
+ return { color: '#7C3AED', icon: 'โš›๏ธ', label: clean };
39
+ }
40
+ if (clean === 'ANALYTICS' || clean === 'FIREBASE' || clean === 'GA4' || clean === 'GA') {
41
+ return { color: '#0D9488', icon: '๐Ÿ“Š', label: clean };
42
+ }
43
+ if (clean === 'AUTH' || clean === 'TOKEN' || clean === 'SESSION') {
44
+ return { color: '#D97706', icon: '๐Ÿ”‘', label: clean };
45
+ }
46
+ if (clean === 'APP') {
47
+ return { color: '#4F46E5', icon: '๐Ÿ“ฑ', label: 'APP' };
48
+ }
49
+ if (clean === 'TEST') {
50
+ return { color: '#10B981', icon: '๐Ÿงช', label: 'TEST' };
51
+ }
52
+ if (clean === 'WARN' || clean === 'WARNING') {
53
+ return { color: '#D97706', icon: 'โš ๏ธ', label: 'WARN' };
54
+ }
55
+ if (clean === 'ERROR' || clean === 'CRASH' || clean === 'BUG') {
56
+ return { color: '#DC2626', icon: '๐Ÿ’ฅ', label: 'ERROR' };
57
+ }
58
+ if (clean === 'PERF' || clean === 'RENDER') {
59
+ return { color: '#8B5CF6', icon: 'โšก', label: clean };
60
+ }
61
+ return { color: AppColors_1.AppColors.slate600, icon: '๐Ÿท๏ธ', label: clean };
42
62
  };
43
63
  return (<react_native_1.View style={{ flexDirection: 'column', gap: 6 }}>
44
- <react_native_1.View style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 4 }}>
64
+ <react_native_1.View style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 5 }}>
45
65
  {tags.map((tag, i) => {
46
- const color = getTagColor(tag);
66
+ const dec = getTagDecorator(tag);
47
67
  return (<react_native_1.View key={i} style={[
48
68
  styles.prefixTag,
49
69
  {
50
- backgroundColor: `${color}15`,
51
- borderColor: `${color}35`,
70
+ backgroundColor: `${dec.color}15`,
71
+ borderColor: `${dec.color}35`,
52
72
  },
53
73
  ]}>
54
- <react_native_1.Text style={[styles.prefixTagText, { color }]}>
55
- {tag.replace(/[\[\]]/g, '')}
74
+ <react_native_1.Text style={{ fontSize: 9.5 }}>{dec.icon}</react_native_1.Text>
75
+ <react_native_1.Text style={[styles.prefixTagText, { color: dec.color }]}>
76
+ {dec.label}
56
77
  </react_native_1.Text>
57
78
  </react_native_1.View>);
58
79
  })}
@@ -416,9 +437,12 @@ const styles = react_native_1.StyleSheet.create({
416
437
  fontSize: 9,
417
438
  },
418
439
  prefixTag: {
419
- paddingHorizontal: 6,
420
- paddingVertical: 1.5,
421
- borderRadius: 4,
440
+ flexDirection: 'row',
441
+ alignItems: 'center',
442
+ gap: 3.5,
443
+ paddingHorizontal: 6.5,
444
+ paddingVertical: 2,
445
+ borderRadius: 5,
422
446
  borderWidth: 1,
423
447
  },
424
448
  prefixTagText: {
@@ -6,6 +6,6 @@ export declare class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBo
6
6
  componentDidCatch(error: Error, errorInfo: ErrorInfo): void;
7
7
  private handleReset;
8
8
  private handleCopyTrace;
9
- render(): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode>> | React.JSX.Element;
9
+ render(): React.ReactNode;
10
10
  }
11
11
  export default ErrorBoundary;