react-native-inapp-inspector 2.3.15 → 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 (96) hide show
  1. package/README.md +1 -0
  2. package/dist/commonjs/components/Inspector/AnalyticsTab.js +0 -22
  3. package/dist/commonjs/components/Inspector/ConsoleTab.js +0 -22
  4. package/dist/commonjs/components/Inspector/CrashTab.js +0 -23
  5. package/dist/commonjs/components/Inspector/FeedbackModal.d.ts +7 -0
  6. package/dist/commonjs/components/Inspector/FeedbackModal.js +552 -0
  7. package/dist/commonjs/components/Inspector/InspectorHeader.js +56 -4
  8. package/dist/commonjs/components/Inspector/MainScreen.js +45 -3
  9. package/dist/commonjs/components/Inspector/NetworkTab.js +27 -38
  10. package/dist/commonjs/components/Inspector/NpmStarPrompt.d.ts +3 -0
  11. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +494 -0
  12. package/dist/commonjs/components/Inspector/PerformanceTab.js +8 -1
  13. package/dist/commonjs/components/Inspector/ReduxTab.js +0 -22
  14. package/dist/commonjs/components/Inspector/SettingsPanel.js +1035 -173
  15. package/dist/commonjs/components/Inspector/StorageTab.js +0 -23
  16. package/dist/commonjs/components/Inspector/TabBar.js +50 -15
  17. package/dist/commonjs/components/NetworkIcons.d.ts +5 -0
  18. package/dist/commonjs/components/NetworkIcons.js +33 -2
  19. package/dist/commonjs/constants/version.d.ts +1 -1
  20. package/dist/commonjs/constants/version.js +1 -1
  21. package/dist/commonjs/helpers/index.d.ts +1 -0
  22. package/dist/commonjs/helpers/index.js +1 -0
  23. package/dist/commonjs/helpers/remoteConfig.d.ts +4 -0
  24. package/dist/commonjs/helpers/remoteConfig.js +165 -0
  25. package/dist/commonjs/helpers/searchQueryParser.js +2 -0
  26. package/dist/commonjs/helpers/telemetry.d.ts +5 -0
  27. package/dist/commonjs/helpers/telemetry.js +339 -8
  28. package/dist/commonjs/index.d.ts +1 -0
  29. package/dist/commonjs/index.js +32 -2
  30. package/dist/commonjs/styles/AppFonts.d.ts +2 -0
  31. package/dist/commonjs/styles/AppFonts.js +1 -0
  32. package/dist/commonjs/styles/index.d.ts +22 -0
  33. package/dist/commonjs/styles/index.js +19 -0
  34. package/dist/commonjs/types/enums.d.ts +1 -0
  35. package/dist/commonjs/types/enums.js +1 -0
  36. package/dist/commonjs/types/interfaces.d.ts +12 -0
  37. package/dist/esm/components/Inspector/AnalyticsTab.js +1 -23
  38. package/dist/esm/components/Inspector/ConsoleTab.js +1 -23
  39. package/dist/esm/components/Inspector/CrashTab.js +1 -24
  40. package/dist/esm/components/Inspector/FeedbackModal.d.ts +7 -0
  41. package/dist/esm/components/Inspector/FeedbackModal.js +515 -0
  42. package/dist/esm/components/Inspector/InspectorHeader.js +57 -5
  43. package/dist/esm/components/Inspector/MainScreen.js +46 -4
  44. package/dist/esm/components/Inspector/NetworkTab.js +28 -39
  45. package/dist/esm/components/Inspector/NpmStarPrompt.d.ts +3 -0
  46. package/dist/esm/components/Inspector/NpmStarPrompt.js +454 -0
  47. package/dist/esm/components/Inspector/PerformanceTab.js +8 -1
  48. package/dist/esm/components/Inspector/ReduxTab.js +1 -23
  49. package/dist/esm/components/Inspector/SettingsPanel.js +1038 -176
  50. package/dist/esm/components/Inspector/StorageTab.js +0 -23
  51. package/dist/esm/components/Inspector/TabBar.js +50 -15
  52. package/dist/esm/components/NetworkIcons.d.ts +5 -0
  53. package/dist/esm/components/NetworkIcons.js +26 -0
  54. package/dist/esm/constants/version.d.ts +1 -1
  55. package/dist/esm/constants/version.js +1 -1
  56. package/dist/esm/helpers/index.d.ts +1 -0
  57. package/dist/esm/helpers/index.js +1 -0
  58. package/dist/esm/helpers/remoteConfig.d.ts +4 -0
  59. package/dist/esm/helpers/remoteConfig.js +160 -0
  60. package/dist/esm/helpers/searchQueryParser.js +2 -0
  61. package/dist/esm/helpers/telemetry.d.ts +5 -0
  62. package/dist/esm/helpers/telemetry.js +332 -9
  63. package/dist/esm/index.d.ts +1 -0
  64. package/dist/esm/index.js +30 -2
  65. package/dist/esm/styles/AppFonts.d.ts +2 -0
  66. package/dist/esm/styles/AppFonts.js +1 -0
  67. package/dist/esm/styles/index.d.ts +22 -0
  68. package/dist/esm/styles/index.js +19 -0
  69. package/dist/esm/types/enums.d.ts +1 -0
  70. package/dist/esm/types/enums.js +1 -0
  71. package/dist/esm/types/interfaces.d.ts +12 -0
  72. package/package.json +1 -1
  73. package/src/components/Inspector/AnalyticsTab.tsx +0 -23
  74. package/src/components/Inspector/ConsoleTab.tsx +0 -23
  75. package/src/components/Inspector/CrashTab.tsx +0 -23
  76. package/src/components/Inspector/FeedbackModal.tsx +626 -0
  77. package/src/components/Inspector/InspectorHeader.tsx +78 -2
  78. package/src/components/Inspector/MainScreen.tsx +59 -3
  79. package/src/components/Inspector/NetworkTab.tsx +69 -78
  80. package/src/components/Inspector/NpmStarPrompt.tsx +532 -0
  81. package/src/components/Inspector/PerformanceTab.tsx +8 -1
  82. package/src/components/Inspector/ReduxTab.tsx +0 -23
  83. package/src/components/Inspector/SettingsPanel.tsx +1162 -197
  84. package/src/components/Inspector/StorageTab.tsx +0 -23
  85. package/src/components/Inspector/TabBar.tsx +57 -20
  86. package/src/components/NetworkIcons.tsx +92 -0
  87. package/src/constants/version.ts +1 -1
  88. package/src/helpers/index.ts +1 -0
  89. package/src/helpers/remoteConfig.ts +212 -0
  90. package/src/helpers/searchQueryParser.ts +3 -0
  91. package/src/helpers/telemetry.ts +381 -10
  92. package/src/index.tsx +42 -0
  93. package/src/styles/AppFonts.ts +2 -0
  94. package/src/styles/index.ts +20 -1
  95. package/src/types/enums.ts +1 -0
  96. package/src/types/interfaces.ts +12 -0
