react-native-inapp-inspector 2.3.5 → 2.3.6
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/dist/commonjs/analytics.d.ts +0 -4
- package/dist/commonjs/analytics.js +0 -4
- package/dist/commonjs/bundle.d.ts +0 -4
- package/dist/commonjs/bundle.js +0 -4
- package/dist/commonjs/components/AnalyticsDetail.js +18 -27
- package/dist/commonjs/components/AnalyticsEventCard.js +9 -12
- package/dist/commonjs/components/AnalyticsGraph.js +10 -15
- package/dist/commonjs/components/AppHeaderLogo.js +0 -3
- package/dist/commonjs/components/BrandCircleIcon.js +15 -15
- package/dist/commonjs/components/BrandSquareIcon.js +20 -20
- package/dist/commonjs/components/CodeSnippet.js +6 -19
- package/dist/commonjs/components/ConsoleLogCard.js +0 -1
- package/dist/commonjs/components/CopyButton.js +0 -4
- package/dist/commonjs/components/DiffViewer.js +0 -2
- package/dist/commonjs/components/DomainHeader.js +0 -4
- package/dist/commonjs/components/EmptyState.js +0 -3
- package/dist/commonjs/components/ErrorBoundary.js +5 -10
- package/dist/commonjs/components/HeadersSection.js +0 -5
- package/dist/commonjs/components/HighlightText.js +1 -4
- package/dist/commonjs/components/Inspector/AnalyticsFilterModal.js +11 -26
- package/dist/commonjs/components/Inspector/AnalyticsTab.js +34 -40
- package/dist/commonjs/components/Inspector/BundleTab.js +56 -84
- package/dist/commonjs/components/Inspector/ConsoleTab.js +7 -7
- package/dist/commonjs/components/Inspector/CrashDetail.js +18 -20
- package/dist/commonjs/components/Inspector/CrashFilterModal.js +0 -1
- package/dist/commonjs/components/Inspector/CrashTab.js +11 -20
- package/dist/commonjs/components/Inspector/DeviceInfoTab.js +12 -24
- package/dist/commonjs/components/Inspector/FabLauncher.js +1 -1
- package/dist/commonjs/components/Inspector/InspectorContext.js +0 -2
- package/dist/commonjs/components/Inspector/InspectorHeader.js +7 -8
- package/dist/commonjs/components/Inspector/LogDetail.js +27 -29
- package/dist/commonjs/components/Inspector/MainScreen.js +9 -10
- package/dist/commonjs/components/Inspector/NetworkDetail.js +10 -11
- package/dist/commonjs/components/Inspector/NetworkTab.js +14 -14
- package/dist/commonjs/components/Inspector/NpmUpdateToast.js +6 -9
- package/dist/commonjs/components/Inspector/PerformanceTab.js +30 -43
- package/dist/commonjs/components/Inspector/ReduxDetail.js +18 -34
- package/dist/commonjs/components/Inspector/ReduxTab.js +11 -20
- package/dist/commonjs/components/Inspector/SettingsPanel.js +32 -36
- package/dist/commonjs/components/Inspector/SkeletonPlaceholder.js +6 -6
- package/dist/commonjs/components/Inspector/StorageTab.js +14 -26
- package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +5 -6
- package/dist/commonjs/components/JsonViewer.js +3 -10
- package/dist/commonjs/components/LogCard.js +7 -7
- package/dist/commonjs/components/MetaAccordion.js +1 -7
- package/dist/commonjs/components/NetworkIcons.js +12 -16
- package/dist/commonjs/components/SectionHeader.js +0 -4
- package/dist/commonjs/components/SkeletonPlaceholder.js +6 -6
- package/dist/commonjs/components/Slider.js +6 -6
- package/dist/commonjs/components/SourcePageCard.js +0 -4
- package/dist/commonjs/components/TreeNode.js +0 -4
- package/dist/commonjs/console.d.ts +0 -4
- package/dist/commonjs/console.js +0 -4
- package/dist/commonjs/constants/index.js +6 -9
- package/dist/commonjs/constants/telemetryConfig.d.ts +7 -0
- package/dist/commonjs/constants/telemetryConfig.js +10 -0
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -3
- package/dist/commonjs/crash.d.ts +0 -4
- package/dist/commonjs/crash.js +0 -4
- package/dist/commonjs/customHooks/analyticsLogger.d.ts +0 -7
- package/dist/commonjs/customHooks/analyticsLogger.js +3 -59
- package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +0 -9
- package/dist/commonjs/customHooks/bundleAnalyzer.js +3 -86
- package/dist/commonjs/customHooks/consoleLogger.js +0 -16
- package/dist/commonjs/customHooks/crashHandler.d.ts +0 -28
- package/dist/commonjs/customHooks/crashHandler.js +0 -55
- package/dist/commonjs/customHooks/logFilters.d.ts +0 -4
- package/dist/commonjs/customHooks/logFilters.js +0 -11
- package/dist/commonjs/customHooks/networkLogger.js +2 -13
- package/dist/commonjs/customHooks/performanceTracker.d.ts +0 -27
- package/dist/commonjs/customHooks/performanceTracker.js +0 -31
- package/dist/commonjs/customHooks/reduxLogger.d.ts +0 -12
- package/dist/commonjs/customHooks/reduxLogger.js +0 -51
- package/dist/commonjs/customHooks/storageInspector.d.ts +0 -40
- package/dist/commonjs/customHooks/storageInspector.js +1 -56
- package/dist/commonjs/decorators/index.d.ts +0 -37
- package/dist/commonjs/decorators/index.js +0 -42
- package/dist/commonjs/helpers/gaAnalyticsRegistry.d.ts +0 -10
- package/dist/commonjs/helpers/gaAnalyticsRegistry.js +0 -26
- package/dist/commonjs/helpers/index.d.ts +0 -7
- package/dist/commonjs/helpers/index.js +1 -42
- package/dist/commonjs/helpers/memoryManager.d.ts +0 -11
- package/dist/commonjs/helpers/memoryManager.js +0 -13
- package/dist/commonjs/helpers/searchQueryParser.d.ts +0 -4
- package/dist/commonjs/helpers/searchQueryParser.js +0 -18
- package/dist/commonjs/helpers/settingsStore.js +0 -8
- package/dist/commonjs/helpers/telemetry.d.ts +2 -0
- package/dist/commonjs/helpers/telemetry.js +302 -0
- package/dist/commonjs/i18n/index.d.ts +0 -9
- package/dist/commonjs/i18n/index.js +0 -15
- package/dist/commonjs/index.js +15 -97
- package/dist/commonjs/native/NativeInspector.d.ts +0 -54
- package/dist/commonjs/native/NativeInspector.js +0 -56
- package/dist/commonjs/network.d.ts +0 -4
- package/dist/commonjs/network.js +0 -4
- package/dist/commonjs/performance.d.ts +0 -4
- package/dist/commonjs/performance.js +0 -4
- package/dist/commonjs/redux.d.ts +0 -4
- package/dist/commonjs/redux.js +0 -4
- package/dist/commonjs/storage.d.ts +0 -4
- package/dist/commonjs/storage.js +0 -4
- package/dist/commonjs/styles/AppColors.d.ts +0 -3
- package/dist/commonjs/styles/AppColors.js +15 -30
- package/dist/commonjs/styles/AppFonts.d.ts +0 -4
- package/dist/commonjs/styles/AppFonts.js +0 -4
- package/dist/commonjs/styles/common.js +0 -11
- package/dist/commonjs/styles/index.js +0 -8
- package/dist/commonjs/types/enums.js +0 -3
- package/dist/commonjs/types/interfaces.d.ts +3 -3
- package/dist/esm/analytics.d.ts +0 -4
- package/dist/esm/analytics.js +0 -4
- package/dist/esm/bundle.d.ts +0 -4
- package/dist/esm/bundle.js +0 -4
- package/dist/esm/components/AnalyticsDetail.js +18 -27
- package/dist/esm/components/AnalyticsEventCard.js +9 -12
- package/dist/esm/components/AnalyticsGraph.js +10 -15
- package/dist/esm/components/AppHeaderLogo.js +0 -3
- package/dist/esm/components/BrandCircleIcon.js +15 -15
- package/dist/esm/components/BrandSquareIcon.js +20 -20
- package/dist/esm/components/CodeSnippet.js +6 -19
- package/dist/esm/components/ConsoleLogCard.js +0 -1
- package/dist/esm/components/CopyButton.js +0 -4
- package/dist/esm/components/DiffViewer.js +0 -2
- package/dist/esm/components/DomainHeader.js +0 -4
- package/dist/esm/components/EmptyState.js +0 -3
- package/dist/esm/components/ErrorBoundary.js +5 -10
- package/dist/esm/components/HeadersSection.js +0 -5
- package/dist/esm/components/HighlightText.js +1 -4
- package/dist/esm/components/Inspector/AnalyticsFilterModal.js +11 -26
- package/dist/esm/components/Inspector/AnalyticsTab.js +34 -40
- package/dist/esm/components/Inspector/BundleTab.js +56 -84
- package/dist/esm/components/Inspector/ConsoleTab.js +7 -7
- package/dist/esm/components/Inspector/CrashDetail.js +18 -20
- package/dist/esm/components/Inspector/CrashFilterModal.js +0 -1
- package/dist/esm/components/Inspector/CrashTab.js +11 -20
- package/dist/esm/components/Inspector/DeviceInfoTab.js +12 -24
- package/dist/esm/components/Inspector/FabLauncher.js +1 -1
- package/dist/esm/components/Inspector/InspectorContext.js +0 -2
- package/dist/esm/components/Inspector/InspectorHeader.js +7 -8
- package/dist/esm/components/Inspector/LogDetail.js +27 -29
- package/dist/esm/components/Inspector/MainScreen.js +9 -10
- package/dist/esm/components/Inspector/NetworkDetail.js +10 -11
- package/dist/esm/components/Inspector/NetworkTab.js +14 -14
- package/dist/esm/components/Inspector/NpmUpdateToast.js +6 -9
- package/dist/esm/components/Inspector/PerformanceTab.js +30 -43
- package/dist/esm/components/Inspector/ReduxDetail.js +18 -34
- package/dist/esm/components/Inspector/ReduxTab.js +11 -20
- package/dist/esm/components/Inspector/SettingsPanel.js +32 -36
- package/dist/esm/components/Inspector/SkeletonPlaceholder.js +6 -6
- package/dist/esm/components/Inspector/StorageTab.js +14 -26
- package/dist/esm/components/Inspector/UpdateAvailableModal.js +5 -6
- package/dist/esm/components/JsonViewer.js +3 -10
- package/dist/esm/components/LogCard.js +7 -7
- package/dist/esm/components/MetaAccordion.js +1 -7
- package/dist/esm/components/NetworkIcons.js +12 -16
- package/dist/esm/components/SectionHeader.js +0 -4
- package/dist/esm/components/SkeletonPlaceholder.js +6 -6
- package/dist/esm/components/Slider.js +6 -6
- package/dist/esm/components/SourcePageCard.js +0 -4
- package/dist/esm/components/TreeNode.js +0 -4
- package/dist/esm/console.d.ts +0 -4
- package/dist/esm/console.js +0 -4
- package/dist/esm/constants/index.js +6 -9
- package/dist/esm/constants/telemetryConfig.d.ts +7 -0
- package/dist/esm/constants/telemetryConfig.js +7 -0
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -3
- package/dist/esm/crash.d.ts +0 -4
- package/dist/esm/crash.js +0 -4
- package/dist/esm/customHooks/analyticsLogger.d.ts +0 -7
- package/dist/esm/customHooks/analyticsLogger.js +3 -59
- package/dist/esm/customHooks/bundleAnalyzer.d.ts +0 -9
- package/dist/esm/customHooks/bundleAnalyzer.js +3 -86
- package/dist/esm/customHooks/consoleLogger.js +0 -16
- package/dist/esm/customHooks/crashHandler.d.ts +0 -28
- package/dist/esm/customHooks/crashHandler.js +0 -55
- package/dist/esm/customHooks/logFilters.d.ts +0 -4
- package/dist/esm/customHooks/logFilters.js +0 -11
- package/dist/esm/customHooks/networkLogger.js +2 -13
- package/dist/esm/customHooks/performanceTracker.d.ts +0 -27
- package/dist/esm/customHooks/performanceTracker.js +0 -31
- package/dist/esm/customHooks/reduxLogger.d.ts +0 -12
- package/dist/esm/customHooks/reduxLogger.js +0 -51
- package/dist/esm/customHooks/storageInspector.d.ts +0 -40
- package/dist/esm/customHooks/storageInspector.js +1 -56
- package/dist/esm/decorators/index.d.ts +0 -37
- package/dist/esm/decorators/index.js +0 -42
- package/dist/esm/helpers/gaAnalyticsRegistry.d.ts +0 -10
- package/dist/esm/helpers/gaAnalyticsRegistry.js +0 -26
- package/dist/esm/helpers/index.d.ts +0 -7
- package/dist/esm/helpers/index.js +1 -42
- package/dist/esm/helpers/memoryManager.d.ts +0 -11
- package/dist/esm/helpers/memoryManager.js +0 -13
- package/dist/esm/helpers/searchQueryParser.d.ts +0 -4
- package/dist/esm/helpers/searchQueryParser.js +0 -18
- package/dist/esm/helpers/settingsStore.js +0 -8
- package/dist/esm/helpers/telemetry.d.ts +2 -0
- package/dist/esm/helpers/telemetry.js +298 -0
- package/dist/esm/i18n/index.d.ts +0 -9
- package/dist/esm/i18n/index.js +0 -15
- package/dist/esm/index.js +15 -97
- package/dist/esm/native/NativeInspector.d.ts +0 -54
- package/dist/esm/native/NativeInspector.js +0 -56
- package/dist/esm/network.d.ts +0 -4
- package/dist/esm/network.js +0 -4
- package/dist/esm/performance.d.ts +0 -4
- package/dist/esm/performance.js +0 -4
- package/dist/esm/redux.d.ts +0 -4
- package/dist/esm/redux.js +0 -4
- package/dist/esm/storage.d.ts +0 -4
- package/dist/esm/storage.js +0 -4
- package/dist/esm/styles/AppColors.d.ts +0 -3
- package/dist/esm/styles/AppColors.js +15 -30
- package/dist/esm/styles/AppFonts.d.ts +0 -4
- package/dist/esm/styles/AppFonts.js +0 -4
- package/dist/esm/styles/common.js +0 -11
- package/dist/esm/styles/index.js +0 -8
- package/dist/esm/types/enums.js +0 -3
- package/dist/esm/types/interfaces.d.ts +3 -3
- package/package.json +2 -2
- package/src/constants/telemetryConfig.ts +16 -0
- package/src/constants/version.ts +1 -1
- package/src/helpers/telemetry.ts +341 -0
- package/src/index.tsx +15 -1
- package/src/types/interfaces.ts +3 -0
|
@@ -31,8 +31,6 @@ const CrashDetail = React.memo(() => {
|
|
|
31
31
|
}
|
|
32
32
|
return [];
|
|
33
33
|
}, [selectedCrash]);
|
|
34
|
-
// Strip keys holding explicit undefined values (e.g. componentStack) so the
|
|
35
|
-
// Raw JSON tab never renders a literal "undefined".
|
|
36
34
|
const rawCrashData = useMemo(() => {
|
|
37
35
|
try {
|
|
38
36
|
return JSON.parse(JSON.stringify(selectedCrash));
|
|
@@ -88,12 +86,12 @@ const CrashDetail = React.memo(() => {
|
|
|
88
86
|
},
|
|
89
87
|
];
|
|
90
88
|
return (<View style={{ flex: 1, backgroundColor: AppColors.grayBackground }}>
|
|
91
|
-
|
|
89
|
+
|
|
92
90
|
<View style={{ paddingHorizontal: 8, paddingTop: 6 }}>
|
|
93
91
|
<View style={localStyles.infoBar}>
|
|
94
|
-
|
|
92
|
+
|
|
95
93
|
<View style={localStyles.badgeRow}>
|
|
96
|
-
|
|
94
|
+
|
|
97
95
|
<View style={[
|
|
98
96
|
localStyles.pillBadge,
|
|
99
97
|
{
|
|
@@ -125,7 +123,7 @@ const CrashDetail = React.memo(() => {
|
|
|
125
123
|
</Text>
|
|
126
124
|
</View>
|
|
127
125
|
|
|
128
|
-
|
|
126
|
+
|
|
129
127
|
<View style={[
|
|
130
128
|
localStyles.pillBadge,
|
|
131
129
|
{
|
|
@@ -140,7 +138,7 @@ const CrashDetail = React.memo(() => {
|
|
|
140
138
|
|
|
141
139
|
<View style={{ flex: 1 }}/>
|
|
142
140
|
|
|
143
|
-
|
|
141
|
+
|
|
144
142
|
<TouchableScale onPress={handleCopyReport} hitSlop={10} style={[
|
|
145
143
|
localStyles.actionButton,
|
|
146
144
|
copiedSuccess && { backgroundColor: AppColors.mintGreenBg, borderColor: AppColors.mintGreenBorder },
|
|
@@ -155,12 +153,12 @@ const CrashDetail = React.memo(() => {
|
|
|
155
153
|
</TouchableScale>
|
|
156
154
|
</View>
|
|
157
155
|
|
|
158
|
-
|
|
156
|
+
|
|
159
157
|
<Text style={localStyles.titleText}>
|
|
160
158
|
{selectedCrash.message}
|
|
161
159
|
</Text>
|
|
162
160
|
|
|
163
|
-
|
|
161
|
+
|
|
164
162
|
<ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={localStyles.metaRow}>
|
|
165
163
|
{originFrame && (<View style={localStyles.metaChip}>
|
|
166
164
|
<TerminalIcon color={AppColors.grayText} size={11}/>
|
|
@@ -186,12 +184,12 @@ const CrashDetail = React.memo(() => {
|
|
|
186
184
|
</View>
|
|
187
185
|
</View>
|
|
188
186
|
|
|
189
|
-
|
|
187
|
+
|
|
190
188
|
<View style={{ paddingHorizontal: 8, paddingTop: 6, paddingBottom: 4 }}>
|
|
191
189
|
<SegmentedTabs tabs={tabsConfig} activeKey={activeSubTab} onChange={tab => setActiveSubTab(tab)}/>
|
|
192
190
|
</View>
|
|
193
191
|
|
|
194
|
-
|
|
192
|
+
|
|
195
193
|
{(activeSubTab === 'stack' || activeSubTab === 'raw') && (<View style={{ paddingHorizontal: 12, paddingBottom: 6 }}>
|
|
196
194
|
<View style={localStyles.searchContainer}>
|
|
197
195
|
<SearchIcon color={AppColors.grayText} size={14}/>
|
|
@@ -202,11 +200,11 @@ const CrashDetail = React.memo(() => {
|
|
|
202
200
|
</View>
|
|
203
201
|
</View>)}
|
|
204
202
|
|
|
205
|
-
|
|
203
|
+
|
|
206
204
|
<ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 12, paddingBottom: 40, gap: 12 }}>
|
|
207
|
-
|
|
205
|
+
|
|
208
206
|
{activeSubTab === 'stack' && (<View style={{ gap: 10 }}>
|
|
209
|
-
|
|
207
|
+
|
|
210
208
|
<View style={localStyles.filterChipsRow}>
|
|
211
209
|
<TouchableScale onPress={() => setStackFilter('app')} style={[
|
|
212
210
|
localStyles.filterChip,
|
|
@@ -239,7 +237,7 @@ const CrashDetail = React.memo(() => {
|
|
|
239
237
|
</TouchableScale>
|
|
240
238
|
</View>
|
|
241
239
|
|
|
242
|
-
|
|
240
|
+
|
|
243
241
|
{displayedFrames.length > 0 ? (displayedFrames
|
|
244
242
|
.filter(frame => {
|
|
245
243
|
if (!searchQuery.trim())
|
|
@@ -325,9 +323,9 @@ const CrashDetail = React.memo(() => {
|
|
|
325
323
|
</View>)}
|
|
326
324
|
</View>)}
|
|
327
325
|
|
|
328
|
-
|
|
326
|
+
|
|
329
327
|
{activeSubTab === 'diagnostics' && (<View style={{ gap: 12 }}>
|
|
330
|
-
|
|
328
|
+
|
|
331
329
|
<View style={localStyles.sectionCard}>
|
|
332
330
|
<View style={[
|
|
333
331
|
localStyles.sectionCardHeader,
|
|
@@ -390,7 +388,7 @@ const CrashDetail = React.memo(() => {
|
|
|
390
388
|
</View>
|
|
391
389
|
</View>
|
|
392
390
|
|
|
393
|
-
|
|
391
|
+
|
|
394
392
|
{selectedCrash.memoryInfo && (<View style={localStyles.sectionCard}>
|
|
395
393
|
<View style={[
|
|
396
394
|
localStyles.sectionCardHeader,
|
|
@@ -423,7 +421,7 @@ const CrashDetail = React.memo(() => {
|
|
|
423
421
|
</View>)}
|
|
424
422
|
</View>)}
|
|
425
423
|
|
|
426
|
-
|
|
424
|
+
|
|
427
425
|
{activeSubTab === 'breadcrumbs' && (<View style={{ gap: 10 }}>
|
|
428
426
|
{selectedCrash.breadcrumbs && selectedCrash.breadcrumbs.length > 0 && (<View style={{
|
|
429
427
|
flexDirection: 'row',
|
|
@@ -461,7 +459,7 @@ const CrashDetail = React.memo(() => {
|
|
|
461
459
|
</View>)}
|
|
462
460
|
</View>)}
|
|
463
461
|
|
|
464
|
-
|
|
462
|
+
|
|
465
463
|
{activeSubTab === 'raw' && (<View style={localStyles.rawContainer}>
|
|
466
464
|
<JsonViewer data={rawCrashData} search={searchQuery} wrap/>
|
|
467
465
|
</View>)}
|
|
@@ -34,7 +34,6 @@ const CrashTab = React.memo(() => {
|
|
|
34
34
|
const [crashFilters, setCrashFilters] = useState(DEFAULT_CRASH_FILTERS);
|
|
35
35
|
const [isFilterModalOpen, setIsFilterModalOpen] = useState(false);
|
|
36
36
|
const [detailSubTab, setDetailSubTab] = useState('stack');
|
|
37
|
-
// Calculate statistics
|
|
38
37
|
const stats = useMemo(() => {
|
|
39
38
|
const total = crashRecords.length;
|
|
40
39
|
let fatalCount = 0;
|
|
@@ -56,10 +55,8 @@ const CrashTab = React.memo(() => {
|
|
|
56
55
|
});
|
|
57
56
|
return { total, fatalCount, jsCount, promiseCount, renderCount, nativeCount };
|
|
58
57
|
}, [crashRecords]);
|
|
59
|
-
// Filtered crash list
|
|
60
58
|
const filteredList = useMemo(() => {
|
|
61
59
|
let list = crashRecords.filter(item => {
|
|
62
|
-
// Type filter
|
|
63
60
|
if (filterType === 'fatal' && !item.isFatal)
|
|
64
61
|
return false;
|
|
65
62
|
if (filterType === 'js' && item.type !== 'js')
|
|
@@ -70,7 +67,6 @@ const CrashTab = React.memo(() => {
|
|
|
70
67
|
return false;
|
|
71
68
|
if (filterType === 'native' && item.type !== 'native')
|
|
72
69
|
return false;
|
|
73
|
-
// Modal filters: crash types
|
|
74
70
|
if (crashFilters.types.size > 0 && !crashFilters.types.has('all')) {
|
|
75
71
|
const matches = (crashFilters.types.has('fatal') && item.isFatal) ||
|
|
76
72
|
(crashFilters.types.has('js') && item.type === 'js') ||
|
|
@@ -80,7 +76,6 @@ const CrashTab = React.memo(() => {
|
|
|
80
76
|
if (!matches)
|
|
81
77
|
return false;
|
|
82
78
|
}
|
|
83
|
-
// Modal filters: time window
|
|
84
79
|
if (crashFilters.timeWindow !== 'all') {
|
|
85
80
|
const now = Date.now();
|
|
86
81
|
const cutoff = crashFilters.timeWindow === '15m'
|
|
@@ -93,13 +88,11 @@ const CrashTab = React.memo(() => {
|
|
|
93
88
|
if (item.timestamp < cutoff)
|
|
94
89
|
return false;
|
|
95
90
|
}
|
|
96
|
-
// Modal filters: platform
|
|
97
91
|
if (crashFilters.platform !== 'all') {
|
|
98
92
|
const platform = (item.deviceInfo?.platform || '').toLowerCase();
|
|
99
93
|
if (platform !== crashFilters.platform)
|
|
100
94
|
return false;
|
|
101
95
|
}
|
|
102
|
-
// Modal filters: engine
|
|
103
96
|
if (crashFilters.engine !== 'all') {
|
|
104
97
|
const isHermes = item.deviceInfo?.isHermes;
|
|
105
98
|
if (crashFilters.engine === 'hermes' && isHermes !== true)
|
|
@@ -107,7 +100,6 @@ const CrashTab = React.memo(() => {
|
|
|
107
100
|
if (crashFilters.engine === 'jsc' && (isHermes === true))
|
|
108
101
|
return false;
|
|
109
102
|
}
|
|
110
|
-
// Search filter
|
|
111
103
|
if (searchQuery.trim().length > 0) {
|
|
112
104
|
const queryTokens = searchQuery.trim().toLowerCase().split(/\s+/).filter(Boolean);
|
|
113
105
|
const searchTarget = [
|
|
@@ -122,7 +114,6 @@ const CrashTab = React.memo(() => {
|
|
|
122
114
|
}
|
|
123
115
|
return true;
|
|
124
116
|
});
|
|
125
|
-
// Modal filters: sort order
|
|
126
117
|
if (crashFilters.sortBy === 'time_asc') {
|
|
127
118
|
list = [...list].sort((a, b) => a.timestamp - b.timestamp);
|
|
128
119
|
}
|
|
@@ -163,7 +154,7 @@ const CrashTab = React.memo(() => {
|
|
|
163
154
|
localStyles.cardContainer,
|
|
164
155
|
isFatal && localStyles.fatalCardBorder,
|
|
165
156
|
]}>
|
|
166
|
-
|
|
157
|
+
|
|
167
158
|
<View style={localStyles.cardHeader}>
|
|
168
159
|
<View style={localStyles.badgeRow}>
|
|
169
160
|
<View style={localStyles.sNoBadge}>
|
|
@@ -201,12 +192,12 @@ const CrashTab = React.memo(() => {
|
|
|
201
192
|
</View>
|
|
202
193
|
</View>
|
|
203
194
|
|
|
204
|
-
|
|
195
|
+
|
|
205
196
|
<View style={{ marginVertical: 6 }}>
|
|
206
197
|
<HighlightText text={item.message || t('crash.unknownException')} highlight={searchQuery} numberOfLines={3} style={localStyles.errorMessageText}/>
|
|
207
198
|
</View>
|
|
208
199
|
|
|
209
|
-
|
|
200
|
+
|
|
210
201
|
{topFrame && (<View style={localStyles.locationRow}>
|
|
211
202
|
<TerminalIcon size={12} color={AppColors.grayTextWeak}/>
|
|
212
203
|
<Text numberOfLines={1} ellipsizeMode="middle" style={localStyles.locationText}>
|
|
@@ -217,7 +208,7 @@ const CrashTab = React.memo(() => {
|
|
|
217
208
|
</Text>
|
|
218
209
|
</View>)}
|
|
219
210
|
|
|
220
|
-
|
|
211
|
+
|
|
221
212
|
<View style={localStyles.cardFooter}>
|
|
222
213
|
<View style={{ flexDirection: 'row', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>
|
|
223
214
|
{item.deviceInfo && (<View style={localStyles.metaPill}>
|
|
@@ -256,7 +247,7 @@ const CrashTab = React.memo(() => {
|
|
|
256
247
|
}, [searchQuery, setSelectedCrash]);
|
|
257
248
|
return (<View style={localStyles.container}>
|
|
258
249
|
{crashRecords.length > 0 && (<>
|
|
259
|
-
|
|
250
|
+
|
|
260
251
|
<View style={localStyles.statsBar}>
|
|
261
252
|
<ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={localStyles.statsScrollContent}>
|
|
262
253
|
<View style={[localStyles.statChip, localStyles.statChipActive]}>
|
|
@@ -301,7 +292,7 @@ const CrashTab = React.memo(() => {
|
|
|
301
292
|
</ScrollView>
|
|
302
293
|
</View>
|
|
303
294
|
|
|
304
|
-
|
|
295
|
+
|
|
305
296
|
<View style={localStyles.controlsContainer}>
|
|
306
297
|
<View style={localStyles.searchRow}>
|
|
307
298
|
<View style={localStyles.searchInputWrapper}>
|
|
@@ -328,7 +319,7 @@ const CrashTab = React.memo(() => {
|
|
|
328
319
|
</View>)}
|
|
329
320
|
</View>
|
|
330
321
|
|
|
331
|
-
|
|
322
|
+
|
|
332
323
|
<TouchableScale onPress={() => setIsFilterModalOpen(true)} style={[
|
|
333
324
|
localStyles.filterButton,
|
|
334
325
|
!isCrashFiltersDefault(crashFilters) && {
|
|
@@ -352,13 +343,13 @@ const CrashTab = React.memo(() => {
|
|
|
352
343
|
}}/>)}
|
|
353
344
|
</TouchableScale>
|
|
354
345
|
|
|
355
|
-
|
|
346
|
+
|
|
356
347
|
<TouchableScale onPress={handleClearAll} style={localStyles.clearButton}>
|
|
357
348
|
<TrashIcon size={14} color={AppColors.errorColor}/>
|
|
358
349
|
</TouchableScale>
|
|
359
350
|
</View>
|
|
360
351
|
|
|
361
|
-
|
|
352
|
+
|
|
362
353
|
<ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={localStyles.filterScrollContent}>
|
|
363
354
|
{[
|
|
364
355
|
{ key: 'all', label: t('crash.filterAll'), Icon: LayersIcon },
|
|
@@ -386,7 +377,7 @@ const CrashTab = React.memo(() => {
|
|
|
386
377
|
</View>
|
|
387
378
|
</>)}
|
|
388
379
|
|
|
389
|
-
|
|
380
|
+
|
|
390
381
|
{filteredList.length === 0 ? (<ScrollView contentContainerStyle={localStyles.emptyContainer} showsVerticalScrollIndicator={false}>
|
|
391
382
|
<View style={localStyles.emptyIconCircle}>
|
|
392
383
|
<ShieldAlertIcon size={38} color={AppColors.greenColor}/>
|
|
@@ -414,7 +405,7 @@ const CrashTab = React.memo(() => {
|
|
|
414
405
|
</TouchableScale>)}
|
|
415
406
|
</ScrollView>) : (<FlatList data={filteredList} keyExtractor={item => item.id} renderItem={renderCard} initialNumToRender={12} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={true} renderToHardwareTextureAndroid={true} contentContainerStyle={localStyles.listContent} showsVerticalScrollIndicator={false} ListFooterComponent={<EndOfListFooter />}/>)}
|
|
416
407
|
|
|
417
|
-
|
|
408
|
+
|
|
418
409
|
<CrashFilterModal visible={isFilterModalOpen} onClose={() => setIsFilterModalOpen(false)} filters={crashFilters} onApply={setCrashFilters} searchQuery={searchQuery}/>
|
|
419
410
|
</View>);
|
|
420
411
|
});
|
|
@@ -70,7 +70,6 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
70
70
|
const [ipAddress, setIpAddress] = useState('Detecting...');
|
|
71
71
|
const [deviceUptime, setDeviceUptime] = useState('0s');
|
|
72
72
|
const startTimeRef = React.useRef(Date.now());
|
|
73
|
-
// Load hardware metrics and IP
|
|
74
73
|
const fetchMetrics = useCallback(async () => {
|
|
75
74
|
try {
|
|
76
75
|
const [devMetrics, sysMetrics] = await Promise.all([
|
|
@@ -81,7 +80,6 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
81
80
|
setSystemMetrics(sysMetrics);
|
|
82
81
|
}
|
|
83
82
|
catch {
|
|
84
|
-
// Fallback
|
|
85
83
|
}
|
|
86
84
|
finally {
|
|
87
85
|
setIsLoading(false);
|
|
@@ -92,11 +90,9 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
92
90
|
const interval = setInterval(fetchMetrics, 3000);
|
|
93
91
|
return () => clearInterval(interval);
|
|
94
92
|
}, [fetchMetrics]);
|
|
95
|
-
// Probe local IP address
|
|
96
93
|
useEffect(() => {
|
|
97
94
|
let isMounted = true;
|
|
98
95
|
const probeIp = async () => {
|
|
99
|
-
// 1. Try NativeModules or PlatformConstants
|
|
100
96
|
try {
|
|
101
97
|
const serverHost = NativeModules?.PlatformConstants?.serverHost ||
|
|
102
98
|
NativeModules?.AndroidConstants?.serverHost ||
|
|
@@ -111,7 +107,6 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
111
107
|
}
|
|
112
108
|
}
|
|
113
109
|
catch { }
|
|
114
|
-
// 2. Query dynamic candidate ip endpoints
|
|
115
110
|
try {
|
|
116
111
|
const controller = new AbortController();
|
|
117
112
|
const timer = setTimeout(() => controller.abort(), 1200);
|
|
@@ -137,7 +132,6 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
137
132
|
isMounted = false;
|
|
138
133
|
};
|
|
139
134
|
}, []);
|
|
140
|
-
// Calculate Uptime
|
|
141
135
|
useEffect(() => {
|
|
142
136
|
const updateUptime = () => {
|
|
143
137
|
const diffSec = Math.floor((Date.now() - startTimeRef.current) / 1000);
|
|
@@ -158,7 +152,6 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
158
152
|
updateUptime();
|
|
159
153
|
return () => clearInterval(timer);
|
|
160
154
|
}, []);
|
|
161
|
-
// Screen Geometry
|
|
162
155
|
const windowDims = Dimensions.get('window');
|
|
163
156
|
const screenDims = Dimensions.get('screen');
|
|
164
157
|
const pixelRatio = PixelRatio.get();
|
|
@@ -168,7 +161,6 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
168
161
|
const statusBarHeight = Platform.OS === 'android'
|
|
169
162
|
? StatusBar.currentHeight || 24
|
|
170
163
|
: (windowDims.height >= 812 ? 44 : 20);
|
|
171
|
-
// Pseudo-UDID deterministic identifier
|
|
172
164
|
const pseudoUDID = useMemo(() => {
|
|
173
165
|
const raw = `${Platform.OS}-${Platform.Version}-${screenDims.width}x${screenDims.height}-${pixelRatio}-${Platform.constants?.Brand || 'generic'}`;
|
|
174
166
|
let hash = 0;
|
|
@@ -179,7 +171,6 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
179
171
|
const hex = Math.abs(hash).toString(16).padStart(8, '0');
|
|
180
172
|
return `UDID-${Platform.OS.toUpperCase()}-${hex.slice(0, 4)}-${hex.slice(4, 8)}-${Date.now().toString(16).slice(-4)}`.toUpperCase();
|
|
181
173
|
}, [screenDims.width, screenDims.height, pixelRatio]);
|
|
182
|
-
// Hermes & TurboModule engine status
|
|
183
174
|
const isHermes = Boolean(global?.HermesInternal);
|
|
184
175
|
const isTurboModule = Boolean(globalThis?.__turboModuleProxy);
|
|
185
176
|
const reactNativeVersion = useMemo(() => {
|
|
@@ -203,7 +194,6 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
203
194
|
const freeStorageGb = deviceMetrics?.freeStorage
|
|
204
195
|
? (deviceMetrics.freeStorage / (1024 * 1024 * 1024)).toFixed(1)
|
|
205
196
|
: '64.2';
|
|
206
|
-
// Sub-Tab Definitions
|
|
207
197
|
const subTabs = useMemo(() => [
|
|
208
198
|
{
|
|
209
199
|
key: 'overview',
|
|
@@ -236,7 +226,6 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
236
226
|
icon: (c) => <KeyIcon size={12} color={c}/>,
|
|
237
227
|
},
|
|
238
228
|
], []);
|
|
239
|
-
// Full device JSON export
|
|
240
229
|
const fullDeviceData = useMemo(() => ({
|
|
241
230
|
identifiers: {
|
|
242
231
|
pseudoUDID,
|
|
@@ -349,7 +338,6 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
349
338
|
copyToClipboard(md, 'Device Markdown Report');
|
|
350
339
|
showToast('Copied Markdown Report to Clipboard!');
|
|
351
340
|
};
|
|
352
|
-
// Filter items matching search
|
|
353
341
|
const isMatch = (text) => {
|
|
354
342
|
if (!search.trim())
|
|
355
343
|
return true;
|
|
@@ -364,7 +352,7 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
364
352
|
pseudoUDID.toLowerCase().includes(query));
|
|
365
353
|
}, [search, fullDeviceData, ipAddress, pseudoUDID]);
|
|
366
354
|
return (<View style={styles.container}>
|
|
367
|
-
|
|
355
|
+
|
|
368
356
|
<View style={styles.subTabsWrapper}>
|
|
369
357
|
<ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.subTabsContainer}>
|
|
370
358
|
{subTabs.map(tab => {
|
|
@@ -383,7 +371,7 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
383
371
|
</ScrollView>
|
|
384
372
|
</View>
|
|
385
373
|
|
|
386
|
-
|
|
374
|
+
|
|
387
375
|
<View style={styles.actionBar}>
|
|
388
376
|
<View style={styles.searchBar}>
|
|
389
377
|
<SearchIcon size={14} color={AppColors.grayTextWeak}/>
|
|
@@ -404,9 +392,9 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
404
392
|
</TouchableScale>
|
|
405
393
|
</View>
|
|
406
394
|
|
|
407
|
-
|
|
395
|
+
|
|
408
396
|
<ScrollView style={styles.scrollArea} contentContainerStyle={styles.scrollContent} showsVerticalScrollIndicator={false}>
|
|
409
|
-
|
|
397
|
+
|
|
410
398
|
<View style={styles.heroCard}>
|
|
411
399
|
<View style={styles.heroHeader}>
|
|
412
400
|
<View style={styles.heroIconWrap}>
|
|
@@ -426,7 +414,7 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
426
414
|
</View>
|
|
427
415
|
</View>
|
|
428
416
|
|
|
429
|
-
|
|
417
|
+
|
|
430
418
|
<View style={styles.heroMetricsStrip}>
|
|
431
419
|
<View style={styles.heroMetricItem}>
|
|
432
420
|
<Text style={styles.heroMetricLabel} numberOfLines={1} ellipsizeMode="tail">IP ADDRESS</Text>
|
|
@@ -449,7 +437,7 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
449
437
|
</View>
|
|
450
438
|
</View>
|
|
451
439
|
|
|
452
|
-
|
|
440
|
+
|
|
453
441
|
{(activeSubTab === 'overview' || search.length > 0) && (<View style={styles.sectionCard}>
|
|
454
442
|
<Text style={styles.sectionTitle}>DEVICE OVERVIEW</Text>
|
|
455
443
|
{isMatch('Device Model') && (<InfoRow label="Device Model" value={fullDeviceData.hardware.model}/>)}
|
|
@@ -465,7 +453,7 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
465
453
|
{isMatch('UDID Identifier') && (<InfoRow label="Pseudo-UDID" value={pseudoUDID} isLast/>)}
|
|
466
454
|
</View>)}
|
|
467
455
|
|
|
468
|
-
|
|
456
|
+
|
|
469
457
|
{(activeSubTab === 'hardware' || search.length > 0) && (<View style={styles.sectionCard}>
|
|
470
458
|
<Text style={styles.sectionTitle}>HARDWARE & SYSTEM SPECIFICATIONS</Text>
|
|
471
459
|
{isMatch('CPU Architecture') && (<InfoRow label="CPU Architecture / ABI" value={fullDeviceData.hardware.cpuAbi} badge={{ text: '64-BIT', color: AppColors.purple, bg: `${AppColors.purple}18` }}/>)}
|
|
@@ -486,7 +474,7 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
486
474
|
{isMatch('Thermal State') && (<InfoRow label="Thermal State" value="Nominal (Cool)" badge={{ text: 'OPTIMAL', color: AppColors.emerald500, bg: `${AppColors.emerald500}18` }} isLast/>)}
|
|
487
475
|
</View>)}
|
|
488
476
|
|
|
489
|
-
|
|
477
|
+
|
|
490
478
|
{(activeSubTab === 'network' || search.length > 0) && (<View style={styles.sectionCard}>
|
|
491
479
|
<Text style={styles.sectionTitle}>NETWORK & CONNECTIVITY</Text>
|
|
492
480
|
{isMatch('IP Address') && (<InfoRow label="Local Device IP" value={ipAddress} badge={{ text: 'IPV4', color: AppColors.blue500, bg: `${AppColors.blue500}18` }}/>)}
|
|
@@ -499,7 +487,7 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
499
487
|
{isMatch('Network Inspector Interceptor') && (<InfoRow label="Network Interceptor Status" value="Intercepting XHR & Fetch" badge={{ text: 'MONITORING', color: AppColors.purple, bg: `${AppColors.purple}18` }} isLast/>)}
|
|
500
488
|
</View>)}
|
|
501
489
|
|
|
502
|
-
|
|
490
|
+
|
|
503
491
|
{(activeSubTab === 'display' || search.length > 0) && (<View style={styles.sectionCard}>
|
|
504
492
|
<Text style={styles.sectionTitle}>DISPLAY & SCREEN GEOMETRY</Text>
|
|
505
493
|
{isMatch('Window Resolution') && (<InfoRow label="Window Logical Size" value={`${windowDims.width.toFixed(0)} × ${windowDims.height.toFixed(0)} pt`}/>)}
|
|
@@ -515,7 +503,7 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
515
503
|
{isMatch('Status Bar Height') && (<InfoRow label="Status Bar Inset" value={`${statusBarHeight} pt`} isLast/>)}
|
|
516
504
|
</View>)}
|
|
517
505
|
|
|
518
|
-
|
|
506
|
+
|
|
519
507
|
{(activeSubTab === 'runtime' || search.length > 0) && (<View style={styles.sectionCard}>
|
|
520
508
|
<Text style={styles.sectionTitle}>RUNTIME & APPLICATION</Text>
|
|
521
509
|
{isMatch('App Name') && (<InfoRow label="Application Name" value={fullDeviceData.runtime.appName}/>)}
|
|
@@ -543,7 +531,7 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
543
531
|
{isMatch('Session Uptime') && (<InfoRow label="Inspector Session Uptime" value={deviceUptime} isLast/>)}
|
|
544
532
|
</View>)}
|
|
545
533
|
|
|
546
|
-
|
|
534
|
+
|
|
547
535
|
{(activeSubTab === 'security' || search.length > 0) && (<View style={styles.sectionCard}>
|
|
548
536
|
<Text style={styles.sectionTitle}>DEVICE IDENTIFIERS & SECURITY</Text>
|
|
549
537
|
{isMatch('Pseudo-UDID') && (<InfoRow label="Deterministic Pseudo-UDID" value={pseudoUDID} subtext="Stable hardware signature hash for testing & diagnostics" badge={{ text: 'PERSISTENT', color: AppColors.purple, bg: `${AppColors.purple}18` }}/>)}
|
|
@@ -557,7 +545,7 @@ export const DeviceInfoTab = React.memo(() => {
|
|
|
557
545
|
{isMatch('Sandbox Integrity') && (<InfoRow label="App Sandbox File Isolation" value="Enforced by OS Kernel" isLast/>)}
|
|
558
546
|
</View>)}
|
|
559
547
|
|
|
560
|
-
|
|
548
|
+
|
|
561
549
|
{search.trim().length > 0 && !hasAnyMatch && (<View style={styles.emptySearchCard}>
|
|
562
550
|
<SearchIcon size={26} color={AppColors.grayTextWeak}/>
|
|
563
551
|
<Text style={styles.emptySearchTitle}>No matching device specifications</Text>
|
|
@@ -16,7 +16,7 @@ const FabLauncher = () => {
|
|
|
16
16
|
}} hitSlop={10}>
|
|
17
17
|
<Animated.View style={[styles.fabPulseRing, { transform: [{ scale: pulseAnim }] }]}/>
|
|
18
18
|
<BrandCircleIcon size={62}/>
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
<View pointerEvents="none" style={styles.fabShineClip}>
|
|
21
21
|
<Animated.View style={[
|
|
22
22
|
styles.fabShineStreak,
|
|
@@ -36,7 +36,7 @@ const InspectorHeader = React.memo(() => {
|
|
|
36
36
|
if (clean === 'DEV' || clean.includes('DEV') || clean === 'LOCAL') {
|
|
37
37
|
return {
|
|
38
38
|
label: rawEnv,
|
|
39
|
-
bg: `${AppColors.emerald500}40`,
|
|
39
|
+
bg: `${AppColors.emerald500}40`,
|
|
40
40
|
border: `${AppColors.emerald400}8C`,
|
|
41
41
|
text: AppColors.mintGreenBorder,
|
|
42
42
|
};
|
|
@@ -44,7 +44,7 @@ const InspectorHeader = React.memo(() => {
|
|
|
44
44
|
if (clean === 'UAT' || clean === 'QA' || clean === 'TEST') {
|
|
45
45
|
return {
|
|
46
46
|
label: rawEnv,
|
|
47
|
-
bg: `${AppColors.amber500}47`,
|
|
47
|
+
bg: `${AppColors.amber500}47`,
|
|
48
48
|
border: `${AppColors.amber400}99`,
|
|
49
49
|
text: AppColors.amberWarmBorder,
|
|
50
50
|
};
|
|
@@ -52,15 +52,14 @@ const InspectorHeader = React.memo(() => {
|
|
|
52
52
|
if (clean === 'PREPROD' || clean === 'STAGE' || clean === 'STAGING') {
|
|
53
53
|
return {
|
|
54
54
|
label: rawEnv,
|
|
55
|
-
bg: `${AppColors.purple500}47`,
|
|
55
|
+
bg: `${AppColors.purple500}47`,
|
|
56
56
|
border: `${AppColors.purple400}99`,
|
|
57
57
|
text: AppColors.violetSoftBorder,
|
|
58
58
|
};
|
|
59
59
|
}
|
|
60
|
-
// PROD / Live
|
|
61
60
|
return {
|
|
62
61
|
label: rawEnv,
|
|
63
|
-
bg: `${AppColors.rose500}40`,
|
|
62
|
+
bg: `${AppColors.rose500}40`,
|
|
64
63
|
border: `${AppColors.roseBorder}8C`,
|
|
65
64
|
text: AppColors.errorBorder,
|
|
66
65
|
};
|
|
@@ -139,7 +138,7 @@ const InspectorHeader = React.memo(() => {
|
|
|
139
138
|
},
|
|
140
139
|
!isAnySelected && { display: 'none' },
|
|
141
140
|
]}>
|
|
142
|
-
|
|
141
|
+
|
|
143
142
|
<View style={{
|
|
144
143
|
position: 'absolute',
|
|
145
144
|
width: 48,
|
|
@@ -254,7 +253,7 @@ const InspectorHeader = React.memo(() => {
|
|
|
254
253
|
</Pressable>)}
|
|
255
254
|
</View>
|
|
256
255
|
|
|
257
|
-
|
|
256
|
+
|
|
258
257
|
<View style={{
|
|
259
258
|
flexDirection: 'row',
|
|
260
259
|
alignItems: 'center',
|
|
@@ -663,7 +662,7 @@ const InspectorHeader = React.memo(() => {
|
|
|
663
662
|
</View>
|
|
664
663
|
</LinearGradient>
|
|
665
664
|
|
|
666
|
-
|
|
665
|
+
|
|
667
666
|
<UpdateAvailableModal visible={showUpdateModal} latestVersion={latestNpmVersion} onClose={() => setShowUpdateModal(false)}/>
|
|
668
667
|
</>);
|
|
669
668
|
});
|