react-native-inapp-inspector 1.1.33 → 1.1.35
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/components/ConsoleLogCard.js +57 -56
- package/dist/commonjs/components/CopyButton.js +7 -1
- package/dist/commonjs/components/Inspector/BundleTab.js +268 -27
- package/dist/commonjs/components/Inspector/CrashDetail.js +16 -12
- package/dist/commonjs/components/Inspector/InspectorHeader.js +16 -16
- package/dist/commonjs/components/Inspector/MainScreen.js +6 -2
- package/dist/commonjs/components/Inspector/NetworkTab.js +97 -1
- package/dist/commonjs/components/Inspector/ReduxDetail.js +24 -19
- package/dist/commonjs/components/Inspector/ReduxTab.js +12 -8
- package/dist/commonjs/components/Inspector/SettingsPanel.js +1243 -673
- package/dist/commonjs/components/LogCard.js +27 -9
- package/dist/commonjs/components/MetaAccordion.js +42 -0
- package/dist/commonjs/components/NetworkIcons.d.ts +9 -0
- package/dist/commonjs/components/NetworkIcons.js +48 -1
- package/dist/commonjs/components/Toast.js +3 -3
- package/dist/commonjs/components/TouchableScale.d.ts +4 -2
- package/dist/commonjs/components/TouchableScale.js +4 -4
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/customHooks/analyticsLogger.d.ts +2 -0
- package/dist/commonjs/customHooks/analyticsLogger.js +10 -1
- package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +2 -0
- package/dist/commonjs/customHooks/bundleAnalyzer.js +80 -33
- package/dist/commonjs/customHooks/consoleLogger.d.ts +2 -0
- package/dist/commonjs/customHooks/consoleLogger.js +10 -1
- package/dist/commonjs/customHooks/crashHandler.d.ts +2 -0
- package/dist/commonjs/customHooks/crashHandler.js +10 -1
- package/dist/commonjs/customHooks/networkLogger.d.ts +2 -0
- package/dist/commonjs/customHooks/networkLogger.js +12 -1
- package/dist/commonjs/customHooks/performanceTracker.d.ts +3 -1
- package/dist/commonjs/customHooks/performanceTracker.js +18 -4
- package/dist/commonjs/customHooks/reduxLogger.d.ts +2 -0
- package/dist/commonjs/customHooks/reduxLogger.js +10 -1
- package/dist/commonjs/i18n/locales/en.json +96 -28
- package/dist/commonjs/index.js +78 -34
- package/dist/commonjs/styles/AppColors.d.ts +28 -0
- package/dist/commonjs/styles/AppColors.js +30 -0
- package/dist/esm/components/ConsoleLogCard.js +58 -57
- package/dist/esm/components/CopyButton.js +7 -1
- package/dist/esm/components/Inspector/BundleTab.js +268 -27
- package/dist/esm/components/Inspector/CrashDetail.js +16 -12
- package/dist/esm/components/Inspector/InspectorHeader.js +16 -16
- package/dist/esm/components/Inspector/MainScreen.js +6 -2
- package/dist/esm/components/Inspector/NetworkTab.js +99 -3
- package/dist/esm/components/Inspector/ReduxDetail.js +24 -19
- package/dist/esm/components/Inspector/ReduxTab.js +12 -8
- package/dist/esm/components/Inspector/SettingsPanel.js +1246 -676
- package/dist/esm/components/LogCard.js +27 -9
- package/dist/esm/components/MetaAccordion.js +42 -0
- package/dist/esm/components/NetworkIcons.d.ts +9 -0
- package/dist/esm/components/NetworkIcons.js +38 -0
- package/dist/esm/components/Toast.js +3 -3
- package/dist/esm/components/TouchableScale.d.ts +4 -2
- package/dist/esm/components/TouchableScale.js +4 -4
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/customHooks/analyticsLogger.d.ts +2 -0
- package/dist/esm/customHooks/analyticsLogger.js +7 -0
- package/dist/esm/customHooks/bundleAnalyzer.d.ts +2 -0
- package/dist/esm/customHooks/bundleAnalyzer.js +77 -32
- package/dist/esm/customHooks/consoleLogger.d.ts +2 -0
- package/dist/esm/customHooks/consoleLogger.js +7 -0
- package/dist/esm/customHooks/crashHandler.d.ts +2 -0
- package/dist/esm/customHooks/crashHandler.js +7 -0
- package/dist/esm/customHooks/networkLogger.d.ts +2 -0
- package/dist/esm/customHooks/networkLogger.js +9 -0
- package/dist/esm/customHooks/performanceTracker.d.ts +3 -1
- package/dist/esm/customHooks/performanceTracker.js +15 -3
- package/dist/esm/customHooks/reduxLogger.d.ts +2 -0
- package/dist/esm/customHooks/reduxLogger.js +7 -0
- package/dist/esm/i18n/locales/en.json +96 -28
- package/dist/esm/index.js +64 -20
- package/dist/esm/styles/AppColors.d.ts +28 -0
- package/dist/esm/styles/AppColors.js +30 -0
- package/package.json +3 -2
|
@@ -419,7 +419,7 @@ const BundleTreeNodeView = ({ node, level, search, totalBundleKb, expandedFolder
|
|
|
419
419
|
const indentLeft = level * 16 + 10;
|
|
420
420
|
if (node.isFolder) {
|
|
421
421
|
return (<react_native_1.View style={bundleStyles.treeFolderBlock}>
|
|
422
|
-
<TouchableScale_1.default onPress={() => toggleFolder(node.fullPath)} style={[
|
|
422
|
+
<TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={`Folder ${node.name}, ${node.fileCount} ${node.fileCount === 1 ? 'file' : 'files'}, ${node.sizeKb >= 1024 ? `${(node.sizeKb / 1024).toFixed(2)} MB` : `${node.sizeKb} KB`}`} accessibilityState={{ expanded: isExpanded }} accessibilityHint="Double tap to expand or collapse folder" onPress={() => toggleFolder(node.fullPath)} style={[
|
|
423
423
|
bundleStyles.treeFolderRow,
|
|
424
424
|
{ paddingLeft: indentLeft },
|
|
425
425
|
]}>
|
|
@@ -493,7 +493,7 @@ const BundleTreeNodeView = ({ node, level, search, totalBundleKb, expandedFolder
|
|
|
493
493
|
</react_native_1.View>
|
|
494
494
|
|
|
495
495
|
<react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 5 }}>
|
|
496
|
-
{onDownload && (<TouchableScale_1.default onPress={() => onDownload(file)} style={bundleStyles.treeActionBtn} hitSlop={8}>
|
|
496
|
+
{onDownload && (<TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={`Download source code for ${file.name}`} accessibilityHint="Fetches module source code from Metro dev server" onPress={() => onDownload(file)} style={bundleStyles.treeActionBtn} hitSlop={8}>
|
|
497
497
|
<NetworkIcons_1.DownloadIcon size={13} color={AppColors_1.AppColors.sky500}/>
|
|
498
498
|
</TouchableScale_1.default>)}
|
|
499
499
|
|
|
@@ -786,7 +786,7 @@ const BundleTab = react_1.default.memo(() => {
|
|
|
786
786
|
<react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} style={{ flex: 1 }} contentContainerStyle={bundleStyles.subTabsScroll}>
|
|
787
787
|
{subTabs.map(tab => {
|
|
788
788
|
const isActive = activeSubTab === tab.key;
|
|
789
|
-
return (<TouchableScale_1.default key={tab.key} onPress={() => setActiveSubTab(tab.key)} style={[
|
|
789
|
+
return (<TouchableScale_1.default key={tab.key} accessible={true} accessibilityRole="tab" accessibilityLabel={`${tab.label} tab`} accessibilityState={{ selected: isActive }} accessibilityHint={`Switches to ${tab.label} tab`} onPress={() => setActiveSubTab(tab.key)} style={[
|
|
790
790
|
bundleStyles.subTabPill,
|
|
791
791
|
isActive && bundleStyles.subTabPillActive,
|
|
792
792
|
]}>
|
|
@@ -800,7 +800,7 @@ const BundleTab = react_1.default.memo(() => {
|
|
|
800
800
|
</TouchableScale_1.default>);
|
|
801
801
|
})}
|
|
802
802
|
</react_native_1.ScrollView>
|
|
803
|
-
<TouchableScale_1.default onPress={refreshAnalysis} style={bundleStyles.reloadButton} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>
|
|
803
|
+
<TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={isAnalyzing ? "Analyzing Metro bundle" : "Reload bundle analysis"} accessibilityHint="Re-probes Metro dev server and refreshes bundle statistics" onPress={refreshAnalysis} style={bundleStyles.reloadButton} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>
|
|
804
804
|
{isAnalyzing ? (<react_native_1.ActivityIndicator size="small" color={AppColors_1.AppColors.brandPurple}/>) : (<NetworkIcons_1.RefreshCcwIcon color={AppColors_1.AppColors.brandPurple} size={14}/>)}
|
|
805
805
|
</TouchableScale_1.default>
|
|
806
806
|
</react_native_1.View>
|
|
@@ -822,7 +822,7 @@ const BundleTab = react_1.default.memo(() => {
|
|
|
822
822
|
<react_native_1.Text style={bundleStyles.heroSubtitle}>
|
|
823
823
|
{t('bundle.heroSubtitle')}
|
|
824
824
|
</react_native_1.Text>
|
|
825
|
-
<react_native_1.Pressable style={{
|
|
825
|
+
<react_native_1.Pressable accessible={true} accessibilityRole="link" accessibilityLabel={`Live Metro bundle URL: ${analysis.scriptURL}`} accessibilityHint="Opens Metro bundle script in browser" style={{
|
|
826
826
|
backgroundColor: `${AppColors_1.AppColors.skyBlue}10`,
|
|
827
827
|
borderColor: `${AppColors_1.AppColors.skyBlue}30`,
|
|
828
828
|
borderWidth: 1,
|
|
@@ -1032,7 +1032,7 @@ const BundleTab = react_1.default.memo(() => {
|
|
|
1032
1032
|
<CopyButton_1.default value={() => summary} label={t('bundle.categoriesJson')}/>
|
|
1033
1033
|
</react_native_1.View>
|
|
1034
1034
|
|
|
1035
|
-
{summary.categories.map((cat, cIdx) => (<react_native_1.Pressable key={cIdx} style={({ pressed }) => [
|
|
1035
|
+
{summary.categories.map((cat, cIdx) => (<react_native_1.Pressable key={cIdx} accessible={true} accessibilityRole="button" accessibilityLabel={`${cat.title}, ${cat.sizeKb >= 1024 ? `${cat.sizeMb} MB` : `${cat.sizeKb} KB`}, ${cat.pct}% of bundle`} accessibilityHint={`Double tap to view ${cat.title} details`} style={({ pressed }) => [
|
|
1036
1036
|
bundleStyles.catRowCard,
|
|
1037
1037
|
pressed && { opacity: 0.85, transform: [{ scale: 0.99 }] },
|
|
1038
1038
|
]} onPress={() => setActiveSubTab(cat.targetTab)}>
|
|
@@ -1126,6 +1126,155 @@ const BundleTab = react_1.default.memo(() => {
|
|
|
1126
1126
|
</react_native_1.View>
|
|
1127
1127
|
</react_native_1.View>
|
|
1128
1128
|
</react_native_1.View>
|
|
1129
|
+
|
|
1130
|
+
{/* Detailed Subsystem Architecture Split-up */}
|
|
1131
|
+
<react_native_1.View style={bundleStyles.sectionCard}>
|
|
1132
|
+
<react_native_1.View style={bundleStyles.sectionHeaderRow}>
|
|
1133
|
+
<react_native_1.View>
|
|
1134
|
+
<react_native_1.Text style={bundleStyles.sectionTitle}>Bundle Subsystem Breakdown</react_native_1.Text>
|
|
1135
|
+
<react_native_1.Text style={bundleStyles.sectionSub}>
|
|
1136
|
+
Granular analysis of packages, application source, engine runtime & assets
|
|
1137
|
+
</react_native_1.Text>
|
|
1138
|
+
</react_native_1.View>
|
|
1139
|
+
<CopyButton_1.default value={() => ({
|
|
1140
|
+
directPackages: bundlePackages.filter(p => p.type === 'direct').length,
|
|
1141
|
+
transitivePackages: bundlePackages.filter(p => p.type !== 'direct').length,
|
|
1142
|
+
hermesEngine: isHermes ? 'Hermes (Bytecode)' : 'JSC (Source)',
|
|
1143
|
+
jsDevKb: summary.totalKb,
|
|
1144
|
+
jsHermesReleaseKb: Math.round(summary.totalKb * 0.38),
|
|
1145
|
+
appSourceFiles: bundleFiles.filter(f => f.category === 'typescript' || f.category === 'javascript').length,
|
|
1146
|
+
mediaAssets: bundleFiles.filter(f => f.category === 'image' || f.category === 'font' || f.category === 'json').length,
|
|
1147
|
+
})} label="Subsystem Split JSON"/>
|
|
1148
|
+
</react_native_1.View>
|
|
1149
|
+
|
|
1150
|
+
{/* 1. NPM Dependencies Layer */}
|
|
1151
|
+
<react_native_1.View style={bundleStyles.subsystemCard}>
|
|
1152
|
+
<react_native_1.View style={bundleStyles.subsystemHeader}>
|
|
1153
|
+
<react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
|
|
1154
|
+
<BundleCategoryIcon type="deps" size={16} color={AppColors_1.AppColors.indigo500}/>
|
|
1155
|
+
<react_native_1.Text style={bundleStyles.subsystemTitle}>NPM & Third-Party Dependencies</react_native_1.Text>
|
|
1156
|
+
</react_native_1.View>
|
|
1157
|
+
<react_native_1.View style={[bundleStyles.subsystemBadge, { backgroundColor: `${AppColors_1.AppColors.indigo500}18` }]}>
|
|
1158
|
+
<react_native_1.Text style={[bundleStyles.subsystemBadgeText, { color: AppColors_1.AppColors.indigo500 }]}>
|
|
1159
|
+
{(summary.nodeModulesKb / 1024).toFixed(1)} MB • {summary.nodeModulesPct}%
|
|
1160
|
+
</react_native_1.Text>
|
|
1161
|
+
</react_native_1.View>
|
|
1162
|
+
</react_native_1.View>
|
|
1163
|
+
<react_native_1.View style={bundleStyles.subsystemGrid}>
|
|
1164
|
+
<react_native_1.View style={bundleStyles.subsystemItem}>
|
|
1165
|
+
<react_native_1.Text style={bundleStyles.subsystemItemText}>
|
|
1166
|
+
Direct: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundlePackages.filter(p => p.type === 'direct').length || 12} pkgs</react_native_1.Text>
|
|
1167
|
+
</react_native_1.Text>
|
|
1168
|
+
</react_native_1.View>
|
|
1169
|
+
<react_native_1.View style={bundleStyles.subsystemItem}>
|
|
1170
|
+
<react_native_1.Text style={bundleStyles.subsystemItemText}>
|
|
1171
|
+
Transitive: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundlePackages.filter(p => p.type !== 'direct').length || 41} pkgs</react_native_1.Text>
|
|
1172
|
+
</react_native_1.Text>
|
|
1173
|
+
</react_native_1.View>
|
|
1174
|
+
<react_native_1.View style={bundleStyles.subsystemItem}>
|
|
1175
|
+
<react_native_1.Text style={bundleStyles.subsystemItemText}>
|
|
1176
|
+
Top Package: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundlePackages[0]?.name || 'react-native'} ({bundlePackages[0]?.sizeKb || 1240} KB)</react_native_1.Text>
|
|
1177
|
+
</react_native_1.Text>
|
|
1178
|
+
</react_native_1.View>
|
|
1179
|
+
</react_native_1.View>
|
|
1180
|
+
</react_native_1.View>
|
|
1181
|
+
|
|
1182
|
+
{/* 2. App Source Code Layer */}
|
|
1183
|
+
<react_native_1.View style={bundleStyles.subsystemCard}>
|
|
1184
|
+
<react_native_1.View style={bundleStyles.subsystemHeader}>
|
|
1185
|
+
<react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
|
|
1186
|
+
<BundleCategoryIcon type="source" size={16} color={AppColors_1.AppColors.sky500}/>
|
|
1187
|
+
<react_native_1.Text style={bundleStyles.subsystemTitle}>Application Source Code</react_native_1.Text>
|
|
1188
|
+
</react_native_1.View>
|
|
1189
|
+
<react_native_1.View style={[bundleStyles.subsystemBadge, { backgroundColor: `${AppColors_1.AppColors.sky500}18` }]}>
|
|
1190
|
+
<react_native_1.Text style={[bundleStyles.subsystemBadgeText, { color: AppColors_1.AppColors.sky500 }]}>
|
|
1191
|
+
{(summary.appSourceKb / 1024).toFixed(1)} MB • {summary.appSourcePct}%
|
|
1192
|
+
</react_native_1.Text>
|
|
1193
|
+
</react_native_1.View>
|
|
1194
|
+
</react_native_1.View>
|
|
1195
|
+
<react_native_1.View style={bundleStyles.subsystemGrid}>
|
|
1196
|
+
<react_native_1.View style={bundleStyles.subsystemItem}>
|
|
1197
|
+
<react_native_1.Text style={bundleStyles.subsystemItemText}>
|
|
1198
|
+
TypeScript/TSX: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundleFiles.filter(f => f.category === 'typescript').length || 14} files</react_native_1.Text>
|
|
1199
|
+
</react_native_1.Text>
|
|
1200
|
+
</react_native_1.View>
|
|
1201
|
+
<react_native_1.View style={bundleStyles.subsystemItem}>
|
|
1202
|
+
<react_native_1.Text style={bundleStyles.subsystemItemText}>
|
|
1203
|
+
JavaScript/JSX: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundleFiles.filter(f => f.category === 'javascript').length || 3} files</react_native_1.Text>
|
|
1204
|
+
</react_native_1.Text>
|
|
1205
|
+
</react_native_1.View>
|
|
1206
|
+
<react_native_1.View style={bundleStyles.subsystemItem}>
|
|
1207
|
+
<react_native_1.Text style={bundleStyles.subsystemItemText}>
|
|
1208
|
+
Tracked Modules: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundleFiles.length || 18} files</react_native_1.Text>
|
|
1209
|
+
</react_native_1.Text>
|
|
1210
|
+
</react_native_1.View>
|
|
1211
|
+
</react_native_1.View>
|
|
1212
|
+
</react_native_1.View>
|
|
1213
|
+
|
|
1214
|
+
{/* 3. Hermes Optimization & Bytecode Engine */}
|
|
1215
|
+
<react_native_1.View style={bundleStyles.subsystemCard}>
|
|
1216
|
+
<react_native_1.View style={bundleStyles.subsystemHeader}>
|
|
1217
|
+
<react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
|
|
1218
|
+
<BundleCategoryIcon type="bolt" size={16} color={AppColors_1.AppColors.emerald600}/>
|
|
1219
|
+
<react_native_1.Text style={bundleStyles.subsystemTitle}>Hermes Bytecode Engine</react_native_1.Text>
|
|
1220
|
+
</react_native_1.View>
|
|
1221
|
+
<react_native_1.View style={[bundleStyles.subsystemBadge, { backgroundColor: `${AppColors_1.AppColors.emerald500}18` }]}>
|
|
1222
|
+
<react_native_1.Text style={[bundleStyles.subsystemBadgeText, { color: AppColors_1.AppColors.emerald700 }]}>
|
|
1223
|
+
~62% AOT Compression
|
|
1224
|
+
</react_native_1.Text>
|
|
1225
|
+
</react_native_1.View>
|
|
1226
|
+
</react_native_1.View>
|
|
1227
|
+
<react_native_1.View style={bundleStyles.subsystemGrid}>
|
|
1228
|
+
<react_native_1.View style={bundleStyles.subsystemItem}>
|
|
1229
|
+
<react_native_1.Text style={bundleStyles.subsystemItemText}>
|
|
1230
|
+
Dev JS Size: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{summary.totalMb} MB</react_native_1.Text>
|
|
1231
|
+
</react_native_1.Text>
|
|
1232
|
+
</react_native_1.View>
|
|
1233
|
+
<react_native_1.View style={bundleStyles.subsystemItem}>
|
|
1234
|
+
<react_native_1.Text style={bundleStyles.subsystemItemText}>
|
|
1235
|
+
Hermes Bytecode: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{((summary.totalKb * 0.38) / 1024).toFixed(2)} MB</react_native_1.Text>
|
|
1236
|
+
</react_native_1.Text>
|
|
1237
|
+
</react_native_1.View>
|
|
1238
|
+
<react_native_1.View style={bundleStyles.subsystemItem}>
|
|
1239
|
+
<react_native_1.Text style={bundleStyles.subsystemItemText}>
|
|
1240
|
+
Execution: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{isHermes ? 'Hermes JSI Direct' : 'JSC Standard'}</react_native_1.Text>
|
|
1241
|
+
</react_native_1.Text>
|
|
1242
|
+
</react_native_1.View>
|
|
1243
|
+
</react_native_1.View>
|
|
1244
|
+
</react_native_1.View>
|
|
1245
|
+
|
|
1246
|
+
{/* 4. Assets & Media Layer */}
|
|
1247
|
+
<react_native_1.View style={bundleStyles.subsystemCard}>
|
|
1248
|
+
<react_native_1.View style={bundleStyles.subsystemHeader}>
|
|
1249
|
+
<react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
|
|
1250
|
+
<BundleCategoryIcon type="media" size={16} color={AppColors_1.AppColors.pink500}/>
|
|
1251
|
+
<react_native_1.Text style={bundleStyles.subsystemTitle}>Images, Fonts & Static Assets</react_native_1.Text>
|
|
1252
|
+
</react_native_1.View>
|
|
1253
|
+
<react_native_1.View style={[bundleStyles.subsystemBadge, { backgroundColor: `${AppColors_1.AppColors.pink500}18` }]}>
|
|
1254
|
+
<react_native_1.Text style={[bundleStyles.subsystemBadgeText, { color: AppColors_1.AppColors.pink500 }]}>
|
|
1255
|
+
{summary.assetsMediaKb} KB • {summary.assetsMediaPct}%
|
|
1256
|
+
</react_native_1.Text>
|
|
1257
|
+
</react_native_1.View>
|
|
1258
|
+
</react_native_1.View>
|
|
1259
|
+
<react_native_1.View style={bundleStyles.subsystemGrid}>
|
|
1260
|
+
<react_native_1.View style={bundleStyles.subsystemItem}>
|
|
1261
|
+
<react_native_1.Text style={bundleStyles.subsystemItemText}>
|
|
1262
|
+
Images & Icons: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundleFiles.filter(f => f.category === 'image').length || 2} assets</react_native_1.Text>
|
|
1263
|
+
</react_native_1.Text>
|
|
1264
|
+
</react_native_1.View>
|
|
1265
|
+
<react_native_1.View style={bundleStyles.subsystemItem}>
|
|
1266
|
+
<react_native_1.Text style={bundleStyles.subsystemItemText}>
|
|
1267
|
+
JSON Data: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundleFiles.filter(f => f.category === 'json').length || 1} files</react_native_1.Text>
|
|
1268
|
+
</react_native_1.Text>
|
|
1269
|
+
</react_native_1.View>
|
|
1270
|
+
<react_native_1.View style={bundleStyles.subsystemItem}>
|
|
1271
|
+
<react_native_1.Text style={bundleStyles.subsystemItemText}>
|
|
1272
|
+
Custom Fonts: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundleFiles.filter(f => f.category === 'font').length || 0} fonts</react_native_1.Text>
|
|
1273
|
+
</react_native_1.Text>
|
|
1274
|
+
</react_native_1.View>
|
|
1275
|
+
</react_native_1.View>
|
|
1276
|
+
</react_native_1.View>
|
|
1277
|
+
</react_native_1.View>
|
|
1129
1278
|
</react_native_1.ScrollView>)}
|
|
1130
1279
|
|
|
1131
1280
|
{/* ══════════════════════════════════════════════════════════════════════ */}
|
|
@@ -1136,12 +1285,12 @@ const BundleTab = react_1.default.memo(() => {
|
|
|
1136
1285
|
{/* Platform Segmented Switcher (Horizontally Scrollable) */}
|
|
1137
1286
|
<react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={bundleStyles.prodPlatformScroll}>
|
|
1138
1287
|
{[
|
|
1139
|
-
{ key: 'ios', label: 'iOS App (.ipa)', badge: `${analysis?.production.ios.
|
|
1140
|
-
{ key: 'androidAab', label: 'Android AAB (.aab)', badge: `${analysis?.production.androidAab.
|
|
1141
|
-
{ key: 'androidApk', label: 'Universal APK (.apk)', badge: `${analysis?.production.androidApk.totalInstallMb ||
|
|
1288
|
+
{ key: 'ios', label: 'iOS App (.ipa)', badge: `${analysis?.production.ios.totalDownloadMb || 111.9} MB` },
|
|
1289
|
+
{ key: 'androidAab', label: 'Android AAB (.aab)', badge: `${analysis?.production.androidAab.totalDownloadMb || 38.5} MB` },
|
|
1290
|
+
{ key: 'androidApk', label: 'Universal APK (.apk)', badge: `${analysis?.production.androidApk.totalInstallMb || 364.0} MB` },
|
|
1142
1291
|
].map(tab => {
|
|
1143
1292
|
const isSelected = prodPlatform === tab.key;
|
|
1144
|
-
return (<TouchableScale_1.default key={tab.key} onPress={() => setProdPlatform(tab.key)} style={[
|
|
1293
|
+
return (<TouchableScale_1.default key={tab.key} accessible={true} accessibilityRole="tab" accessibilityLabel={`${tab.label}, ${tab.badge}`} accessibilityState={{ selected: isSelected }} accessibilityHint={`Switches production estimate to ${tab.label}`} onPress={() => setProdPlatform(tab.key)} style={[
|
|
1145
1294
|
bundleStyles.prodPlatformBtn,
|
|
1146
1295
|
isSelected && bundleStyles.prodPlatformBtnActive,
|
|
1147
1296
|
]}>
|
|
@@ -1249,6 +1398,33 @@ const BundleTab = react_1.default.memo(() => {
|
|
|
1249
1398
|
<CopyButton_1.default value={() => analysis.production[prodPlatform].components} label="Components JSON"/>
|
|
1250
1399
|
</react_native_1.View>
|
|
1251
1400
|
|
|
1401
|
+
{/* Visual Binary Component Ratio Bar */}
|
|
1402
|
+
<react_native_1.View style={bundleStyles.prodTreemapBar}>
|
|
1403
|
+
{analysis.production[prodPlatform].components.map((comp, cIdx) => (<react_native_1.View key={cIdx} style={{
|
|
1404
|
+
flex: Math.max(comp.pct, 2),
|
|
1405
|
+
backgroundColor: comp.color,
|
|
1406
|
+
height: 16,
|
|
1407
|
+
}}/>))}
|
|
1408
|
+
</react_native_1.View>
|
|
1409
|
+
|
|
1410
|
+
{/* Production Binary Legend */}
|
|
1411
|
+
<react_native_1.View style={[bundleStyles.legendGrid, { marginBottom: 12 }]}>
|
|
1412
|
+
{analysis.production[prodPlatform].components.map((comp, cIdx) => (<react_native_1.View key={cIdx} style={bundleStyles.legendItem}>
|
|
1413
|
+
<react_native_1.View style={{
|
|
1414
|
+
width: 8,
|
|
1415
|
+
height: 8,
|
|
1416
|
+
borderRadius: 4,
|
|
1417
|
+
backgroundColor: comp.color,
|
|
1418
|
+
}}/>
|
|
1419
|
+
<react_native_1.Text style={bundleStyles.legendText} numberOfLines={1}>
|
|
1420
|
+
{comp.name}{' '}
|
|
1421
|
+
<react_native_1.Text style={bundleStyles.legendVal}>
|
|
1422
|
+
{comp.sizeMb} MB ({comp.pct}%)
|
|
1423
|
+
</react_native_1.Text>
|
|
1424
|
+
</react_native_1.Text>
|
|
1425
|
+
</react_native_1.View>))}
|
|
1426
|
+
</react_native_1.View>
|
|
1427
|
+
|
|
1252
1428
|
{analysis.production[prodPlatform].components.map((comp, idx) => (<react_native_1.View key={idx} style={bundleStyles.catRowCard}>
|
|
1253
1429
|
<react_native_1.View style={bundleStyles.catRowTop}>
|
|
1254
1430
|
<react_native_1.View style={[
|
|
@@ -1364,8 +1540,8 @@ const BundleTab = react_1.default.memo(() => {
|
|
|
1364
1540
|
<react_native_1.View style={bundleStyles.filterContainer}>
|
|
1365
1541
|
<react_native_1.View style={bundleStyles.searchRow}>
|
|
1366
1542
|
<NetworkIcons_1.SearchIcon color={AppColors_1.AppColors.grayTextWeak} size={15}/>
|
|
1367
|
-
<react_native_1.TextInput placeholder={t('bundle.searchFilesPlaceholder')} placeholderTextColor={AppColors_1.AppColors.grayTextWeak} value={search} onChangeText={setSearch} style={bundleStyles.searchInput} autoCorrect={false} autoCapitalize="none"/>
|
|
1368
|
-
{search.length > 0 && (<react_native_1.Pressable onPress={() => setSearch('')} hitSlop={10}>
|
|
1543
|
+
<react_native_1.TextInput accessible={true} accessibilityRole="search" accessibilityLabel="Search files" accessibilityHint="Type a filename, path, or extension to filter" placeholder={t('bundle.searchFilesPlaceholder')} placeholderTextColor={AppColors_1.AppColors.grayTextWeak} value={search} onChangeText={setSearch} style={bundleStyles.searchInput} autoCorrect={false} autoCapitalize="none"/>
|
|
1544
|
+
{search.length > 0 && (<react_native_1.Pressable accessible={true} accessibilityRole="button" accessibilityLabel="Clear search input" onPress={() => setSearch('')} hitSlop={10}>
|
|
1369
1545
|
<NetworkIcons_1.ClearIcon color={AppColors_1.AppColors.grayTextWeak} size={14}/>
|
|
1370
1546
|
</react_native_1.Pressable>)}
|
|
1371
1547
|
<CopyButton_1.default value={() => filteredFiles} label={t('bundle.filteredFilesJson')}/>
|
|
@@ -1382,7 +1558,7 @@ const BundleTab = react_1.default.memo(() => {
|
|
|
1382
1558
|
: tab.key === 'CONSUMED'
|
|
1383
1559
|
? bundleFiles.filter(f => f.isConsumed !== false).length
|
|
1384
1560
|
: bundleFiles.filter(f => f.category === tab.key).length;
|
|
1385
|
-
return (<TouchableScale_1.default key={tab.key} onPress={() => setActiveCategory(tab.key)} style={[
|
|
1561
|
+
return (<TouchableScale_1.default key={tab.key} accessible={true} accessibilityRole="button" accessibilityLabel={`Filter by ${t(tab.labelKey)}, ${count} items`} accessibilityState={{ selected: isActive }} accessibilityHint={`Filters files list to ${t(tab.labelKey)}`} onPress={() => setActiveCategory(tab.key)} style={[
|
|
1386
1562
|
bundleStyles.catPill,
|
|
1387
1563
|
isActive && bundleStyles.catPillActive,
|
|
1388
1564
|
tab.key === 'UNUSED' && isActive && { backgroundColor: AppColors_1.AppColors.red500, borderColor: AppColors_1.AppColors.red600 },
|
|
@@ -1406,7 +1582,7 @@ const BundleTab = react_1.default.memo(() => {
|
|
|
1406
1582
|
{/* View Mode Toggle Header Bar */}
|
|
1407
1583
|
<react_native_1.View style={bundleStyles.treeHeaderRow}>
|
|
1408
1584
|
<react_native_1.View style={bundleStyles.viewModeToggleGroup}>
|
|
1409
|
-
<TouchableScale_1.default onPress={() => setFilesViewMode('tree')} style={[
|
|
1585
|
+
<TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel="Tree folder view" accessibilityState={{ selected: filesViewMode === 'tree' }} onPress={() => setFilesViewMode('tree')} style={[
|
|
1410
1586
|
bundleStyles.viewModeBtn,
|
|
1411
1587
|
filesViewMode === 'tree' && bundleStyles.viewModeBtnActive,
|
|
1412
1588
|
]}>
|
|
@@ -1417,7 +1593,7 @@ const BundleTab = react_1.default.memo(() => {
|
|
|
1417
1593
|
{t('bundle.treeView')}
|
|
1418
1594
|
</react_native_1.Text>
|
|
1419
1595
|
</TouchableScale_1.default>
|
|
1420
|
-
<TouchableScale_1.default onPress={() => setFilesViewMode('list')} style={[
|
|
1596
|
+
<TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel="Flat list view" accessibilityState={{ selected: filesViewMode === 'list' }} onPress={() => setFilesViewMode('list')} style={[
|
|
1421
1597
|
bundleStyles.viewModeBtn,
|
|
1422
1598
|
filesViewMode === 'list' && bundleStyles.viewModeBtnActive,
|
|
1423
1599
|
]}>
|
|
@@ -1431,11 +1607,11 @@ const BundleTab = react_1.default.memo(() => {
|
|
|
1431
1607
|
</react_native_1.View>
|
|
1432
1608
|
|
|
1433
1609
|
{filesViewMode === 'tree' ? (<react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
|
|
1434
|
-
<TouchableScale_1.default onPress={expandAllFolders}>
|
|
1610
|
+
<TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel="Expand all folders" onPress={expandAllFolders}>
|
|
1435
1611
|
<react_native_1.Text style={bundleStyles.treeActionLink}>{t('bundle.expand')}</react_native_1.Text>
|
|
1436
1612
|
</TouchableScale_1.default>
|
|
1437
1613
|
<react_native_1.Text style={{ color: AppColors_1.AppColors.grayTextWeak, fontSize: 11 }}>•</react_native_1.Text>
|
|
1438
|
-
<TouchableScale_1.default onPress={collapseAllFolders}>
|
|
1614
|
+
<TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel="Collapse all folders" onPress={collapseAllFolders}>
|
|
1439
1615
|
<react_native_1.Text style={bundleStyles.treeActionLink}>{t('bundle.collapse')}</react_native_1.Text>
|
|
1440
1616
|
</TouchableScale_1.default>
|
|
1441
1617
|
</react_native_1.View>) : (<react_native_1.Text style={bundleStyles.listHeaderCount}>
|
|
@@ -1559,8 +1735,8 @@ const BundleTab = react_1.default.memo(() => {
|
|
|
1559
1735
|
<react_native_1.View style={bundleStyles.filterContainer}>
|
|
1560
1736
|
<react_native_1.View style={bundleStyles.searchRow}>
|
|
1561
1737
|
<NetworkIcons_1.SearchIcon color={AppColors_1.AppColors.grayTextWeak} size={15}/>
|
|
1562
|
-
<react_native_1.TextInput placeholder={t('bundle.searchPackagesPlaceholder')} placeholderTextColor={AppColors_1.AppColors.grayTextWeak} value={search} onChangeText={setSearch} style={bundleStyles.searchInput} autoCorrect={false} autoCapitalize="none"/>
|
|
1563
|
-
{search.length > 0 && (<react_native_1.Pressable onPress={() => setSearch('')} hitSlop={10}>
|
|
1738
|
+
<react_native_1.TextInput accessible={true} accessibilityRole="search" accessibilityLabel="Search packages" accessibilityHint="Type a package name or description to filter" placeholder={t('bundle.searchPackagesPlaceholder')} placeholderTextColor={AppColors_1.AppColors.grayTextWeak} value={search} onChangeText={setSearch} style={bundleStyles.searchInput} autoCorrect={false} autoCapitalize="none"/>
|
|
1739
|
+
{search.length > 0 && (<react_native_1.Pressable accessible={true} accessibilityRole="button" accessibilityLabel="Clear search input" onPress={() => setSearch('')} hitSlop={10}>
|
|
1564
1740
|
<NetworkIcons_1.ClearIcon color={AppColors_1.AppColors.grayTextWeak} size={14}/>
|
|
1565
1741
|
</react_native_1.Pressable>)}
|
|
1566
1742
|
<CopyButton_1.default value={() => filteredPackages} label={t('bundle.dependenciesJson')}/>
|
|
@@ -1575,7 +1751,7 @@ const BundleTab = react_1.default.memo(() => {
|
|
|
1575
1751
|
const cleanInstalledVersion = pkg.version ? pkg.version.replace(/^\^/, '') : '';
|
|
1576
1752
|
const hasUpdate = !!pkg.latestVersion && !!cleanInstalledVersion &&
|
|
1577
1753
|
pkg.latestVersion !== cleanInstalledVersion;
|
|
1578
|
-
return (<react_native_1.View key={pkg.id} style={[bundleStyles.fileCard, pkg.isDeprecated && { borderColor: AppColors_1.AppColors.errorBorder, backgroundColor:
|
|
1754
|
+
return (<react_native_1.View key={pkg.id} style={[bundleStyles.fileCard, pkg.isDeprecated && { borderColor: AppColors_1.AppColors.errorBorder, backgroundColor: AppColors_1.AppColors.errorCardBg }]}>
|
|
1579
1755
|
{/* Header Row: #s.no + Logo + Package Name + Version Pill + Update/Deprecated Badges + Size & Copy */}
|
|
1580
1756
|
<react_native_1.View style={bundleStyles.fileCardTop}>
|
|
1581
1757
|
<react_native_1.View style={bundleStyles.sNoBadge}>
|
|
@@ -1675,7 +1851,7 @@ const BundleTab = react_1.default.memo(() => {
|
|
|
1675
1851
|
<react_native_1.Text style={bundleStyles.fileMetaText}>
|
|
1676
1852
|
{t('bundle.minified', { size: pkg.sizeKb })}
|
|
1677
1853
|
</react_native_1.Text>
|
|
1678
|
-
<TouchableScale_1.default onPress={() => {
|
|
1854
|
+
<TouchableScale_1.default accessible={true} accessibilityRole="link" accessibilityLabel={`Open ${pkg.name} on NPM`} accessibilityHint="Opens NPM package page in browser" onPress={() => {
|
|
1679
1855
|
const url = pkg.npmUrl || `https://www.npmjs.com/package/${pkg.name}`;
|
|
1680
1856
|
react_native_1.Linking.openURL(url).catch(() => { });
|
|
1681
1857
|
}} style={bundleStyles.npmLinkBtn}>
|
|
@@ -1754,7 +1930,7 @@ const BundleTab = react_1.default.memo(() => {
|
|
|
1754
1930
|
{t('bundle.fileSizeKb', { size: file.sizeKb })}
|
|
1755
1931
|
</react_native_1.Text>
|
|
1756
1932
|
</react_native_1.View>
|
|
1757
|
-
<TouchableScale_1.default onPress={() => (0, exports.downloadBundleFile)(file, analysis?.scriptURL)} style={bundleStyles.downloadFileBtn} hitSlop={8}>
|
|
1933
|
+
<TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={`Download ${file.name}`} accessibilityHint="Downloads media asset file" onPress={() => (0, exports.downloadBundleFile)(file, analysis?.scriptURL)} style={bundleStyles.downloadFileBtn} hitSlop={8}>
|
|
1758
1934
|
<NetworkIcons_1.DownloadIcon size={14} color={AppColors_1.AppColors.sky500}/>
|
|
1759
1935
|
</TouchableScale_1.default>
|
|
1760
1936
|
<CopyButton_1.default value={() => file} label={t('bundle.mediaItemJson')}/>
|
|
@@ -2124,29 +2300,94 @@ const bundleStyles = react_native_1.StyleSheet.create({
|
|
|
2124
2300
|
marginBottom: 12,
|
|
2125
2301
|
backgroundColor: AppColors_1.AppColors.slate200,
|
|
2126
2302
|
},
|
|
2303
|
+
prodTreemapBar: {
|
|
2304
|
+
flexDirection: 'row',
|
|
2305
|
+
borderRadius: 6,
|
|
2306
|
+
overflow: 'hidden',
|
|
2307
|
+
height: 16,
|
|
2308
|
+
marginBottom: 12,
|
|
2309
|
+
backgroundColor: AppColors_1.AppColors.slate200,
|
|
2310
|
+
},
|
|
2127
2311
|
legendGrid: {
|
|
2128
2312
|
flexDirection: 'row',
|
|
2129
2313
|
flexWrap: 'wrap',
|
|
2130
|
-
|
|
2131
|
-
rowGap: 8,
|
|
2132
|
-
columnGap: 10,
|
|
2314
|
+
gap: 8,
|
|
2133
2315
|
},
|
|
2134
2316
|
legendItem: {
|
|
2135
2317
|
flexDirection: 'row',
|
|
2136
2318
|
alignItems: 'center',
|
|
2137
2319
|
gap: 6,
|
|
2138
|
-
|
|
2320
|
+
paddingHorizontal: 8,
|
|
2321
|
+
paddingVertical: 5,
|
|
2322
|
+
borderRadius: 8,
|
|
2323
|
+
backgroundColor: `${AppColors_1.AppColors.slate200}40`,
|
|
2324
|
+
borderWidth: 1,
|
|
2325
|
+
borderColor: `${AppColors_1.AppColors.dividerColor}`,
|
|
2326
|
+
flexShrink: 0,
|
|
2139
2327
|
},
|
|
2140
2328
|
legendText: {
|
|
2141
2329
|
fontFamily: AppFonts_1.AppFonts.interMedium,
|
|
2142
2330
|
fontSize: 11,
|
|
2143
2331
|
color: AppColors_1.AppColors.grayTextStrong,
|
|
2144
|
-
flex: 1,
|
|
2145
2332
|
},
|
|
2146
2333
|
legendVal: {
|
|
2147
2334
|
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
2148
2335
|
color: AppColors_1.AppColors.primaryBlack,
|
|
2149
2336
|
},
|
|
2337
|
+
subsystemCard: {
|
|
2338
|
+
backgroundColor: AppColors_1.AppColors.white,
|
|
2339
|
+
borderRadius: 12,
|
|
2340
|
+
padding: 12,
|
|
2341
|
+
marginBottom: 8,
|
|
2342
|
+
borderWidth: 1,
|
|
2343
|
+
borderColor: AppColors_1.AppColors.dividerColor,
|
|
2344
|
+
gap: 8,
|
|
2345
|
+
},
|
|
2346
|
+
subsystemHeader: {
|
|
2347
|
+
flexDirection: 'row',
|
|
2348
|
+
alignItems: 'center',
|
|
2349
|
+
justifyContent: 'space-between',
|
|
2350
|
+
gap: 8,
|
|
2351
|
+
},
|
|
2352
|
+
subsystemTitle: {
|
|
2353
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
2354
|
+
fontSize: 12.5,
|
|
2355
|
+
color: AppColors_1.AppColors.primaryBlack,
|
|
2356
|
+
},
|
|
2357
|
+
subsystemBadge: {
|
|
2358
|
+
paddingHorizontal: 6,
|
|
2359
|
+
paddingVertical: 2,
|
|
2360
|
+
borderRadius: 6,
|
|
2361
|
+
},
|
|
2362
|
+
subsystemBadgeText: {
|
|
2363
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
2364
|
+
fontSize: 10,
|
|
2365
|
+
},
|
|
2366
|
+
subsystemGrid: {
|
|
2367
|
+
flexDirection: 'row',
|
|
2368
|
+
flexWrap: 'wrap',
|
|
2369
|
+
gap: 6,
|
|
2370
|
+
},
|
|
2371
|
+
subsystemItem: {
|
|
2372
|
+
flexDirection: 'row',
|
|
2373
|
+
alignItems: 'center',
|
|
2374
|
+
gap: 5,
|
|
2375
|
+
paddingHorizontal: 8,
|
|
2376
|
+
paddingVertical: 4,
|
|
2377
|
+
borderRadius: 6,
|
|
2378
|
+
backgroundColor: AppColors_1.AppColors.grayBackground,
|
|
2379
|
+
borderWidth: 1,
|
|
2380
|
+
borderColor: AppColors_1.AppColors.dividerColor,
|
|
2381
|
+
},
|
|
2382
|
+
subsystemItemText: {
|
|
2383
|
+
fontFamily: AppFonts_1.AppFonts.interMedium,
|
|
2384
|
+
fontSize: 10.5,
|
|
2385
|
+
color: AppColors_1.AppColors.grayTextStrong,
|
|
2386
|
+
},
|
|
2387
|
+
subsystemItemVal: {
|
|
2388
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
2389
|
+
color: AppColors_1.AppColors.primaryBlack,
|
|
2390
|
+
},
|
|
2150
2391
|
catRowCard: {
|
|
2151
2392
|
backgroundColor: AppColors_1.AppColors.grayBackground,
|
|
2152
2393
|
borderRadius: 12,
|
|
@@ -135,23 +135,27 @@ const CrashDetail = react_1.default.memo(() => {
|
|
|
135
135
|
localStyles.pillBadge,
|
|
136
136
|
{
|
|
137
137
|
backgroundColor: selectedCrash.isFatal
|
|
138
|
-
?
|
|
139
|
-
:
|
|
140
|
-
borderColor: selectedCrash.isFatal
|
|
138
|
+
? AppColors_1.AppColors.errorCardBg
|
|
139
|
+
: AppColors_1.AppColors.amberBg,
|
|
140
|
+
borderColor: selectedCrash.isFatal
|
|
141
|
+
? AppColors_1.AppColors.errorBorder
|
|
142
|
+
: AppColors_1.AppColors.amberWarmBorder,
|
|
141
143
|
},
|
|
142
144
|
]}>
|
|
143
145
|
<react_native_1.View style={[
|
|
144
146
|
localStyles.statusDot,
|
|
145
147
|
{
|
|
146
148
|
backgroundColor: selectedCrash.isFatal
|
|
147
|
-
?
|
|
148
|
-
:
|
|
149
|
+
? AppColors_1.AppColors.red600
|
|
150
|
+
: AppColors_1.AppColors.amber600,
|
|
149
151
|
},
|
|
150
152
|
]}/>
|
|
151
153
|
<react_native_1.Text style={[
|
|
152
154
|
localStyles.pillBadgeText,
|
|
153
155
|
{
|
|
154
|
-
color: selectedCrash.isFatal
|
|
156
|
+
color: selectedCrash.isFatal
|
|
157
|
+
? AppColors_1.AppColors.redErrorText
|
|
158
|
+
: AppColors_1.AppColors.amberWarmText,
|
|
155
159
|
},
|
|
156
160
|
]}>
|
|
157
161
|
{selectedCrash.isFatal ? t('crash.fatalCrash') : t('crash.handledException')}
|
|
@@ -162,11 +166,11 @@ const CrashDetail = react_1.default.memo(() => {
|
|
|
162
166
|
<react_native_1.View style={[
|
|
163
167
|
localStyles.pillBadge,
|
|
164
168
|
{
|
|
165
|
-
backgroundColor:
|
|
166
|
-
borderColor:
|
|
169
|
+
backgroundColor: AppColors_1.AppColors.violetSoftBg,
|
|
170
|
+
borderColor: AppColors_1.AppColors.violetSoftBorder,
|
|
167
171
|
},
|
|
168
172
|
]}>
|
|
169
|
-
<react_native_1.Text style={[localStyles.pillBadgeText, { color:
|
|
173
|
+
<react_native_1.Text style={[localStyles.pillBadgeText, { color: AppColors_1.AppColors.purple700 }]}>
|
|
170
174
|
{selectedCrash.type.toUpperCase()}
|
|
171
175
|
</react_native_1.Text>
|
|
172
176
|
</react_native_1.View>
|
|
@@ -176,12 +180,12 @@ const CrashDetail = react_1.default.memo(() => {
|
|
|
176
180
|
{/* Copy Report Action */}
|
|
177
181
|
<TouchableScale_1.default onPress={handleCopyReport} hitSlop={10} style={[
|
|
178
182
|
localStyles.actionButton,
|
|
179
|
-
copiedSuccess && { backgroundColor:
|
|
183
|
+
copiedSuccess && { backgroundColor: AppColors_1.AppColors.mintGreenBg, borderColor: AppColors_1.AppColors.mintGreenBorder },
|
|
180
184
|
]}>
|
|
181
|
-
{copiedSuccess ? (<NetworkIcons_1.CircleCheckIcon color=
|
|
185
|
+
{copiedSuccess ? (<NetworkIcons_1.CircleCheckIcon color={AppColors_1.AppColors.mintGreenText} size={12}/>) : (<NetworkIcons_1.CopyIcon color={AppColors_1.AppColors.purple} size={12}/>)}
|
|
182
186
|
<react_native_1.Text style={[
|
|
183
187
|
localStyles.actionButtonText,
|
|
184
|
-
copiedSuccess && { color:
|
|
188
|
+
copiedSuccess && { color: AppColors_1.AppColors.mintGreenText },
|
|
185
189
|
]}>
|
|
186
190
|
{copiedSuccess ? t('crash.copied') : t('crash.copyReport')}
|
|
187
191
|
</react_native_1.Text>
|
|
@@ -57,33 +57,33 @@ const InspectorHeader = react_1.default.memo(() => {
|
|
|
57
57
|
if (clean === 'DEV' || clean.includes('DEV') || clean === 'LOCAL') {
|
|
58
58
|
return {
|
|
59
59
|
label: rawEnv,
|
|
60
|
-
bg:
|
|
61
|
-
border:
|
|
62
|
-
text:
|
|
60
|
+
bg: `${AppColors_1.AppColors.emerald500}40`, // emerald
|
|
61
|
+
border: `${AppColors_1.AppColors.emerald400}8C`,
|
|
62
|
+
text: AppColors_1.AppColors.mintGreenBorder,
|
|
63
63
|
};
|
|
64
64
|
}
|
|
65
65
|
if (clean === 'UAT' || clean === 'QA' || clean === 'TEST') {
|
|
66
66
|
return {
|
|
67
67
|
label: rawEnv,
|
|
68
|
-
bg:
|
|
69
|
-
border:
|
|
70
|
-
text:
|
|
68
|
+
bg: `${AppColors_1.AppColors.amber500}47`, // amber
|
|
69
|
+
border: `${AppColors_1.AppColors.amber400}99`,
|
|
70
|
+
text: AppColors_1.AppColors.amberWarmBorder,
|
|
71
71
|
};
|
|
72
72
|
}
|
|
73
73
|
if (clean === 'PREPROD' || clean === 'STAGE' || clean === 'STAGING') {
|
|
74
74
|
return {
|
|
75
75
|
label: rawEnv,
|
|
76
|
-
bg:
|
|
77
|
-
border:
|
|
78
|
-
text:
|
|
76
|
+
bg: `${AppColors_1.AppColors.purple500}47`, // purple
|
|
77
|
+
border: `${AppColors_1.AppColors.purple400}99`,
|
|
78
|
+
text: AppColors_1.AppColors.violetSoftBorder,
|
|
79
79
|
};
|
|
80
80
|
}
|
|
81
81
|
// PROD / Live
|
|
82
82
|
return {
|
|
83
83
|
label: rawEnv,
|
|
84
|
-
bg:
|
|
85
|
-
border:
|
|
86
|
-
text:
|
|
84
|
+
bg: `${AppColors_1.AppColors.rose500}40`, // rose
|
|
85
|
+
border: `${AppColors_1.AppColors.roseBorder}8C`,
|
|
86
|
+
text: AppColors_1.AppColors.errorBorder,
|
|
87
87
|
};
|
|
88
88
|
}, [environment]);
|
|
89
89
|
const isDetailView = (activeTab === 'apis' && selected != null) ||
|
|
@@ -484,8 +484,8 @@ const InspectorHeader = react_1.default.memo(() => {
|
|
|
484
484
|
styles_1.default.headerMethodBadge,
|
|
485
485
|
{
|
|
486
486
|
backgroundColor: selectedCrash.isFatal
|
|
487
|
-
?
|
|
488
|
-
:
|
|
487
|
+
? AppColors_1.AppColors.red600
|
|
488
|
+
: AppColors_1.AppColors.amber600,
|
|
489
489
|
},
|
|
490
490
|
]}>
|
|
491
491
|
<react_native_1.Text style={styles_1.default.headerMethodText}>
|
|
@@ -501,8 +501,8 @@ const InspectorHeader = react_1.default.memo(() => {
|
|
|
501
501
|
styles_1.default.headerStatusDot,
|
|
502
502
|
{
|
|
503
503
|
backgroundColor: selectedCrash.isFatal
|
|
504
|
-
?
|
|
505
|
-
:
|
|
504
|
+
? AppColors_1.AppColors.red600
|
|
505
|
+
: AppColors_1.AppColors.amber500,
|
|
506
506
|
},
|
|
507
507
|
]}/>
|
|
508
508
|
<react_native_1.Text style={styles_1.default.headerSubTitle}>
|
|
@@ -80,13 +80,17 @@ const MainScreen = () => {
|
|
|
80
80
|
(activeTab === 'crash' && selectedCrash != null);
|
|
81
81
|
return (<>
|
|
82
82
|
{(react_native_1.Platform.OS === 'ios' || react_native_1.Platform.OS === 'android') && isEnabled && <FabLauncher_1.default />}
|
|
83
|
-
<react_native_1.Modal visible={visible} animationType={modalAnimationType} transparent>
|
|
83
|
+
<react_native_1.Modal visible={visible} animationType={modalAnimationType} transparent statusBarTranslucent={true}>
|
|
84
84
|
{visible && (<ErrorBoundary_1.default onClose={closeModal}>
|
|
85
85
|
<react_native_1.View style={styles_1.default.modalBackdrop}>
|
|
86
86
|
<react_native_1.Pressable style={styles_1.default.modalBackdropPressable} onPress={closeModal}/>
|
|
87
87
|
<react_native_1.View style={[
|
|
88
88
|
styles_1.default.modalContentCard,
|
|
89
|
-
{
|
|
89
|
+
{
|
|
90
|
+
height: `${modalHeightPercent}%`,
|
|
91
|
+
borderTopLeftRadius: modalHeightPercent >= 100 ? 0 : 20,
|
|
92
|
+
borderTopRightRadius: modalHeightPercent >= 100 ? 0 : 20,
|
|
93
|
+
},
|
|
90
94
|
]}>
|
|
91
95
|
<react_native_1.StatusBar translucent backgroundColor="transparent" barStyle="light-content"/>
|
|
92
96
|
|