react-native-inapp-inspector 2.3.14 → 2.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/README.md +1 -0
  2. package/dist/commonjs/components/AnimatedEntrance.js +3 -3
  3. package/dist/commonjs/components/ConsoleLogCard.js +174 -100
  4. package/dist/commonjs/components/Inspector/AnalyticsTab.js +0 -22
  5. package/dist/commonjs/components/Inspector/ConsoleTab.js +25 -38
  6. package/dist/commonjs/components/Inspector/CrashTab.js +19 -28
  7. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +198 -98
  8. package/dist/commonjs/components/Inspector/FeedbackModal.d.ts +7 -0
  9. package/dist/commonjs/components/Inspector/FeedbackModal.js +552 -0
  10. package/dist/commonjs/components/Inspector/InspectorHeader.js +58 -6
  11. package/dist/commonjs/components/Inspector/MainScreen.js +100 -58
  12. package/dist/commonjs/components/Inspector/NetworkTab.js +26 -371
  13. package/dist/commonjs/components/Inspector/NpmStarPrompt.d.ts +3 -0
  14. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +494 -0
  15. package/dist/commonjs/components/Inspector/PerformanceTab.js +40 -7
  16. package/dist/commonjs/components/Inspector/ReduxTab.js +3 -23
  17. package/dist/commonjs/components/Inspector/SettingsPanel.js +1035 -173
  18. package/dist/commonjs/components/Inspector/StorageTab.js +23 -28
  19. package/dist/commonjs/components/Inspector/TabBar.js +50 -15
  20. package/dist/commonjs/components/JsonViewer.js +14 -2
  21. package/dist/commonjs/components/LogCard.js +428 -227
  22. package/dist/commonjs/components/NetworkIcons.d.ts +5 -0
  23. package/dist/commonjs/components/NetworkIcons.js +33 -2
  24. package/dist/commonjs/constants/version.d.ts +1 -1
  25. package/dist/commonjs/constants/version.js +1 -1
  26. package/dist/commonjs/customHooks/analyticsLogger.js +1 -1
  27. package/dist/commonjs/customHooks/consoleLogger.js +34 -2
  28. package/dist/commonjs/customHooks/crashHandler.js +1 -1
  29. package/dist/commonjs/customHooks/networkLogger.js +184 -26
  30. package/dist/commonjs/helpers/index.d.ts +1 -0
  31. package/dist/commonjs/helpers/index.js +1 -0
  32. package/dist/commonjs/helpers/remoteConfig.d.ts +4 -0
  33. package/dist/commonjs/helpers/remoteConfig.js +165 -0
  34. package/dist/commonjs/helpers/searchQueryParser.d.ts +1 -1
  35. package/dist/commonjs/helpers/searchQueryParser.js +39 -291
  36. package/dist/commonjs/helpers/telemetry.d.ts +5 -0
  37. package/dist/commonjs/helpers/telemetry.js +339 -8
  38. package/dist/commonjs/index.d.ts +1 -0
  39. package/dist/commonjs/index.js +173 -29
  40. package/dist/commonjs/styles/AppFonts.d.ts +2 -0
  41. package/dist/commonjs/styles/AppFonts.js +1 -0
  42. package/dist/commonjs/styles/index.d.ts +22 -0
  43. package/dist/commonjs/styles/index.js +19 -0
  44. package/dist/commonjs/types/enums.d.ts +1 -0
  45. package/dist/commonjs/types/enums.js +1 -0
  46. package/dist/commonjs/types/interfaces.d.ts +12 -0
  47. package/dist/esm/components/AnimatedEntrance.js +3 -3
  48. package/dist/esm/components/ConsoleLogCard.js +141 -100
  49. package/dist/esm/components/Inspector/AnalyticsTab.js +1 -23
  50. package/dist/esm/components/Inspector/ConsoleTab.js +26 -39
  51. package/dist/esm/components/Inspector/CrashTab.js +20 -29
  52. package/dist/esm/components/Inspector/DeviceInfoTab.js +198 -98
  53. package/dist/esm/components/Inspector/FeedbackModal.d.ts +7 -0
  54. package/dist/esm/components/Inspector/FeedbackModal.js +515 -0
  55. package/dist/esm/components/Inspector/InspectorHeader.js +60 -8
  56. package/dist/esm/components/Inspector/MainScreen.js +101 -59
  57. package/dist/esm/components/Inspector/NetworkTab.js +27 -372
  58. package/dist/esm/components/Inspector/NpmStarPrompt.d.ts +3 -0
  59. package/dist/esm/components/Inspector/NpmStarPrompt.js +454 -0
  60. package/dist/esm/components/Inspector/PerformanceTab.js +40 -7
  61. package/dist/esm/components/Inspector/ReduxTab.js +4 -24
  62. package/dist/esm/components/Inspector/SettingsPanel.js +1038 -176
  63. package/dist/esm/components/Inspector/StorageTab.js +23 -28
  64. package/dist/esm/components/Inspector/TabBar.js +50 -15
  65. package/dist/esm/components/JsonViewer.js +14 -2
  66. package/dist/esm/components/LogCard.js +422 -221
  67. package/dist/esm/components/NetworkIcons.d.ts +5 -0
  68. package/dist/esm/components/NetworkIcons.js +26 -0
  69. package/dist/esm/constants/version.d.ts +1 -1
  70. package/dist/esm/constants/version.js +1 -1
  71. package/dist/esm/customHooks/analyticsLogger.js +1 -1
  72. package/dist/esm/customHooks/consoleLogger.js +34 -2
  73. package/dist/esm/customHooks/crashHandler.js +1 -1
  74. package/dist/esm/customHooks/networkLogger.js +184 -26
  75. package/dist/esm/helpers/index.d.ts +1 -0
  76. package/dist/esm/helpers/index.js +1 -0
  77. package/dist/esm/helpers/remoteConfig.d.ts +4 -0
  78. package/dist/esm/helpers/remoteConfig.js +160 -0
  79. package/dist/esm/helpers/searchQueryParser.d.ts +1 -1
  80. package/dist/esm/helpers/searchQueryParser.js +39 -291
  81. package/dist/esm/helpers/telemetry.d.ts +5 -0
  82. package/dist/esm/helpers/telemetry.js +332 -9
  83. package/dist/esm/index.d.ts +1 -0
  84. package/dist/esm/index.js +171 -29
  85. package/dist/esm/styles/AppFonts.d.ts +2 -0
  86. package/dist/esm/styles/AppFonts.js +1 -0
  87. package/dist/esm/styles/index.d.ts +22 -0
  88. package/dist/esm/styles/index.js +19 -0
  89. package/dist/esm/types/enums.d.ts +1 -0
  90. package/dist/esm/types/enums.js +1 -0
  91. package/dist/esm/types/interfaces.d.ts +12 -0
  92. package/package.json +1 -1
  93. package/src/components/AnimatedEntrance.tsx +3 -3
  94. package/src/components/ConsoleLogCard.tsx +154 -103
  95. package/src/components/Inspector/AnalyticsTab.tsx +0 -23
  96. package/src/components/Inspector/ConsoleTab.tsx +27 -41
  97. package/src/components/Inspector/CrashTab.tsx +19 -28
  98. package/src/components/Inspector/DeviceInfoTab.tsx +224 -102
  99. package/src/components/Inspector/FeedbackModal.tsx +626 -0
  100. package/src/components/Inspector/InspectorHeader.tsx +83 -5
  101. package/src/components/Inspector/MainScreen.tsx +61 -6
  102. package/src/components/Inspector/NetworkTab.tsx +70 -480
  103. package/src/components/Inspector/NpmStarPrompt.tsx +532 -0
  104. package/src/components/Inspector/PerformanceTab.tsx +44 -8
  105. package/src/components/Inspector/ReduxTab.tsx +9 -24
  106. package/src/components/Inspector/SettingsPanel.tsx +1162 -197
  107. package/src/components/Inspector/StorageTab.tsx +27 -30
  108. package/src/components/Inspector/TabBar.tsx +57 -20
  109. package/src/components/JsonViewer.tsx +15 -2
  110. package/src/components/LogCard.tsx +528 -339
  111. package/src/components/NetworkIcons.tsx +92 -0
  112. package/src/constants/version.ts +1 -1
  113. package/src/customHooks/analyticsLogger.ts +1 -1
  114. package/src/customHooks/consoleLogger.ts +36 -3
  115. package/src/customHooks/crashHandler.ts +1 -1
  116. package/src/customHooks/networkLogger.ts +214 -26
  117. package/src/helpers/index.ts +1 -0
  118. package/src/helpers/remoteConfig.ts +212 -0
  119. package/src/helpers/searchQueryParser.ts +42 -284
  120. package/src/helpers/telemetry.ts +381 -10
  121. package/src/index.tsx +374 -211
  122. package/src/styles/AppFonts.ts +2 -0
  123. package/src/styles/index.ts +20 -1
  124. package/src/types/enums.ts +1 -0
  125. package/src/types/interfaces.ts +12 -0
