react-native-inapp-inspector 2.3.12 → 2.3.13

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 (54) hide show
  1. package/dist/commonjs/components/HeadersSection.js +3 -2
  2. package/dist/commonjs/components/Inspector/BundleTab.js +4 -4
  3. package/dist/commonjs/components/Inspector/DebuggingTab.js +26 -14
  4. package/dist/commonjs/components/Inspector/NetworkDetail.js +2 -2
  5. package/dist/commonjs/components/Inspector/NetworkFilterModal.js +18 -12
  6. package/dist/commonjs/components/Inspector/StorageTab.js +10 -4
  7. package/dist/commonjs/components/JsonViewer.js +3 -2
  8. package/dist/commonjs/components/NetworkIcons.d.ts +4 -1
  9. package/dist/commonjs/components/NetworkIcons.js +26 -3
  10. package/dist/commonjs/constants/telemetryConfig.d.ts +3 -3
  11. package/dist/commonjs/constants/telemetryConfig.js +3 -3
  12. package/dist/commonjs/constants/version.d.ts +1 -1
  13. package/dist/commonjs/constants/version.js +1 -1
  14. package/dist/esm/components/HeadersSection.js +3 -2
  15. package/dist/esm/components/Inspector/BundleTab.js +5 -5
  16. package/dist/esm/components/Inspector/DebuggingTab.js +27 -15
  17. package/dist/esm/components/Inspector/NetworkDetail.js +2 -2
  18. package/dist/esm/components/Inspector/NetworkFilterModal.js +19 -13
  19. package/dist/esm/components/Inspector/StorageTab.js +11 -5
  20. package/dist/esm/components/JsonViewer.js +4 -3
  21. package/dist/esm/components/NetworkIcons.d.ts +4 -1
  22. package/dist/esm/components/NetworkIcons.js +22 -2
  23. package/dist/esm/constants/telemetryConfig.d.ts +3 -3
  24. package/dist/esm/constants/telemetryConfig.js +3 -3
  25. package/dist/esm/constants/version.d.ts +1 -1
  26. package/dist/esm/constants/version.js +1 -1
  27. package/package.json +1 -1
  28. package/src/components/HeadersSection.tsx +7 -2
  29. package/src/components/Inspector/BundleTab.tsx +9 -4
  30. package/src/components/Inspector/DebuggingTab.tsx +34 -15
  31. package/src/components/Inspector/NetworkDetail.tsx +2 -2
  32. package/src/components/Inspector/NetworkFilterModal.tsx +32 -12
  33. package/src/components/Inspector/StorageTab.tsx +15 -4
  34. package/src/components/JsonViewer.tsx +8 -3
  35. package/src/components/NetworkIcons.tsx +71 -1
  36. package/src/constants/telemetryConfig.ts +3 -5
  37. package/src/constants/version.ts +1 -1
  38. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  39. package/android/.gradle/8.9/checksums/md5-checksums.bin +0 -0
  40. package/android/.gradle/8.9/checksums/sha1-checksums.bin +0 -0
  41. package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
  42. package/android/.gradle/8.9/executionHistory/executionHistory.lock +0 -0
  43. package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
  44. package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
  45. package/android/.gradle/8.9/gc.properties +0 -0
  46. package/android/.gradle/9.2.0/checksums/checksums.lock +0 -0
  47. package/android/.gradle/9.2.0/fileChanges/last-build.bin +0 -0
  48. package/android/.gradle/9.2.0/fileHashes/fileHashes.bin +0 -0
  49. package/android/.gradle/9.2.0/fileHashes/fileHashes.lock +0 -0
  50. package/android/.gradle/9.2.0/gc.properties +0 -0
  51. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  52. package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
  53. package/android/.gradle/vcs-1/gc.properties +0 -0
  54. package/android/build/reports/problems/problems-report.html +0 -659
@@ -5,7 +5,7 @@ import globalStyles from '../../styles';
5
5
  import { AppColors } from '../../styles/AppColors';
6
6
  import { AppFonts } from '../../styles/AppFonts';
7
7
  import { useTranslation } from '../../i18n';
8
- import { DatabaseIcon, SearchIcon, ClearIcon, PlusIcon, PencilIcon, TrashIcon, CopyIcon, CheckIcon, LayersIcon, ResetIcon, ChevronIcon, } from '../NetworkIcons';
8
+ import { DatabaseIcon, SearchIcon, ClearIcon, PlusIcon, PencilIcon, TrashIcon, CopyIcon, CheckIcon, LayersIcon, ResetIcon, ChevronIcon, WarningTriangleIcon, } from '../NetworkIcons';
9
9
  import { fetchStorageEntries, setStorageEntry, removeStorageEntry, clearStorageDriver, isAsyncStorageConnected, isMMKVConnected, getRegisteredMMKVInstanceIds, subscribeToStorageChanges, } from '../../customHooks/storageInspector';