@@ -2,6 +2,10 @@ import React, {useMemo, useState, useEffect, useRef} from 'react';
2
2
  import {
3
3
  Alert,
4
4
  Animated,
5
+ DevSettings,
6
+ Dimensions,
7
+ Linking,
8
+ PixelRatio,
5
9
  Platform,
6
10
  ScrollView,
7
11
  StatusBar,
@@ -57,9 +61,18 @@ import {
57
61
  SmartphoneIcon,
58
62
  DatabaseIcon,
59
63
  QrCodeIcon,
64
+ GitHubIcon,
65
+ InfoCircleIcon,
66
+ CopyIcon,
60
67
  } from '../NetworkIcons';
61
68
  import {LIB_VERSION} from '../../constants';
62
- import {copyToClipboard, isLocalDebugEnvironment} from '../../helpers';
69
+ import {
70
+ copyToClipboard,
71
+ isLocalDebugEnvironment,
72
+ getAppName,
73
+ getBundleIdentifier,
74
+ getAppVersionAndBuild,
75
+ } from '../../helpers';
63
76
  import {showToast} from '../../helpers/toast';
64
77
  import {pruneAllLogs} from '../../helpers/memoryManager';
65
78
 
@@ -87,6 +100,7 @@ const SettingsPanel = () => {
87
100
  showConsoleLevels,
88
101
  setShowConsoleLevels,
89
102
  resetToDefaults,
103
+ closeModal,
90
104
  storage,
91
105
  logs,
92
106
  consoleLogs,
@@ -136,6 +150,7 @@ const SettingsPanel = () => {
136
150
  (
137
151
  [
138
152
  {
153
+ id: 1,
139
154
  key: 'apis',
140
155
  label: 'APIs (Network)',
141
156
  category: 'core',
@@ -143,6 +158,7 @@ const SettingsPanel = () => {
143
158
  desc: 'HTTP/HTTPS requests, GraphQL, Axios & WebSocket inspector',
144
159
  },
145
160
  {
161
+ id: 2,
146
162
  key: 'logs',
147
163
  label: 'Console Logs',
148
164
  category: 'core',
@@ -150,27 +166,7 @@ const SettingsPanel = () => {
150
166
  desc: 'Terminal console logs, warnings, errors & stack traces',
151
167
  },
152
168
  {
153
- key: 'performance',
154
- label: 'Performance Tracker',
155
- category: 'diagnostic',
156
- icon: 'performance',
157
- desc: '60 FPS monitor, Hermes memory telemetry & re-render profiler',
158
- },
159
- {
160
- key: 'bundle',
161
- label: 'Bundle Analyzer',
162
- category: 'diagnostic',
163
- icon: 'bundle',
164
- desc: 'Metro packager dependencies, source maps & asset breakdown',
165
- },
166
- {
167
- key: 'crash',
168
- label: 'Crash Protection',
169
- category: 'diagnostic',
170
- icon: 'crash',
171
- desc: 'Runtime exception guard, breadcrumbs & memory snapshot',
172
- },
173
- {
169
+ id: 3,
174
170
  key: 'analytics',
175
171
  label: 'Analytics Logger',
176
172
  category: 'telemetry',
@@ -178,6 +174,7 @@ const SettingsPanel = () => {
178
174
  desc: 'Firebase & custom analytics events, user properties & params',
179
175
  },
180
176
  {
177
+ id: 4,
181
178
  key: 'redux',
182
179
  label: 'Redux Inspector',
183
180
  category: 'telemetry',
@@ -185,6 +182,15 @@ const SettingsPanel = () => {
185
182
  desc: 'Store state diffing, action history & reducer timeline',
186
183
  },
187
184
  {
185
+ id: 5,
186
+ key: 'storage',
187
+ label: 'Storage Inspector',
188
+ category: 'telemetry',
189
+ icon: 'storage',
190
+ desc: 'AsyncStorage & MMKV key-value store viewer with full CRUD support',
191
+ },
192
+ {
193
+ id: 6,
188
194
  key: 'device',
189
195
  label: 'Device Info',
190
196
  category: 'diagnostic',
@@ -192,13 +198,31 @@ const SettingsPanel = () => {
192
198
  desc: 'Hardware specs, IP address, screen metrics, UDID & runtime stats',
193
199
  },
194
200
  {
195
- key: 'storage',
196
- label: 'Storage Inspector',
197
- category: 'telemetry',
198
- icon: 'storage',
199
- desc: 'AsyncStorage & MMKV key-value store viewer with full CRUD support',
201
+ id: 7,
202
+ key: 'crash',
203
+ label: 'Crash Protection',
204
+ category: 'diagnostic',
205
+ icon: 'crash',
206
+ desc: 'Runtime exception guard, breadcrumbs & memory snapshot',
207
+ },
208
+ {
209
+ id: 8,
210
+ key: 'bundle',
211
+ label: 'Bundle Analyzer',
212
+ category: 'diagnostic',
213
+ icon: 'bundle',
214
+ desc: 'Metro packager dependencies, source maps & asset breakdown',
215
+ },
216
+ {
217
+ id: 9,
218
+ key: 'performance',
219
+ label: 'Performance & Tracker',
220
+ category: 'diagnostic',
221
+ icon: 'performance',
222
+ desc: '60 FPS monitor, Hermes memory telemetry & re-render profiler',
200
223
  },
201
224
  {
225
+ id: 10,
202
226
  key: 'debugging',
203
227
  label: 'Multi-Device Debugging',
204
228
  category: 'diagnostic',
@@ -222,11 +246,11 @@ const SettingsPanel = () => {
222
246
  logs: Boolean(tabVisibility?.logs),
223
247
  analytics: Boolean(tabVisibility?.analytics),
224
248
  redux: Boolean(tabVisibility?.redux),
249
+ storage: Boolean(tabVisibility?.storage),
250
+ device: Boolean(tabVisibility?.device),
251
+ crash: Boolean(tabVisibility?.crash),
225
252
  bundle: Boolean(tabVisibility?.bundle),
226
253
  performance: Boolean(tabVisibility?.performance),
227
- crash: Boolean(tabVisibility?.crash),
228
- device: Boolean(tabVisibility?.device),
229
- storage: Boolean(tabVisibility?.storage),
230
254
  debugging: Boolean(tabVisibility?.debugging),
231
255
  }));
232
256
 
@@ -237,11 +261,11 @@ const SettingsPanel = () => {
237
261
  logs: Boolean(tabVisibility?.logs),
238
262
  analytics: Boolean(tabVisibility?.analytics),
239
263
  redux: Boolean(tabVisibility?.redux),
264
+ storage: Boolean(tabVisibility?.storage),
265
+ device: Boolean(tabVisibility?.device),
266
+ crash: Boolean(tabVisibility?.crash),
240
267
  bundle: Boolean(tabVisibility?.bundle),
241
268
  performance: Boolean(tabVisibility?.performance),
242
- crash: Boolean(tabVisibility?.crash),
243
- device: Boolean(tabVisibility?.device),
244
- storage: Boolean(tabVisibility?.storage),
245
269
  debugging: Boolean(tabVisibility?.debugging),
246
270
  });
247
271
  }, [tabVisibility]);
@@ -259,17 +283,55 @@ const SettingsPanel = () => {
259
283
  ).length;
260
284
 
261
285
  const handleSaveChanges = () => {
262
- animateNextLayout();
263
- allModules.forEach(m => {
264
- if (m.key !== 'apis') {
265
- const isStagedOn = Boolean(stagedTabVisibility[m.key as ActiveTab]);
266
- const isCurrentOn = Boolean(tabVisibility?.[m.key as ActiveTab]);
267
- if (isStagedOn !== isCurrentOn) {
268
- toggleTabVisibility(m.key as ActiveTab);
269
- }
270
- }
271
- });
272
- Alert.alert(t('settings.settingsSaved'), t('settings.settingsSavedDesc'));
286
+ if (!hasUnsavedChanges) return;
287
+
288
+ Alert.alert(
289
+ 'Apply Changes & Reload',
290
+ 'Are you sure you want to save module changes? The inspector will close and reload the app to apply the new configuration.',
291
+ [
292
+ {
293
+ text: 'Cancel',
294
+ style: 'cancel',
295
+ onPress: () => {
296
+ // Discard: Revert staged visibility back to saved tabVisibility
297
+ setStagedTabVisibility({
298
+ apis: true,
299
+ logs: Boolean(tabVisibility?.logs),
300
+ analytics: Boolean(tabVisibility?.analytics),
301
+ redux: Boolean(tabVisibility?.redux),
302
+ storage: Boolean(tabVisibility?.storage),
303
+ device: Boolean(tabVisibility?.device),
304
+ crash: Boolean(tabVisibility?.crash),
305
+ bundle: Boolean(tabVisibility?.bundle),
306
+ performance: Boolean(tabVisibility?.performance),
307
+ debugging: Boolean(tabVisibility?.debugging),
308
+ });
309
+ },
310
+ },
311
+ {
312
+ text: 'Save & Reload',
313
+ style: 'default',
314
+ onPress: () => {
315
+ animateNextLayout();
316
+ allModules.forEach(m => {
317
+ if (m.key !== 'apis') {
318
+ const isStagedOn = Boolean(stagedTabVisibility[m.key as ActiveTab]);
319
+ const isCurrentOn = Boolean(tabVisibility?.[m.key as ActiveTab]);
320
+ if (isStagedOn !== isCurrentOn) {
321
+ toggleTabVisibility(m.key as ActiveTab);
322
+ }
323
+ }
324
+ });
325
+ closeModal();
326
+ setTimeout(() => {
327
+ if (__DEV__ && DevSettings && DevSettings.reload) {
328
+ DevSettings.reload();
329
+ }
330
+ }, 350);
331
+ },
332
+ },
333
+ ],
334
+ );
273
335
  };
274
336
 
275
337
  const [isDefaultTabDropdownOpen, setIsDefaultTabDropdownOpen] =
@@ -517,6 +579,11 @@ const SettingsPanel = () => {
517
579
  label: t('settings.ramLimits', 'RAM & Limits'),
518
580
  Icon: BrainIcon,
519
581
  },
582
+ {
583
+ key: 'about' as const,
584
+ label: t('settings.aboutAndSpecs', 'About & Specs'),
585
+ Icon: InfoCircleIcon,
586
+ },
520
587
  ].map(tab => {
521
588
  const isActive = settingsActiveSubTab === tab.key;
522
589
  const IconComp = tab.Icon;
@@ -864,6 +931,34 @@ const SettingsPanel = () => {
864
931
  gap: 6,
865
932
  flexWrap: 'wrap',
866
933
  }}>
934
+ <View
935
+ style={{
936
+ minWidth: 22,
937
+ height: 22,
938
+ paddingHorizontal: 5,
939
+ borderRadius: 11,
940
+ backgroundColor: isChecked
941
+ ? `${AppColors.purple}1C`
942
+ : `${AppColors.grayBorderSecondary}80`,
943
+ borderWidth: 1,
944
+ borderColor: isChecked
945
+ ? `${AppColors.purple}44`
946
+ : AppColors.grayBorderSecondary,
947
+ alignItems: 'center',
948
+ justifyContent: 'center',
949
+ }}>
950
+ <Text
951
+ style={{
952
+ fontFamily: AppFonts.interBold,
953
+ fontSize: 10,
954
+ lineHeight: 13,
955
+ color: isChecked
956
+ ? AppColors.purple
957
+ : AppColors.grayText,
958
+ }}>
959
+ #{moduleItem.id}
960
+ </Text>
961
+ </View>
867
962
  <Text
868
963
  style={{
869
964
  fontFamily: AppFonts.interBold,
@@ -1531,8 +1626,9 @@ const SettingsPanel = () => {
1531
1626
  lineHeight: 18,
1532
1627
  color: AppColors.primaryBlack,
1533
1628
  }}>
1534
- {allModules.find(m => m.key === defaultTab)?.label ||
1535
- 'APIs (Network)'}
1629
+ {allModules.find(m => m.key === defaultTab)
1630
+ ? `#${allModules.find(m => m.key === defaultTab)?.id} ${allModules.find(m => m.key === defaultTab)?.label}`
1631
+ : '#1 APIs (Network)'}
1536
1632
  </Text>
1537
1633
  <View
1538
1634
  style={{
@@ -1635,7 +1731,7 @@ const SettingsPanel = () => {
1635
1731
  ? AppColors.purple
1636
1732
  : AppColors.primaryBlack,
1637
1733
  }}>
1638
- {tab.label}
1734
+ #{tab.id} {tab.label}
1639
1735
  </Text>
1640
1736
  </View>
1641
1737
  {isActive && (
@@ -1752,156 +1848,6 @@ const SettingsPanel = () => {
1752
1848
  </TouchableScale>
1753
1849
  </View>
1754
1850
  </View>
1755
-
1756
- {/* Section 5: NPM Package & Updates */}
1757
- <View
1758
- style={{
1759
- backgroundColor: AppColors.primaryLight,
1760
- borderRadius: 14,
1761
- borderWidth: 1,
1762
- borderColor: AppColors.grayBorderSecondary,
1763
- overflow: 'hidden',
1764
- padding: 14,
1765
- gap: 12,
1766
- }}>
1767
- <Text
1768
- style={{
1769
- fontFamily: AppFonts.interBold,
1770
- fontSize: 11,
1771
- lineHeight: 14,
1772
- color: AppColors.grayTextWeak,
1773
- letterSpacing: 0.8,
1774
- }}>
1775
- PACKAGE VERSION & UPDATES
1776
- </Text>
1777
-
1778
- <View
1779
- style={{
1780
- flexDirection: 'row',
1781
- alignItems: 'center',
1782
- justifyContent: 'space-between',
1783
- }}>
1784
- <View
1785
- style={{
1786
- flexDirection: 'row',
1787
- alignItems: 'center',
1788
- gap: 10,
1789
- flex: 1,
1790
- marginRight: 8,
1791
- }}>
1792
- <View
1793
- style={{
1794
- width: 32,
1795
- height: 32,
1796
- borderRadius: 8,
1797
- backgroundColor: '#CB383715',
1798
- alignItems: 'center',
1799
- justifyContent: 'center',
1800
- }}>
1801
- <NpmIcon color="#CB3837" size={16} />
1802
- </View>
1803
- <View style={{flex: 1}}>
1804
- <View
1805
- style={{
1806
- flexDirection: 'row',
1807
- alignItems: 'center',
1808
- gap: 6,
1809
- }}>
1810
- <Text
1811
- style={{
1812
- fontFamily: AppFonts.interBold,
1813
- fontSize: 13.5,
1814
- lineHeight: 18,
1815
- color: AppColors.primaryBlack,
1816
- }}>
1817
- v{LIB_VERSION}
1818
- </Text>
1819
- {updateAvailable ? (
1820
- <View
1821
- style={{
1822
- flexDirection: 'row',
1823
- alignItems: 'center',
1824
- gap: 3,
1825
- backgroundColor: '#F59E0B20',
1826
- paddingHorizontal: 6,
1827
- paddingVertical: 1.5,
1828
- borderRadius: 5,
1829
- borderWidth: 1,
1830
- borderColor: '#F59E0B60',
1831
- }}>
1832
- <Text
1833
- style={{
1834
- fontFamily: AppFonts.interBold,
1835
- fontSize: 9.5,
1836
- color: '#D97706',
1837
- }}>
1838
- v{latestNpmVersion} Available
1839
- </Text>
1840
- <BoltIcon size={9} color="#D97706" />
1841
- </View>
1842
- ) : (
1843
- <View
1844
- style={{
1845
- backgroundColor: `${AppColors.emerald500}20`,
1846
- paddingHorizontal: 6,
1847
- paddingVertical: 1.5,
1848
- borderRadius: 5,
1849
- borderWidth: 1,
1850
- borderColor: `${AppColors.emerald500}50`,
1851
- }}>
1852
- <Text
1853
- style={{
1854
- fontFamily: AppFonts.interBold,
1855
- fontSize: 9.5,
1856
- color: AppColors.emerald600,
1857
- }}>
1858
- Up to date
1859
- </Text>
1860
- </View>
1861
- )}
1862
- </View>
1863
- <Text
1864
- style={{
1865
- fontFamily: AppFonts.interRegular,
1866
- fontSize: 11,
1867
- lineHeight: 15,
1868
- color: AppColors.grayText,
1869
- marginTop: 1,
1870
- }}>
1871
- {updateAvailable
1872
- ? `A newer version (v${latestNpmVersion}) is available on npm registry.`
1873
- : 'You are running the latest version from npm registry.'}
1874
- </Text>
1875
- </View>
1876
- </View>
1877
-
1878
- {updateAvailable && (
1879
- <TouchableScale
1880
- onPress={() => {
1881
- copyToClipboard(
1882
- 'npm install react-native-inapp-inspector@latest',
1883
- 'Install Command',
1884
- );
1885
- showToast('Copied npm install command!');
1886
- }}
1887
- style={{
1888
- backgroundColor: AppColors.purple,
1889
- paddingVertical: 6,
1890
- paddingHorizontal: 10,
1891
- borderRadius: 8,
1892
- }}>
1893
- <Text
1894
- style={{
1895
- fontFamily: AppFonts.interBold,
1896
- fontSize: 11,
1897
- color: AppColors.white,
1898
- }}>
1899
- Copy Upgrade
1900
- </Text>
1901
- </TouchableScale>
1902
- )}
1903
- </View>
1904
- </View>
1905
1851
  </View>
1906
1852
  )}
1907
1853
 
@@ -2338,6 +2284,1025 @@ const SettingsPanel = () => {
2338
2284
  </View>
2339
2285
  </View>
2340
2286
  )}
2287
+ {settingsActiveSubTab === 'about' && (
2288
+ <View style={{gap: 14}}>
2289
+ {/* Header Hero Branding Card */}
2290
+ <View
2291
+ style={{
2292
+ backgroundColor: AppColors.primaryLight,
2293
+ borderRadius: 14,
2294
+ borderWidth: 1,
2295
+ borderColor: AppColors.grayBorderSecondary,
2296
+ padding: 16,
2297
+ gap: 12,
2298
+ }}>
2299
+ <View
2300
+ style={{
2301
+ flexDirection: 'row',
2302
+ alignItems: 'center',
2303
+ justifyContent: 'space-between',
2304
+ }}>
2305
+ <View
2306
+ style={{
2307
+ flexDirection: 'row',
2308
+ alignItems: 'center',
2309
+ gap: 12,
2310
+ flex: 1,
2311
+ }}>
2312
+ <View
2313
+ style={{
2314
+ width: 44,
2315
+ height: 44,
2316
+ borderRadius: 12,
2317
+ backgroundColor: `${AppColors.purple}1A`,
2318
+ alignItems: 'center',
2319
+ justifyContent: 'center',
2320
+ borderWidth: 1,
2321
+ borderColor: `${AppColors.purple}33`,
2322
+ }}>
2323
+ <PackageIcon color={AppColors.purple} size={22} />
2324
+ </View>
2325
+ <View style={{flex: 1}}>
2326
+ <View
2327
+ style={{
2328
+ flexDirection: 'row',
2329
+ alignItems: 'center',
2330
+ gap: 8,
2331
+ flexWrap: 'wrap',
2332
+ }}>
2333
+ <Text
2334
+ style={{
2335
+ fontFamily: AppFonts.interBold,
2336
+ fontSize: 15,
2337
+ lineHeight: 20,
2338
+ color: AppColors.primaryBlack,
2339
+ }}>
2340
+ In-App Inspector
2341
+ </Text>
2342
+ <View
2343
+ style={{
2344
+ backgroundColor: `${AppColors.purple}18`,
2345
+ paddingHorizontal: 7,
2346
+ paddingVertical: 2,
2347
+ borderRadius: 6,
2348
+ borderWidth: 1,
2349
+ borderColor: `${AppColors.purple}33`,
2350
+ }}>
2351
+ <Text
2352
+ style={{
2353
+ fontFamily: AppFonts.interBold,
2354
+ fontSize: 10,
2355
+ color: AppColors.purple,
2356
+ }}>
2357
+ v{LIB_VERSION}
2358
+ </Text>
2359
+ </View>
2360
+ {updateAvailable ? (
2361
+ <View
2362
+ style={{
2363
+ flexDirection: 'row',
2364
+ alignItems: 'center',
2365
+ gap: 3,
2366
+ backgroundColor: '#F59E0B20',
2367
+ paddingHorizontal: 6,
2368
+ paddingVertical: 2,
2369
+ borderRadius: 6,
2370
+ borderWidth: 1,
2371
+ borderColor: '#F59E0B60',
2372
+ }}>
2373
+ <Text
2374
+ style={{
2375
+ fontFamily: AppFonts.interBold,
2376
+ fontSize: 9.5,
2377
+ color: '#D97706',
2378
+ }}>
2379
+ v{latestNpmVersion} Available
2380
+ </Text>
2381
+ <BoltIcon size={9} color="#D97706" />
2382
+ </View>
2383
+ ) : (
2384
+ <View
2385
+ style={{
2386
+ backgroundColor: `${AppColors.emerald500}20`,
2387
+ paddingHorizontal: 6,
2388
+ paddingVertical: 2,
2389
+ borderRadius: 6,
2390
+ borderWidth: 1,
2391
+ borderColor: `${AppColors.emerald500}50`,
2392
+ }}>
2393
+ <Text
2394
+ style={{
2395
+ fontFamily: AppFonts.interBold,
2396
+ fontSize: 9.5,
2397
+ color: AppColors.emerald600,
2398
+ }}>
2399
+ Up to date
2400
+ </Text>
2401
+ </View>
2402
+ )}
2403
+ </View>
2404
+ <Text
2405
+ style={{
2406
+ fontFamily: AppFonts.interRegular,
2407
+ fontSize: 11,
2408
+ lineHeight: 15,
2409
+ color: AppColors.grayText,
2410
+ marginTop: 2,
2411
+ }}>
2412
+ react-native-inapp-inspector
2413
+ </Text>
2414
+ </View>
2415
+ </View>
2416
+ </View>
2417
+
2418
+ <Text
2419
+ style={{
2420
+ fontFamily: AppFonts.interRegular,
2421
+ fontSize: 11.5,
2422
+ lineHeight: 16,
2423
+ color: AppColors.grayText,
2424
+ }}>
2425
+ High-performance in-app debugging, network logging, console inspection, performance profiling, storage viewer & telemetry diagnostics for React Native.
2426
+ </Text>
2427
+
2428
+ {updateAvailable && (
2429
+ <TouchableScale
2430
+ onPress={() => {
2431
+ copyToClipboard(
2432
+ 'npm install react-native-inapp-inspector@latest',
2433
+ 'Install Command',
2434
+ );
2435
+ showToast('Copied npm upgrade command!');
2436
+ }}
2437
+ style={{
2438
+ backgroundColor: AppColors.purple,
2439
+ paddingVertical: 8,
2440
+ paddingHorizontal: 12,
2441
+ borderRadius: 8,
2442
+ flexDirection: 'row',
2443
+ alignItems: 'center',
2444
+ justifyContent: 'center',
2445
+ gap: 6,
2446
+ }}>
2447
+ <BoltIcon size={12} color={AppColors.white} />
2448
+ <Text
2449
+ style={{
2450
+ fontFamily: AppFonts.interBold,
2451
+ fontSize: 12,
2452
+ color: AppColors.white,
2453
+ }}>
2454
+ Copy Upgrade Command (v{latestNpmVersion})
2455
+ </Text>
2456
+ </TouchableScale>
2457
+ )}
2458
+ </View>
2459
+
2460
+ {/* Quick Actions & Developer Community Grid */}
2461
+ <View
2462
+ style={{
2463
+ flexDirection: 'row',
2464
+ flexWrap: 'wrap',
2465
+ gap: 8,
2466
+ }}>
2467
+ <TouchableScale
2468
+ onPress={() => {
2469
+ Linking.openURL(
2470
+ 'https://github.com/vengatmacuser/react-native-inapp-inspector',
2471
+ ).catch(() => {});
2472
+ }}
2473
+ style={{
2474
+ flex: 1,
2475
+ minWidth: '47%',
2476
+ backgroundColor: `${AppColors.purple}0F`,
2477
+ borderRadius: 12,
2478
+ borderWidth: 1,
2479
+ borderColor: `${AppColors.purple}30`,
2480
+ paddingVertical: 10,
2481
+ paddingHorizontal: 12,
2482
+ flexDirection: 'row',
2483
+ alignItems: 'center',
2484
+ gap: 8,
2485
+ }}>
2486
+ <GitHubIcon color={AppColors.purple} size={18} />
2487
+ <View style={{flex: 1}}>
2488
+ <Text
2489
+ style={{
2490
+ fontFamily: AppFonts.interBold,
2491
+ fontSize: 11.5,
2492
+ color: AppColors.primaryBlack,
2493
+ }}>
2494
+ ⭐ Star on GitHub
2495
+ </Text>
2496
+ <Text
2497
+ style={{
2498
+ fontFamily: AppFonts.interRegular,
2499
+ fontSize: 9.5,
2500
+ color: AppColors.grayText,
2501
+ }}>
2502
+ Support open source
2503
+ </Text>
2504
+ </View>
2505
+ </TouchableScale>
2506
+
2507
+ <TouchableScale
2508
+ onPress={() => {
2509
+ Linking.openURL(
2510
+ 'https://www.npmjs.com/package/react-native-inapp-inspector',
2511
+ ).catch(() => {});
2512
+ }}
2513
+ style={{
2514
+ flex: 1,
2515
+ minWidth: '47%',
2516
+ backgroundColor: AppColors.primaryLight,
2517
+ borderRadius: 12,
2518
+ borderWidth: 1,
2519
+ borderColor: AppColors.grayBorderSecondary,
2520
+ paddingVertical: 10,
2521
+ paddingHorizontal: 12,
2522
+ flexDirection: 'row',
2523
+ alignItems: 'center',
2524
+ gap: 8,
2525
+ }}>
2526
+ <NpmIcon color="#CB3837" size={18} />
2527
+ <View style={{flex: 1}}>
2528
+ <Text
2529
+ style={{
2530
+ fontFamily: AppFonts.interBold,
2531
+ fontSize: 11.5,
2532
+ color: AppColors.primaryBlack,
2533
+ }}>
2534
+ NPM Registry
2535
+ </Text>
2536
+ <Text
2537
+ style={{
2538
+ fontFamily: AppFonts.interRegular,
2539
+ fontSize: 9.5,
2540
+ color: AppColors.grayText,
2541
+ }}>
2542
+ Package repository
2543
+ </Text>
2544
+ </View>
2545
+ </TouchableScale>
2546
+
2547
+ <TouchableScale
2548
+ onPress={() => {
2549
+ Linking.openURL(
2550
+ 'https://github.com/vengatmacuser/react-native-inapp-inspector#readme',
2551
+ ).catch(() => {});
2552
+ }}
2553
+ style={{
2554
+ flex: 1,
2555
+ minWidth: '47%',
2556
+ backgroundColor: AppColors.primaryLight,
2557
+ borderRadius: 12,
2558
+ borderWidth: 1,
2559
+ borderColor: AppColors.grayBorderSecondary,
2560
+ paddingVertical: 10,
2561
+ paddingHorizontal: 12,
2562
+ flexDirection: 'row',
2563
+ alignItems: 'center',
2564
+ gap: 8,
2565
+ }}>
2566
+ <Text style={{fontSize: 16}}>📖</Text>
2567
+ <View style={{flex: 1}}>
2568
+ <Text
2569
+ style={{
2570
+ fontFamily: AppFonts.interBold,
2571
+ fontSize: 11.5,
2572
+ color: AppColors.primaryBlack,
2573
+ }}>
2574
+ Documentation
2575
+ </Text>
2576
+ <Text
2577
+ style={{
2578
+ fontFamily: AppFonts.interRegular,
2579
+ fontSize: 9.5,
2580
+ color: AppColors.grayText,
2581
+ }}>
2582
+ Setup & API guide
2583
+ </Text>
2584
+ </View>
2585
+ </TouchableScale>
2586
+
2587
+ <TouchableScale
2588
+ onPress={() => {
2589
+ Linking.openURL(
2590
+ 'https://github.com/vengatmacuser/react-native-inapp-inspector/issues',
2591
+ ).catch(() => {});
2592
+ }}
2593
+ style={{
2594
+ flex: 1,
2595
+ minWidth: '47%',
2596
+ backgroundColor: AppColors.primaryLight,
2597
+ borderRadius: 12,
2598
+ borderWidth: 1,
2599
+ borderColor: AppColors.grayBorderSecondary,
2600
+ paddingVertical: 10,
2601
+ paddingHorizontal: 12,
2602
+ flexDirection: 'row',
2603
+ alignItems: 'center',
2604
+ gap: 8,
2605
+ }}>
2606
+ <Text style={{fontSize: 16}}>🐞</Text>
2607
+ <View style={{flex: 1}}>
2608
+ <Text
2609
+ style={{
2610
+ fontFamily: AppFonts.interBold,
2611
+ fontSize: 11.5,
2612
+ color: AppColors.primaryBlack,
2613
+ }}>
2614
+ Report Issue
2615
+ </Text>
2616
+ <Text
2617
+ style={{
2618
+ fontFamily: AppFonts.interRegular,
2619
+ fontSize: 9.5,
2620
+ color: AppColors.grayText,
2621
+ }}>
2622
+ Bugs & feature requests
2623
+ </Text>
2624
+ </View>
2625
+ </TouchableScale>
2626
+
2627
+ <TouchableScale
2628
+ onPress={() => {
2629
+ Linking.openURL(
2630
+ 'https://github.com/vengatmacuser/react-native-inapp-inspector/releases',
2631
+ ).catch(() => {});
2632
+ }}
2633
+ style={{
2634
+ flex: 1,
2635
+ minWidth: '47%',
2636
+ backgroundColor: AppColors.primaryLight,
2637
+ borderRadius: 12,
2638
+ borderWidth: 1,
2639
+ borderColor: AppColors.grayBorderSecondary,
2640
+ paddingVertical: 10,
2641
+ paddingHorizontal: 12,
2642
+ flexDirection: 'row',
2643
+ alignItems: 'center',
2644
+ gap: 8,
2645
+ }}>
2646
+ <Text style={{fontSize: 16}}>🏷️</Text>
2647
+ <View style={{flex: 1}}>
2648
+ <Text
2649
+ style={{
2650
+ fontFamily: AppFonts.interBold,
2651
+ fontSize: 11.5,
2652
+ color: AppColors.primaryBlack,
2653
+ }}>
2654
+ Release Notes
2655
+ </Text>
2656
+ <Text
2657
+ style={{
2658
+ fontFamily: AppFonts.interRegular,
2659
+ fontSize: 9.5,
2660
+ color: AppColors.grayText,
2661
+ }}>
2662
+ Version changelog
2663
+ </Text>
2664
+ </View>
2665
+ </TouchableScale>
2666
+
2667
+ <TouchableScale
2668
+ onPress={() => {
2669
+ const win = Dimensions.get('window');
2670
+ const scr = Dimensions.get('screen');
2671
+ const rnVer = (Platform.constants as any)?.reactNativeVersion;
2672
+ const specsPayload = {
2673
+ package: {
2674
+ name: 'react-native-inapp-inspector',
2675
+ version: `v${LIB_VERSION}`,
2676
+ latestNpmVersion: latestNpmVersion ? `v${latestNpmVersion}` : 'Checking...',
2677
+ license: 'MIT',
2678
+ repository: 'https://github.com/vengatmacuser/react-native-inapp-inspector',
2679
+ },
2680
+ hostApp: {
2681
+ name: getAppName(),
2682
+ bundleId: getBundleIdentifier(),
2683
+ versionAndBuild: getAppVersionAndBuild().formatted,
2684
+ buildVariant: __DEV__ ? 'Development (Debug)' : 'Production (Release)',
2685
+ metroConnected: isLocalDebugEnvironment(),
2686
+ },
2687
+ runtime: {
2688
+ reactNativeVersion: rnVer ? `${rnVer.major}.${rnVer.minor}.${rnVer.patch}` : '0.74+',
2689
+ reactVersion: React.version,
2690
+ jsEngine: Boolean((global as any)?.HermesInternal) ? 'Hermes' : 'JavaScriptCore (JSC)',
2691
+ architecture: Boolean((global as any)?.nativeFabricUIManager) ? 'Fabric (New Architecture)' : 'Paper (Legacy Bridge)',
2692
+ turboModules: Boolean((global as any)?.__turboModuleProxy || (global as any)?.TurboModuleRegistry),
2693
+ },
2694
+ device: {
2695
+ platform: Platform.OS,
2696
+ osVersion: Platform.Version,
2697
+ deviceModel: (Platform.constants as any)?.Model || 'Unknown Device',
2698
+ windowDimensions: `${Math.round(win.width)}x${Math.round(win.height)} pt`,
2699
+ screenDimensions: `${Math.round(scr.width)}x${Math.round(scr.height)} pt`,
2700
+ pixelRatio: PixelRatio.get(),
2701
+ fontScale: PixelRatio.getFontScale(),
2702
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone || 'Unknown',
2703
+ locale: Intl.DateTimeFormat().resolvedOptions().locale || 'en',
2704
+ },
2705
+ storageAndCapabilities: {
2706
+ storageEngine: isPersistentStorageAvailable() ? 'MMKV (Fast Native Storage)' : 'In-Memory State',
2707
+ hasNativeModule: Boolean((global as any)?.NativeInspectorModule || (global as any)?.__IN_APP_INSPECTOR_NATIVE__),
2708
+ reduxConnected: isReduxConnected(),
2709
+ analyticsConnected: isAnalyticsConnected(),
2710
+ },
2711
+ };
2712
+
2713
+ copyToClipboard(
2714
+ JSON.stringify(specsPayload, null, 2),
2715
+ 'Diagnostic Specifications',
2716
+ );
2717
+ showToast('Copied full diagnostic specs to clipboard!');
2718
+ }}
2719
+ style={{
2720
+ flex: 1,
2721
+ minWidth: '47%',
2722
+ backgroundColor: AppColors.primaryLight,
2723
+ borderRadius: 12,
2724
+ borderWidth: 1,
2725
+ borderColor: AppColors.grayBorderSecondary,
2726
+ paddingVertical: 10,
2727
+ paddingHorizontal: 12,
2728
+ flexDirection: 'row',
2729
+ alignItems: 'center',
2730
+ gap: 8,
2731
+ }}>
2732
+ <CopyIcon color={AppColors.purple} size={16} />
2733
+ <View style={{flex: 1}}>
2734
+ <Text
2735
+ style={{
2736
+ fontFamily: AppFonts.interBold,
2737
+ fontSize: 11.5,
2738
+ color: AppColors.primaryBlack,
2739
+ }}>
2740
+ Copy Specs JSON
2741
+ </Text>
2742
+ <Text
2743
+ style={{
2744
+ fontFamily: AppFonts.interRegular,
2745
+ fontSize: 9.5,
2746
+ color: AppColors.grayText,
2747
+ }}>
2748
+ Diagnostics payload
2749
+ </Text>
2750
+ </View>
2751
+ </TouchableScale>
2752
+ </View>
2753
+
2754
+ {/* Section: Package Version & Upgrades */}
2755
+ <View
2756
+ style={{
2757
+ backgroundColor: AppColors.primaryLight,
2758
+ borderRadius: 14,
2759
+ borderWidth: 1,
2760
+ borderColor: AppColors.grayBorderSecondary,
2761
+ overflow: 'hidden',
2762
+ padding: 14,
2763
+ gap: 12,
2764
+ }}>
2765
+ <Text
2766
+ style={{
2767
+ fontFamily: AppFonts.interBold,
2768
+ fontSize: 11,
2769
+ lineHeight: 14,
2770
+ color: AppColors.grayTextWeak,
2771
+ letterSpacing: 0.8,
2772
+ }}>
2773
+ PACKAGE VERSION & UPGRADES
2774
+ </Text>
2775
+
2776
+ <View
2777
+ style={{
2778
+ flexDirection: 'row',
2779
+ alignItems: 'center',
2780
+ justifyContent: 'space-between',
2781
+ }}>
2782
+ <View
2783
+ style={{
2784
+ flexDirection: 'row',
2785
+ alignItems: 'center',
2786
+ gap: 10,
2787
+ flex: 1,
2788
+ marginRight: 8,
2789
+ }}>
2790
+ <View
2791
+ style={{
2792
+ width: 34,
2793
+ height: 34,
2794
+ borderRadius: 9,
2795
+ backgroundColor: '#CB383715',
2796
+ alignItems: 'center',
2797
+ justifyContent: 'center',
2798
+ }}>
2799
+ <NpmIcon color="#CB3837" size={17} />
2800
+ </View>
2801
+ <View style={{flex: 1}}>
2802
+ <View
2803
+ style={{
2804
+ flexDirection: 'row',
2805
+ alignItems: 'center',
2806
+ gap: 6,
2807
+ }}>
2808
+ <Text
2809
+ style={{
2810
+ fontFamily: AppFonts.interBold,
2811
+ fontSize: 14,
2812
+ lineHeight: 18,
2813
+ color: AppColors.primaryBlack,
2814
+ }}>
2815
+ v{LIB_VERSION}
2816
+ </Text>
2817
+ {updateAvailable ? (
2818
+ <View
2819
+ style={{
2820
+ flexDirection: 'row',
2821
+ alignItems: 'center',
2822
+ gap: 3,
2823
+ backgroundColor: '#F59E0B20',
2824
+ paddingHorizontal: 6,
2825
+ paddingVertical: 1.5,
2826
+ borderRadius: 5,
2827
+ borderWidth: 1,
2828
+ borderColor: '#F59E0B60',
2829
+ }}>
2830
+ <Text
2831
+ style={{
2832
+ fontFamily: AppFonts.interBold,
2833
+ fontSize: 9.5,
2834
+ color: '#D97706',
2835
+ }}>
2836
+ v{latestNpmVersion} Available
2837
+ </Text>
2838
+ <BoltIcon size={9} color="#D97706" />
2839
+ </View>
2840
+ ) : (
2841
+ <View
2842
+ style={{
2843
+ backgroundColor: `${AppColors.emerald500}20`,
2844
+ paddingHorizontal: 6,
2845
+ paddingVertical: 1.5,
2846
+ borderRadius: 5,
2847
+ borderWidth: 1,
2848
+ borderColor: `${AppColors.emerald500}50`,
2849
+ }}>
2850
+ <Text
2851
+ style={{
2852
+ fontFamily: AppFonts.interBold,
2853
+ fontSize: 9.5,
2854
+ color: AppColors.emerald600,
2855
+ }}>
2856
+ Up to date
2857
+ </Text>
2858
+ </View>
2859
+ )}
2860
+ </View>
2861
+ <Text
2862
+ style={{
2863
+ fontFamily: AppFonts.interRegular,
2864
+ fontSize: 11,
2865
+ lineHeight: 15,
2866
+ color: AppColors.grayText,
2867
+ marginTop: 1,
2868
+ }}>
2869
+ {updateAvailable
2870
+ ? `A newer release (v${latestNpmVersion}) is available on npm registry.`
2871
+ : 'You are running the latest version from npm registry.'}
2872
+ </Text>
2873
+ </View>
2874
+ </View>
2875
+
2876
+ <TouchableScale
2877
+ onPress={() => {
2878
+ copyToClipboard(
2879
+ 'npm install react-native-inapp-inspector@latest',
2880
+ 'Install Command',
2881
+ );
2882
+ showToast('Copied npm install command!');
2883
+ }}
2884
+ style={{
2885
+ backgroundColor: updateAvailable ? AppColors.purple : `${AppColors.purple}18`,
2886
+ paddingVertical: 7,
2887
+ paddingHorizontal: 11,
2888
+ borderRadius: 8,
2889
+ flexDirection: 'row',
2890
+ alignItems: 'center',
2891
+ gap: 5,
2892
+ }}>
2893
+ <CopyIcon color={updateAvailable ? AppColors.white : AppColors.purple} size={12} />
2894
+ <Text
2895
+ style={{
2896
+ fontFamily: AppFonts.interBold,
2897
+ fontSize: 11,
2898
+ color: updateAvailable ? AppColors.white : AppColors.purple,
2899
+ }}>
2900
+ {updateAvailable ? 'Copy Upgrade' : 'Copy Install'}
2901
+ </Text>
2902
+ </TouchableScale>
2903
+ </View>
2904
+ </View>
2905
+
2906
+ {/* Section 1: Host Application Specs */}
2907
+ <View
2908
+ style={{
2909
+ backgroundColor: AppColors.primaryLight,
2910
+ borderRadius: 14,
2911
+ borderWidth: 1,
2912
+ borderColor: AppColors.grayBorderSecondary,
2913
+ padding: 14,
2914
+ gap: 10,
2915
+ }}>
2916
+ <Text
2917
+ style={{
2918
+ fontFamily: AppFonts.interBold,
2919
+ fontSize: 11,
2920
+ lineHeight: 14,
2921
+ color: AppColors.grayTextWeak,
2922
+ letterSpacing: 0.8,
2923
+ }}>
2924
+ HOST APPLICATION & BUILD
2925
+ </Text>
2926
+
2927
+ <View style={{gap: 8}}>
2928
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
2929
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
2930
+ Application Name
2931
+ </Text>
2932
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack}}>
2933
+ {getAppName()}
2934
+ </Text>
2935
+ </View>
2936
+
2937
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
2938
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
2939
+ Bundle ID / Package
2940
+ </Text>
2941
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11, color: AppColors.primaryBlack}}>
2942
+ {getBundleIdentifier()}
2943
+ </Text>
2944
+ </View>
2945
+
2946
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
2947
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
2948
+ Version & Build Number
2949
+ </Text>
2950
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack}}>
2951
+ {getAppVersionAndBuild().formatted}
2952
+ </Text>
2953
+ </View>
2954
+
2955
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
2956
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
2957
+ Build Variant
2958
+ </Text>
2959
+ <View
2960
+ style={{
2961
+ backgroundColor: __DEV__ ? `${AppColors.amber500}20` : `${AppColors.emerald500}20`,
2962
+ paddingHorizontal: 6,
2963
+ paddingVertical: 1.5,
2964
+ borderRadius: 5,
2965
+ borderWidth: 1,
2966
+ borderColor: __DEV__ ? `${AppColors.amber500}50` : `${AppColors.emerald500}50`,
2967
+ }}>
2968
+ <Text
2969
+ style={{
2970
+ fontFamily: AppFonts.interBold,
2971
+ fontSize: 10,
2972
+ color: __DEV__ ? AppColors.amber500 : AppColors.emerald600,
2973
+ }}>
2974
+ {__DEV__ ? 'Development (Debug)' : 'Production (Release)'}
2975
+ </Text>
2976
+ </View>
2977
+ </View>
2978
+
2979
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
2980
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
2981
+ Metro Bundler Connection
2982
+ </Text>
2983
+ <Text
2984
+ style={{
2985
+ fontFamily: AppFonts.interBold,
2986
+ fontSize: 11.5,
2987
+ color: isLocalDebugEnvironment() ? AppColors.emerald600 : AppColors.grayText,
2988
+ }}>
2989
+ {isLocalDebugEnvironment() ? 'Connected (Hot Reload Active)' : 'Offline / Standalone'}
2990
+ </Text>
2991
+ </View>
2992
+ </View>
2993
+ </View>
2994
+
2995
+ {/* Section 2: React Native Engine & Runtime Specs */}
2996
+ <View
2997
+ style={{
2998
+ backgroundColor: AppColors.primaryLight,
2999
+ borderRadius: 14,
3000
+ borderWidth: 1,
3001
+ borderColor: AppColors.grayBorderSecondary,
3002
+ padding: 14,
3003
+ gap: 10,
3004
+ }}>
3005
+ <Text
3006
+ style={{
3007
+ fontFamily: AppFonts.interBold,
3008
+ fontSize: 11,
3009
+ lineHeight: 14,
3010
+ color: AppColors.grayTextWeak,
3011
+ letterSpacing: 0.8,
3012
+ }}>
3013
+ FRAMEWORK & RUNTIME ENGINE
3014
+ </Text>
3015
+
3016
+ <View style={{gap: 8}}>
3017
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3018
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3019
+ React Native Version
3020
+ </Text>
3021
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack}}>
3022
+ v{((Platform.constants as any)?.reactNativeVersion?.major != null)
3023
+ ? `${(Platform.constants as any).reactNativeVersion.major}.${(Platform.constants as any).reactNativeVersion.minor}.${(Platform.constants as any).reactNativeVersion.patch}`
3024
+ : '0.74+'}
3025
+ </Text>
3026
+ </View>
3027
+
3028
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3029
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3030
+ React Core Version
3031
+ </Text>
3032
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack}}>
3033
+ v{React.version}
3034
+ </Text>
3035
+ </View>
3036
+
3037
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3038
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3039
+ JavaScript Engine
3040
+ </Text>
3041
+ <View
3042
+ style={{
3043
+ backgroundColor: `${AppColors.purple}15`,
3044
+ paddingHorizontal: 6,
3045
+ paddingVertical: 1.5,
3046
+ borderRadius: 5,
3047
+ borderWidth: 1,
3048
+ borderColor: `${AppColors.purple}40`,
3049
+ }}>
3050
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 10.5, color: AppColors.purple}}>
3051
+ {Boolean((global as any)?.HermesInternal) ? 'Hermes Engine (Active)' : 'JavaScriptCore (JSC)'}
3052
+ </Text>
3053
+ </View>
3054
+ </View>
3055
+
3056
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3057
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3058
+ Rendering Architecture
3059
+ </Text>
3060
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack}}>
3061
+ {Boolean((global as any)?.nativeFabricUIManager) ? 'Fabric (New Architecture)' : 'Paper (Legacy Bridge)'}
3062
+ </Text>
3063
+ </View>
3064
+
3065
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3066
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3067
+ TurboModules Support
3068
+ </Text>
3069
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack}}>
3070
+ {Boolean((global as any)?.__turboModuleProxy || (global as any)?.TurboModuleRegistry)
3071
+ ? 'Enabled (C++ JSI)'
3072
+ : 'Standard Bridge'}
3073
+ </Text>
3074
+ </View>
3075
+ </View>
3076
+ </View>
3077
+
3078
+ {/* Section 3: Device & Display Metrics */}
3079
+ <View
3080
+ style={{
3081
+ backgroundColor: AppColors.primaryLight,
3082
+ borderRadius: 14,
3083
+ borderWidth: 1,
3084
+ borderColor: AppColors.grayBorderSecondary,
3085
+ padding: 14,
3086
+ gap: 10,
3087
+ }}>
3088
+ <Text
3089
+ style={{
3090
+ fontFamily: AppFonts.interBold,
3091
+ fontSize: 11,
3092
+ lineHeight: 14,
3093
+ color: AppColors.grayTextWeak,
3094
+ letterSpacing: 0.8,
3095
+ }}>
3096
+ DEVICE & DISPLAY METRICS
3097
+ </Text>
3098
+
3099
+ <View style={{gap: 8}}>
3100
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3101
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3102
+ Operating System
3103
+ </Text>
3104
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack}}>
3105
+ {Platform.OS === 'ios' ? 'Apple iOS' : Platform.OS === 'android' ? 'Google Android' : Platform.OS}{' '}
3106
+ {Platform.Version}
3107
+ </Text>
3108
+ </View>
3109
+
3110
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3111
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3112
+ Device Hardware Model
3113
+ </Text>
3114
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack}}>
3115
+ {(Platform.constants as any)?.Model ||
3116
+ (Platform.OS === 'ios' ? 'Apple Device' : 'Android Device')}
3117
+ </Text>
3118
+ </View>
3119
+
3120
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3121
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3122
+ Window Viewport (Points)
3123
+ </Text>
3124
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack}}>
3125
+ {Math.round(Dimensions.get('window').width)} × {Math.round(Dimensions.get('window').height)} pt
3126
+ </Text>
3127
+ </View>
3128
+
3129
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3130
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3131
+ Native Physical Resolution
3132
+ </Text>
3133
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack}}>
3134
+ {Math.round(Dimensions.get('screen').width * PixelRatio.get())} × {Math.round(Dimensions.get('screen').height * PixelRatio.get())} px
3135
+ </Text>
3136
+ </View>
3137
+
3138
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3139
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3140
+ Pixel Density & Font Scale
3141
+ </Text>
3142
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack}}>
3143
+ {PixelRatio.get().toFixed(1)}x ({PixelRatio.get() >= 3 ? '@3x' : PixelRatio.get() >= 2 ? '@2x' : '@1x'}) • Font: {PixelRatio.getFontScale().toFixed(2)}x
3144
+ </Text>
3145
+ </View>
3146
+
3147
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3148
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3149
+ Timezone & Locale
3150
+ </Text>
3151
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack}}>
3152
+ {Intl.DateTimeFormat().resolvedOptions().timeZone || 'System'} ({Intl.DateTimeFormat().resolvedOptions().locale || 'en'})
3153
+ </Text>
3154
+ </View>
3155
+ </View>
3156
+ </View>
3157
+
3158
+ {/* Section 4: Inspector Capabilities & Storage */}
3159
+ <View
3160
+ style={{
3161
+ backgroundColor: AppColors.primaryLight,
3162
+ borderRadius: 14,
3163
+ borderWidth: 1,
3164
+ borderColor: AppColors.grayBorderSecondary,
3165
+ padding: 14,
3166
+ gap: 10,
3167
+ }}>
3168
+ <Text
3169
+ style={{
3170
+ fontFamily: AppFonts.interBold,
3171
+ fontSize: 11,
3172
+ lineHeight: 14,
3173
+ color: AppColors.grayTextWeak,
3174
+ letterSpacing: 0.8,
3175
+ }}>
3176
+ INSPECTOR STORAGE & CAPABILITIES
3177
+ </Text>
3178
+
3179
+ <View style={{gap: 8}}>
3180
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3181
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3182
+ Storage Persistence Engine
3183
+ </Text>
3184
+ <View
3185
+ style={{
3186
+ backgroundColor: isPersistentStorageAvailable() ? `${AppColors.emerald500}18` : `${AppColors.amber500}18`,
3187
+ paddingHorizontal: 6,
3188
+ paddingVertical: 1.5,
3189
+ borderRadius: 5,
3190
+ borderWidth: 1,
3191
+ borderColor: isPersistentStorageAvailable() ? `${AppColors.emerald500}50` : `${AppColors.amber500}50`,
3192
+ }}>
3193
+ <Text
3194
+ style={{
3195
+ fontFamily: AppFonts.interBold,
3196
+ fontSize: 10.5,
3197
+ color: isPersistentStorageAvailable() ? AppColors.emerald600 : AppColors.amber500,
3198
+ }}>
3199
+ {isPersistentStorageAvailable() ? 'MMKV Fast Native Storage' : 'In-Memory State'}
3200
+ </Text>
3201
+ </View>
3202
+ </View>
3203
+
3204
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3205
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3206
+ Native Module Status
3207
+ </Text>
3208
+ <Text
3209
+ style={{
3210
+ fontFamily: AppFonts.interBold,
3211
+ fontSize: 11.5,
3212
+ color: Boolean((global as any)?.NativeInspectorModule) ? AppColors.emerald600 : AppColors.grayText,
3213
+ }}>
3214
+ {Boolean((global as any)?.NativeInspectorModule) ? 'Linked & Active' : 'JavaScript Only'}
3215
+ </Text>
3216
+ </View>
3217
+
3218
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3219
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3220
+ Network Logger Interceptor
3221
+ </Text>
3222
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.emerald600}}>
3223
+ Active (XMLHttpRequest & Fetch Hooked)
3224
+ </Text>
3225
+ </View>
3226
+
3227
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3228
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3229
+ Redux & Analytics Watchers
3230
+ </Text>
3231
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack}}>
3232
+ Redux: {isReduxConnected() ? 'Connected' : 'Listening'} • Analytics: {isAnalyticsConnected() ? 'Connected' : 'Listening'}
3233
+ </Text>
3234
+ </View>
3235
+
3236
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3237
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3238
+ Crash & Exception Boundary
3239
+ </Text>
3240
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.emerald600}}>
3241
+ Global JS Exception Handler Active
3242
+ </Text>
3243
+ </View>
3244
+
3245
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3246
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3247
+ Memory Management
3248
+ </Text>
3249
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.emerald600}}>
3250
+ Dynamic Auto RAM Tiering Active
3251
+ </Text>
3252
+ </View>
3253
+ </View>
3254
+ </View>
3255
+
3256
+ {/* Section 5: License & Copyright */}
3257
+ <View
3258
+ style={{
3259
+ backgroundColor: AppColors.primaryLight,
3260
+ borderRadius: 14,
3261
+ borderWidth: 1,
3262
+ borderColor: AppColors.grayBorderSecondary,
3263
+ padding: 14,
3264
+ gap: 8,
3265
+ }}>
3266
+ <Text
3267
+ style={{
3268
+ fontFamily: AppFonts.interBold,
3269
+ fontSize: 11,
3270
+ lineHeight: 14,
3271
+ color: AppColors.grayTextWeak,
3272
+ letterSpacing: 0.8,
3273
+ }}>
3274
+ LICENSE & CREDITS
3275
+ </Text>
3276
+
3277
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3278
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3279
+ License
3280
+ </Text>
3281
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.emerald600}}>
3282
+ MIT Permissive Open Source
3283
+ </Text>
3284
+ </View>
3285
+
3286
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3287
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3288
+ Created & Maintained By
3289
+ </Text>
3290
+ <Text style={{fontFamily: AppFonts.interBold, fontSize: 11.5, color: AppColors.primaryBlack}}>
3291
+ Vengateswaran
3292
+ </Text>
3293
+ </View>
3294
+
3295
+ <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
3296
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11.5, color: AppColors.grayText}}>
3297
+ Repository
3298
+ </Text>
3299
+ <Text style={{fontFamily: AppFonts.interRegular, fontSize: 11, color: AppColors.purple}}>
3300
+ github.com/vengatmacuser/react-native-inapp-inspector
3301
+ </Text>
3302
+ </View>
3303
+ </View>
3304
+ </View>
3305
+ )}
2341
3306
  <View style={{height: 48}} />
2342
3307
  </ScrollView>
2343
3308