react-native-inapp-inspector 2.2.8 → 2.3.0
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 +22 -7
- package/dist/commonjs/components/AppHeaderLogo.js +45 -12
- package/dist/commonjs/components/BrandSquareIcon.js +92 -49
- package/dist/commonjs/components/EmptyState.d.ts +7 -2
- package/dist/commonjs/components/EmptyState.js +11 -5
- package/dist/commonjs/components/Inspector/AnalyticsTab.js +29 -18
- package/dist/commonjs/components/Inspector/ConsoleTab.js +6 -1
- package/dist/commonjs/components/Inspector/CrashDetail.js +43 -9
- package/dist/commonjs/components/Inspector/CrashTab.js +34 -3
- package/dist/commonjs/components/Inspector/DeviceInfoTab.js +80 -16
- package/dist/commonjs/components/Inspector/InspectorHeader.js +16 -3
- package/dist/commonjs/components/Inspector/NetworkDetail.js +3 -2
- package/dist/commonjs/components/Inspector/NetworkTab.js +103 -4
- package/dist/commonjs/components/Inspector/ReduxTab.js +19 -3
- package/dist/commonjs/components/Inspector/SettingsPanel.js +4 -4
- package/dist/commonjs/components/Inspector/StorageTab.js +19 -3
- package/dist/commonjs/components/JsonViewer.js +2 -0
- package/dist/commonjs/components/MetaAccordion.js +15 -3
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/customHooks/networkLogger.d.ts +3 -0
- package/dist/commonjs/customHooks/networkLogger.js +10 -1
- package/dist/commonjs/helpers/index.d.ts +6 -0
- package/dist/commonjs/helpers/index.js +196 -6
- package/dist/commonjs/helpers/searchQueryParser.js +62 -20
- package/dist/commonjs/i18n/index.d.ts +13 -0
- package/dist/commonjs/i18n/index.js +35 -2
- package/dist/commonjs/index.d.ts +3 -0
- package/dist/commonjs/index.js +80 -11
- package/dist/commonjs/native/NativeInspector.js +13 -0
- package/dist/commonjs/native/NativeNetworkInspector.d.ts +1 -1
- package/dist/commonjs/styles/AppColors.d.ts +4 -0
- package/dist/commonjs/styles/AppColors.js +11 -1
- package/dist/commonjs/styles/AppFonts.d.ts +11 -0
- package/dist/commonjs/styles/AppFonts.js +11 -1
- package/dist/commonjs/types/interfaces.d.ts +1 -0
- package/dist/esm/components/AppHeaderLogo.js +45 -12
- package/dist/esm/components/BrandSquareIcon.js +92 -49
- package/dist/esm/components/EmptyState.d.ts +7 -2
- package/dist/esm/components/EmptyState.js +11 -5
- package/dist/esm/components/Inspector/AnalyticsTab.js +30 -19
- package/dist/esm/components/Inspector/ConsoleTab.js +6 -1
- package/dist/esm/components/Inspector/CrashDetail.js +43 -9
- package/dist/esm/components/Inspector/CrashTab.js +34 -3
- package/dist/esm/components/Inspector/DeviceInfoTab.js +80 -16
- package/dist/esm/components/Inspector/InspectorHeader.js +17 -4
- package/dist/esm/components/Inspector/NetworkDetail.js +3 -2
- package/dist/esm/components/Inspector/NetworkTab.js +103 -4
- package/dist/esm/components/Inspector/ReduxTab.js +19 -3
- package/dist/esm/components/Inspector/SettingsPanel.js +4 -4
- package/dist/esm/components/Inspector/StorageTab.js +19 -3
- package/dist/esm/components/JsonViewer.js +2 -0
- package/dist/esm/components/MetaAccordion.js +15 -3
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/customHooks/networkLogger.d.ts +3 -0
- package/dist/esm/customHooks/networkLogger.js +8 -0
- package/dist/esm/helpers/index.d.ts +6 -0
- package/dist/esm/helpers/index.js +193 -5
- package/dist/esm/helpers/searchQueryParser.js +62 -20
- package/dist/esm/i18n/index.d.ts +13 -0
- package/dist/esm/i18n/index.js +33 -3
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +68 -12
- package/dist/esm/native/NativeInspector.js +13 -0
- package/dist/esm/native/NativeNetworkInspector.d.ts +1 -1
- package/dist/esm/styles/AppColors.d.ts +4 -0
- package/dist/esm/styles/AppColors.js +9 -0
- package/dist/esm/styles/AppFonts.d.ts +11 -0
- package/dist/esm/styles/AppFonts.js +9 -0
- package/dist/esm/types/interfaces.d.ts +1 -0
- package/ios/NetworkInspectorModule.mm +11 -1
- package/package.json +1 -1
- package/src/components/AppHeaderLogo.tsx +46 -12
- package/src/components/BrandSquareIcon.tsx +127 -78
- package/src/components/EmptyState.tsx +27 -5
- package/src/components/Inspector/AnalyticsTab.tsx +48 -27
- package/src/components/Inspector/ConsoleTab.tsx +10 -0
- package/src/components/Inspector/CrashDetail.tsx +65 -9
- package/src/components/Inspector/CrashTab.tsx +41 -3
- package/src/components/Inspector/DeviceInfoTab.tsx +87 -16
- package/src/components/Inspector/InspectorHeader.tsx +24 -4
- package/src/components/Inspector/NetworkDetail.tsx +4 -4
- package/src/components/Inspector/NetworkTab.tsx +129 -4
- package/src/components/Inspector/ReduxTab.tsx +26 -8
- package/src/components/Inspector/SettingsPanel.tsx +4 -4
- package/src/components/Inspector/StorageTab.tsx +21 -3
- package/src/components/JsonViewer.tsx +2 -0
- package/src/components/MetaAccordion.tsx +18 -3
- package/src/constants/version.ts +1 -1
- package/src/customHooks/networkLogger.ts +15 -0
- package/src/helpers/index.ts +213 -5
- package/src/helpers/searchQueryParser.ts +63 -20
- package/src/i18n/index.ts +38 -3
- package/src/index.tsx +89 -11
- package/src/native/NativeInspector.ts +13 -0
- package/src/native/NativeNetworkInspector.ts +1 -1
- package/src/styles/AppColors.ts +9 -0
- package/src/styles/AppFonts.ts +16 -0
- package/src/types/interfaces.ts +1 -0
|
@@ -8,7 +8,6 @@ import Svg, {
|
|
|
8
8
|
RadialGradient,
|
|
9
9
|
Stop,
|
|
10
10
|
Rect,
|
|
11
|
-
Ellipse,
|
|
12
11
|
Line,
|
|
13
12
|
} from 'react-native-svg';
|
|
14
13
|
|
|
@@ -16,117 +15,167 @@ export const BrandSquareIcon = ({size = 56}: {size?: number}) => {
|
|
|
16
15
|
return (
|
|
17
16
|
<Svg width={size} height={size} viewBox="0 0 256 256" fill="none">
|
|
18
17
|
<Defs>
|
|
18
|
+
{/* App Tile Background - Crisp Royal Deep Violet to Midnight */}
|
|
19
19
|
<LinearGradient id="bs_tile" x1="0" y1="0" x2="256" y2="256" gradientUnits="userSpaceOnUse">
|
|
20
|
-
<Stop offset="0" stopColor="#1E1B4B" />
|
|
21
|
-
<Stop offset="
|
|
20
|
+
<Stop offset="0%" stopColor="#1E1B4B" />
|
|
21
|
+
<Stop offset="50%" stopColor="#18182F" />
|
|
22
|
+
<Stop offset="100%" stopColor="#0B0F19" />
|
|
22
23
|
</LinearGradient>
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
<Stop offset="
|
|
24
|
+
|
|
25
|
+
{/* Outer Neon Cyber Border */}
|
|
26
|
+
<LinearGradient id="bs_border" x1="0" y1="0" x2="256" y2="256" gradientUnits="userSpaceOnUse">
|
|
27
|
+
<Stop offset="0%" stopColor="#818CF8" stopOpacity={0.9} />
|
|
28
|
+
<Stop offset="45%" stopColor="#C084FC" stopOpacity={0.8} />
|
|
29
|
+
<Stop offset="80%" stopColor="#F472B6" stopOpacity={0.85} />
|
|
30
|
+
<Stop offset="100%" stopColor="#38BDF8" stopOpacity={0.9} />
|
|
27
31
|
</LinearGradient>
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
32
|
+
|
|
33
|
+
{/* Ambient Top Glow */}
|
|
34
|
+
<RadialGradient id="bs_top_glow" cx="50%" cy="15%" r="65%">
|
|
35
|
+
<Stop offset="0%" stopColor="#818CF8" stopOpacity={0.35} />
|
|
36
|
+
<Stop offset="60%" stopColor="#A855F7" stopOpacity={0.12} />
|
|
37
|
+
<Stop offset="100%" stopColor="#1E1B4B" stopOpacity={0} />
|
|
38
|
+
</RadialGradient>
|
|
39
|
+
|
|
40
|
+
{/* Owl Outer Body Gradient - High Contrast */}
|
|
41
|
+
<LinearGradient id="bs_body" x1="64" y1="40" x2="192" y2="220" gradientUnits="userSpaceOnUse">
|
|
42
|
+
<Stop offset="0%" stopColor="#3730A3" />
|
|
43
|
+
<Stop offset="50%" stopColor="#2E1065" />
|
|
44
|
+
<Stop offset="100%" stopColor="#17123A" />
|
|
31
45
|
</LinearGradient>
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
<Stop offset="
|
|
46
|
+
|
|
47
|
+
{/* Neon Cyber Beam Stroke */}
|
|
48
|
+
<LinearGradient id="bs_beam" x1="40" y1="40" x2="220" y2="220" gradientUnits="userSpaceOnUse">
|
|
49
|
+
<Stop offset="0%" stopColor="#67E8F9" />
|
|
50
|
+
<Stop offset="35%" stopColor="#818CF8" />
|
|
51
|
+
<Stop offset="70%" stopColor="#C084FC" />
|
|
52
|
+
<Stop offset="100%" stopColor="#F472B6" />
|
|
53
|
+
</LinearGradient>
|
|
54
|
+
|
|
55
|
+
{/* Eyes Radiant Iris */}
|
|
56
|
+
<RadialGradient id="bs_iris" cx="38%" cy="36%" r="65%">
|
|
57
|
+
<Stop offset="0%" stopColor="#FEF08A" />
|
|
58
|
+
<Stop offset="40%" stopColor="#FBBF24" />
|
|
59
|
+
<Stop offset="80%" stopColor="#F59E0B" />
|
|
60
|
+
<Stop offset="100%" stopColor="#D97706" />
|
|
36
61
|
</RadialGradient>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
62
|
+
|
|
63
|
+
{/* Beak Gradient */}
|
|
64
|
+
<LinearGradient id="bs_beak" x1="124" y1="120" x2="132" y2="136" gradientUnits="userSpaceOnUse">
|
|
65
|
+
<Stop offset="0%" stopColor="#FDE047" />
|
|
66
|
+
<Stop offset="100%" stopColor="#EA580C" />
|
|
40
67
|
</LinearGradient>
|
|
68
|
+
|
|
69
|
+
{/* Diagnostic Lens Glass Flare */}
|
|
70
|
+
<RadialGradient id="bs_lens" cx="40%" cy="35%" r="65%">
|
|
71
|
+
<Stop offset="0%" stopColor="#A5F3FC" stopOpacity={0.4} />
|
|
72
|
+
<Stop offset="50%" stopColor="#38BDF8" stopOpacity={0.18} />
|
|
73
|
+
<Stop offset="100%" stopColor="#0284C7" stopOpacity={0.05} />
|
|
74
|
+
</RadialGradient>
|
|
41
75
|
</Defs>
|
|
42
76
|
|
|
43
|
-
{/* Rounded App Tile
|
|
44
|
-
<Rect x="
|
|
77
|
+
{/* ── 1. Rounded App Tile Base (Full Edge-to-Edge) ── */}
|
|
78
|
+
<Rect x="2" y="2" width="252" height="252" rx="58" fill="url(#bs_tile)" />
|
|
79
|
+
<Rect x="2" y="2" width="252" height="252" rx="58" fill="url(#bs_top_glow)" />
|
|
45
80
|
<Rect
|
|
46
|
-
x="
|
|
47
|
-
y="
|
|
48
|
-
width="
|
|
49
|
-
height="
|
|
50
|
-
rx="
|
|
81
|
+
x="2"
|
|
82
|
+
y="2"
|
|
83
|
+
width="252"
|
|
84
|
+
height="252"
|
|
85
|
+
rx="58"
|
|
51
86
|
fill="none"
|
|
52
|
-
stroke="url(#
|
|
53
|
-
strokeWidth="3"
|
|
54
|
-
strokeOpacity={0.4}
|
|
87
|
+
stroke="url(#bs_border)"
|
|
88
|
+
strokeWidth="3.5"
|
|
55
89
|
/>
|
|
56
90
|
|
|
57
|
-
{/* Owl Outer
|
|
91
|
+
{/* ── 2. Owl Outer Wings (Layered behind) ── */}
|
|
58
92
|
<Path
|
|
59
|
-
d="
|
|
60
|
-
fill="
|
|
93
|
+
d="M62 120 C42 152 46 194 76 210 C68 178 66 146 80 120 Z"
|
|
94
|
+
fill="#1E1B4B"
|
|
61
95
|
stroke="url(#bs_beam)"
|
|
62
|
-
strokeWidth="
|
|
63
|
-
|
|
96
|
+
strokeWidth="3"
|
|
97
|
+
strokeOpacity={0.75}
|
|
64
98
|
/>
|
|
65
|
-
|
|
66
|
-
{/* Wings */}
|
|
67
99
|
<Path
|
|
68
|
-
d="
|
|
100
|
+
d="M194 120 C214 152 210 194 180 210 C188 178 190 146 176 120 Z"
|
|
69
101
|
fill="#1E1B4B"
|
|
70
|
-
stroke="#
|
|
71
|
-
strokeWidth="
|
|
72
|
-
strokeOpacity={0.
|
|
102
|
+
stroke="url(#bs_beam)"
|
|
103
|
+
strokeWidth="3"
|
|
104
|
+
strokeOpacity={0.75}
|
|
73
105
|
/>
|
|
106
|
+
|
|
107
|
+
{/* ── 3. Owl Body Contour ── */}
|
|
74
108
|
<Path
|
|
75
|
-
d="
|
|
76
|
-
fill="#
|
|
77
|
-
stroke="#
|
|
78
|
-
strokeWidth="
|
|
79
|
-
|
|
109
|
+
d="M58 146 C54 98 68 64 88 52 L98 34 L118 56 Q128 50 138 56 L158 34 L168 52 C188 64 202 98 198 146 C202 180 186 208 152 216 C140 220 116 220 104 216 C70 208 54 180 58 146 Z"
|
|
110
|
+
fill="url(#bs_body)"
|
|
111
|
+
stroke="url(#bs_beam)"
|
|
112
|
+
strokeWidth="4.5"
|
|
113
|
+
strokeLinejoin="round"
|
|
80
114
|
/>
|
|
81
115
|
|
|
82
|
-
{/*
|
|
116
|
+
{/* Inner Ear Highlights */}
|
|
117
|
+
<Path d="M98 42 L112 56 L102 57 Z" fill="#67E8F9" opacity={0.6} />
|
|
118
|
+
<Path d="M158 42 L144 56 L154 57 Z" fill="#F472B6" opacity={0.6} />
|
|
119
|
+
|
|
120
|
+
{/* ── 4. Chest Terminal & Code Braces ── */}
|
|
83
121
|
<Rect
|
|
84
|
-
x="
|
|
85
|
-
y="
|
|
86
|
-
width="
|
|
87
|
-
height="
|
|
88
|
-
rx="
|
|
89
|
-
fill="#
|
|
122
|
+
x="98"
|
|
123
|
+
y="162"
|
|
124
|
+
width="60"
|
|
125
|
+
height="38"
|
|
126
|
+
rx="10"
|
|
127
|
+
fill="#050811"
|
|
90
128
|
stroke="url(#bs_beam)"
|
|
91
|
-
strokeWidth="2"
|
|
129
|
+
strokeWidth="2.5"
|
|
92
130
|
/>
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
<Path d="
|
|
96
|
-
<Path d="
|
|
97
|
-
<Path d="M130 169 L126 185" stroke="#EC4899" />
|
|
131
|
+
<G strokeWidth="3" strokeLinecap="round" strokeLinejoin="round" fill="none">
|
|
132
|
+
<Path d="M116 174 L108 181 L116 188" stroke="#38BDF8" />
|
|
133
|
+
<Path d="M140 174 L148 181 L140 188" stroke="#38BDF8" />
|
|
134
|
+
<Path d="M131 171 L125 191" stroke="#F43F5E" />
|
|
98
135
|
</G>
|
|
99
136
|
|
|
100
|
-
{/*
|
|
137
|
+
{/* ── 5. Facial Mask Plate ── */}
|
|
101
138
|
<Path
|
|
102
|
-
d="M128
|
|
103
|
-
fill="#
|
|
104
|
-
stroke="#
|
|
105
|
-
strokeWidth="2"
|
|
106
|
-
strokeOpacity={0.6}
|
|
139
|
+
d="M128 88 C152 64 192 72 192 104 C192 132 162 152 128 152 C94 152 64 132 64 104 C64 72 104 64 128 88 Z"
|
|
140
|
+
fill="#1E1B4B"
|
|
141
|
+
stroke="url(#bs_beam)"
|
|
142
|
+
strokeWidth="2.8"
|
|
107
143
|
/>
|
|
108
144
|
|
|
109
|
-
{/* Right Eye (
|
|
110
|
-
<Circle cx="
|
|
111
|
-
<Circle cx="
|
|
112
|
-
<Circle cx="
|
|
113
|
-
<Circle cx="
|
|
145
|
+
{/* ── 6. Right Eye (Glowing Owl Eye) ── */}
|
|
146
|
+
<Circle cx="156" cy="106" r="19" fill="url(#bs_iris)" stroke="#0F172A" strokeWidth="2.5" />
|
|
147
|
+
<Circle cx="156" cy="106" r="9.5" fill="#0B0F19" />
|
|
148
|
+
<Circle cx="159.5" cy="102.5" r="3.5" fill="#FFFFFF" />
|
|
149
|
+
<Circle cx="153" cy="109.5" r="1.8" fill="#FFFFFF" opacity={0.85} />
|
|
150
|
+
|
|
151
|
+
{/* ── 7. Left Eye (Diagnostic Magnifier Lens) ── */}
|
|
152
|
+
{/* Magnifier Glass Glow */}
|
|
153
|
+
<Circle cx="94" cy="104" r="30" fill="url(#bs_lens)" stroke="url(#bs_beam)" strokeWidth="6" />
|
|
154
|
+
<Line x1="72" y1="126" x2="48" y2="152" stroke="#0B0F19" strokeWidth="13" strokeLinecap="round" />
|
|
155
|
+
<Line x1="72" y1="126" x2="48" y2="152" stroke="url(#bs_beam)" strokeWidth="8" strokeLinecap="round" />
|
|
114
156
|
|
|
115
|
-
{/*
|
|
116
|
-
<Circle cx="
|
|
117
|
-
<Circle cx="
|
|
118
|
-
<Circle cx="
|
|
119
|
-
<Circle cx="
|
|
157
|
+
{/* Eye Inside Magnifier */}
|
|
158
|
+
<Circle cx="94" cy="104" r="21" fill="url(#bs_iris)" stroke="#0F172A" strokeWidth="2.5" />
|
|
159
|
+
<Circle cx="94" cy="104" r="10.5" fill="#0B0F19" />
|
|
160
|
+
<Circle cx="98" cy="100" r="4" fill="#FFFFFF" />
|
|
161
|
+
<Circle cx="90.5" cy="107.5" r="2" fill="#FFFFFF" opacity={0.85} />
|
|
120
162
|
|
|
121
|
-
{/*
|
|
122
|
-
<
|
|
123
|
-
|
|
124
|
-
|
|
163
|
+
{/* Lens Reflection Highlight */}
|
|
164
|
+
<Path
|
|
165
|
+
d="M74 94 A26 26 0 0 1 106 78"
|
|
166
|
+
stroke="#FFFFFF"
|
|
167
|
+
strokeWidth="3"
|
|
168
|
+
strokeLinecap="round"
|
|
169
|
+
opacity={0.65}
|
|
170
|
+
fill="none"
|
|
171
|
+
/>
|
|
125
172
|
|
|
126
|
-
{/* Beak */}
|
|
173
|
+
{/* ── 8. Beak ── */}
|
|
127
174
|
<Path
|
|
128
|
-
d="M123
|
|
175
|
+
d="M123 120 Q128 118 133 120 Q131.5 133 128 137 Q124.5 133 123 120 Z"
|
|
129
176
|
fill="url(#bs_beak)"
|
|
177
|
+
stroke="#78350F"
|
|
178
|
+
strokeWidth="1"
|
|
130
179
|
/>
|
|
131
180
|
</Svg>
|
|
132
181
|
);
|
|
@@ -12,7 +12,21 @@ import {EmptyRadarIcon} from './NetworkIcons';
|
|
|
12
12
|
import {AppColors} from '../styles/AppColors';
|
|
13
13
|
import styles from '../styles';
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
interface EmptyStateProps {
|
|
16
|
+
isSearch?: boolean;
|
|
17
|
+
searchQuery?: string;
|
|
18
|
+
customTitle?: string;
|
|
19
|
+
customSub?: string;
|
|
20
|
+
onClearSearch?: () => void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const EmptyState = React.memo(function EmptyState({
|
|
24
|
+
isSearch,
|
|
25
|
+
searchQuery,
|
|
26
|
+
customTitle,
|
|
27
|
+
customSub,
|
|
28
|
+
onClearSearch,
|
|
29
|
+
}: EmptyStateProps) {
|
|
16
30
|
const iconPulse = useRef(new Animated.Value(1)).current;
|
|
17
31
|
|
|
18
32
|
useEffect(() => {
|
|
@@ -54,13 +68,21 @@ const EmptyState = React.memo(function EmptyState({isSearch}: {isSearch?: boolea
|
|
|
54
68
|
<EmptyRadarIcon color={AppColors.purple} size={32} />
|
|
55
69
|
</Animated.View>
|
|
56
70
|
<Text style={styles.emptyTitle}>
|
|
57
|
-
{isSearch ? 'No matching
|
|
71
|
+
{customTitle || (isSearch ? 'No matching results' : 'No network activity')}
|
|
58
72
|
</Text>
|
|
59
73
|
<Text style={styles.emptySub}>
|
|
60
|
-
{
|
|
61
|
-
|
|
62
|
-
|
|
74
|
+
{customSub ||
|
|
75
|
+
(isSearch
|
|
76
|
+
? searchQuery
|
|
77
|
+
? `No items matched "${searchQuery}"`
|
|
78
|
+
: 'Try adjusting your filters or search keywords.'
|
|
79
|
+
: 'Listening for incoming API calls...')}
|
|
63
80
|
</Text>
|
|
81
|
+
{isSearch && onClearSearch && (
|
|
82
|
+
<TouchableScale style={styles.reloadBtn} onPress={onClearSearch}>
|
|
83
|
+
<Text style={styles.reloadBtnText}>Clear Search & Filters</Text>
|
|
84
|
+
</TouchableScale>
|
|
85
|
+
)}
|
|
64
86
|
{!isSearch && (
|
|
65
87
|
<TouchableScale style={styles.reloadBtn} onPress={handleReload}>
|
|
66
88
|
<Text style={styles.reloadBtnText}>Reload App</Text>
|
|
@@ -11,6 +11,7 @@ import {animateNextLayout, useInspector} from './InspectorContext';
|
|
|
11
11
|
import AnalyticsEventCard from '../AnalyticsEventCard';
|
|
12
12
|
import AnalyticsFilterModal from './AnalyticsFilterModal';
|
|
13
13
|
import EndOfListFooter from '../EndOfListFooter';
|
|
14
|
+
import EmptyState from '../EmptyState';
|
|
14
15
|
import styles from '../../styles';
|
|
15
16
|
import {AppColors} from '../../styles/AppColors';
|
|
16
17
|
import {AppFonts} from '../../styles/AppFonts';
|
|
@@ -1183,15 +1184,38 @@ const AnalyticsTab = React.memo(() => {
|
|
|
1183
1184
|
autoCapitalize="none"
|
|
1184
1185
|
/>
|
|
1185
1186
|
{analyticsSearch.length > 0 && (
|
|
1186
|
-
<
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1187
|
+
<View
|
|
1188
|
+
style={{
|
|
1189
|
+
flexDirection: 'row',
|
|
1190
|
+
alignItems: 'center',
|
|
1191
|
+
gap: 4,
|
|
1192
|
+
}}>
|
|
1193
|
+
<View
|
|
1194
|
+
style={{
|
|
1195
|
+
backgroundColor: `${AppColors.purple}20`,
|
|
1196
|
+
borderRadius: 10,
|
|
1197
|
+
paddingHorizontal: 6,
|
|
1198
|
+
paddingVertical: 1.5,
|
|
1199
|
+
}}>
|
|
1200
|
+
<Text
|
|
1201
|
+
style={{
|
|
1202
|
+
color: AppColors.purple,
|
|
1203
|
+
fontSize: 9.5,
|
|
1204
|
+
fontFamily: AppFonts.interBold,
|
|
1205
|
+
}}>
|
|
1206
|
+
{filteredAnalyticsEvents.length}
|
|
1207
|
+
</Text>
|
|
1208
|
+
</View>
|
|
1209
|
+
<Pressable
|
|
1210
|
+
onPress={() => setAnalyticsSearch('')}
|
|
1211
|
+
hitSlop={10}
|
|
1212
|
+
style={styles.clearBtn}>
|
|
1213
|
+
<ClearIcon
|
|
1214
|
+
color={AppColors.grayTextWeak}
|
|
1215
|
+
size={13}
|
|
1216
|
+
/>
|
|
1217
|
+
</Pressable>
|
|
1218
|
+
</View>
|
|
1195
1219
|
)}
|
|
1196
1220
|
</View>
|
|
1197
1221
|
<View style={styles.toolbarRight}>
|
|
@@ -1292,24 +1316,21 @@ const AnalyticsTab = React.memo(() => {
|
|
|
1292
1316
|
removeClippedSubviews={true}
|
|
1293
1317
|
renderToHardwareTextureAndroid={true}
|
|
1294
1318
|
ListEmptyComponent={
|
|
1295
|
-
<
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
: 'Call setupAnalyticsLogger(analytics()) at app start.'}
|
|
1311
|
-
</Text>
|
|
1312
|
-
</View>
|
|
1319
|
+
<EmptyState
|
|
1320
|
+
isSearch={analyticsSearch.length > 0}
|
|
1321
|
+
searchQuery={analyticsSearch}
|
|
1322
|
+
customTitle={
|
|
1323
|
+
analyticsSearch.length > 0
|
|
1324
|
+
? 'No matching analytics events'
|
|
1325
|
+
: 'No analytics events yet'
|
|
1326
|
+
}
|
|
1327
|
+
customSub={
|
|
1328
|
+
analyticsSearch.length > 0
|
|
1329
|
+
? `No events matched "${analyticsSearch}"`
|
|
1330
|
+
: 'Call setupAnalyticsLogger(analytics()) at app start.'
|
|
1331
|
+
}
|
|
1332
|
+
onClearSearch={() => setAnalyticsSearch('')}
|
|
1333
|
+
/>
|
|
1313
1334
|
}
|
|
1314
1335
|
ListFooterComponent={
|
|
1315
1336
|
filteredAnalyticsEvents.length > 0 ? (
|
|
@@ -682,6 +682,16 @@ const ConsoleTab = React.memo(() => {
|
|
|
682
682
|
isSearch={
|
|
683
683
|
logSearch.length > 0 || logFilters.size > 0
|
|
684
684
|
}
|
|
685
|
+
searchQuery={logSearch}
|
|
686
|
+
customTitle={
|
|
687
|
+
logSearch.length > 0
|
|
688
|
+
? 'No matching console logs'
|
|
689
|
+
: 'No console logs'
|
|
690
|
+
}
|
|
691
|
+
onClearSearch={() => {
|
|
692
|
+
setLogSearch('');
|
|
693
|
+
setLogFilters(new Set());
|
|
694
|
+
}}
|
|
685
695
|
/>
|
|
686
696
|
}
|
|
687
697
|
ListFooterComponent={
|
|
@@ -13,6 +13,7 @@ import TouchableScale from '../TouchableScale';
|
|
|
13
13
|
import SegmentedTabs from '../SegmentedTabs';
|
|
14
14
|
import HighlightText from '../HighlightText';
|
|
15
15
|
import JsonViewer from '../JsonViewer';
|
|
16
|
+
import CopyButton from '../CopyButton';
|
|
16
17
|
import {AppColors} from '../../styles/AppColors';
|
|
17
18
|
import {AppFonts} from '../../styles/AppFonts';
|
|
18
19
|
import {
|
|
@@ -485,9 +486,27 @@ const CrashDetail: React.FC = React.memo(() => {
|
|
|
485
486
|
<View style={{gap: 12}}>
|
|
486
487
|
{/* Device & OS Diagnostics Card */}
|
|
487
488
|
<View style={localStyles.sectionCard}>
|
|
488
|
-
<View
|
|
489
|
-
|
|
490
|
-
|
|
489
|
+
<View
|
|
490
|
+
style={[
|
|
491
|
+
localStyles.sectionCardHeader,
|
|
492
|
+
{justifyContent: 'space-between'},
|
|
493
|
+
]}>
|
|
494
|
+
<View
|
|
495
|
+
style={{flexDirection: 'row', alignItems: 'center', gap: 6}}>
|
|
496
|
+
<GlobeIcon color={AppColors.purple} size={14} />
|
|
497
|
+
<Text style={localStyles.sectionCardTitle}>
|
|
498
|
+
{t('crash.deviceEnvironment')}
|
|
499
|
+
</Text>
|
|
500
|
+
</View>
|
|
501
|
+
<CopyButton
|
|
502
|
+
value={
|
|
503
|
+
selectedCrash.deviceInfo || {
|
|
504
|
+
platform: Platform.OS,
|
|
505
|
+
osVersion: String(Platform.Version),
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
label="Diagnostics"
|
|
509
|
+
/>
|
|
491
510
|
</View>
|
|
492
511
|
|
|
493
512
|
<View style={localStyles.diagGrid}>
|
|
@@ -538,9 +557,22 @@ const CrashDetail: React.FC = React.memo(() => {
|
|
|
538
557
|
{/* Memory Metrics Card */}
|
|
539
558
|
{selectedCrash.memoryInfo && (
|
|
540
559
|
<View style={localStyles.sectionCard}>
|
|
541
|
-
<View
|
|
542
|
-
|
|
543
|
-
|
|
560
|
+
<View
|
|
561
|
+
style={[
|
|
562
|
+
localStyles.sectionCardHeader,
|
|
563
|
+
{justifyContent: 'space-between'},
|
|
564
|
+
]}>
|
|
565
|
+
<View
|
|
566
|
+
style={{flexDirection: 'row', alignItems: 'center', gap: 6}}>
|
|
567
|
+
<LayersIcon color={AppColors.purple} size={14} />
|
|
568
|
+
<Text style={localStyles.sectionCardTitle}>
|
|
569
|
+
{t('crash.jsHeapMemory')}
|
|
570
|
+
</Text>
|
|
571
|
+
</View>
|
|
572
|
+
<CopyButton
|
|
573
|
+
value={selectedCrash.memoryInfo}
|
|
574
|
+
label="Memory Info"
|
|
575
|
+
/>
|
|
544
576
|
</View>
|
|
545
577
|
|
|
546
578
|
<View style={localStyles.diagGrid}>
|
|
@@ -566,6 +598,19 @@ const CrashDetail: React.FC = React.memo(() => {
|
|
|
566
598
|
{/* 3. BREADCRUMBS TAB */}
|
|
567
599
|
{activeSubTab === 'breadcrumbs' && (
|
|
568
600
|
<View style={{gap: 10}}>
|
|
601
|
+
{selectedCrash.breadcrumbs && selectedCrash.breadcrumbs.length > 0 && (
|
|
602
|
+
<View
|
|
603
|
+
style={{
|
|
604
|
+
flexDirection: 'row',
|
|
605
|
+
justifyContent: 'flex-end',
|
|
606
|
+
marginBottom: 2,
|
|
607
|
+
}}>
|
|
608
|
+
<CopyButton
|
|
609
|
+
value={selectedCrash.breadcrumbs}
|
|
610
|
+
label="All Breadcrumbs"
|
|
611
|
+
/>
|
|
612
|
+
</View>
|
|
613
|
+
)}
|
|
569
614
|
{selectedCrash.breadcrumbs && selectedCrash.breadcrumbs.length > 0 ? (
|
|
570
615
|
selectedCrash.breadcrumbs.map((b, idx) => (
|
|
571
616
|
<View key={`crumb_${idx}`} style={localStyles.breadcrumbCard}>
|
|
@@ -575,9 +620,20 @@ const CrashDetail: React.FC = React.memo(() => {
|
|
|
575
620
|
{b.type.toUpperCase()}
|
|
576
621
|
</Text>
|
|
577
622
|
</View>
|
|
578
|
-
<
|
|
579
|
-
{
|
|
580
|
-
|
|
623
|
+
<View
|
|
624
|
+
style={{
|
|
625
|
+
flexDirection: 'row',
|
|
626
|
+
alignItems: 'center',
|
|
627
|
+
gap: 8,
|
|
628
|
+
}}>
|
|
629
|
+
<Text style={localStyles.breadcrumbTime}>
|
|
630
|
+
{new Date(b.timestamp).toLocaleTimeString()}
|
|
631
|
+
</Text>
|
|
632
|
+
<CopyButton
|
|
633
|
+
value={`${new Date(b.timestamp).toLocaleTimeString()} [${b.type.toUpperCase()}] ${b.message}${b.data ? ' ' + JSON.stringify(b.data) : ''}`}
|
|
634
|
+
label="Breadcrumb"
|
|
635
|
+
/>
|
|
636
|
+
</View>
|
|
581
637
|
</View>
|
|
582
638
|
<Text style={localStyles.breadcrumbMessage}>{b.message}</Text>
|
|
583
639
|
{b.data && (
|
|
@@ -433,9 +433,27 @@ const CrashTab = React.memo(() => {
|
|
|
433
433
|
autoCorrect={false}
|
|
434
434
|
/>
|
|
435
435
|
{searchQuery.length > 0 && (
|
|
436
|
-
<
|
|
437
|
-
<
|
|
438
|
-
|
|
436
|
+
<View style={{flexDirection: 'row', alignItems: 'center', gap: 4}}>
|
|
437
|
+
<View
|
|
438
|
+
style={{
|
|
439
|
+
backgroundColor: `${AppColors.purple}20`,
|
|
440
|
+
borderRadius: 10,
|
|
441
|
+
paddingHorizontal: 6,
|
|
442
|
+
paddingVertical: 1.5,
|
|
443
|
+
}}>
|
|
444
|
+
<Text
|
|
445
|
+
style={{
|
|
446
|
+
color: AppColors.purple,
|
|
447
|
+
fontSize: 9.5,
|
|
448
|
+
fontFamily: AppFonts.interBold,
|
|
449
|
+
}}>
|
|
450
|
+
{filteredList.length}
|
|
451
|
+
</Text>
|
|
452
|
+
</View>
|
|
453
|
+
<TouchableOpacity onPress={() => setSearchQuery('')} hitSlop={8}>
|
|
454
|
+
<ClearIcon color={AppColors.grayTextWeak} size={14} />
|
|
455
|
+
</TouchableOpacity>
|
|
456
|
+
</View>
|
|
439
457
|
)}
|
|
440
458
|
</View>
|
|
441
459
|
|
|
@@ -539,6 +557,26 @@ const CrashTab = React.memo(() => {
|
|
|
539
557
|
? t('crash.emptySearchSubtitle')
|
|
540
558
|
: t('crash.emptySubtitle')}
|
|
541
559
|
</Text>
|
|
560
|
+
{searchQuery.length > 0 && (
|
|
561
|
+
<TouchableScale
|
|
562
|
+
onPress={() => setSearchQuery('')}
|
|
563
|
+
style={{
|
|
564
|
+
marginTop: 10,
|
|
565
|
+
paddingHorizontal: 14,
|
|
566
|
+
paddingVertical: 7,
|
|
567
|
+
borderRadius: 8,
|
|
568
|
+
backgroundColor: AppColors.purple,
|
|
569
|
+
}}>
|
|
570
|
+
<Text
|
|
571
|
+
style={{
|
|
572
|
+
fontFamily: AppFonts.interBold,
|
|
573
|
+
fontSize: 11.5,
|
|
574
|
+
color: AppColors.white,
|
|
575
|
+
}}>
|
|
576
|
+
Clear Search
|
|
577
|
+
</Text>
|
|
578
|
+
</TouchableScale>
|
|
579
|
+
)}
|
|
542
580
|
</ScrollView>
|
|
543
581
|
) : (
|
|
544
582
|
<FlatList
|