10
10
  import { copyToClipboard } from '../../helpers';
11
11
  import { showToast } from '../../helpers/toast';
@@ -88,9 +88,12 @@ const StorageEntryCard = React.memo(function StorageEntryCard({ entry, isExpande
88
88
  <Text style={styles.valuePreviewText} numberOfLines={isExpanded ? undefined : 3} selectable={isExpanded}>
89
89
  {displayValue}
90
90
  </Text>
91
- {entry.value.length > 80 && (<Text style={styles.expandHint}>
92
- {isExpanded ? '▲ Collapse' : '▼ Expand'}
93
- </Text>)}
91
+ {entry.value.length > 80 && (<View style={{ flexDirection: 'row', alignItems: 'center', gap: 4, marginTop: 4 }}>
92
+ <Text style={styles.expandHint}>
93
+ {isExpanded ? 'Collapse' : 'Expand'}
94
+ </Text>
95
+ <ChevronIcon direction={isExpanded ? 'up' : 'down'} size={10} color={AppColors.purple}/>
96
+ </View>)}
94
97
  </TouchableScale>
95
98
  </View>);
96
99
  });
@@ -465,7 +468,10 @@ export const StorageTab = React.memo(() => {
465
468
  : editType === 'boolean'
466
469
  ? 'true'
467
470
  : 'String value...'} placeholderTextColor={AppColors.grayTextWeak} style={[styles.textInput, styles.textAreaInput]} multiline textAlignVertical="top" autoCapitalize="none"/>
468
- {jsonError && (<Text style={styles.errorText}>⚠️ {jsonError}</Text>)}
471
+ {jsonError && (<View style={{ flexDirection: 'row', alignItems: 'center', gap: 5, marginTop: 4 }}>
472
+ <WarningTriangleIcon size={12} color={AppColors.errorColor}/>
473
+ <Text style={styles.errorText}>{jsonError}</Text>
474
+ </View>)}
469
475
  </View>
470
476
 
471
477
 
@@ -5,7 +5,7 @@ import TreeNode from './TreeNode';
5
5
  import SegmentedTabs from './SegmentedTabs';
6
6
  import HighlightText from './HighlightText';
7
7
  import CopyButton from './CopyButton';
8
- import { PrettyIcon, RawIcon, TableIcon } from './NetworkIcons';
8
+ import { PrettyIcon, RawIcon, TableIcon, ChevronIcon } from './NetworkIcons';
9
9
  import { AppColors } from '../styles/AppColors';
10
10
  import { AppFonts } from '../styles/AppFonts';
11
11
  import styles from '../styles';
@@ -44,10 +44,11 @@ const JsonTableRow = React.memo(({ itemKey, val, search, }) => {
44
44
  localStyles.tableCellValue,
45
45
  isObject && localStyles.tableCellRawCode,
46
46
  ]} highlightStyle={localStyles.highlight} numberOfLines={expanded ? undefined : 3} selectable={true}/>
47
- {isMultiline && (<TouchableOpacity onPress={() => setExpanded(prev => !prev)} hitSlop={6} style={localStyles.showMoreBtn}>
47
+ {isMultiline && (<TouchableOpacity onPress={() => setExpanded(prev => !prev)} hitSlop={6} style={[localStyles.showMoreBtn, { flexDirection: 'row', alignItems: 'center', gap: 4 }]}>
48
48
  <Text style={localStyles.showMoreText}>
49
- {expanded ? 'Show less' : 'Show more'}
49
+ {expanded ? 'Show less' : 'Show more'}
50
50
  </Text>
51
+ <ChevronIcon direction={expanded ? 'up' : 'down'} size={10} color={AppColors.purple}/>
51
52
  </TouchableOpacity>)}
52
53
  </View>
53
54
  </View>);
@@ -37,7 +37,7 @@ export declare const SignalIcon: ({ color, size, }: IconProps) => React.JSX.Elem
37
37
  export declare const DiffIcon: ({ color, size }: IconProps) => React.JSX.Element;
38
38
  export declare const GlobeIcon: ({ color, size }: IconProps) => React.JSX.Element;
39
39
  export declare const SortArrowIcon: ({ color, size, direction, }: IconProps) => React.JSX.Element;
40
- export declare const ChevronIcon: ({ color, size, }: IconProps) => React.JSX.Element;
40
+ export declare const ChevronIcon: ({ color, size, direction, }: IconProps) => React.JSX.Element;
41
41
  export declare const FilterIcon: ({ color, size, }: IconProps) => React.JSX.Element;
42
42
  export declare const DownloadIcon: ({ color, size, }: IconProps) => React.JSX.Element;
43
43
  export declare const CloseWhite: ({ color, size }: IconProps) => React.JSX.Element;
@@ -135,3 +135,6 @@ export declare const PencilIcon: ({ color, size, }: IconProps) => React.JSX.Elem
135
135
  export declare const PlusIcon: ({ color, size, }: IconProps) => React.JSX.Element;
136
136
  export declare const LockIcon: ({ color, size, }: IconProps) => React.JSX.Element;
137
137
  export declare const QrCodeIcon: ({ color, size, }: IconProps) => React.JSX.Element;
138
+ export declare const UnlockIcon: ({ color, size, }: IconProps) => React.JSX.Element;
139
+ export declare const RocketIcon: ({ color, size, }: IconProps) => React.JSX.Element;
140
+ export declare const TurtleIcon: ({ color, size, }: IconProps) => React.JSX.Element;
@@ -167,9 +167,16 @@ export const SortArrowIcon = ({ color = AppColors.primaryLight, size = 20, direc
167
167
  </>)}
168
168
  </Svg>);
169
169
  };