@@ -1,5 +1,5 @@
1
1
  import React, { useMemo, useState, useEffect, useRef } from 'react';
2
- import { Alert, Animated, Platform, ScrollView, StatusBar, StyleSheet, Text, TextInput, View, } from 'react-native';
2
+ import { Alert, Animated, DevSettings, Dimensions, Linking, PixelRatio, Platform, ScrollView, StatusBar, StyleSheet, Text, TextInput, View, } from 'react-native';
3
3
  import Svg, { Path } from 'react-native-svg';
4
4
  import { animateNextLayout, useInspector } from './InspectorContext';
5
5
  import TouchableScale from '../TouchableScale';
@@ -17,14 +17,14 @@ import { clearPerformanceEvents } from '../../customHooks/performanceTracker';
17
17
  import { isReduxConnected } from '../../customHooks/reduxLogger';
18
18
  import { isAnalyticsConnected } from '../../customHooks/analyticsLogger';
19
19
  import { useTranslation } from '../../i18n';
20
- import { SignalIcon, TerminalIcon, AnalyticsIcon, SettingsIcon, SunIcon, MoonIcon, ScreenIcon, MotionIcon, LayersIcon, EyeIcon, CheckIcon, TrashIcon, PackageIcon, ReduxIcon, PerformanceIcon, CrashIcon, ShieldAlertIcon, ForwardChevronIcon, ChevronDownIcon, NpmIcon, BoltIcon, BrainIcon, SmartphoneIcon, DatabaseIcon, QrCodeIcon, } from '../NetworkIcons';
20
+ import { SignalIcon, TerminalIcon, AnalyticsIcon, SettingsIcon, SunIcon, MoonIcon, ScreenIcon, MotionIcon, LayersIcon, EyeIcon, CheckIcon, TrashIcon, PackageIcon, ReduxIcon, PerformanceIcon, CrashIcon, ShieldAlertIcon, ForwardChevronIcon, ChevronDownIcon, NpmIcon, BoltIcon, BrainIcon, SmartphoneIcon, DatabaseIcon, QrCodeIcon, GitHubIcon, InfoCircleIcon, CopyIcon, } from '../NetworkIcons';
21
21
  import { LIB_VERSION } from '../../constants';
22
- import { copyToClipboard, isLocalDebugEnvironment } from '../../helpers';
22
+ import { copyToClipboard, isLocalDebugEnvironment, getAppName, getBundleIdentifier, getAppVersionAndBuild, } from '../../helpers';
23
23
  import { showToast } from '../../helpers/toast';
24
24
  import { pruneAllLogs } from '../../helpers/memoryManager';
