react-native-inapp-inspector 2.3.14 → 2.3.16

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 (125) hide show
  1. package/README.md +1 -0
  2. package/dist/commonjs/components/AnimatedEntrance.js +3 -3
  3. package/dist/commonjs/components/ConsoleLogCard.js +174 -100
  4. package/dist/commonjs/components/Inspector/AnalyticsTab.js +0 -22
  5. package/dist/commonjs/components/Inspector/ConsoleTab.js +25 -38
  6. package/dist/commonjs/components/Inspector/CrashTab.js +19 -28
  7. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +198 -98
  8. package/dist/commonjs/components/Inspector/FeedbackModal.d.ts +7 -0
  9. package/dist/commonjs/components/Inspector/FeedbackModal.js +552 -0
  10. package/dist/commonjs/components/Inspector/InspectorHeader.js +58 -6
  11. package/dist/commonjs/components/Inspector/MainScreen.js +100 -58
  12. package/dist/commonjs/components/Inspector/NetworkTab.js +26 -371
  13. package/dist/commonjs/components/Inspector/NpmStarPrompt.d.ts +3 -0
  14. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +494 -0
  15. package/dist/commonjs/components/Inspector/PerformanceTab.js +40 -7
  16. package/dist/commonjs/components/Inspector/ReduxTab.js +3 -23
  17. package/dist/commonjs/components/Inspector/SettingsPanel.js +1035 -173
  18. package/dist/commonjs/components/Inspector/StorageTab.js +23 -28
  19. package/dist/commonjs/components/Inspector/TabBar.js +50 -15
  20. package/dist/commonjs/components/JsonViewer.js +14 -2
  21. package/dist/commonjs/components/LogCard.js +428 -227
  22. package/dist/commonjs/components/NetworkIcons.d.ts +5 -0
  23. package/dist/commonjs/components/NetworkIcons.js +33 -2
  24. package/dist/commonjs/constants/version.d.ts +1 -1
  25. package/dist/commonjs/constants/version.js +1 -1
  26. package/dist/commonjs/customHooks/analyticsLogger.js +1 -1
  27. package/dist/commonjs/customHooks/consoleLogger.js +34 -2
  28. package/dist/commonjs/customHooks/crashHandler.js +1 -1
  29. package/dist/commonjs/customHooks/networkLogger.js +184 -26
  30. package/dist/commonjs/helpers/index.d.ts +1 -0
  31. package/dist/commonjs/helpers/index.js +1 -0
  32. package/dist/commonjs/helpers/remoteConfig.d.ts +4 -0
  33. package/dist/commonjs/helpers/remoteConfig.js +165 -0
  34. package/dist/commonjs/helpers/searchQueryParser.d.ts +1 -1
  35. package/dist/commonjs/helpers/searchQueryParser.js +39 -291
  36. package/dist/commonjs/helpers/telemetry.d.ts +5 -0
  37. package/dist/commonjs/helpers/telemetry.js +339 -8
  38. package/dist/commonjs/index.d.ts +1 -0
  39. package/dist/commonjs/index.js +173 -29
  40. package/dist/commonjs/styles/AppFonts.d.ts +2 -0
  41. package/dist/commonjs/styles/AppFonts.js +1 -0
  42. package/dist/commonjs/styles/index.d.ts +22 -0
  43. package/dist/commonjs/styles/index.js +19 -0
  44. package/dist/commonjs/types/enums.d.ts +1 -0
  45. package/dist/commonjs/types/enums.js +1 -0
  46. package/dist/commonjs/types/interfaces.d.ts +12 -0
  47. package/dist/esm/components/AnimatedEntrance.js +3 -3
  48. package/dist/esm/components/ConsoleLogCard.js +141 -100
  49. package/dist/esm/components/Inspector/AnalyticsTab.js +1 -23
  50. package/dist/esm/components/Inspector/ConsoleTab.js +26 -39
  51. package/dist/esm/components/Inspector/CrashTab.js +20 -29
  52. package/dist/esm/components/Inspector/DeviceInfoTab.js +198 -98
  53. package/dist/esm/components/Inspector/FeedbackModal.d.ts +7 -0
  54. package/dist/esm/components/Inspector/FeedbackModal.js +515 -0
  55. package/dist/esm/components/Inspector/InspectorHeader.js +60 -8
  56. package/dist/esm/components/Inspector/MainScreen.js +101 -59
  57. package/dist/esm/components/Inspector/NetworkTab.js +27 -372
  58. package/dist/esm/components/Inspector/NpmStarPrompt.d.ts +3 -0
  59. package/dist/esm/components/Inspector/NpmStarPrompt.js +454 -0
  60. package/dist/esm/components/Inspector/PerformanceTab.js +40 -7
  61. package/dist/esm/components/Inspector/ReduxTab.js +4 -24
  62. package/dist/esm/components/Inspector/SettingsPanel.js +1038 -176
  63. package/dist/esm/components/Inspector/StorageTab.js +23 -28
  64. package/dist/esm/components/Inspector/TabBar.js +50 -15
  65. package/dist/esm/components/JsonViewer.js +14 -2
  66. package/dist/esm/components/LogCard.js +422 -221
  67. package/dist/esm/components/NetworkIcons.d.ts +5 -0
  68. package/dist/esm/components/NetworkIcons.js +26 -0
  69. package/dist/esm/constants/version.d.ts +1 -1
  70. package/dist/esm/constants/version.js +1 -1
  71. package/dist/esm/customHooks/analyticsLogger.js +1 -1
  72. package/dist/esm/customHooks/consoleLogger.js +34 -2
  73. package/dist/esm/customHooks/crashHandler.js +1 -1
  74. package/dist/esm/customHooks/networkLogger.js +184 -26
  75. package/dist/esm/helpers/index.d.ts +1 -0
  76. package/dist/esm/helpers/index.js +1 -0
  77. package/dist/esm/helpers/remoteConfig.d.ts +4 -0
  78. package/dist/esm/helpers/remoteConfig.js +160 -0
  79. package/dist/esm/helpers/searchQueryParser.d.ts +1 -1
  80. package/dist/esm/helpers/searchQueryParser.js +39 -291
  81. package/dist/esm/helpers/telemetry.d.ts +5 -0
  82. package/dist/esm/helpers/telemetry.js +332 -9
  83. package/dist/esm/index.d.ts +1 -0
  84. package/dist/esm/index.js +171 -29
  85. package/dist/esm/styles/AppFonts.d.ts +2 -0
  86. package/dist/esm/styles/AppFonts.js +1 -0
  87. package/dist/esm/styles/index.d.ts +22 -0
  88. package/dist/esm/styles/index.js +19 -0
  89. package/dist/esm/types/enums.d.ts +1 -0
  90. package/dist/esm/types/enums.js +1 -0
  91. package/dist/esm/types/interfaces.d.ts +12 -0
  92. package/package.json +1 -1
  93. package/src/components/AnimatedEntrance.tsx +3 -3
  94. package/src/components/ConsoleLogCard.tsx +154 -103
  95. package/src/components/Inspector/AnalyticsTab.tsx +0 -23
  96. package/src/components/Inspector/ConsoleTab.tsx +27 -41
  97. package/src/components/Inspector/CrashTab.tsx +19 -28
  98. package/src/components/Inspector/DeviceInfoTab.tsx +224 -102
  99. package/src/components/Inspector/FeedbackModal.tsx +626 -0
  100. package/src/components/Inspector/InspectorHeader.tsx +83 -5
  101. package/src/components/Inspector/MainScreen.tsx +61 -6
  102. package/src/components/Inspector/NetworkTab.tsx +70 -480
  103. package/src/components/Inspector/NpmStarPrompt.tsx +532 -0
  104. package/src/components/Inspector/PerformanceTab.tsx +44 -8
  105. package/src/components/Inspector/ReduxTab.tsx +9 -24
  106. package/src/components/Inspector/SettingsPanel.tsx +1162 -197
  107. package/src/components/Inspector/StorageTab.tsx +27 -30
  108. package/src/components/Inspector/TabBar.tsx +57 -20
  109. package/src/components/JsonViewer.tsx +15 -2
  110. package/src/components/LogCard.tsx +528 -339
  111. package/src/components/NetworkIcons.tsx +92 -0
  112. package/src/constants/version.ts +1 -1
  113. package/src/customHooks/analyticsLogger.ts +1 -1
  114. package/src/customHooks/consoleLogger.ts +36 -3
  115. package/src/customHooks/crashHandler.ts +1 -1
  116. package/src/customHooks/networkLogger.ts +214 -26
  117. package/src/helpers/index.ts +1 -0
  118. package/src/helpers/remoteConfig.ts +212 -0
  119. package/src/helpers/searchQueryParser.ts +42 -284
  120. package/src/helpers/telemetry.ts +381 -10
  121. package/src/index.tsx +374 -211
  122. package/src/styles/AppFonts.ts +2 -0
  123. package/src/styles/index.ts +20 -1
  124. package/src/types/enums.ts +1 -0
  125. package/src/types/interfaces.ts +12 -0
