react-native-inapp-inspector 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +10 -24
- package/dist/commonjs/components/ConsoleLogCard.js +5 -5
- package/dist/commonjs/components/EndOfListFooter.js +1 -1
- package/dist/commonjs/components/Inspector/AnalyticsTab.js +19 -71
- package/dist/commonjs/components/Inspector/BundleTab.js +670 -188
- package/dist/commonjs/components/Inspector/ConsoleTab.js +109 -98
- package/dist/commonjs/components/Inspector/CrashTab.js +2 -1
- package/dist/commonjs/components/Inspector/InspectorHeader.js +102 -19
- package/dist/commonjs/components/Inspector/MainScreen.js +147 -17
- package/dist/commonjs/components/Inspector/NetworkTab.js +104 -20
- package/dist/commonjs/components/Inspector/SettingsPanel.js +1111 -1385
- package/dist/commonjs/components/Inspector/TabBar.js +3 -4
- package/dist/commonjs/components/JsonViewer.js +9 -4
- package/dist/commonjs/components/LogCard.js +31 -1
- package/dist/commonjs/components/LogSyntaxHighlighter.d.ts +16 -0
- package/dist/commonjs/components/LogSyntaxHighlighter.js +130 -0
- package/dist/commonjs/components/NetworkIcons.d.ts +2 -0
- package/dist/commonjs/components/NetworkIcons.js +10 -1
- package/dist/commonjs/components/Slider.d.ts +13 -0
- package/dist/commonjs/components/Slider.js +261 -0
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/customHooks/analyticsLogger.js +1 -1
- package/dist/commonjs/customHooks/crashHandler.js +1 -1
- package/dist/commonjs/helpers/index.d.ts +1 -0
- package/dist/commonjs/helpers/index.js +15 -0
- package/dist/commonjs/helpers/searchQueryParser.d.ts +6 -0
- package/dist/commonjs/helpers/searchQueryParser.js +236 -0
- package/dist/commonjs/helpers/settingsStore.js +13 -13
- package/dist/commonjs/index.js +7 -20
- package/dist/commonjs/styles/index.js +35 -35
- package/dist/esm/components/ConsoleLogCard.js +5 -5
- package/dist/esm/components/EndOfListFooter.js +2 -2
- package/dist/esm/components/Inspector/AnalyticsTab.js +21 -73
- package/dist/esm/components/Inspector/BundleTab.js +670 -188
- package/dist/esm/components/Inspector/ConsoleTab.js +110 -99
- package/dist/esm/components/Inspector/CrashTab.js +2 -1
- package/dist/esm/components/Inspector/InspectorHeader.js +103 -20
- package/dist/esm/components/Inspector/MainScreen.js +115 -18
- package/dist/esm/components/Inspector/NetworkTab.js +105 -21
- package/dist/esm/components/Inspector/SettingsPanel.js +1114 -1388
- package/dist/esm/components/Inspector/TabBar.js +4 -5
- package/dist/esm/components/JsonViewer.js +9 -4
- package/dist/esm/components/LogCard.js +32 -2
- package/dist/esm/components/LogSyntaxHighlighter.d.ts +16 -0
- package/dist/esm/components/LogSyntaxHighlighter.js +123 -0
- package/dist/esm/components/NetworkIcons.d.ts +2 -0
- package/dist/esm/components/NetworkIcons.js +7 -0
- package/dist/esm/components/Slider.d.ts +13 -0
- package/dist/esm/components/Slider.js +222 -0
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/customHooks/analyticsLogger.js +1 -1
- package/dist/esm/customHooks/crashHandler.js +1 -1
- package/dist/esm/helpers/index.d.ts +1 -0
- package/dist/esm/helpers/index.js +1 -0
- package/dist/esm/helpers/searchQueryParser.d.ts +6 -0
- package/dist/esm/helpers/searchQueryParser.js +233 -0
- package/dist/esm/helpers/settingsStore.js +13 -13
- package/dist/esm/index.js +8 -21
- package/dist/esm/styles/index.js +35 -35
- package/ios/NetworkInspectorModule.m +81 -41
- package/package.json +1 -1
|
@@ -645,7 +645,6 @@ class InAppInspectorFloatingView(
|
|
|
645
645
|
private var touchDownY = 0f
|
|
646
646
|
private var touchDownTime = 0L
|
|
647
647
|
private var isDragging = false
|
|
648
|
-
private val badgeView: android.view.View
|
|
649
648
|
|
|
650
649
|
init {
|
|
651
650
|
val density = context.resources.displayMetrics.density
|
|
@@ -823,28 +822,10 @@ class InAppInspectorFloatingView(
|
|
|
823
822
|
isFocusable = false
|
|
824
823
|
}
|
|
825
824
|
addView(iconView, LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT))
|
|
826
|
-
|
|
827
|
-
// 3. Status Badge Dot (Top-Right)
|
|
828
|
-
val badgeSize = (10f * density).toInt()
|
|
829
|
-
badgeView = android.view.View(context).apply {
|
|
830
|
-
val badgeDrawable = android.graphics.drawable.GradientDrawable().apply {
|
|
831
|
-
shape = android.graphics.drawable.GradientDrawable.OVAL
|
|
832
|
-
setColor(android.graphics.Color.parseColor("#22C55E"))
|
|
833
|
-
setStroke((1.5f * density).toInt(), android.graphics.Color.parseColor("#0F172A"))
|
|
834
|
-
}
|
|
835
|
-
background = badgeDrawable
|
|
836
|
-
visibility = GONE
|
|
837
|
-
}
|
|
838
|
-
val badgeParams = LayoutParams(badgeSize, badgeSize).apply {
|
|
839
|
-
gravity = android.view.Gravity.TOP or android.view.Gravity.END
|
|
840
|
-
topMargin = (4f * density).toInt()
|
|
841
|
-
rightMargin = (4f * density).toInt()
|
|
842
|
-
}
|
|
843
|
-
addView(badgeView, badgeParams)
|
|
844
825
|
}
|
|
845
826
|
|
|
846
827
|
fun setBadgeVisible(visible: Boolean) {
|
|
847
|
-
|
|
828
|
+
// Active badge dot removed
|
|
848
829
|
}
|
|
849
830
|
|
|
850
831
|
override fun onTouchEvent(event: android.view.MotionEvent): Boolean {
|
|
@@ -867,7 +848,8 @@ class InAppInspectorFloatingView(
|
|
|
867
848
|
val dx = event.rawX - touchDownX
|
|
868
849
|
val dy = event.rawY - touchDownY
|
|
869
850
|
|
|
870
|
-
|
|
851
|
+
val dist = Math.hypot(dx.toDouble(), dy.toDouble())
|
|
852
|
+
if (!isDragging && dist > 16 * density) {
|
|
871
853
|
isDragging = true
|
|
872
854
|
}
|
|
873
855
|
|
|
@@ -882,12 +864,12 @@ class InAppInspectorFloatingView(
|
|
|
882
864
|
}
|
|
883
865
|
return true
|
|
884
866
|
}
|
|
885
|
-
android.view.MotionEvent.ACTION_UP
|
|
886
|
-
animate().scaleX(1.0f).scaleY(1.0f).setDuration(
|
|
867
|
+
android.view.MotionEvent.ACTION_UP -> {
|
|
868
|
+
animate().scaleX(1.0f).scaleY(1.0f).setDuration(100).start()
|
|
887
869
|
val elapsed = System.currentTimeMillis() - touchDownTime
|
|
888
870
|
val totalDist = Math.hypot((event.rawX - touchDownX).toDouble(), (event.rawY - touchDownY).toDouble())
|
|
889
871
|
|
|
890
|
-
if (!isDragging && totalDist <
|
|
872
|
+
if (!isDragging && totalDist < 24 * density && elapsed < 850) {
|
|
891
873
|
onTap()
|
|
892
874
|
} else if (isDragging) {
|
|
893
875
|
// Smooth native snap to nearest horizontal side
|
|
@@ -898,6 +880,10 @@ class InAppInspectorFloatingView(
|
|
|
898
880
|
}
|
|
899
881
|
return true
|
|
900
882
|
}
|
|
883
|
+
android.view.MotionEvent.ACTION_CANCEL -> {
|
|
884
|
+
animate().scaleX(1.0f).scaleY(1.0f).setDuration(100).start()
|
|
885
|
+
return true
|
|
886
|
+
}
|
|
901
887
|
}
|
|
902
888
|
return super.onTouchEvent(event)
|
|
903
889
|
}
|
|
@@ -10,8 +10,8 @@ const react_native_1 = require("react-native");
|
|
|
10
10
|
const AppColors_1 = require("../styles/AppColors");
|
|
11
11
|
const AppFonts_1 = require("../styles/AppFonts");
|
|
12
12
|
const helpers_1 = require("../helpers");
|
|
13
|
-
const HighlightText_1 = __importDefault(require("./HighlightText"));
|
|
14
13
|
const CopyButton_1 = __importDefault(require("./CopyButton"));
|
|
14
|
+
const LogSyntaxHighlighter_1 = __importDefault(require("./LogSyntaxHighlighter"));
|
|
15
15
|
const NetworkIcons_1 = require("./NetworkIcons");
|
|
16
16
|
const InspectorContext_1 = require("./Inspector/InspectorContext");
|
|
17
17
|
const getLogMessageWithBadges = (message, searchStr, textStyle, highlightStyle, numberOfLines) => {
|
|
@@ -79,10 +79,10 @@ const getLogMessageWithBadges = (message, searchStr, textStyle, highlightStyle,
|
|
|
79
79
|
</react_native_1.View>);
|
|
80
80
|
})}
|
|
81
81
|
</react_native_1.View>
|
|
82
|
-
<
|
|
82
|
+
<LogSyntaxHighlighter_1.default text={remainingText} search={searchStr} style={textStyle} numberOfLines={numberOfLines} detectLinks={true}/>
|
|
83
83
|
</react_native_1.View>);
|
|
84
84
|
}
|
|
85
|
-
return (<
|
|
85
|
+
return (<LogSyntaxHighlighter_1.default text={message} search={searchStr} style={textStyle} numberOfLines={numberOfLines} detectLinks={true}/>);
|
|
86
86
|
};
|
|
87
87
|
exports.ConsoleLogCard = react_1.default.memo(function ConsoleLogCard({ item, searchStr = '', }) {
|
|
88
88
|
const { setSelectedLog } = (0, InspectorContext_1.useInspector)();
|
|
@@ -240,10 +240,10 @@ exports.ConsoleLogCard = react_1.default.memo(function ConsoleLogCard({ item, se
|
|
|
240
240
|
{jsonContent ? (<>
|
|
241
241
|
{jsonContent.header ? (getLogMessageWithBadges(jsonContent.header, searchStr, [styles.messageText, { color: AppColors_1.AppColors.primaryBlack }], styles.highlight, 2)) : null}
|
|
242
242
|
{jsonPreview && (<react_native_1.View style={styles.jsonPreviewContainer}>
|
|
243
|
-
<
|
|
243
|
+
<LogSyntaxHighlighter_1.default text={jsonPreview.text} search={searchStr} style={[
|
|
244
244
|
styles.jsonPreviewText,
|
|
245
245
|
{ color: AppColors_1.AppColors.primaryBlack },
|
|
246
|
-
]}
|
|
246
|
+
]} detectLinks={false} numberOfLines={5}/>
|
|
247
247
|
</react_native_1.View>)}
|
|
248
248
|
</>) : (getLogMessageWithBadges(item.message, searchStr, [styles.messageText, { color: AppColors_1.AppColors.primaryBlack }], styles.highlight, 3))}
|
|
249
249
|
</react_native_1.View>
|
|
@@ -40,7 +40,6 @@ const react_1 = __importStar(require("react"));
|
|
|
40
40
|
const react_native_1 = require("react-native");
|
|
41
41
|
const InspectorContext_1 = require("./InspectorContext");
|
|
42
42
|
const AnalyticsEventCard_1 = __importDefault(require("../AnalyticsEventCard"));
|
|
43
|
-
const AnalyticsDetail_1 = __importDefault(require("../AnalyticsDetail"));
|
|
44
43
|
const AnalyticsFilterModal_1 = __importDefault(require("./AnalyticsFilterModal"));
|
|
45
44
|
const EndOfListFooter_1 = __importDefault(require("../EndOfListFooter"));
|
|
46
45
|
const styles_1 = __importDefault(require("../../styles"));
|
|
@@ -161,16 +160,25 @@ const AnalyticsHeader = react_1.default.memo(() => {
|
|
|
161
160
|
return { ...prev, categories: nextCategories };
|
|
162
161
|
});
|
|
163
162
|
};
|
|
164
|
-
// 12-Bucket GA4 Realtime Stacked Histogram & Spline Wave Graph (
|
|
163
|
+
// 12-Bucket GA4 Realtime Stacked Histogram & Spline Wave Graph (60s live rolling stream)
|
|
165
164
|
const BUCKET_COUNT = 12;
|
|
166
165
|
const chartHeight = 64;
|
|
167
166
|
const svgWidth = 320;
|
|
168
167
|
const [selectedBucketIdx, setSelectedBucketIdx] = (0, react_1.useState)(null);
|
|
168
|
+
const [liveTick, setLiveTick] = (0, react_1.useState)(0);
|
|
169
|
+
(0, react_1.useEffect)(() => {
|
|
170
|
+
if (!isTrackingEnabled)
|
|
171
|
+
return;
|
|
172
|
+
const interval = setInterval(() => {
|
|
173
|
+
setLiveTick(t => (t + 1) % 100000);
|
|
174
|
+
}, 1000);
|
|
175
|
+
return () => clearInterval(interval);
|
|
176
|
+
}, [isTrackingEnabled]);
|
|
169
177
|
const histogramData = (0, react_1.useMemo)(() => {
|
|
170
178
|
const buckets = [];
|
|
171
179
|
const now = Date.now();
|
|
172
|
-
const windowMs = 60000; // 60s window
|
|
173
|
-
const bucketDuration = windowMs / BUCKET_COUNT;
|
|
180
|
+
const windowMs = 60000; // 60s live rolling window
|
|
181
|
+
const bucketDuration = windowMs / BUCKET_COUNT; // 5s per bucket
|
|
174
182
|
for (let i = 0; i < BUCKET_COUNT; i++) {
|
|
175
183
|
const bucketAgeSec = Math.round(((BUCKET_COUNT - 1 - i) * bucketDuration) / 1000);
|
|
176
184
|
buckets.push({
|
|
@@ -235,7 +243,7 @@ const AnalyticsHeader = react_1.default.memo(() => {
|
|
|
235
243
|
peakVal,
|
|
236
244
|
eventRate,
|
|
237
245
|
};
|
|
238
|
-
}, [filteredAnalyticsEvents, chartHeight, svgWidth, t]);
|
|
246
|
+
}, [filteredAnalyticsEvents, chartHeight, svgWidth, liveTick, t]);
|
|
239
247
|
const selectedBucket = selectedBucketIdx != null ? histogramData.buckets[selectedBucketIdx] : null;
|
|
240
248
|
return (<react_native_1.View style={styles_1.default.analyticsHeaderCard}>
|
|
241
249
|
{/* ── 1. Top Header Row (GA4 Style) ─────────────────────────────────── */}
|
|
@@ -307,7 +315,7 @@ const AnalyticsHeader = react_1.default.memo(() => {
|
|
|
307
315
|
}}/>)}
|
|
308
316
|
</react_native_1.View>
|
|
309
317
|
|
|
310
|
-
{/* Multi-Select Category Buttons
|
|
318
|
+
{/* Multi-Select Category Buttons */}
|
|
311
319
|
<react_native_1.View style={{
|
|
312
320
|
flexDirection: 'row',
|
|
313
321
|
flexWrap: 'wrap',
|
|
@@ -336,18 +344,6 @@ const AnalyticsHeader = react_1.default.memo(() => {
|
|
|
336
344
|
elevation: 2,
|
|
337
345
|
},
|
|
338
346
|
]}>
|
|
339
|
-
<react_native_1.View style={{
|
|
340
|
-
width: 12,
|
|
341
|
-
height: 12,
|
|
342
|
-
borderRadius: 3,
|
|
343
|
-
borderWidth: 1.2,
|
|
344
|
-
borderColor: isAllSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.indigo400,
|
|
345
|
-
backgroundColor: isAllSelected ? AppColors_1.AppColors.white : 'transparent',
|
|
346
|
-
alignItems: 'center',
|
|
347
|
-
justifyContent: 'center',
|
|
348
|
-
}}>
|
|
349
|
-
{isAllSelected && <NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.indigo600Alt} size={8}/>}
|
|
350
|
-
</react_native_1.View>
|
|
351
347
|
<NetworkIcons_1.LayersIcon color={isAllSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.indigo600Alt} size={11}/>
|
|
352
348
|
<react_native_1.Text style={{
|
|
353
349
|
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
@@ -383,18 +379,6 @@ const AnalyticsHeader = react_1.default.memo(() => {
|
|
|
383
379
|
elevation: 2,
|
|
384
380
|
},
|
|
385
381
|
]}>
|
|
386
|
-
<react_native_1.View style={{
|
|
387
|
-
width: 12,
|
|
388
|
-
height: 12,
|
|
389
|
-
borderRadius: 3,
|
|
390
|
-
borderWidth: 1.2,
|
|
391
|
-
borderColor: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.amber500,
|
|
392
|
-
backgroundColor: isSelected ? AppColors_1.AppColors.white : 'transparent',
|
|
393
|
-
alignItems: 'center',
|
|
394
|
-
justifyContent: 'center',
|
|
395
|
-
}}>
|
|
396
|
-
{isSelected && <NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.amber600} size={8}/>}
|
|
397
|
-
</react_native_1.View>
|
|
398
382
|
<NetworkIcons_1.CartIcon color={isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.amber700} size={11}/>
|
|
399
383
|
<react_native_1.Text style={{
|
|
400
384
|
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
@@ -430,18 +414,6 @@ const AnalyticsHeader = react_1.default.memo(() => {
|
|
|
430
414
|
elevation: 2,
|
|
431
415
|
},
|
|
432
416
|
]}>
|
|
433
|
-
<react_native_1.View style={{
|
|
434
|
-
width: 12,
|
|
435
|
-
height: 12,
|
|
436
|
-
borderRadius: 3,
|
|
437
|
-
borderWidth: 1.2,
|
|
438
|
-
borderColor: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.sky400,
|
|
439
|
-
backgroundColor: isSelected ? AppColors_1.AppColors.white : 'transparent',
|
|
440
|
-
alignItems: 'center',
|
|
441
|
-
justifyContent: 'center',
|
|
442
|
-
}}>
|
|
443
|
-
{isSelected && <NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.sky600} size={8}/>}
|
|
444
|
-
</react_native_1.View>
|
|
445
417
|
<NetworkIcons_1.GlobeIcon color={isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.sky600} size={11}/>
|
|
446
418
|
<react_native_1.Text style={{
|
|
447
419
|
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
@@ -477,18 +449,6 @@ const AnalyticsHeader = react_1.default.memo(() => {
|
|
|
477
449
|
elevation: 2,
|
|
478
450
|
},
|
|
479
451
|
]}>
|
|
480
|
-
<react_native_1.View style={{
|
|
481
|
-
width: 12,
|
|
482
|
-
height: 12,
|
|
483
|
-
borderRadius: 3,
|
|
484
|
-
borderWidth: 1.2,
|
|
485
|
-
borderColor: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple400,
|
|
486
|
-
backgroundColor: isSelected ? AppColors_1.AppColors.white : 'transparent',
|
|
487
|
-
alignItems: 'center',
|
|
488
|
-
justifyContent: 'center',
|
|
489
|
-
}}>
|
|
490
|
-
{isSelected && <NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.violet600} size={8}/>}
|
|
491
|
-
</react_native_1.View>
|
|
492
452
|
<NetworkIcons_1.BoltIcon color={isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple} size={11}/>
|
|
493
453
|
<react_native_1.Text style={{
|
|
494
454
|
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
@@ -524,18 +484,6 @@ const AnalyticsHeader = react_1.default.memo(() => {
|
|
|
524
484
|
elevation: 2,
|
|
525
485
|
},
|
|
526
486
|
]}>
|
|
527
|
-
<react_native_1.View style={{
|
|
528
|
-
width: 12,
|
|
529
|
-
height: 12,
|
|
530
|
-
borderRadius: 3,
|
|
531
|
-
borderWidth: 1.2,
|
|
532
|
-
borderColor: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.pink400,
|
|
533
|
-
backgroundColor: isSelected ? AppColors_1.AppColors.white : 'transparent',
|
|
534
|
-
alignItems: 'center',
|
|
535
|
-
justifyContent: 'center',
|
|
536
|
-
}}>
|
|
537
|
-
{isSelected && <NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.pink600} size={8}/>}
|
|
538
|
-
</react_native_1.View>
|
|
539
487
|
<NetworkIcons_1.SparkleIcon color={isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.brandPurple} size={11}/>
|
|
540
488
|
<react_native_1.Text style={{
|
|
541
489
|
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
@@ -731,7 +679,7 @@ const AnalyticsHeader = react_1.default.memo(() => {
|
|
|
731
679
|
</react_native_1.View>
|
|
732
680
|
</react_native_1.View>)}
|
|
733
681
|
|
|
734
|
-
{/* Timeline Axis Labels */}
|
|
682
|
+
{/* Timeline Axis Labels (60s Realtime Rolling Stream) */}
|
|
735
683
|
<react_native_1.View style={{
|
|
736
684
|
flexDirection: 'row',
|
|
737
685
|
justifyContent: 'space-between',
|
|
@@ -743,21 +691,21 @@ const AnalyticsHeader = react_1.default.memo(() => {
|
|
|
743
691
|
fontSize: 8.5,
|
|
744
692
|
color: AppColors_1.AppColors.grayTextWeak,
|
|
745
693
|
}}>
|
|
746
|
-
|
|
694
|
+
-60s
|
|
747
695
|
</react_native_1.Text>
|
|
748
696
|
<react_native_1.Text style={{
|
|
749
697
|
fontFamily: AppFonts_1.AppFonts.interMedium,
|
|
750
698
|
fontSize: 8.5,
|
|
751
699
|
color: AppColors_1.AppColors.grayTextWeak,
|
|
752
700
|
}}>
|
|
753
|
-
|
|
701
|
+
-40s
|
|
754
702
|
</react_native_1.Text>
|
|
755
703
|
<react_native_1.Text style={{
|
|
756
704
|
fontFamily: AppFonts_1.AppFonts.interMedium,
|
|
757
705
|
fontSize: 8.5,
|
|
758
706
|
color: AppColors_1.AppColors.grayTextWeak,
|
|
759
707
|
}}>
|
|
760
|
-
|
|
708
|
+
-20s
|
|
761
709
|
</react_native_1.Text>
|
|
762
710
|
<react_native_1.Text style={{
|
|
763
711
|
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
@@ -997,7 +945,7 @@ const AnalyticsTab = react_1.default.memo(() => {
|
|
|
997
945
|
<AnalyticsFilterModal_1.default visible={isFilterModalOpen} onClose={() => setIsFilterModalOpen(false)}/>
|
|
998
946
|
|
|
999
947
|
<react_native_1.View style={{ flex: 1 }} onLayout={() => setIsAnalyticsLayoutReady(true)}>
|
|
1000
|
-
{
|
|
948
|
+
{isAnalyticsLayoutReady ? (<react_native_1.FlatList data={filteredAnalyticsEvents} keyExtractor={keyExtractor} ListHeaderComponent={AnalyticsHeader} renderItem={renderItem} initialNumToRender={12} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={true} renderToHardwareTextureAndroid={true} ListEmptyComponent={<react_native_1.View style={styles_1.default.emptyContainer}>
|
|
1001
949
|
<react_native_1.View style={styles_1.default.emptyIconWrap}>
|
|
1002
950
|
<NetworkIcons_1.EmptyRadarIcon color={AppColors_1.AppColors.purple} size={32}/>
|
|
1003
951
|
</react_native_1.View>
|