25
25
  const SettingsPanel = () => {
26
26
  const { t } = useTranslation();
27
- const { settingsPage, setSettingsPage, settingsActiveSubTab, setSettingsActiveSubTab, tabVisibility, toggleTabVisibility, defaultTab, setDefaultTab, isDark, setIsDark, modalHeightPercent, setModalHeightPercent, modalAnimationType, setModalAnimationType, showDuplicateLogs, setShowDuplicateLogs, showUpdateToast, setShowUpdateToast, showConsoleLevels, setShowConsoleLevels, resetToDefaults, storage, logs, consoleLogs, analyticsEvents, reduxState, maxNetworkLogs, setMaxNetworkLogs, maxConsoleLogs, setMaxConsoleLogs, maxAnalyticsEventsLimit, setMaxAnalyticsEventsLimit, isAutoRamLimitEnabled, setIsAutoRamLimitEnabled, deviceFreeRamMb, reduxAutoRefresh, setReduxAutoRefreshState, reduxExpandDepth, setReduxExpandDepth, switchActiveTab, setSelected, setSelectedEvent, setReduxState, crashRecords, maxCrashLogs, setMaxCrashLogs, updateAvailable, latestNpmVersion, } = useInspector();
27
+ const { settingsPage, setSettingsPage, settingsActiveSubTab, setSettingsActiveSubTab, tabVisibility, toggleTabVisibility, defaultTab, setDefaultTab, isDark, setIsDark, modalHeightPercent, setModalHeightPercent, modalAnimationType, setModalAnimationType, showDuplicateLogs, setShowDuplicateLogs, showUpdateToast, setShowUpdateToast, showConsoleLevels, setShowConsoleLevels, resetToDefaults, closeModal, storage, logs, consoleLogs, analyticsEvents, reduxState, maxNetworkLogs, setMaxNetworkLogs, maxConsoleLogs, setMaxConsoleLogs, maxAnalyticsEventsLimit, setMaxAnalyticsEventsLimit, isAutoRamLimitEnabled, setIsAutoRamLimitEnabled, deviceFreeRamMb, reduxAutoRefresh, setReduxAutoRefreshState, reduxExpandDepth, setReduxExpandDepth, switchActiveTab, setSelected, setSelectedEvent, setReduxState, crashRecords, maxCrashLogs, setMaxCrashLogs, updateAvailable, latestNpmVersion, } = useInspector();
28
28
  const [stagedHeight, setStagedHeight] = useState(modalHeightPercent);
29
29
  useEffect(() => {
30
30
  setStagedHeight(modalHeightPercent);
@@ -35,6 +35,7 @@ const SettingsPanel = () => {
35
35
  const headerTopPadding = modalHeightPercent >= 95 ? statusBarHeight : 0;
36
36
  const allModules = useMemo(() => [
37
37
  {
38
+ id: 1,
38
39
  key: 'apis',
39
40
  label: 'APIs (Network)',
40
41
  category: 'core',
@@ -42,6 +43,7 @@ const SettingsPanel = () => {
42
43
  desc: 'HTTP/HTTPS requests, GraphQL, Axios & WebSocket inspector',
43
44
  },
44
45
  {
46
+ id: 2,
45
47
  key: 'logs',
46
48
  label: 'Console Logs',
47
49
  category: 'core',
@@ -49,27 +51,7 @@ const SettingsPanel = () => {
49
51
  desc: 'Terminal console logs, warnings, errors & stack traces',
50
52
  },
51
53
  {
52
- key: 'performance',
53
- label: 'Performance Tracker',
54
- category: 'diagnostic',
55
- icon: 'performance',
56
- desc: '60 FPS monitor, Hermes memory telemetry & re-render profiler',
57
- },
58
- {
59
- key: 'bundle',
60
- label: 'Bundle Analyzer',
61
- category: 'diagnostic',
62
- icon: 'bundle',
63
- desc: 'Metro packager dependencies, source maps & asset breakdown',
64
- },
65
- {
66
- key: 'crash',
67
- label: 'Crash Protection',
68
- category: 'diagnostic',
69
- icon: 'crash',
70
- desc: 'Runtime exception guard, breadcrumbs & memory snapshot',
71
- },
72
- {
54
+ id: 3,
73
55
  key: 'analytics',
74
56
  label: 'Analytics Logger',
75
57
  category: 'telemetry',
@@ -77,6 +59,7 @@ const SettingsPanel = () => {
77
59
  desc: 'Firebase & custom analytics events, user properties & params',
78
60
  },
79
61
  {
62
+ id: 4,
80
63
  key: 'redux',
81
64
  label: 'Redux Inspector',
82
65
  category: 'telemetry',
@@ -84,6 +67,15 @@ const SettingsPanel = () => {
84
67
  desc: 'Store state diffing, action history & reducer timeline',
85
68
  },
86
69
  {
70
+ id: 5,
71
+ key: 'storage',
72
+ label: 'Storage Inspector',
73
+ category: 'telemetry',
74
+ icon: 'storage',
75
+ desc: 'AsyncStorage & MMKV key-value store viewer with full CRUD support',
76
+ },
77
+ {
78
+ id: 6,
87
79
  key: 'device',
88
80
  label: 'Device Info',
89
81
  category: 'diagnostic',
@@ -91,13 +83,31 @@ const SettingsPanel = () => {
91
83
  desc: 'Hardware specs, IP address, screen metrics, UDID & runtime stats',
92
84
  },
93
85
  {
94
- key: 'storage',
95
- label: 'Storage Inspector',
96
- category: 'telemetry',
97
- icon: 'storage',
98
- desc: 'AsyncStorage & MMKV key-value store viewer with full CRUD support',
86
+ id: 7,
87
+ key: 'crash',
88
+ label: 'Crash Protection',
89
+ category: 'diagnostic',
90
+ icon: 'crash',
91
+ desc: 'Runtime exception guard, breadcrumbs & memory snapshot',
92
+ },
93
+ {
94
+ id: 8,
95
+ key: 'bundle',
96
+ label: 'Bundle Analyzer',
97
+ category: 'diagnostic',
98
+ icon: 'bundle',
99
+ desc: 'Metro packager dependencies, source maps & asset breakdown',
100
+ },
101
+ {
102
+ id: 9,
103
+ key: 'performance',
104
+ label: 'Performance & Tracker',
105
+ category: 'diagnostic',
106
+ icon: 'performance',
107
+ desc: '60 FPS monitor, Hermes memory telemetry & re-render profiler',
99
108
  },
100
109
  {
110
+ id: 10,
101
111
  key: 'debugging',
102
112
  label: 'Multi-Device Debugging',
103
113
  category: 'diagnostic',
@@ -112,11 +122,11 @@ const SettingsPanel = () => {
112
122
  logs: Boolean(tabVisibility?.logs),
113
123
  analytics: Boolean(tabVisibility?.analytics),
114
124
  redux: Boolean(tabVisibility?.redux),
125
+ storage: Boolean(tabVisibility?.storage),
126
+ device: Boolean(tabVisibility?.device),
127
+ crash: Boolean(tabVisibility?.crash),
115
128
  bundle: Boolean(tabVisibility?.bundle),
116
129
  performance: Boolean(tabVisibility?.performance),
117
- crash: Boolean(tabVisibility?.crash),
118
- device: Boolean(tabVisibility?.device),
119
- storage: Boolean(tabVisibility?.storage),
120
130
  debugging: Boolean(tabVisibility?.debugging),
121
131
  }));
122
132
  useEffect(() => {
@@ -125,11 +135,11 @@ const SettingsPanel = () => {
125
135
  logs: Boolean(tabVisibility?.logs),
126
136
  analytics: Boolean(tabVisibility?.analytics),
127
137
  redux: Boolean(tabVisibility?.redux),
138
+ storage: Boolean(tabVisibility?.storage),
139
+ device: Boolean(tabVisibility?.device),
140
+ crash: Boolean(tabVisibility?.crash),
128
141
  bundle: Boolean(tabVisibility?.bundle),
129
142
  performance: Boolean(tabVisibility?.performance),
130
- crash: Boolean(tabVisibility?.crash),
131
- device: Boolean(tabVisibility?.device),
132
- storage: Boolean(tabVisibility?.storage),
133
143
  debugging: Boolean(tabVisibility?.debugging),
134
144
  });
135
145
  }, [tabVisibility]);
@@ -139,17 +149,50 @@ const SettingsPanel = () => {
139
149
  }, [stagedTabVisibility, tabVisibility, allModules]);
140
150
  const stagedActiveCount = allModules.filter(m => m.key === 'apis' || Boolean(stagedTabVisibility[m.key])).length;
141
151
  const handleSaveChanges = () => {
142
- animateNextLayout();
143
- allModules.forEach(m => {
144
- if (m.key !== 'apis') {
145
- const isStagedOn = Boolean(stagedTabVisibility[m.key]);
146
- const isCurrentOn = Boolean(tabVisibility?.[m.key]);
147
- if (isStagedOn !== isCurrentOn) {
148
- toggleTabVisibility(m.key);
149
- }
150
- }
151
- });
152
- Alert.alert(t('settings.settingsSaved'), t('settings.settingsSavedDesc'));
152
+ if (!hasUnsavedChanges)
153
+ return;
154
+ Alert.alert('Apply Changes & Reload', 'Are you sure you want to save module changes? The inspector will close and reload the app to apply the new configuration.', [
155
+ {
156
+ text: 'Cancel',
157
+ style: 'cancel',
158
+ onPress: () => {
159
+ setStagedTabVisibility({
160
+ apis: true,
161
+ logs: Boolean(tabVisibility?.logs),
162
+ analytics: Boolean(tabVisibility?.analytics),
163
+ redux: Boolean(tabVisibility?.redux),
164
+ storage: Boolean(tabVisibility?.storage),
165
+ device: Boolean(tabVisibility?.device),
166
+ crash: Boolean(tabVisibility?.crash),
167
+ bundle: Boolean(tabVisibility?.bundle),
168
+ performance: Boolean(tabVisibility?.performance),
169
+ debugging: Boolean(tabVisibility?.debugging),
170
+ });
171
+ },
172
+ },
173
+ {
174
+ text: 'Save & Reload',
175
+ style: 'default',
176
+ onPress: () => {
177
+ animateNextLayout();
178
+ allModules.forEach(m => {
179
+ if (m.key !== 'apis') {
180
+ const isStagedOn = Boolean(stagedTabVisibility[m.key]);
181
+ const isCurrentOn = Boolean(tabVisibility?.[m.key]);
182
+ if (isStagedOn !== isCurrentOn) {
183
+ toggleTabVisibility(m.key);
184
+ }
185
+ }
186
+ });
187
+ closeModal();
188
+ setTimeout(() => {
189
+ if (__DEV__ && DevSettings && DevSettings.reload) {
190
+ DevSettings.reload();
191
+ }
192
+ }, 350);
193
+ },
194
+ },
195
+ ]);
153
196
  };
154
197
  const [isDefaultTabDropdownOpen, setIsDefaultTabDropdownOpen] = useState(false);
155
198
  const goBackToMain = () => {
@@ -322,6 +365,11 @@ const SettingsPanel = () => {
322
365
  label: t('settings.ramLimits', 'RAM & Limits'),
323
366
  Icon: BrainIcon,
324
367
  },
368
+ {
369
+ key: 'about',
370
+ label: t('settings.aboutAndSpecs', 'About & Specs'),
371
+ Icon: InfoCircleIcon,
372
+ },
325
373
  ].map(tab => {
326
374
  const isActive = settingsActiveSubTab === tab.key;
327
375
  const IconComp = tab.Icon;
@@ -531,6 +579,32 @@ const SettingsPanel = () => {
531
579
  gap: 6,
532
580
  flexWrap: 'wrap',
533
581
  }}>
582
+ <View style={{
583
+ minWidth: 22,
584
+ height: 22,
585
+ paddingHorizontal: 5,
586
+ borderRadius: 11,
587
+ backgroundColor: isChecked
588
+ ? `${AppColors.purple}1C`
589
+ : `${AppColors.grayBorderSecondary}80`,
590
+ borderWidth: 1,
591
+ borderColor: isChecked
592
+ ? `${AppColors.purple}44`
593
+ : AppColors.grayBorderSecondary,
594
+ alignItems: 'center',
595
+ justifyContent: 'center',
596
+ }}>
597
+ <Text style={{
598
+ fontFamily: AppFonts.interBold,
599
+ fontSize: 10,
600
+ lineHeight: 13,
601
+ color: isChecked
602
+ ? AppColors.purple
603
+ : AppColors.grayText,
604
+ }}>
605
+ #{moduleItem.id}
606
+ </Text>
607
+ </View>
534
608
  <Text style={{
535
609
  fontFamily: AppFonts.interBold,
536
610
  fontSize: 14,
@@ -1082,8 +1156,9 @@ const SettingsPanel = () => {
1082
1156
  lineHeight: 18,
1083
1157
  color: AppColors.primaryBlack,
1084
1158
  }}>
1085
- {allModules.find(m => m.key === defaultTab)?.label ||
1086
- 'APIs (Network)'}
1159
+ {allModules.find(m => m.key === defaultTab)
1160
+ ? `#${allModules.find(m => m.key === defaultTab)?.id} ${allModules.find(m => m.key === defaultTab)?.label}`
1161
+ : '#1 APIs (Network)'}
1087
1162
  </Text>
1088
1163
  <View style={{
1089
1164
  backgroundColor: `${AppColors.purple}14`,
@@ -1167,7 +1242,7 @@ const SettingsPanel = () => {
1167
1242
  ? AppColors.purple
1168
1243
  : AppColors.primaryBlack,
1169
1244
  }}>
1170
- {tab.label}
1245
+ #{tab.id} {tab.label}
1171
1246
  </Text>
1172
1247
  </View>
1173
1248
  {isActive && (<CheckIcon size={14} color={AppColors.purple}/>)}
@@ -1265,132 +1340,6 @@ const SettingsPanel = () => {
1265
1340
  </TouchableScale>
1266
1341
  </View>
1267
1342
  </View>
1268
-
1269
-
1270
- <View style={{
1271
- backgroundColor: AppColors.primaryLight,
1272
- borderRadius: 14,
1273
- borderWidth: 1,
1274
- borderColor: AppColors.grayBorderSecondary,
1275
- overflow: 'hidden',
1276
- padding: 14,
1277
- gap: 12,
1278
- }}>
1279
- <Text style={{
1280
- fontFamily: AppFonts.interBold,
1281
- fontSize: 11,
1282
- lineHeight: 14,
1283
- color: AppColors.grayTextWeak,
1284
- letterSpacing: 0.8,
1285
- }}>
1286
- PACKAGE VERSION & UPDATES
1287
- </Text>
1288
-
1289
- <View style={{
1290
- flexDirection: 'row',
1291
- alignItems: 'center',
1292
- justifyContent: 'space-between',
1293
- }}>
1294
- <View style={{
1295
- flexDirection: 'row',
1296
- alignItems: 'center',
1297
- gap: 10,
1298
- flex: 1,
1299
- marginRight: 8,
1300
- }}>
1301
- <View style={{
1302
- width: 32,
1303
- height: 32,
1304
- borderRadius: 8,
1305
- backgroundColor: '#CB383715',
1306
- alignItems: 'center',
1307
- justifyContent: 'center',
1308
- }}>
1309
- <NpmIcon color="#CB3837" size={16}/>
1310
- </View>
1311
- <View style={{ flex: 1 }}>
1312
- <View style={{
1313
- flexDirection: 'row',
1314
- alignItems: 'center',
1315
- gap: 6,
1316
- }}>
1317
- <Text style={{
1318
- fontFamily: AppFonts.interBold,
1319
- fontSize: 13.5,
1320
- lineHeight: 18,
1321
- color: AppColors.primaryBlack,
1322
- }}>
1323
- v{LIB_VERSION}
1324
- </Text>
1325
- {updateAvailable ? (<View style={{
1326
- flexDirection: 'row',
1327
- alignItems: 'center',
1328
- gap: 3,
1329
- backgroundColor: '#F59E0B20',
1330
- paddingHorizontal: 6,
1331
- paddingVertical: 1.5,
1332
- borderRadius: 5,
1333
- borderWidth: 1,
1334
- borderColor: '#F59E0B60',
1335
- }}>
1336
- <Text style={{
1337
- fontFamily: AppFonts.interBold,
1338
- fontSize: 9.5,
1339
- color: '#D97706',
1340
- }}>
1341
- v{latestNpmVersion} Available
1342
- </Text>
1343
- <BoltIcon size={9} color="#D97706"/>
1344
- </View>) : (<View style={{
1345
- backgroundColor: `${AppColors.emerald500}20`,
1346
- paddingHorizontal: 6,
1347
- paddingVertical: 1.5,
1348
- borderRadius: 5,
1349
- borderWidth: 1,
1350
- borderColor: `${AppColors.emerald500}50`,
1351
- }}>
1352
- <Text style={{
1353
- fontFamily: AppFonts.interBold,
1354
- fontSize: 9.5,
1355
- color: AppColors.emerald600,
1356
- }}>
1357
- Up to date
1358
- </Text>
1359
- </View>)}
1360
- </View>
1361
- <Text style={{
1362
- fontFamily: AppFonts.interRegular,
1363
- fontSize: 11,
1364
- lineHeight: 15,
1365
- color: AppColors.grayText,
1366
- marginTop: 1,
1367
- }}>
1368
- {updateAvailable
1369
- ? `A newer version (v${latestNpmVersion}) is available on npm registry.`
1370
- : 'You are running the latest version from npm registry.'}
1371
- </Text>
1372
- </View>
1373
- </View>
1374
-
1375
- {updateAvailable && (<TouchableScale onPress={() => {
1376
- copyToClipboard('npm install react-native-inapp-inspector@latest', 'Install Command');
1377
- showToast('Copied npm install command!');
1378
- }} style={{
1379
- backgroundColor: AppColors.purple,
1380
- paddingVertical: 6,
1381
- paddingHorizontal: 10,
1382
- borderRadius: 8,
1383
- }}>
1384
- <Text style={{
1385
- fontFamily: AppFonts.interBold,
1386
- fontSize: 11,
1387
- color: AppColors.white,
1388
- }}>
1389
- Copy Upgrade
1390
- </Text>
1391
- </TouchableScale>)}
1392
- </View>
1393
- </View>
1394
1343
  </View>)}
1395
1344
 
1396
1345
  {settingsActiveSubTab === 'limits' && (<View style={{ gap: 14 }}>
@@ -1766,6 +1715,919 @@ const SettingsPanel = () => {
1766
1715
  </View>
1767
1716
  </View>
1768
1717
  </View>)}
1718
+ {settingsActiveSubTab === 'about' && (<View style={{ gap: 14 }}>
1719
+
1720
+ <View style={{
1721
+ backgroundColor: AppColors.primaryLight,
1722
+ borderRadius: 14,
1723
+ borderWidth: 1,
1724
+ borderColor: AppColors.grayBorderSecondary,
1725
+ padding: 16,
1726
+ gap: 12,
1727
+ }}>
1728
+ <View style={{
1729
+ flexDirection: 'row',
1730
+ alignItems: 'center',
1731
+ justifyContent: 'space-between',
1732
+ }}>
1733
+ <View style={{
1734
+ flexDirection: 'row',
1735
+ alignItems: 'center',
1736
+ gap: 12,
1737
+ flex: 1,
1738
+ }}>
1739
+ <View style={{
1740
+ width: 44,
1741
+ height: 44,
1742
+ borderRadius: 12,
1743
+ backgroundColor: `${AppColors.purple}1A`,
1744
+ alignItems: 'center',
1745
+ justifyContent: 'center',
1746
+ borderWidth: 1,
1747
+ borderColor: `${AppColors.purple}33`,
1748
+ }}>
1749
+ <PackageIcon color={AppColors.purple} size={22}/>
1750
+ </View>
1751
+ <View style={{ flex: 1 }}>
1752
+ <View style={{
1753
+ flexDirection: 'row',
1754
+ alignItems: 'center',
1755
+ gap: 8,
1756
+ flexWrap: 'wrap',
1757
+ }}>
1758
+ <Text style={{
1759
+ fontFamily: AppFonts.interBold,
1760
+ fontSize: 15,
1761
+ lineHeight: 20,
1762
+ color: AppColors.primaryBlack,
1763
+ }}>
1764
+ In-App Inspector
1765
+ </Text>
1766
+ <View style={{
1767
+ backgroundColor: `${AppColors.purple}18`,
1768
+ paddingHorizontal: 7,
1769
+ paddingVertical: 2,
1770
+ borderRadius: 6,
1771
+ borderWidth: 1,
1772
+ borderColor: `${AppColors.purple}33`,
1773
+ }}>
1774
+ <Text style={{
1775
+ fontFamily: AppFonts.interBold,
1776
+ fontSize: 10,
1777
+ color: AppColors.purple,
1778
+ }}>
1779
+ v{LIB_VERSION}
1780
+ </Text>
1781
+ </View>
1782
+ {updateAvailable ? (<View style={{
1783
+ flexDirection: 'row',
1784
+ alignItems: 'center',
1785
+ gap: 3,
1786
+ backgroundColor: '#F59E0B20',
1787
+ paddingHorizontal: 6,
1788
+ paddingVertical: 2,
1789
+ borderRadius: 6,
1790
+ borderWidth: 1,
1791
+ borderColor: '#F59E0B60',
1792
+ }}>
1793
+ <Text style={{
1794
+ fontFamily: AppFonts.interBold,
1795
+ fontSize: 9.5,
1796
+ color: '#D97706',
1797
+ }}>
1798
+ v{latestNpmVersion} Available
1799
+ </Text>
1800
+ <BoltIcon size={9} color="#D97706"/>
1801
+ </View>) : (<View style={{
1802
+ backgroundColor: `${AppColors.emerald500}20`,
1803
+ paddingHorizontal: 6,
1804
+ paddingVertical: 2,
1805
+ borderRadius: 6,
1806
+ borderWidth: 1,
1807
+ borderColor: `${AppColors.emerald500}50`,
1808
+ }}>
1809
+ <Text style={{
1810
+ fontFamily: AppFonts.interBold,
1811
+ fontSize: 9.5,
1812
+ color: AppColors.emerald600,
1813
+ }}>
1814
+ Up to date
1815
+ </Text>
1816
+ </View>)}
1817
+ </View>
1818
+ <Text style={{
1819
+ fontFamily: AppFonts.interRegular,
1820
+ fontSize: 11,
1821
+ lineHeight: 15,
1822
+ color: AppColors.grayText,
1823
+ marginTop: 2,
1824
+ }}>
1825
+ react-native-inapp-inspector
1826
+ </Text>
1827
+ </View>
1828
+ </View>
1829
+ </View>
1830
+
1831
+ <Text style={{
1832
+ fontFamily: AppFonts.interRegular,
1833
+ fontSize: 11.5,
1834
+ lineHeight: 16,
1835
+ color: AppColors.grayText,
1836
+ }}>
1837
+ High-performance in-app debugging, network logging, console inspection, performance profiling, storage viewer & telemetry diagnostics for React Native.
1838
+ </Text>
1839
+
1840
+ {updateAvailable && (<TouchableScale onPress={() => {
1841
+ copyToClipboard('npm install react-native-inapp-inspector@latest', 'Install Command');
1842
+ showToast('Copied npm upgrade command!');
1843
+ }} style={{
1844
+ backgroundColor: AppColors.purple,
1845
+ paddingVertical: 8,
1846
+ paddingHorizontal: 12,
1847
+ borderRadius: 8,
1848
+ flexDirection: 'row',
1849
+ alignItems: 'center',
1850
+ justifyContent: 'center',
1851
+ gap: 6,
1852
+ }}>
1853
+ <BoltIcon size={12} color={AppColors.white}/>
1854
+ <Text style={{
1855
+ fontFamily: AppFonts.interBold,
1856
+ fontSize: 12,
1857
+ color: AppColors.white,
1858
+ }}>
1859
+ Copy Upgrade Command (v{latestNpmVersion})
1860
+ </Text>
1861
+ </TouchableScale>)}
1862
+ </View>
1863
+
1864
+
1865
+ <View style={{
1866
+ flexDirection: 'row',
1867
+ flexWrap: 'wrap',
1868
+ gap: 8,
1869
+ }}>
1870
+ <TouchableScale onPress={() => {
1871
+ Linking.openURL('https://github.com/vengatmacuser/react-native-inapp-inspector').catch(() => { });
1872
+ }} style={{
1873
+ flex: 1,
1874
+ minWidth: '47%',
1875
+ backgroundColor: `${AppColors.purple}0F`,
1876
+ borderRadius: 12,
1877
+ borderWidth: 1,
1878
+ borderColor: `${AppColors.purple}30`,
1879
+ paddingVertical: 10,
1880
+ paddingHorizontal: 12,
1881
+ flexDirection: 'row',
1882
+ alignItems: 'center',
1883
+ gap: 8,
1884
+ }}>
1885
+ <GitHubIcon color={AppColors.purple} size={18}/>
1886
+ <View style={{ flex: 1 }}>
1887
+ <Text style={{
1888
+ fontFamily: AppFonts.interBold,
1889
+ fontSize: 11.5,
1890
+ color: AppColors.primaryBlack,
1891
+ }}>
1892
+ ⭐ Star on GitHub
1893
+ </Text>
1894
+ <Text style={{
1895
+ fontFamily: AppFonts.interRegular,
1896
+ fontSize: 9.5,
1897
+ color: AppColors.grayText,
1898
+ }}>
1899
+ Support open source
1900
+ </Text>
1901
+ </View>
1902
+ </TouchableScale>
1903
+
1904
+ <TouchableScale onPress={() => {
1905
+ Linking.openURL('https://www.npmjs.com/package/react-native-inapp-inspector').catch(() => { });
1906
+ }} style={{
1907
+ flex: 1,
1908
+ minWidth: '47%',
1909
+ backgroundColor: AppColors.primaryLight,
1910
+ borderRadius: 12,
1911
+ borderWidth: 1,
1912
+ borderColor: AppColors.grayBorderSecondary,
1913
+ paddingVertical: 10,
1914
+ paddingHorizontal: 12,
1915
+ flexDirection: 'row',
1916
+ alignItems: 'center',
1917
+ gap: 8,
1918
+ }}>
1919
+ <NpmIcon color="#CB3837" size={18}/>
1920
+ <View style={{ flex: 1 }}>
1921
+ <Text style={{
1922
+ fontFamily: AppFonts.interBold,
1923
+ fontSize: 11.5,
1924
+ color: AppColors.primaryBlack,
1925
+ }}>
1926
+ NPM Registry
1927
+ </Text>
1928
+ <Text style={{
1929
+ fontFamily: AppFonts.interRegular,
1930
+ fontSize: 9.5,
1931
+ color: AppColors.grayText,
1932
+ }}>
1933
+ Package repository
1934
+ </Text>
1935
+ </View>
1936
+ </TouchableScale>
1937
+
1938
+ <TouchableScale onPress={() => {
1939
+ Linking.openURL('https://github.com/vengatmacuser/react-native-inapp-inspector#readme').catch(() => { });
1940
+ }} style={{
1941
+ flex: 1,
1942
+ minWidth: '47%',
1943
+ backgroundColor: AppColors.primaryLight,
1944
+ borderRadius: 12,
1945
+ borderWidth: 1,
1946
+ borderColor: AppColors.grayBorderSecondary,
1947
+ paddingVertical: 10,
1948
+ paddingHorizontal: 12,
1949
+ flexDirection: 'row',
1950
+ alignItems: 'center',
1951
+ gap: 8,
1952
+ }}>
1953
+ <Text style={{ fontSize: 16 }}>📖</Text>
1954
+ <View style={{ flex: 1 }}>
1955
+ <Text style={{
1956
+ fontFamily: AppFonts.interBold,
1957
+ fontSize: 11.5,
1958
+ color: AppColors.primaryBlack,
1959
+ }}>
1960
+ Documentation
1961
+ </Text>
1962
+ <Text style={{
1963
+ fontFamily: AppFonts.interRegular,
1964
+ fontSize: 9.5,
1965
+ color: AppColors.grayText,
1966
+ }}>
1967
+ Setup & API guide
1968
+ </Text>
1969
+ </View>
1970
+ </TouchableScale>
1971
+
1972
+ <TouchableScale onPress={() => {
1973
+ Linking.openURL('https://github.com/vengatmacuser/react-native-inapp-inspector/issues').catch(() => { });
1974
+ }} style={{
1975
+ flex: 1,
1976
+ minWidth: '47%',
1977
+ backgroundColor: AppColors.primaryLight,
1978
+ borderRadius: 12,
1979
+ borderWidth: 1,
1980
+ borderColor: AppColors.grayBorderSecondary,
1981
+ paddingVertical: 10,
1982
+ paddingHorizontal: 12,
1983
+ flexDirection: 'row',
1984
+ alignItems: 'center',
1985
+ gap: 8,
1986
+ }}>
1987
+ <Text style={{ fontSize: 16 }}>🐞</Text>
1988
+ <View style={{ flex: 1 }}>
1989
+ <Text style={{
1990
+ fontFamily: AppFonts.interBold,
1991
+ fontSize: 11.5,
1992
+ color: AppColors.primaryBlack,
1993
+ }}>
1994
+ Report Issue
1995
+ </Text>
1996
+ <Text style={{
1997
+ fontFamily: AppFonts.interRegular,
1998
+ fontSize: 9.5,
1999
+ color: AppColors.grayText,
2000
+ }}>
2001
+ Bugs & feature requests
2002
+ </Text>
2003
+ </View>
2004
+ </TouchableScale>
2005
+
2006
+ <TouchableScale onPress={() => {
2007
+ Linking.openURL('https://github.com/vengatmacuser/react-native-inapp-inspector/releases').catch(() => { });
2008
+ }} style={{
2009
+ flex: 1,
2010
+ minWidth: '47%',
2011
+ backgroundColor: AppColors.primaryLight,
2012
+ borderRadius: 12,
2013
+ borderWidth: 1,
2014
+ borderColor: AppColors.grayBorderSecondary,
2015
+ paddingVertical: 10,
2016
+ paddingHorizontal: 12,
2017
+ flexDirection: 'row',
2018
+ alignItems: 'center',
2019
+ gap: 8,
2020
+ }}>
2021
+ <Text style={{ fontSize: 16 }}>🏷️</Text>
2022
+ <View style={{ flex: 1 }}>
2023
+ <Text style={{
2024
+ fontFamily: AppFonts.interBold,
2025
+ fontSize: 11.5,
2026
+ color: AppColors.primaryBlack,
2027
+ }}>
2028
+ Release Notes
2029
+ </Text>
2030
+ <Text style={{
2031
+ fontFamily: AppFonts.interRegular,
2032
+ fontSize: 9.5,
2033
+ color: AppColors.grayText,
2034
+ }}>
2035
+ Version changelog
2036
+ </Text>
2037
+ </View>
2038
+ </TouchableScale>
2039
+
2040
+ <TouchableScale onPress={() => {
2041
+ const win = Dimensions.get('window');
2042
+ const scr = Dimensions.get('screen');
2043
+ const rnVer = Platform.constants?.reactNativeVersion;
2044
+ const specsPayload = {
2045
+ package: {
2046
+ name: 'react-native-inapp-inspector',
2047
+ version: `v${LIB_VERSION}`,
2048
+ latestNpmVersion: latestNpmVersion ? `v${latestNpmVersion}` : 'Checking...',
2049
+ license: 'MIT',
2050
+ repository: 'https://github.com/vengatmacuser/react-native-inapp-inspector',
2051
+ },
2052
+ hostApp: {
2053
+ name: getAppName(),
2054
+ bundleId: getBundleIdentifier(),
2055
+ versionAndBuild: getAppVersionAndBuild().formatted,
2056
+ buildVariant: __DEV__ ? 'Development (Debug)' : 'Production (Release)',
2057
+ metroConnected: isLocalDebugEnvironment(),
2058
+ },
2059
+ runtime: {
2060
+ reactNativeVersion: rnVer ? `${rnVer.major}.${rnVer.minor}.${rnVer.patch}` : '0.74+',
2061
+ reactVersion: React.version,
2062
+ jsEngine: Boolean(global?.HermesInternal) ? 'Hermes' : 'JavaScriptCore (JSC)',
2063
+ architecture: Boolean(global?.nativeFabricUIManager) ? 'Fabric (New Architecture)' : 'Paper (Legacy Bridge)',
2064
+ turboModules: Boolean(global?.__turboModuleProxy || global?.TurboModuleRegistry),
2065
+ },
2066
+ device: {
2067
+ platform: Platform.OS,
2068
+ osVersion: Platform.Version,
2069
+ deviceModel: Platform.constants?.Model || 'Unknown Device',
2070
+ windowDimensions: `${Math.round(win.width)}x${Math.round(win.height)} pt`,
2071
+ screenDimensions: `${Math.round(scr.width)}x${Math.round(scr.height)} pt`,
2072
+ pixelRatio: PixelRatio.get(),
2073
+ fontScale: PixelRatio.getFontScale(),
2074
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone || 'Unknown',
2075
+ locale: Intl.DateTimeFormat().resolvedOptions().locale || 'en',
2076
+ },
2077
+ storageAndCapabilities: {
2078
+ storageEngine: isPersistentStorageAvailable() ? 'MMKV (Fast Native Storage)' : 'In-Memory State',
2079
+ hasNativeModule: Boolean(global?.NativeInspectorModule || global?.__IN_APP_INSPECTOR_NATIVE__),
2080
+ reduxConnected: isReduxConnected(),
2081
+ analyticsConnected: isAnalyticsConnected(),
2082
+ },
2083
+ };
2084
+ copyToClipboard(JSON.stringify(specsPayload, null, 2), 'Diagnostic Specifications');
2085
+ showToast('Copied full diagnostic specs to clipboard!');
2086
+ }} style={{
2087
+ flex: 1,
2088
+ minWidth: '47%',
2089
+ backgroundColor: AppColors.primaryLight,
2090
+ borderRadius: 12,
2091
+ borderWidth: 1,
2092
+ borderColor: AppColors.grayBorderSecondary,
2093
+ paddingVertical: 10,
2094
+ paddingHorizontal: 12,
2095
+ flexDirection: 'row',
2096
+ alignItems: 'center',
2097
+ gap: 8,
2098
+ }}>
2099
+ <CopyIcon color={AppColors.purple} size={16}/>
2100
+ <View style={{ flex: 1 }}>
2101
+ <Text style={{
2102
+ fontFamily: AppFonts.interBold,
2103
+ fontSize: 11.5,
2104
+ color: AppColors.primaryBlack,
2105
+ }}>
2106
+ Copy Specs JSON
2107
+ </Text>
2108
+ <Text style={{
2109
+ fontFamily: AppFonts.interRegular,
2110
+ fontSize: 9.5,
2111
+ color: AppColors.grayText,
2112
+ }}>
2113
+ Diagnostics payload
2114
+ </Text>
2115
+ </View>
2116
+ </TouchableScale>
2117
+ </View>
2118
+
2119
+
2120
+ <View style={{
2121
+ backgroundColor: AppColors.primaryLight,
2122
+ borderRadius: 14,
2123
+ borderWidth: 1,
2124
+ borderColor: AppColors.grayBorderSecondary,
2125
+ overflow: 'hidden',
2126
+ padding: 14,
2127
+ gap: 12,
2128
+ }}>
2129
+ <Text style={{
2130
+ fontFamily: AppFonts.interBold,
2131
+ fontSize: 11,
2132
+ lineHeight: 14,
2133
+ color: AppColors.grayTextWeak,
2134
+ letterSpacing: 0.8,
2135
+ }}>
2136
+ PACKAGE VERSION & UPGRADES
2137
+ </Text>
2138
+
2139
+ <View style={{
2140
+ flexDirection: 'row',
2141
+ alignItems: 'center',
2142
+ justifyContent: 'space-between',
2143
+ }}>
2144
+ <View style={{
2145
+ flexDirection: 'row',
2146
+ alignItems: 'center',
2147
+ gap: 10,
2148
+ flex: 1,
2149
+ marginRight: 8,
2150
+ }}>
2151
+ <View style={{
2152
+ width: 34,
2153
+ height: 34,
2154
+ borderRadius: 9,
2155
+ backgroundColor: '#CB383715',
2156
+ alignItems: 'center',
2157
+ justifyContent: 'center',
2158
+ }}>
2159
+ <NpmIcon color="#CB3837" size={17}/>
2160
+ </View>
2161
+ <View style={{ flex: 1 }}>
2162
+ <View style={{
2163
+ flexDirection: 'row',
2164
+ alignItems: 'center',
2165
+ gap: 6,
2166
+ }}>
2167
+ <Text style={{
2168
+ fontFamily: AppFonts.interBold,
2169
+ fontSize: 14,
2170
+ lineHeight: 18,
2171
+ color: AppColors.primaryBlack,
2172
+ }}>
2173
+ v{LIB_VERSION}
2174
+ </Text>
2175
+ {updateAvailable ? (<View style={{
2176
+ flexDirection: 'row',
2177
+ alignItems: 'center',
2178
+ gap: 3,
2179
+ backgroundColor: '#F59E0B20',
2180
+ paddingHorizontal: 6,
2181
+ paddingVertical: 1.5,
2182
+ borderRadius: 5,
2183
+ borderWidth: 1,
2184
+ borderColor: '#F59E0B60',
2185
+ }}>
2186
+ <Text style={{
2187
+ fontFamily: AppFonts.interBold,
2188
+ fontSize: 9.5,
2189
+ color: '#D97706',
2190
+ }}>
2191
+ v{latestNpmVersion} Available
2192
+ </Text>
2193
+ <BoltIcon size={9} color="#D97706"/>
2194
+ </View>) : (<View style={{
2195
+ backgroundColor: `${AppColors.emerald500}20`,
2196
+ paddingHorizontal: 6,
2197
+ paddingVertical: 1.5,
2198
+ borderRadius: 5,
2199
+ borderWidth: 1,
2200
+ borderColor: `${AppColors.emerald500}50`,
2201
+ }}>
2202
+ <Text style={{
2203
+ fontFamily: AppFonts.interBold,
2204
+ fontSize: 9.5,
2205
+ color: AppColors.emerald600,
2206
+ }}>
2207
+ Up to date
2208
+ </Text>
2209
+ </View>)}
2210
+ </View>
2211
+ <Text style={{
2212
+ fontFamily: AppFonts.interRegular,
2213
+ fontSize: 11,
2214
+ lineHeight: 15,
2215
+ color: AppColors.grayText,
2216
+ marginTop: 1,
2217
+ }}>
2218
+ {updateAvailable
2219
+ ? `A newer release (v${latestNpmVersion}) is available on npm registry.`
2220
+ : 'You are running the latest version from npm registry.'}
2221
+ </Text>
2222
+ </View>
2223
+ </View>
2224
+
2225
+ <TouchableScale onPress={() => {
2226
+ copyToClipboard('npm install react-native-inapp-inspector@latest', 'Install Command');
2227
+ showToast('Copied npm install command!');
2228
+ }} style={{
2229
+ backgroundColor: updateAvailable ? AppColors.purple : `${AppColors.purple}18`,
2230
+ paddingVertical: 7,
2231
+ paddingHorizontal: 11,
2232
+ borderRadius: 8,
2233
+ flexDirection: 'row',
2234
+ alignItems: 'center',
2235
+ gap: 5,
2236
+ }}>
2237
+ <CopyIcon color={updateAvailable ? AppColors.white : AppColors.purple} size={12}/>
2238
+ <Text style={{
2239
+ fontFamily: AppFonts.interBold,
2240
+ fontSize: 11,
2241
+ color: updateAvailable ? AppColors.white : AppColors.purple,
2242
+ }}>
2243
+ {updateAvailable ? 'Copy Upgrade' : 'Copy Install'}
2244
+ </Text>
2245
+ </TouchableScale>
2246
+ </View>
2247
+ </View>
2248
+
2249
+
2250
+ <View style={{
2251
+ backgroundColor: AppColors.primaryLight,
2252
+ borderRadius: 14,
2253
+ borderWidth: 1,
2254
+ borderColor: AppColors.grayBorderSecondary,
2255
+ padding: 14,
2256
+ gap: 10,
2257
+ }}>
2258
+ <Text style={{
2259
+ fontFamily: AppFonts.interBold,
2260
+ fontSize: 11,
2261
+ lineHeight: 14,
2262
+ color: AppColors.grayTextWeak,
2263
+ letterSpacing: 0.8,
2264
+ }}>
2265
+ HOST APPLICATION & BUILD
2266
+ </Text>
2267
+
2268
+ <View style={{ gap: 8 }}>
2269
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2270
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2271
+ Application Name
2272
+ </Text>
2273
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack }}>
2274
+ {getAppName()}
2275
+ </Text>
2276
+ </View>
2277
+
2278
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2279
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2280
+ Bundle ID / Package
2281
+ </Text>
2282
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11, color: AppColors.primaryBlack }}>
2283
+ {getBundleIdentifier()}
2284
+ </Text>
2285
+ </View>
2286
+
2287
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2288
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2289
+ Version & Build Number
2290
+ </Text>
2291
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack }}>
2292
+ {getAppVersionAndBuild().formatted}
2293
+ </Text>
2294
+ </View>
2295
+
2296
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2297
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2298
+ Build Variant
2299
+ </Text>
2300
+ <View style={{
2301
+ backgroundColor: __DEV__ ? `${AppColors.amber500}20` : `${AppColors.emerald500}20`,
2302
+ paddingHorizontal: 6,
2303
+ paddingVertical: 1.5,
2304
+ borderRadius: 5,
2305
+ borderWidth: 1,
2306
+ borderColor: __DEV__ ? `${AppColors.amber500}50` : `${AppColors.emerald500}50`,
2307
+ }}>
2308
+ <Text style={{
2309
+ fontFamily: AppFonts.interBold,
2310
+ fontSize: 10,
2311
+ color: __DEV__ ? AppColors.amber500 : AppColors.emerald600,
2312
+ }}>
2313
+ {__DEV__ ? 'Development (Debug)' : 'Production (Release)'}
2314
+ </Text>
2315
+ </View>
2316
+ </View>
2317
+
2318
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2319
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2320
+ Metro Bundler Connection
2321
+ </Text>
2322
+ <Text style={{
2323
+ fontFamily: AppFonts.interBold,
2324
+ fontSize: 11.5,
2325
+ color: isLocalDebugEnvironment() ? AppColors.emerald600 : AppColors.grayText,
2326
+ }}>
2327
+ {isLocalDebugEnvironment() ? 'Connected (Hot Reload Active)' : 'Offline / Standalone'}
2328
+ </Text>
2329
+ </View>
2330
+ </View>
2331
+ </View>
2332
+
2333
+
2334
+ <View style={{
2335
+ backgroundColor: AppColors.primaryLight,
2336
+ borderRadius: 14,
2337
+ borderWidth: 1,
2338
+ borderColor: AppColors.grayBorderSecondary,
2339
+ padding: 14,
2340
+ gap: 10,
2341
+ }}>
2342
+ <Text style={{
2343
+ fontFamily: AppFonts.interBold,
2344
+ fontSize: 11,
2345
+ lineHeight: 14,
2346
+ color: AppColors.grayTextWeak,
2347
+ letterSpacing: 0.8,
2348
+ }}>
2349
+ FRAMEWORK & RUNTIME ENGINE
2350
+ </Text>
2351
+
2352
+ <View style={{ gap: 8 }}>
2353
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2354
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2355
+ React Native Version
2356
+ </Text>
2357
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack }}>
2358
+ v{(Platform.constants?.reactNativeVersion?.major != null)
2359
+ ? `${Platform.constants.reactNativeVersion.major}.${Platform.constants.reactNativeVersion.minor}.${Platform.constants.reactNativeVersion.patch}`
2360
+ : '0.74+'}
2361
+ </Text>
2362
+ </View>
2363
+
2364
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2365
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2366
+ React Core Version
2367
+ </Text>
2368
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack }}>
2369
+ v{React.version}
2370
+ </Text>
2371
+ </View>
2372
+
2373
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2374
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2375
+ JavaScript Engine
2376
+ </Text>
2377
+ <View style={{
2378
+ backgroundColor: `${AppColors.purple}15`,
2379
+ paddingHorizontal: 6,
2380
+ paddingVertical: 1.5,
2381
+ borderRadius: 5,
2382
+ borderWidth: 1,
2383
+ borderColor: `${AppColors.purple}40`,
2384
+ }}>
2385
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 10.5, color: AppColors.purple }}>
2386
+ {Boolean(global?.HermesInternal) ? 'Hermes Engine (Active)' : 'JavaScriptCore (JSC)'}
2387
+ </Text>
2388
+ </View>
2389
+ </View>
2390
+
2391
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2392
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2393
+ Rendering Architecture
2394
+ </Text>
2395
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack }}>
2396
+ {Boolean(global?.nativeFabricUIManager) ? 'Fabric (New Architecture)' : 'Paper (Legacy Bridge)'}
2397
+ </Text>
2398
+ </View>
2399
+
2400
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2401
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2402
+ TurboModules Support
2403
+ </Text>
2404
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack }}>
2405
+ {Boolean(global?.__turboModuleProxy || global?.TurboModuleRegistry)
2406
+ ? 'Enabled (C++ JSI)'
2407
+ : 'Standard Bridge'}
2408
+ </Text>
2409
+ </View>
2410
+ </View>
2411
+ </View>
2412
+
2413
+
2414
+ <View style={{
2415
+ backgroundColor: AppColors.primaryLight,
2416
+ borderRadius: 14,
2417
+ borderWidth: 1,
2418
+ borderColor: AppColors.grayBorderSecondary,
2419
+ padding: 14,
2420
+ gap: 10,
2421
+ }}>
2422
+ <Text style={{
2423
+ fontFamily: AppFonts.interBold,
2424
+ fontSize: 11,
2425
+ lineHeight: 14,
2426
+ color: AppColors.grayTextWeak,
2427
+ letterSpacing: 0.8,
2428
+ }}>
2429
+ DEVICE & DISPLAY METRICS
2430
+ </Text>
2431
+
2432
+ <View style={{ gap: 8 }}>
2433
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2434
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2435
+ Operating System
2436
+ </Text>
2437
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack }}>
2438
+ {Platform.OS === 'ios' ? 'Apple iOS' : Platform.OS === 'android' ? 'Google Android' : Platform.OS}{' '}
2439
+ {Platform.Version}
2440
+ </Text>
2441
+ </View>
2442
+
2443
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2444
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2445
+ Device Hardware Model
2446
+ </Text>
2447
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack }}>
2448
+ {Platform.constants?.Model ||
2449
+ (Platform.OS === 'ios' ? 'Apple Device' : 'Android Device')}
2450
+ </Text>
2451
+ </View>
2452
+
2453
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2454
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2455
+ Window Viewport (Points)
2456
+ </Text>
2457
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack }}>
2458
+ {Math.round(Dimensions.get('window').width)} × {Math.round(Dimensions.get('window').height)} pt
2459
+ </Text>
2460
+ </View>
2461
+
2462
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2463
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2464
+ Native Physical Resolution
2465
+ </Text>
2466
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack }}>
2467
+ {Math.round(Dimensions.get('screen').width * PixelRatio.get())} × {Math.round(Dimensions.get('screen').height * PixelRatio.get())} px
2468
+ </Text>
2469
+ </View>
2470
+
2471
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2472
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2473
+ Pixel Density & Font Scale
2474
+ </Text>
2475
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack }}>
2476
+ {PixelRatio.get().toFixed(1)}x ({PixelRatio.get() >= 3 ? '@3x' : PixelRatio.get() >= 2 ? '@2x' : '@1x'}) • Font: {PixelRatio.getFontScale().toFixed(2)}x
2477
+ </Text>
2478
+ </View>
2479
+
2480
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2481
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2482
+ Timezone & Locale
2483
+ </Text>
2484
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack }}>
2485
+ {Intl.DateTimeFormat().resolvedOptions().timeZone || 'System'} ({Intl.DateTimeFormat().resolvedOptions().locale || 'en'})
2486
+ </Text>
2487
+ </View>
2488
+ </View>
2489
+ </View>
2490
+
2491
+
2492
+ <View style={{
2493
+ backgroundColor: AppColors.primaryLight,
2494
+ borderRadius: 14,
2495
+ borderWidth: 1,
2496
+ borderColor: AppColors.grayBorderSecondary,
2497
+ padding: 14,
2498
+ gap: 10,
2499
+ }}>
2500
+ <Text style={{
2501
+ fontFamily: AppFonts.interBold,
2502
+ fontSize: 11,
2503
+ lineHeight: 14,
2504
+ color: AppColors.grayTextWeak,
2505
+ letterSpacing: 0.8,
2506
+ }}>
2507
+ INSPECTOR STORAGE & CAPABILITIES
2508
+ </Text>
2509
+
2510
+ <View style={{ gap: 8 }}>
2511
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2512
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2513
+ Storage Persistence Engine
2514
+ </Text>
2515
+ <View style={{
2516
+ backgroundColor: isPersistentStorageAvailable() ? `${AppColors.emerald500}18` : `${AppColors.amber500}18`,
2517
+ paddingHorizontal: 6,
2518
+ paddingVertical: 1.5,
2519
+ borderRadius: 5,
2520
+ borderWidth: 1,
2521
+ borderColor: isPersistentStorageAvailable() ? `${AppColors.emerald500}50` : `${AppColors.amber500}50`,
2522
+ }}>
2523
+ <Text style={{
2524
+ fontFamily: AppFonts.interBold,
2525
+ fontSize: 10.5,
2526
+ color: isPersistentStorageAvailable() ? AppColors.emerald600 : AppColors.amber500,
2527
+ }}>
2528
+ {isPersistentStorageAvailable() ? 'MMKV Fast Native Storage' : 'In-Memory State'}
2529
+ </Text>
2530
+ </View>
2531
+ </View>
2532
+
2533
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2534
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2535
+ Native Module Status
2536
+ </Text>
2537
+ <Text style={{
2538
+ fontFamily: AppFonts.interBold,
2539
+ fontSize: 11.5,
2540
+ color: Boolean(global?.NativeInspectorModule) ? AppColors.emerald600 : AppColors.grayText,
2541
+ }}>
2542
+ {Boolean(global?.NativeInspectorModule) ? 'Linked & Active' : 'JavaScript Only'}
2543
+ </Text>
2544
+ </View>
2545
+
2546
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2547
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2548
+ Network Logger Interceptor
2549
+ </Text>
2550
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.emerald600 }}>
2551
+ Active (XMLHttpRequest & Fetch Hooked)
2552
+ </Text>
2553
+ </View>
2554
+
2555
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2556
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2557
+ Redux & Analytics Watchers
2558
+ </Text>
2559
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack }}>
2560
+ Redux: {isReduxConnected() ? 'Connected' : 'Listening'} • Analytics: {isAnalyticsConnected() ? 'Connected' : 'Listening'}
2561
+ </Text>
2562
+ </View>
2563
+
2564
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2565
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2566
+ Crash & Exception Boundary
2567
+ </Text>
2568
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.emerald600 }}>
2569
+ Global JS Exception Handler Active
2570
+ </Text>
2571
+ </View>
2572
+
2573
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2574
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2575
+ Memory Management
2576
+ </Text>
2577
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.emerald600 }}>
2578
+ Dynamic Auto RAM Tiering Active
2579
+ </Text>
2580
+ </View>
2581
+ </View>
2582
+ </View>
2583
+
2584
+
2585
+ <View style={{
2586
+ backgroundColor: AppColors.primaryLight,
2587
+ borderRadius: 14,
2588
+ borderWidth: 1,
2589
+ borderColor: AppColors.grayBorderSecondary,
2590
+ padding: 14,
2591
+ gap: 8,
2592
+ }}>
2593
+ <Text style={{
2594
+ fontFamily: AppFonts.interBold,
2595
+ fontSize: 11,
2596
+ lineHeight: 14,
2597
+ color: AppColors.grayTextWeak,
2598
+ letterSpacing: 0.8,
2599
+ }}>
2600
+ LICENSE & CREDITS
2601
+ </Text>
2602
+
2603
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2604
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2605
+ License
2606
+ </Text>
2607
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.emerald600 }}>
2608
+ MIT Permissive Open Source
2609
+ </Text>
2610
+ </View>
2611
+
2612
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2613
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2614
+ Created & Maintained By
2615
+ </Text>
2616
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack }}>
2617
+ Vengateswaran
2618
+ </Text>
2619
+ </View>
2620
+
2621
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
2622
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText }}>
2623
+ Repository
2624
+ </Text>
2625
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 11, color: AppColors.purple }}>
2626
+ github.com/vengatmacuser/react-native-inapp-inspector
2627
+ </Text>
2628
+ </View>
2629
+ </View>
2630
+ </View>)}
1769
2631
  <View style={{ height: 48 }}/>
1770
2632
  </ScrollView>
1771
2633