170
- export const ChevronIcon = ({ color = AppColors.grayTextWeak, size = 14, }) => {
170
+ export const ChevronIcon = ({ color = AppColors.grayTextWeak, size = 14, direction = 'down', }) => {
171
+ let path = 'M6 9l6 6 6-6';
172
+ if (direction === 'up')
173
+ path = 'M18 15l-6-6-6 6';
174
+ else if (direction === 'right')
175
+ path = 'M9 18l6-6-6-6';
176
+ else if (direction === 'left')
177
+ path = 'M15 18l-6-6 6-6';
171
178
  return (<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
172
- <Path d="M6 9l6 6 6-6" stroke={color} strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round"/>
179
+ <Path d={path} stroke={color} strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round"/>
173
180
  </Svg>);
174
181
  };
175
182
  export const FilterIcon = ({ color = AppColors.grayTextWeak, size = 18, }) => {
@@ -740,3 +747,16 @@ export const QrCodeIcon = ({ color = AppColors.grayTextWeak, size = 14, }) => (<
740
747
  <Rect x="3" y="14" width="7" height="7" rx="1.5" stroke={color} strokeWidth="2"/>
741
748
  <Path d="M14 14h3v3h-3zM18 18h3v3h-3zM14 19h3v2h-3zM19 14h2v3h-2z" fill={color}/>
742
749
  </Svg>);
750
+ export const UnlockIcon = ({ color = AppColors.grayTextWeak, size = 14, }) => (<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
751
+ <Rect x="3" y="11" width="18" height="11" rx="2" ry="2" stroke={color} strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
752
+ <Path d="M7 11V7a5 5 0 0 1 9.9-1" stroke={color} strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
753
+ </Svg>);
754
+ export const RocketIcon = ({ color = AppColors.grayTextWeak, size = 14, }) => (<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
755
+ <Path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09zM12 15l-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6.05 11a22.35 22.35 0 0 1-3.95 2z" stroke={color} strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
756
+ <Path d="M9 12l-4 4M15 6l-3 3" stroke={color} strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
757
+ </Svg>);
758
+ export const TurtleIcon = ({ color = AppColors.grayTextWeak, size = 14, }) => (<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
759
+ <Ellipse cx="12" cy="14" rx="7" ry="5" stroke={color} strokeWidth="2"/>
760
+ <Circle cx="12" cy="6" r="3" stroke={color} strokeWidth="2"/>
761
+ <Path d="M5 12l-2-2M19 12l2-2M6 18l-2 2M18 18l2 2" stroke={color} strokeWidth="2" strokeLinecap="round"/>
762
+ </Svg>);
@@ -1,3 +1,3 @@
1
- export declare const ENC_MID = "df8ace0290a695bd05986213";
2
- export declare const ENC_SEC = "db93cb0186b1f7bb0ba63a0d0a64997586849455ce37";
3
- export declare const TELEMETRY_SALT = "rn-inapp-inspector-telemetry-v1";
1
+ export declare const ENC_MID = "";
2
+ export declare const ENC_SEC = "";
3
+ export declare const TELEMETRY_SALT = "";
@@ -1,3 +1,3 @@
1
- export const ENC_MID = 'df8ace0290a695bd05986213';
2
- export const ENC_SEC = 'db93cb0186b1f7bb0ba63a0d0a64997586849455ce37';
3
- export const TELEMETRY_SALT = 'rn-inapp-inspector-telemetry-v1';
1
+ export const ENC_MID = '';
2
+ export const ENC_SEC = '';
3
+ export const TELEMETRY_SALT = '';
@@ -1 +1 @@
1
- export declare const LIB_VERSION = "2.3.12";
1
+ export declare const LIB_VERSION = "2.3.13";
@@ -1 +1 @@
1
- export const LIB_VERSION = '2.3.12';
1
+ export const LIB_VERSION = '2.3.13';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-inapp-inspector",
3
- "version": "2.3.12",
3
+ "version": "2.3.13",
4
4
  "description": "The zero-config, all-in-one in-app debugger for React Native & Expo. Inspect Network (fetch/axios), Console logs, Stack Traces, Redux State, Firebase Analytics, and JS Bundle size directly on device.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -79,10 +79,15 @@ const HeaderRow = React.memo(function HeaderRow({
79
79
  {value}
80
80
  </Text>
81
81
  {isLong && (
82
- <View style={styles.htExpandRow}>
82
+ <View style={[styles.htExpandRow, {flexDirection: 'row', alignItems: 'center', gap: 4}]}>
83
83
  <Text style={styles.htExpandText}>
84
- {expanded ? 'less' : 'more'}
84
+ {expanded ? 'less' : 'more'}
85
85
  </Text>
86
+ <ChevronIcon
87
+ direction={expanded ? 'up' : 'down'}
88
+ color={AppColors.purple}
89
+ size={10}
90
+ />
86
91
  </View>
87
92
  )}
88
93
  </Pressable>
@@ -48,6 +48,7 @@ import {
48
48
  AppleIcon,
49
49
  AndroidIcon,
50
50
  DownloadIcon,
51
+ ChevronIcon,
51
52
  } from '../NetworkIcons';
52
53
 
53
54
  import Svg, {
@@ -808,9 +809,13 @@ const BundleTreeNodeView: React.FC<{
808
809
  onPress={() => toggleFolder(node.fullPath)}
809
810
  style={[bundleStyles.treeFolderRow, {paddingLeft: indentLeft}]}>
810
811
  <View style={bundleStyles.treeRowLeft}>
811
- <Text style={bundleStyles.treeChevron}>
812
- {isCollapsed ? '▸' : '▾'}
813
- </Text>
812
+ <View style={{marginRight: 4}}>
813
+ <ChevronIcon
814
+ direction={isCollapsed ? 'right' : 'down'}
815
+ size={12}
816
+ color={AppColors.grayTextWeak}
817
+ />
818
+ </View>
814
819
  {isCollapsed ? (
815
820
  <FolderIcon color={AppColors.amber500} size={15} />
816
821
  ) : (
@@ -1465,7 +1470,7 @@ const BundleTab = React.memo(() => {
1465
1470
  letterSpacing: 0.3,
1466
1471
  textTransform: 'uppercase',
1467
1472
  }}>
1468
- Live Metro URL
1473
+ Live Metro URL
1469
1474
  </Text>
1470
1475
  </View>
1471
1476
  <Text
@@ -31,6 +31,7 @@ import {
31
31
  ExternalLinkIcon,
32
32
  RepeatIcon,
33
33
  ShieldAlertIcon,
34
+ InfoCircleIcon,
34
35
  } from '../NetworkIcons';
35
36
 
36
37
  interface PortStatus {
@@ -180,10 +181,10 @@ export const DebuggingTab: React.FC = () => {
180
181
  </View>
181
182
  <Text style={styles.serverSubtitle}>
182
183
  {activePortInfo?.status === 'active'
183
- ? `🟢 Active & Bundling (${activePortInfo.latencyMs}ms)`
184
+ ? `Active & Bundling (${activePortInfo.latencyMs}ms)`
184
185
  : activePortInfo?.status === 'checking'
185
- ? '🟡 Probing Metro Ports...'
186
- : '🔴 Standby / Select active port'}
186
+ ? 'Probing Metro Ports...'
187
+ : 'Standby / Select active port'}
187
188
  </Text>
188
189
  </View>
189
190
  </View>
@@ -273,9 +274,12 @@ export const DebuggingTab: React.FC = () => {
273
274
  />
274
275
  <Text style={styles.inputSuffix}>:{selectedPort}</Text>
275
276
  </View>
276
- <Text style={styles.inputHint}>
277
- 💡 Ensure your physical Android device and Mac are connected to the same Wi-Fi network.
278
- </Text>
277
+ <View style={{flexDirection: 'row', alignItems: 'center', gap: 6, marginTop: 6}}>
278
+ <InfoCircleIcon size={13} color={AppColors.grayTextWeak} />
279
+ <Text style={[styles.inputHint, {marginTop: 0, flex: 1}]}>
280
+ Ensure your physical Android device and Mac are connected to the same Wi-Fi network.
281
+ </Text>
282
+ </View>
279
283
  </View>
280
284
 
281
285
  {/* ─── Interactive QR Code Generator Card ──────────────────────── */}
@@ -353,13 +357,22 @@ export const DebuggingTab: React.FC = () => {
353
357
  />
354
358
 
355
359
  <View style={styles.qrInfoBox}>
356
- <Text style={styles.qrTargetTitle}>
357
- {activeQrTab === 'apk'
358
- ? '📦 Direct APK Download URL'
359
- : activeQrTab === 'host'
360
- ? '📱 Dev Settings Bundle Host'
361
- : '⚡ Live Metro Fast-Refresh Endpoint'}
362
- </Text>
360
+ <View style={{flexDirection: 'row', alignItems: 'center', gap: 5, marginBottom: 2}}>
361
+ {activeQrTab === 'apk' ? (
362
+ <PackageIcon size={14} color={AppColors.purple} />
363
+ ) : activeQrTab === 'host' ? (
364
+ <SmartphoneIcon size={14} color={AppColors.purple} />
365
+ ) : (
366
+ <BoltIcon size={14} color={AppColors.amber500} />
367
+ )}
368
+ <Text style={styles.qrTargetTitle}>
369
+ {activeQrTab === 'apk'
370
+ ? 'Direct APK Download URL'
371
+ : activeQrTab === 'host'
372
+ ? 'Dev Settings Bundle Host'
373
+ : 'Live Metro Fast-Refresh Endpoint'}
374
+ </Text>
375
+ </View>
363
376
  <Text style={styles.qrTargetUrl} numberOfLines={2} ellipsizeMode="middle">
364
377
  {currentQrValue}
365
378
  </Text>
@@ -389,7 +402,10 @@ export const DebuggingTab: React.FC = () => {
389
402
 
390
403
  {/* ─── Bare React Native Multi-Device Setup Guide ───────────────── */}
391
404
  <View style={styles.guideCard}>
392
- <Text style={styles.guideHeading}>📱 HOW TO CONNECT ANDROID DEVICE:</Text>
405
+ <View style={{flexDirection: 'row', alignItems: 'center', gap: 6, marginBottom: 12}}>
406
+ <SmartphoneIcon size={15} color={AppColors.primaryLight} />
407
+ <Text style={[styles.guideHeading, {marginBottom: 0}]}>HOW TO CONNECT ANDROID DEVICE:</Text>
408
+ </View>
393
409
 
394
410
  <View style={styles.stepRow}>
395
411
  <View style={styles.stepNumberBadge}>
@@ -420,7 +436,10 @@ export const DebuggingTab: React.FC = () => {
420
436
  <Text style={styles.stepNumberText}>3</Text>
421
437
  </View>
422
438
  <View style={{flex: 1}}>
423
- <Text style={styles.stepTitle}>Simultaneous Live Fast-Refresh ⚡</Text>
439
+ <View style={{flexDirection: 'row', alignItems: 'center', gap: 4}}>
440
+ <Text style={styles.stepTitle}>Simultaneous Live Fast-Refresh</Text>
441
+ <BoltIcon size={13} color={AppColors.amber500} />
442
+ </View>
424
443
  <Text style={styles.stepDesc}>
425
444
  Any changes saved in VS Code will immediately update <Text style={{fontWeight: '700'}}>both the iOS Simulator and physical Android phone</Text> in real-time!
426
445
  </Text>
@@ -432,7 +432,7 @@ const NetworkDetail = React.memo(() => {
432
432
  letterSpacing: 0.4,
433
433
  textTransform: 'uppercase',
434
434
  }}>
435
- ENDPOINT URL
435
+ ENDPOINT URL
436
436
  </Text>
437
437
  </View>
438
438
 
@@ -473,7 +473,7 @@ const NetworkDetail = React.memo(() => {
473
473
  fontSize: 9,
474
474
  color: AppColors.sky600,
475
475
  }}>
476
- Open
476
+ Open
477
477
  </Text>
478
478
  </View>
479
479
  </View>
@@ -27,6 +27,11 @@ import {
27
27
  BoltIcon,
28
28
  GlobeIcon,
29
29
  LockIcon,
30
+ UnlockIcon,
31
+ RocketIcon,
32
+ TurtleIcon,
33
+ HourglassIcon,
34
+ PackageIcon,
30
35
  } from '../NetworkIcons';
31
36
  import TouchableScale from '../TouchableScale';
32
37
 
@@ -405,12 +410,13 @@ export const NetworkFilterModal: React.FC<NetworkFilterModalProps> = ({
405
410
  <Text style={styles.sectionTitle}>LATENCY & SPEED</Text>
406
411
  <View style={styles.chipsWrap}>
407
412
  {[
408
- {key: 'all' as const, label: 'All Speeds', color: AppColors.purple},
409
- {key: 'fast' as const, label: 'Fast (<200ms)', color: AppColors.greenColor, count: counts.fastCount},
410
- {key: 'normal' as const, label: '⏱️ Normal (200-500ms)', color: AppColors.skyBlue, count: counts.normalCount},
411
- {key: 'slow' as const, label: '⚠️ Slow (>500ms)', color: AppColors.errorColor, count: counts.slowCount},
413
+ {key: 'all' as const, label: 'All Speeds', color: AppColors.purple, icon: LayersIcon},
414
+ {key: 'fast' as const, label: 'Fast (<200ms)', color: AppColors.greenColor, icon: BoltIcon, count: counts.fastCount},
415
+ {key: 'normal' as const, label: 'Normal (200-500ms)', color: AppColors.skyBlue, icon: ClockIcon, count: counts.normalCount},
416
+ {key: 'slow' as const, label: 'Slow (>500ms)', color: AppColors.errorColor, icon: CircleAlertIcon, count: counts.slowCount},
412
417
  ].map(item => {
413
418
  const isSelected = draft.latency === item.key;
419
+ const IconComp = item.icon;
414
420
  return (
415
421
  <TouchableOpacity
416
422
  key={item.key}
@@ -423,6 +429,10 @@ export const NetworkFilterModal: React.FC<NetworkFilterModalProps> = ({
423
429
  borderColor: item.color,
424
430
  },
425
431
  ]}>
432
+ <IconComp
433
+ size={13}
434
+ color={isSelected ? item.color : AppColors.grayTextWeak}
435
+ />
426
436
  <Text
427
437
  style={[
428
438
  styles.chipLabel,
@@ -448,11 +458,12 @@ export const NetworkFilterModal: React.FC<NetworkFilterModalProps> = ({
448
458
  <Text style={styles.sectionTitle}>PROTOCOL</Text>
449
459
  <View style={styles.chipsWrap}>
450
460
  {[
451
- {key: 'all' as const, label: 'All Protocols', color: AppColors.purple},
452
- {key: 'https' as const, label: '🔒 HTTPS Secure', color: AppColors.mintGreenText, count: counts.httpsCount},
453
- {key: 'http' as const, label: '🔓 HTTP Insecure', color: AppColors.amber700, count: counts.httpCount},
461
+ {key: 'all' as const, label: 'All Protocols', color: AppColors.purple, icon: GlobeIcon},
462
+ {key: 'https' as const, label: 'HTTPS Secure', color: AppColors.mintGreenText, icon: LockIcon, count: counts.httpsCount},
463
+ {key: 'http' as const, label: 'HTTP Insecure', color: AppColors.amber700, icon: UnlockIcon, count: counts.httpCount},
454
464
  ].map(item => {
455
465
  const isSelected = draft.protocol === item.key;
466
+ const IconComp = item.icon;
456
467
  return (
457
468
  <TouchableOpacity
458
469
  key={item.key}
@@ -465,6 +476,10 @@ export const NetworkFilterModal: React.FC<NetworkFilterModalProps> = ({
465
476
  borderColor: item.color,
466
477
  },
467
478
  ]}>
479
+ <IconComp
480
+ size={13}
481
+ color={isSelected ? item.color : AppColors.grayTextWeak}
482
+ />
468
483
  <Text
469
484
  style={[
470
485
  styles.chipLabel,
@@ -490,13 +505,14 @@ export const NetworkFilterModal: React.FC<NetworkFilterModalProps> = ({
490
505
  <Text style={styles.sectionTitle}>SORT BY</Text>
491
506
  <View style={styles.chipsWrap}>
492
507
  {[
493
- {key: 'time_desc' as const, label: '⏱️ Newest First (Default)'},
494
- {key: 'time_asc' as const, label: 'Oldest First'},
495
- {key: 'duration_desc' as const, label: '🐢 Slowest Response'},
496
- {key: 'duration_asc' as const, label: '🚀 Fastest Response'},
497
- {key: 'size_desc' as const, label: '📦 Largest Response Size'},
508
+ {key: 'time_desc' as const, label: 'Newest First (Default)', icon: ClockIcon},
509
+ {key: 'time_asc' as const, label: 'Oldest First', icon: HourglassIcon},
510
+ {key: 'duration_desc' as const, label: 'Slowest Response', icon: TurtleIcon},
511
+ {key: 'duration_asc' as const, label: 'Fastest Response', icon: RocketIcon},
512
+ {key: 'size_desc' as const, label: 'Largest Response Size', icon: PackageIcon},
498
513
  ].map(item => {
499
514
  const isSelected = draft.sortBy === item.key;
515
+ const IconComp = item.icon;
500
516
  return (
501
517
  <TouchableOpacity
502
518
  key={item.key}
@@ -509,6 +525,10 @@ export const NetworkFilterModal: React.FC<NetworkFilterModalProps> = ({
509
525
  borderColor: AppColors.purple,
510
526
  },
511
527
  ]}>
528
+ <IconComp
529
+ size={13}
530
+ color={isSelected ? AppColors.purple : AppColors.grayTextWeak}
531
+ />
512
532
  <Text
513
533
  style={[
514
534
  styles.chipLabel,
@@ -30,6 +30,7 @@ import {
30
30
  LayersIcon,
31
31
  ResetIcon,
32
32
  ChevronIcon,
33
+ WarningTriangleIcon,
33
34
  } from '../NetworkIcons';
34
35
  import {
35
36
  fetchStorageEntries,
@@ -162,9 +163,16 @@ const StorageEntryCard = React.memo(function StorageEntryCard({
162
163
  {displayValue}
163
164
  </Text>
164
165
  {entry.value.length > 80 && (
165
- <Text style={styles.expandHint}>
166
- {isExpanded ? '▲ Collapse' : '▼ Expand'}
167
- </Text>
166
+ <View style={{flexDirection: 'row', alignItems: 'center', gap: 4, marginTop: 4}}>
167
+ <Text style={styles.expandHint}>
168
+ {isExpanded ? 'Collapse' : 'Expand'}
169
+ </Text>
170
+ <ChevronIcon
171
+ direction={isExpanded ? 'up' : 'down'}
172
+ size={10}
173
+ color={AppColors.purple}
174
+ />
175
+ </View>
168
176
  )}
169
177
  </TouchableScale>
170
178
  </View>
@@ -710,7 +718,10 @@ export const StorageTab = React.memo(() => {
710
718
  autoCapitalize="none"
711
719
  />
712
720
  {jsonError && (
713
- <Text style={styles.errorText}>⚠️ {jsonError}</Text>
721
+ <View style={{flexDirection: 'row', alignItems: 'center', gap: 5, marginTop: 4}}>
722
+ <WarningTriangleIcon size={12} color={AppColors.errorColor} />
723
+ <Text style={styles.errorText}>{jsonError}</Text>
724
+ </View>
714
725
  )}
715
726
  </View>
716
727
 
@@ -7,7 +7,7 @@ import TreeNode from './TreeNode';
7
7
  import SegmentedTabs from './SegmentedTabs';
8
8
  import HighlightText from './HighlightText';
9
9
  import CopyButton from './CopyButton';
10
- import {PrettyIcon, RawIcon, TableIcon} from './NetworkIcons';
10
+ import {PrettyIcon, RawIcon, TableIcon, ChevronIcon} from './NetworkIcons';
11
11
 
12
12
  // Styles
13
13
  import {AppColors} from '../styles/AppColors';
@@ -77,10 +77,15 @@ const JsonTableRow = React.memo(({
77
77
  <TouchableOpacity
78
78
  onPress={() => setExpanded(prev => !prev)}
79
79
  hitSlop={6}
80
- style={localStyles.showMoreBtn}>
80
+ style={[localStyles.showMoreBtn, {flexDirection: 'row', alignItems: 'center', gap: 4}]}>
81
81
  <Text style={localStyles.showMoreText}>
82
- {expanded ? 'Show less' : 'Show more'}
82
+ {expanded ? 'Show less' : 'Show more'}
83
83
  </Text>
84
+ <ChevronIcon
85
+ direction={expanded ? 'up' : 'down'}
86
+ size={10}
87
+ color={AppColors.purple}
88
+ />
84
89
  </TouchableOpacity>
85
90
  )}
86
91
  </View>
@@ -570,11 +570,16 @@ export const SortArrowIcon = ({
570
570
  export const ChevronIcon = ({
571
571
  color = AppColors.grayTextWeak,
572
572
  size = 14,
573
+ direction = 'down',
573
574
  }: IconProps) => {
575
+ let path = 'M6 9l6 6 6-6';
576
+ if (direction === 'up') path = 'M18 15l-6-6-6 6';
577
+ else if (direction === 'right') path = 'M9 18l6-6-6-6';
578
+ else if (direction === 'left') path = 'M15 18l-6-6 6-6';
574
579
  return (
575
580
  <Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
576
581
  <Path
577
- d="M6 9l6 6 6-6"
582
+ d={path}
578
583
  stroke={color}
579
584
  strokeWidth="2.5"
580
585
  strokeLinecap="round"
@@ -2285,3 +2290,68 @@ export const QrCodeIcon = ({
2285
2290
  </Svg>
2286
2291
  );
2287
2292
 
2293
+ export const UnlockIcon = ({
2294
+ color = AppColors.grayTextWeak,
2295
+ size = 14,
2296
+ }: IconProps) => (
2297
+ <Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
2298
+ <Rect
2299
+ x="3"
2300
+ y="11"
2301
+ width="18"
2302
+ height="11"
2303
+ rx="2"
2304
+ ry="2"
2305
+ stroke={color}
2306
+ strokeWidth="2"
2307
+ strokeLinecap="round"
2308
+ strokeLinejoin="round"
2309
+ />
2310
+ <Path
2311
+ d="M7 11V7a5 5 0 0 1 9.9-1"
2312
+ stroke={color}
2313
+ strokeWidth="2"
2314
+ strokeLinecap="round"
2315
+ strokeLinejoin="round"
2316
+ />
2317
+ </Svg>
2318
+ );
2319
+
2320
+ export const RocketIcon = ({
2321
+ color = AppColors.grayTextWeak,
2322
+ size = 14,
2323
+ }: IconProps) => (
2324
+ <Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
2325
+ <Path
2326
+ d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09zM12 15l-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6.05 11a22.35 22.35 0 0 1-3.95 2z"
2327
+ stroke={color}
2328
+ strokeWidth="2"
2329
+ strokeLinecap="round"
2330
+ strokeLinejoin="round"
2331
+ />
2332
+ <Path
2333
+ d="M9 12l-4 4M15 6l-3 3"
2334
+ stroke={color}
2335
+ strokeWidth="2"
2336
+ strokeLinecap="round"
2337
+ strokeLinejoin="round"
2338
+ />
2339
+ </Svg>
2340
+ );
2341
+
2342
+ export const TurtleIcon = ({
2343
+ color = AppColors.grayTextWeak,
2344
+ size = 14,
2345
+ }: IconProps) => (
2346
+ <Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
2347
+ <Ellipse cx="12" cy="14" rx="7" ry="5" stroke={color} strokeWidth="2" />
2348
+ <Circle cx="12" cy="6" r="3" stroke={color} strokeWidth="2" />
2349
+ <Path
2350
+ d="M5 12l-2-2M19 12l2-2M6 18l-2 2M18 18l2 2"
2351
+ stroke={color}
2352
+ strokeWidth="2"
2353
+ strokeLinecap="round"
2354
+ />
2355
+ </Svg>
2356
+ );
2357
+
@@ -1,6 +1,4 @@
1
1
  // AUTO-GENERATED FILE — do not edit by hand.
2
- // Generated by scripts/gen-telemetry.js from .env at build time.
3
-
4
- export const ENC_MID = 'df8ace0290a695bd05986213';
5
- export const ENC_SEC = 'db93cb0186b1f7bb0ba63a0d0a64997586849455ce37';
6
- export const TELEMETRY_SALT = 'rn-inapp-inspector-telemetry-v1';
2
+ export const ENC_MID = '';
3
+ export const ENC_SEC = '';
4
+ export const TELEMETRY_SALT = '';
@@ -1,3 +1,3 @@
1
1
  // AUTO-GENERATED FILE — do not edit by hand.
2
2
  // Regenerated from package.json on every build by scripts/gen-version.js.
3
- export const LIB_VERSION = '2.3.12';
3
+ export const LIB_VERSION = '2.3.13';
File without changes
File without changes
@@ -1,2 +0,0 @@
1
- #Wed Aug 19 11:26:52 IST 2026
2
- gradle.version=8.9
File without changes