@@ -227,94 +227,6 @@ const NetworkTab = React.memo(() => {
227
227
  [quickCounts],
228
228
  );
229
229
 
230
- const SEARCH_SCOPES: Array<{
231
- id: SearchScope;
232
- label: string;
233
- icon: (color: string) => React.JSX.Element;
234
- }> = [
235
- {
236
- id: 'all',
237
- label: 'All',
238
- icon: color => <LayersIcon size={9.5} color={color} />,
239
- },
240
- {
241
- id: 'url',
242
- label: 'URL / Path',
243
- icon: color => <GlobeIcon size={9.5} color={color} />,
244
- },
245
- {
246
- id: 'reqBody',
247
- label: 'Payload',
248
- icon: color => <RequestIcon size={9.5} color={color} />,
249
- },
250
- {
251
- id: 'resBody',
252
- label: 'Response',
253
- icon: color => <ResponseIcon size={9.5} color={color} />,
254
- },
255
- {
256
- id: 'headers',
257
- label: 'Headers',
258
- icon: color => <HeadersIcon size={9.5} color={color} />,
259
- },
260
- ];
261
-
262
- const QUICK_API_QUERY_TAGS = useMemo(
263
- () => [
264
- {
265
- label: 'Failed',
266
- query: 'is:error',
267
- icon: (color: string) => <CircleXIcon size={9.5} color={color} />,
268
- },
269
- {
270
- label: 'Slow (>1s)',
271
- query: 'slow:>1s',
272
- icon: (color: string) => <ClockIcon size={9.5} color={color} />,
273
- },
274
- {
275
- label: 'POST',
276
- query: 'm:POST',
277
- icon: (color: string) => <RequestIcon size={9.5} color={color} />,
278
- },
279
- {
280
- label: 'GET',
281
- query: 'm:GET',
282
- icon: (color: string) => <ResponseIcon size={9.5} color={color} />,
283
- },
284
- {
285
- label: 'GraphQL',
286
- query: 'is:graphql',
287
- icon: (color: string) => <AtomIcon size={9.5} color={color} />,
288
- },
289
- {
290
- label: 'Axios',
291
- query: 'client:axios',
292
- icon: (color: string) => <BoltIcon size={9.5} color={color} />,
293
- },
294
- {
295
- label: '200 OK',
296
- query: 'status:200',
297
- icon: (color: string) => <CircleCheckIcon size={9.5} color={color} />,
298
- },
299
- {
300
- label: '404',
301
- query: 'status:404',
302
- icon: (color: string) => <CircleAlertIcon size={9.5} color={color} />,
303
- },
304
- {
305
- label: '500',
306
- query: 'status:500',
307
- icon: (color: string) => <CircleXIcon size={9.5} color={color} />,
308
- },
309
- {
310
- label: 'HTTPS',
311
- query: 'is:https',
312
- icon: (color: string) => <ShieldAlertIcon size={9.5} color={color} />,
313
- },
314
- ],
315
- [],
316
- );
317
-
318
230
  const networkMetrics = useMemo(() => {
319
231
  if (!logs || logs.length === 0) return null;
320
232
  let successCount = 0;
@@ -523,7 +435,7 @@ const NetworkTab = React.memo(() => {
523
435
  size={15}
524
436
  />
525
437
  <TextInput
526
- placeholder="Search url, body, is:error, slow:>1s..."
438
+ placeholder="Search URL, status, method, headers, body..."
527
439
  placeholderTextColor={AppColors.grayTextWeak}
528
440
  value={search}
529
441
  onChangeText={setSearch}
@@ -534,69 +446,6 @@ const NetworkTab = React.memo(() => {
534
446
  autoCapitalize="none"
535
447
  />
536
448
 
537
- {/* Match Case (Aa) & Regex (.*) Quick Toggles */}
538
- <View
539
- style={{
540
- flexDirection: 'row',
541
- alignItems: 'center',
542
- gap: 3,
543
- marginRight: 2,
544
- }}>
545
- <Pressable
546
- hitSlop={8}
547
- onPress={() => setIsCaseSensitive(prev => !prev)}
548
- style={{
549
- paddingHorizontal: 4.5,
550
- paddingVertical: 2,
551
- borderRadius: 4,
552
- backgroundColor: isCaseSensitive
553
- ? AppColors.purple
554
- : 'transparent',
555
- borderWidth: 1,
556
- borderColor: isCaseSensitive
557
- ? AppColors.purple
558
- : `${AppColors.grayBorderSecondary}`,
559
- }}>
560
- <Text
561
- style={{
562
- fontFamily: AppFonts.interBold,
563
- fontSize: 9.5,
564
- color: isCaseSensitive
565
- ? AppColors.white
566
- : AppColors.grayTextWeak,
567
- }}>
568
- Aa
569
- </Text>
570
- </Pressable>
571
-
572
- <Pressable
573
- hitSlop={8}
574
- onPress={() => setIsRegexSearch(prev => !prev)}
575
- style={{
576
- paddingHorizontal: 4.5,
577
- paddingVertical: 2,
578
- borderRadius: 4,
579
- backgroundColor: isRegexSearch
580
- ? AppColors.purple
581
- : 'transparent',
582
- borderWidth: 1,
583
- borderColor: isRegexSearch
584
- ? AppColors.purple
585
- : `${AppColors.grayBorderSecondary}`,
586
- }}>
587
- <Text
588
- style={{
589
- fontFamily: AppFonts.interBold,
590
- fontSize: 9.5,
591
- color: isRegexSearch
592
- ? AppColors.white
593
- : AppColors.grayTextWeak,
594
- }}>
595
- .*
596
- </Text>
597
- </Pressable>
598
- </View>
599
-
600
449
  {search.length > 0 && (
601
450
  <View
602
451
  style={{
@@ -721,123 +570,24 @@ const NetworkTab = React.memo(() => {
721
570
  </View>
722
571
  </View>
723
572
 
724
- {/* Quick Search Scope & Filter Tags Row */}
725
- <View style={{paddingBottom: 4}}>
726
- <ScrollView
727
- horizontal
728
- showsHorizontalScrollIndicator={false}
729
- contentContainerStyle={{
730
- paddingHorizontal: 12,
731
- flexDirection: 'row',
732
- alignItems: 'center',
733
- gap: 5,
734
- paddingVertical: 2,
735
- }}>
736
- {/* Search Scopes */}
737
- {SEARCH_SCOPES.map(s => {
738
- const isActive = searchScope === s.id;
739
- return (
740
- <TouchableScale
741
- key={`scope_${s.id}`}
742
- onPress={() => setSearchScope(s.id)}
743
- hitSlop={6}
744
- style={{
745
- flexDirection: 'row',
746
- alignItems: 'center',
747
- gap: 3.5,
748
- paddingHorizontal: 7.5,
749
- paddingVertical: 3.5,
750
- borderRadius: 6,
751
- backgroundColor: isActive
752
- ? AppColors.purple
753
- : AppColors.grayBackground,
754
- borderWidth: 1,
755
- borderColor: isActive
756
- ? AppColors.purple
757
- : AppColors.grayBorderSecondary,
758
- }}>
759
- {s.icon(isActive ? AppColors.white : AppColors.grayTextWeak)}
760
- <Text
761
- style={{
762
- fontFamily: AppFonts.interBold,
763
- fontSize: 10,
764
- color: isActive ? AppColors.white : AppColors.grayText,
765
- }}>
766
- {s.label}
767
- </Text>
768
- </TouchableScale>
769
- );
770
- })}
771
-
772
- <View
773
- style={{
774
- width: 1,
775
- height: 14,
776
- backgroundColor: AppColors.dividerColor,
777
- marginHorizontal: 3,
778
- }}
779
- />
780
-
781
- {/* Quick Query Suggestions */}
782
- {QUICK_API_QUERY_TAGS.map(q => {
783
- const isActive = search.includes(q.query);
784
- return (
785
- <TouchableScale
786
- key={`quick_${q.query}`}
787
- onPress={() => {
788
- setSearch(prev => {
789
- if (prev.includes(q.query)) {
790
- return prev
791
- .replace(q.query, '')
792
- .replace(/\s+/g, ' ')
793
- .trim();
794
- }
795
- return `${prev} ${q.query}`.trim();
796
- });
797
- }}
798
- hitSlop={6}
799
- style={{
800
- flexDirection: 'row',
801
- alignItems: 'center',
802
- gap: 3.5,
803
- paddingHorizontal: 7.5,
804
- paddingVertical: 3.5,
805
- borderRadius: 6,
806
- backgroundColor: isActive
807
- ? `${AppColors.purple}20`
808
- : AppColors.grayBackground,
809
- borderWidth: 1,
810
- borderColor: isActive
811
- ? AppColors.purple
812
- : AppColors.grayBorderSecondary,
813
- }}>
814
- {q.icon(isActive ? AppColors.purple : AppColors.grayTextWeak)}
815
- <Text
816
- style={{
817
- fontFamily: AppFonts.interMedium,
818
- fontSize: 10,
819
- color: isActive
820
- ? AppColors.purple
821
- : AppColors.grayText,
822
- }}>
823
- {q.label}
824
- </Text>
825
- </TouchableScale>
826
- );
827
- })}
828
- </ScrollView>
829
- </View>
830
-
831
- {/* Quick Filter Horizontal Chips Bar with Live Counts */}
832
- <View style={{marginBottom: 8}}>
573
+ {/* Quick Filter Horizontal Chips Bar with Sticky "More Filters" on Right */}
574
+ <View
575
+ style={{
576
+ flexDirection: 'row',
577
+ alignItems: 'center',
578
+ marginBottom: 8,
579
+ paddingHorizontal: 12,
580
+ gap: 6,
581
+ }}>
833
582
  <ScrollView
834
583
  horizontal
835
584
  showsHorizontalScrollIndicator={false}
585
+ style={{flex: 1}}
836
586
  contentContainerStyle={{
837
- paddingHorizontal: 12,
838
587
  flexDirection: 'row',
839
588
  alignItems: 'center',
840
589
  gap: 6,
590
+ paddingRight: 6,
841
591
  }}>
842
592
  {QUICK_CHIPS.map(chip => {
843
593
  const isActive = quickFilter === chip.id;
@@ -904,200 +654,74 @@ const NetworkTab = React.memo(() => {
904
654
  </TouchableScale>
905
655
  );
906
656
  })}
907
-
908
- <TouchableScale
909
- onPress={() => setIsFilterModalOpen(true)}>
910
- <View
911
- style={{
912
- flexDirection: 'row',
913
- alignItems: 'center',
914
- paddingHorizontal: 10,
915
- paddingVertical: 4.5,
916
- borderRadius: 8,
917
- backgroundColor:
918
- statusFilters.size > 0 || methodFilters.size > 0
919
- ? `${AppColors.purple}20`
920
- : AppColors.grayBackground,
921
- borderWidth: 1,
922
- borderColor:
923
- statusFilters.size > 0 || methodFilters.size > 0
924
- ? AppColors.purple
925
- : AppColors.grayBorderSecondary,
926
- gap: 5,
927
- }}>
928
- <FilterIcon
929
- size={11}
930
- color={
931
- statusFilters.size > 0 || methodFilters.size > 0
932
- ? AppColors.purple
933
- : AppColors.grayText
934
- }
935
- />
936
- <Text
937
- style={{
938
- fontFamily: AppFonts.interBold,
939
- fontSize: 10.5,
940
- color:
941
- statusFilters.size > 0 || methodFilters.size > 0
942
- ? AppColors.purple
943
- : AppColors.grayText,
944
- }}>
945
- More Filters
946
- </Text>
947
- {(statusFilters.size > 0 || methodFilters.size > 0) && (
948
- <View
949
- style={{
950
- backgroundColor: AppColors.purple,
951
- paddingHorizontal: 4.5,
952
- paddingVertical: 1,
953
- borderRadius: 6,
954
- }}>
955
- <Text
956
- style={{
957
- fontFamily: AppFonts.interBold,
958
- fontSize: 8.5,
959
- color: AppColors.white,
960
- }}>
961
- {statusFilters.size + methodFilters.size}
962
- </Text>
963
- </View>
964
- )}
965
- </View>
966
- </TouchableScale>
967
657
  </ScrollView>
968
- </View>
969
658
 
970
- {/* Search Scope Selector Bar (Visible on search or focus) */}
971
- {(isSearchFocused || search.length > 0) && (
972
- <View
973
- style={{
974
- flexDirection: 'row',
975
- alignItems: 'center',
976
- paddingHorizontal: 12,
977
- marginBottom: 6,
978
- gap: 6,
979
- }}>
980
- <Text
659
+ <TouchableScale
660
+ onPress={() => setIsFilterModalOpen(true)}
661
+ style={{flexShrink: 0}}>
662
+ <View
981
663
  style={{
982
- fontFamily: AppFonts.interBold,
983
- fontSize: 9.5,
984
- color: AppColors.grayTextWeak,
985
- textTransform: 'uppercase',
986
- letterSpacing: 0.5,
987
- }}>
988
- Scope:
989
- </Text>
990
- <ScrollView
991
- horizontal
992
- showsHorizontalScrollIndicator={false}
993
- contentContainerStyle={{
994
664
  flexDirection: 'row',
995
665
  alignItems: 'center',
666
+ paddingHorizontal: 10,
667
+ paddingVertical: 4.5,
668
+ borderRadius: 8,
669
+ backgroundColor:
670
+ statusFilters.size > 0 || methodFilters.size > 0
671
+ ? `${AppColors.purple}20`
672
+ : AppColors.grayBackground,
673
+ borderWidth: 1,
674
+ borderColor:
675
+ statusFilters.size > 0 || methodFilters.size > 0
676
+ ? AppColors.purple
677
+ : AppColors.grayBorderSecondary,
996
678
  gap: 5,
679
+ shadowColor: AppColors.black,
680
+ shadowOpacity: 0.04,
681
+ shadowRadius: 2,
682
+ shadowOffset: {width: 0, height: 1},
683
+ elevation: 1,
997
684
  }}>
998
- {SEARCH_SCOPES.map(s => {
999
- const isSelected = searchScope === s.id;
1000
- const iconColor = isSelected ? AppColors.white : AppColors.grayText;
1001
- return (
1002
- <TouchableScale
1003
- key={s.id}
1004
- onPress={() => setSearchScope(s.id)}>
1005
- <View
1006
- style={{
1007
- flexDirection: 'row',
1008
- alignItems: 'center',
1009
- gap: 4,
1010
- paddingHorizontal: 7,
1011
- paddingVertical: 2.5,
1012
- borderRadius: 5,
1013
- backgroundColor: isSelected
1014
- ? AppColors.purple
1015
- : `${AppColors.grayBorderSecondary}40`,
1016
- borderWidth: 1,
1017
- borderColor: isSelected
1018
- ? AppColors.purple
1019
- : AppColors.grayBorderSecondary,
1020
- }}>
1021
- {s.icon(iconColor)}
1022
- <Text
1023
- style={{
1024
- fontFamily: AppFonts.interBold,
1025
- fontSize: 9.5,
1026
- color: isSelected
1027
- ? AppColors.white
1028
- : AppColors.grayText,
1029
- }}>
1030
- {s.label}
1031
- </Text>
1032
- </View>
1033
- </TouchableScale>
1034
- );
1035
- })}
1036
- </ScrollView>
1037
- </View>
1038
- )}
1039
-
1040
- {/* Advanced Search Quick Query Suggestions Bar */}
1041
- {(isSearchFocused || search.length > 0) && (
1042
- <ScrollView
1043
- horizontal
1044
- showsHorizontalScrollIndicator={false}
1045
- style={{marginBottom: 8, maxHeight: 28}}
1046
- contentContainerStyle={{
1047
- paddingHorizontal: 12,
1048
- flexDirection: 'row',
1049
- alignItems: 'center',
1050
- gap: 5,
1051
- }}>
1052
- {QUICK_API_QUERY_TAGS.map(item => {
1053
- const isSelected = search.includes(item.query);
1054
- return (
1055
- <TouchableScale
1056
- key={item.query}
1057
- onPress={() => {
1058
- if (isSelected) {
1059
- setSearch(prev =>
1060
- prev.replace(item.query, '').trim(),
1061
- );
1062
- } else {
1063
- setSearch(prev =>
1064
- prev ? `${prev} ${item.query}`.trim() : item.query,
1065
- );
1066
- }
685
+ <FilterIcon
686
+ size={11}
687
+ color={
688
+ statusFilters.size > 0 || methodFilters.size > 0
689
+ ? AppColors.purple
690
+ : AppColors.grayText
691
+ }
692
+ />
693
+ <Text
694
+ style={{
695
+ fontFamily: AppFonts.interBold,
696
+ fontSize: 10.5,
697
+ color:
698
+ statusFilters.size > 0 || methodFilters.size > 0
699
+ ? AppColors.purple
700
+ : AppColors.grayText,
701
+ }}>
702
+ More Filters
703
+ </Text>
704
+ {(statusFilters.size > 0 || methodFilters.size > 0) && (
705
+ <View
706
+ style={{
707
+ backgroundColor: AppColors.purple,
708
+ paddingHorizontal: 4.5,
709
+ paddingVertical: 1,
710
+ borderRadius: 6,
1067
711
  }}>
1068
- <View
712
+ <Text
1069
713
  style={{
1070
- flexDirection: 'row',
1071
- alignItems: 'center',
1072
- gap: 4,
1073
- paddingHorizontal: 7,
1074
- paddingVertical: 2.5,
1075
- borderRadius: 5,
1076
- backgroundColor: isSelected
1077
- ? AppColors.purple
1078
- : `${AppColors.purple}14`,
1079
- borderWidth: 1,
1080
- borderColor: isSelected
1081
- ? AppColors.purple
1082
- : `${AppColors.purple}30`,
714
+ fontFamily: AppFonts.interBold,
715
+ fontSize: 8.5,
716
+ color: AppColors.white,
1083
717
  }}>
1084
- {item.icon(isSelected ? AppColors.white : AppColors.purple)}
1085
- <Text
1086
- style={{
1087
- fontFamily: AppFonts.interBold,
1088
- fontSize: 9.5,
1089
- color: isSelected
1090
- ? AppColors.white
1091
- : AppColors.purple,
1092
- }}>
1093
- {item.label}
1094
- </Text>
1095
- </View>
1096
- </TouchableScale>
1097
- );
1098
- })}
1099
- </ScrollView>
1100
- )}
718
+ {statusFilters.size + methodFilters.size}
719
+ </Text>
720
+ </View>
721
+ )}
722
+ </View>
723
+ </TouchableScale>
724
+ </View>
1101
725
 
1102
726
  {/* Active Filter Helper Status Bar */}
1103
727
  {(quickFilter !== 'all' ||
@@ -1145,17 +769,6 @@ const NetworkTab = React.memo(() => {
1145
769
  </TouchableScale>
1146
770
  </View>
1147
771
  )}
1148
-
1149
- {(search ||
1150
- statusFilters.size > 0 ||
1151
- methodFilters.size > 0 ||
1152
- quickFilter !== 'all') && (
1153
- <Text style={styles.resultCount}>
1154
- {filteredLogs.length === logs.length
1155
- ? `${logs.length} requests`
1156
- : `${filteredLogs.length} of ${logs.length} filtered requests`}
1157
- </Text>
1158
- )}
1159
772
  </View>
1160
773
  }
1161
774
  ListEmptyComponent={
@@ -1192,29 +805,6 @@ const NetworkTab = React.memo(() => {
1192
805
  ]}
1193
806
  keyboardShouldPersistTaps="handled"
1194
807
  />
1195
- {/* #2 — always-visible scroll-to-top, bottom right */}
1196
- <TouchableScale
1197
- onPress={() => {
1198
- try {
1199
- apisListRef.current?.scrollToOffset({
1200
- offset: 0,
1201
- animated: true,
1202
- });
1203
- } catch {
1204
- try {
1205
- apisListRef.current?.scrollToIndex({
1206
- index: 0,
1207
- animated: true,
1208
- });
1209
- } catch {}
1210
- }
1211
- }}
1212
- hitSlop={12}
1213
- style={styles.scrollTopBtn}>
1214
- <View style={{transform: [{rotate: '180deg'}]}}>
1215
- <ChevronIcon color={AppColors.white} size={18} />
1216
- </View>
1217
- </TouchableScale>
1218
808
 
1219
809
  {/* Modern Network Filter Modal */}
1220
810
  <NetworkFilterModal