react-native-inapp-inspector 1.1.35 → 2.0.0

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 (82) hide show
  1. package/README.md +123 -101
  2. package/android/build.gradle +13 -1
  3. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +904 -0
  4. package/android/src/main/java/com/inappinspector/NetworkInspectorPackage.kt +17 -0
  5. package/dist/commonjs/components/CopyButton.js +3 -0
  6. package/dist/commonjs/components/ErrorBoundary.js +3 -0
  7. package/dist/commonjs/components/Inspector/AnalyticsTab.js +7 -3
  8. package/dist/commonjs/components/Inspector/BundleTab.js +1 -1
  9. package/dist/commonjs/components/Inspector/ConsoleTab.js +1 -1
  10. package/dist/commonjs/components/Inspector/CrashTab.js +97 -90
  11. package/dist/commonjs/components/Inspector/InspectorHeader.js +12 -8
  12. package/dist/commonjs/components/Inspector/MainScreen.js +14 -101
  13. package/dist/commonjs/components/Inspector/NetworkTab.js +47 -10
  14. package/dist/commonjs/components/Inspector/PerformanceTab.js +96 -3
  15. package/dist/commonjs/components/Inspector/ReduxTab.js +18 -10
  16. package/dist/commonjs/components/Inspector/SettingsPanel.js +342 -88
  17. package/dist/commonjs/components/Inspector/TabBar.js +6 -3
  18. package/dist/commonjs/components/NetworkIcons.d.ts +1 -0
  19. package/dist/commonjs/components/NetworkIcons.js +6 -1
  20. package/dist/commonjs/components/TouchableScale.d.ts +1 -0
  21. package/dist/commonjs/components/TouchableScale.js +30 -32
  22. package/dist/commonjs/constants/index.d.ts +1 -2
  23. package/dist/commonjs/constants/index.js +4 -0
  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.d.ts +4 -0
  27. package/dist/commonjs/customHooks/analyticsLogger.js +7 -5
  28. package/dist/commonjs/customHooks/crashHandler.js +7 -0
  29. package/dist/commonjs/helpers/index.js +10 -1
  30. package/dist/commonjs/helpers/settingsStore.d.ts +9 -0
  31. package/dist/commonjs/helpers/settingsStore.js +59 -3
  32. package/dist/commonjs/index.d.ts +1 -0
  33. package/dist/commonjs/index.js +229 -39
  34. package/dist/commonjs/native/NativeInspector.d.ts +125 -0
  35. package/dist/commonjs/native/NativeInspector.js +313 -0
  36. package/dist/commonjs/native/NativeNetworkInspector.d.ts +22 -0
  37. package/dist/commonjs/native/NativeNetworkInspector.js +4 -0
  38. package/dist/commonjs/styles/index.js +6 -6
  39. package/dist/commonjs/types/enums.d.ts +1 -1
  40. package/dist/commonjs/types/interfaces.d.ts +9 -0
  41. package/dist/esm/components/CopyButton.js +3 -0
  42. package/dist/esm/components/ErrorBoundary.js +3 -0
  43. package/dist/esm/components/Inspector/AnalyticsTab.js +7 -3
  44. package/dist/esm/components/Inspector/BundleTab.js +1 -1
  45. package/dist/esm/components/Inspector/ConsoleTab.js +1 -1
  46. package/dist/esm/components/Inspector/CrashTab.js +97 -90
  47. package/dist/esm/components/Inspector/InspectorHeader.js +13 -9
  48. package/dist/esm/components/Inspector/MainScreen.js +15 -69
  49. package/dist/esm/components/Inspector/NetworkTab.js +47 -10
  50. package/dist/esm/components/Inspector/PerformanceTab.js +96 -3
  51. package/dist/esm/components/Inspector/ReduxTab.js +18 -10
  52. package/dist/esm/components/Inspector/SettingsPanel.js +344 -90
  53. package/dist/esm/components/Inspector/TabBar.js +7 -4
  54. package/dist/esm/components/NetworkIcons.d.ts +1 -0
  55. package/dist/esm/components/NetworkIcons.js +4 -0
  56. package/dist/esm/components/TouchableScale.d.ts +1 -0
  57. package/dist/esm/components/TouchableScale.js +31 -33
  58. package/dist/esm/constants/index.d.ts +1 -2
  59. package/dist/esm/constants/index.js +4 -0
  60. package/dist/esm/constants/version.d.ts +1 -1
  61. package/dist/esm/constants/version.js +1 -1
  62. package/dist/esm/customHooks/analyticsLogger.d.ts +4 -0
  63. package/dist/esm/customHooks/analyticsLogger.js +5 -4
  64. package/dist/esm/customHooks/crashHandler.js +7 -0
  65. package/dist/esm/helpers/index.js +10 -1
  66. package/dist/esm/helpers/settingsStore.d.ts +9 -0
  67. package/dist/esm/helpers/settingsStore.js +58 -3
  68. package/dist/esm/index.d.ts +1 -0
  69. package/dist/esm/index.js +215 -39
  70. package/dist/esm/native/NativeInspector.d.ts +125 -0
  71. package/dist/esm/native/NativeInspector.js +289 -0
  72. package/dist/esm/native/NativeNetworkInspector.d.ts +22 -0
  73. package/dist/esm/native/NativeNetworkInspector.js +2 -0
  74. package/dist/esm/styles/index.js +6 -6
  75. package/dist/esm/types/enums.d.ts +1 -1
  76. package/dist/esm/types/interfaces.d.ts +9 -0
  77. package/ios/NetworkInspectorModule.h +6 -0
  78. package/ios/NetworkInspectorModule.m +720 -5
  79. package/package.json +13 -2
  80. package/react-native-inapp-inspector.podspec +7 -2
  81. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.java +0 -97
  82. package/android/src/main/java/com/inappinspector/NetworkInspectorPackage.java +0 -28
@@ -59,7 +59,8 @@ const i18n_1 = require("../../i18n");
59
59
  const NetworkIcons_1 = require("../NetworkIcons");
60
60
  const SettingsPanel = () => {
61
61
  const { t } = (0, i18n_1.useTranslation)();
62
- const { settingsPage, setSettingsPage, settingsActiveSubTab, setSettingsActiveSubTab, tabVisibility, toggleTabVisibility, defaultTab, setDefaultTab, isDark, setIsDark, modalHeightPercent, setModalHeightPercent, modalAnimationType, setModalAnimationType, showDuplicateLogs, setShowDuplicateLogs, showConsoleLevels, setShowConsoleLevels, resetToDefaults, storage, logs, consoleLogs, analyticsEvents, reduxState, maxNetworkLogs, setMaxNetworkLogs, maxConsoleLogs, setMaxConsoleLogs, reduxAutoRefresh, setReduxAutoRefreshState, reduxExpandDepth, setReduxExpandDepth, switchActiveTab, setSelected, setSelectedEvent, setReduxState, crashRecords, maxCrashLogs, setMaxCrashLogs, } = (0, InspectorContext_1.useInspector)();
62
+ const { settingsPage, setSettingsPage, settingsActiveSubTab, setSettingsActiveSubTab, tabVisibility, toggleTabVisibility, defaultTab, setDefaultTab, isDark, setIsDark, modalHeightPercent, setModalHeightPercent, modalAnimationType, setModalAnimationType, showDuplicateLogs, setShowDuplicateLogs, 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, } = (0, InspectorContext_1.useInspector)();
63
+ const autoRamProfile = (0, settingsStore_1.calculateRamBasedLimits)(deviceFreeRamMb);
63
64
  const isPersistent = (0, settingsStore_1.isPersistentStorageAvailable)();
64
65
  // Safe Area & Status Bar Padding for All Device Form Factors
65
66
  const statusBarHeight = react_native_1.Platform.OS === 'android' ? react_native_1.StatusBar.currentHeight || 24 : 44;
@@ -702,9 +703,204 @@ const SettingsPanel = () => {
702
703
  </react_native_1.View>);
703
704
  })}
704
705
  </react_native_1.View>
705
- </react_native_1.View>) : (
706
- /* UI Preferences Subtab */
707
- <react_native_1.View style={{ gap: 14 }}>
706
+
707
+ {/* Section 3.5: RAM-Based Auto Limits */}
708
+ <react_native_1.View style={{
709
+ backgroundColor: AppColors_1.AppColors.primaryLight,
710
+ borderRadius: 14,
711
+ borderWidth: 1,
712
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
713
+ overflow: 'hidden',
714
+ padding: 14,
715
+ gap: 12,
716
+ }}>
717
+ <react_native_1.Text style={{
718
+ fontFamily: AppFonts_1.AppFonts.interBold,
719
+ fontSize: 11,
720
+ lineHeight: 14,
721
+ color: AppColors_1.AppColors.grayTextWeak,
722
+ letterSpacing: 0.8,
723
+ }}>
724
+ RAM-Based Auto Limits
725
+ </react_native_1.Text>
726
+
727
+ {/* Auto RAM Limit Toggle */}
728
+ <react_native_1.View style={{
729
+ flexDirection: 'row',
730
+ alignItems: 'center',
731
+ justifyContent: 'space-between',
732
+ }}>
733
+ <react_native_1.View style={{
734
+ flexDirection: 'row',
735
+ alignItems: 'center',
736
+ gap: 10,
737
+ flex: 1,
738
+ }}>
739
+ <react_native_1.View style={{
740
+ width: 32,
741
+ height: 32,
742
+ borderRadius: 8,
743
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
744
+ alignItems: 'center',
745
+ justifyContent: 'center',
746
+ }}>
747
+ <NetworkIcons_1.PerformanceIcon color={AppColors_1.AppColors.purple} size={15}/>
748
+ </react_native_1.View>
749
+ <react_native_1.View style={{ flex: 1 }}>
750
+ <react_native_1.Text style={{
751
+ fontFamily: AppFonts_1.AppFonts.interBold,
752
+ fontSize: 13.5,
753
+ lineHeight: 18,
754
+ color: AppColors_1.AppColors.primaryBlack,
755
+ }}>
756
+ Auto-Calculate Limits from Device RAM
757
+ </react_native_1.Text>
758
+ <react_native_1.Text style={{
759
+ fontFamily: AppFonts_1.AppFonts.interRegular,
760
+ fontSize: 11,
761
+ lineHeight: 15,
762
+ color: AppColors_1.AppColors.grayText,
763
+ marginTop: 1,
764
+ }}>
765
+ Automatically set API, Logs, Analytics & Crash limits based on available memory
766
+ </react_native_1.Text>
767
+ </react_native_1.View>
768
+ </react_native_1.View>
769
+
770
+ <TouchableScale_1.default accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle auto RAM limit calculation" accessibilityState={{ checked: isAutoRamLimitEnabled }} onPress={() => setIsAutoRamLimitEnabled(prev => !prev)} style={{
771
+ width: 42,
772
+ height: 24,
773
+ borderRadius: 12,
774
+ backgroundColor: isAutoRamLimitEnabled
775
+ ? AppColors_1.AppColors.purple
776
+ : AppColors_1.AppColors.grayBorderSecondary,
777
+ padding: 2,
778
+ justifyContent: 'center',
779
+ alignItems: isAutoRamLimitEnabled ? 'flex-end' : 'flex-start',
780
+ }}>
781
+ <react_native_1.View style={{
782
+ width: 20,
783
+ height: 20,
784
+ borderRadius: 10,
785
+ backgroundColor: AppColors_1.AppColors.white,
786
+ shadowColor: AppColors_1.AppColors.black,
787
+ shadowOpacity: 0.18,
788
+ shadowRadius: 2,
789
+ shadowOffset: { width: 0, height: 1 },
790
+ }}/>
791
+ </TouchableScale_1.default>
792
+ </react_native_1.View>
793
+
794
+ <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
795
+
796
+ {/* Device Free RAM Display */}
797
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 10 }}>
798
+ <react_native_1.View style={{
799
+ width: 32,
800
+ height: 32,
801
+ borderRadius: 8,
802
+ backgroundColor: isAutoRamLimitEnabled
803
+ ? `${AppColors_1.AppColors.purple}14`
804
+ : AppColors_1.AppColors.grayBackground,
805
+ alignItems: 'center',
806
+ justifyContent: 'center',
807
+ }}>
808
+ <NetworkIcons_1.SignalIcon color={isAutoRamLimitEnabled ? AppColors_1.AppColors.purple : AppColors_1.AppColors.grayTextWeak} size={15}/>
809
+ </react_native_1.View>
810
+ <react_native_1.View style={{ flex: 1 }}>
811
+ <react_native_1.Text style={{
812
+ fontFamily: AppFonts_1.AppFonts.interBold,
813
+ fontSize: 13.5,
814
+ lineHeight: 18,
815
+ color: isAutoRamLimitEnabled
816
+ ? AppColors_1.AppColors.primaryBlack
817
+ : AppColors_1.AppColors.grayText,
818
+ }}>
819
+ Detected Free RAM
820
+ </react_native_1.Text>
821
+ <react_native_1.Text style={{
822
+ fontFamily: AppFonts_1.AppFonts.interRegular,
823
+ fontSize: 11,
824
+ lineHeight: 15,
825
+ color: AppColors_1.AppColors.grayText,
826
+ marginTop: 1,
827
+ }}>
828
+ {deviceFreeRamMb} MB available
829
+ </react_native_1.Text>
830
+ </react_native_1.View>
831
+ <react_native_1.View style={{
832
+ paddingHorizontal: 10,
833
+ paddingVertical: 5,
834
+ borderRadius: 8,
835
+ backgroundColor: isAutoRamLimitEnabled
836
+ ? `${AppColors_1.AppColors.purple}12`
837
+ : AppColors_1.AppColors.grayBackground,
838
+ borderWidth: 1,
839
+ borderColor: isAutoRamLimitEnabled
840
+ ? `${AppColors_1.AppColors.purple}26`
841
+ : AppColors_1.AppColors.dividerColor,
842
+ }}>
843
+ <react_native_1.Text style={{
844
+ fontFamily: AppFonts_1.AppFonts.interBold,
845
+ fontSize: 12,
846
+ lineHeight: 15,
847
+ color: isAutoRamLimitEnabled
848
+ ? AppColors_1.AppColors.purple
849
+ : AppColors_1.AppColors.grayText,
850
+ }}>
851
+ {deviceFreeRamMb} MB
852
+ </react_native_1.Text>
853
+ </react_native_1.View>
854
+ </react_native_1.View>
855
+
856
+ {/* Current Auto-Calculated Limits Preview */}
857
+ {isAutoRamLimitEnabled && (<react_native_1.View style={{ marginTop: 8, paddingTop: 8, borderTopWidth: 1, borderTopColor: AppColors_1.AppColors.dividerColor, gap: 6 }}>
858
+ <react_native_1.Text style={{
859
+ fontFamily: AppFonts_1.AppFonts.interBold,
860
+ fontSize: 11.5,
861
+ lineHeight: 15,
862
+ color: AppColors_1.AppColors.purple,
863
+ }}>
864
+ Auto Profile: {autoRamProfile.profileName}
865
+ </react_native_1.Text>
866
+ <react_native_1.View style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 8 }}>
867
+ {[
868
+ { label: 'APIs', value: autoRamProfile.maxNetworkLogs, color: AppColors_1.AppColors.blue500 },
869
+ { label: 'Logs', value: autoRamProfile.maxConsoleLogs, color: AppColors_1.AppColors.sky500 },
870
+ { label: 'Analytics', value: autoRamProfile.maxAnalyticsEvents, color: AppColors_1.AppColors.purple },
871
+ { label: 'Crash', value: autoRamProfile.maxCrashRecords, color: AppColors_1.AppColors.errorColor },
872
+ ].map(item => (<react_native_1.View key={item.label} style={{
873
+ flexDirection: 'row',
874
+ alignItems: 'center',
875
+ gap: 4,
876
+ paddingHorizontal: 8,
877
+ paddingVertical: 4,
878
+ borderRadius: 6,
879
+ backgroundColor: `${item.color}14`,
880
+ borderWidth: 1,
881
+ borderColor: `${item.color}33`,
882
+ }}>
883
+ <react_native_1.Text style={{
884
+ fontFamily: AppFonts_1.AppFonts.interBold,
885
+ fontSize: 10.5,
886
+ lineHeight: 14,
887
+ color: item.color,
888
+ }}>
889
+ {item.label}
890
+ </react_native_1.Text>
891
+ <react_native_1.Text style={{
892
+ fontFamily: AppFonts_1.AppFonts.interBold,
893
+ fontSize: 10.5,
894
+ lineHeight: 14,
895
+ color: item.color,
896
+ }}>
897
+ {item.value}
898
+ </react_native_1.Text>
899
+ </react_native_1.View>))}
900
+ </react_native_1.View>
901
+ </react_native_1.View>)}
902
+ </react_native_1.View>
903
+ </react_native_1.View>) : (<react_native_1.View style={{ gap: 14 }}>
708
904
  {/* Section 1: Appearance */}
709
905
  <react_native_1.View style={{
710
906
  backgroundColor: AppColors_1.AppColors.primaryLight,
@@ -1459,83 +1655,128 @@ const SettingsPanel = () => {
1459
1655
  setSettingsPage('main');
1460
1656
  };
1461
1657
  // Helper: settings row with icon + label + optional description
1462
- const renderSettingRow = (opts) => (<react_native_1.View style={{
1463
- paddingVertical: 12,
1464
- borderBottomWidth: opts.isLast ? 0 : 1,
1465
- borderBottomColor: AppColors_1.AppColors.dividerColor,
1466
- }}>
1467
- <TouchableScale_1.default disabled={!opts.onPress} onPress={opts.onPress} style={{
1468
- flexDirection: 'row',
1469
- alignItems: 'center',
1470
- gap: 12,
1471
- }}>
1472
- <react_native_1.View style={{
1473
- width: 36,
1474
- height: 36,
1475
- borderRadius: 10,
1476
- backgroundColor: AppColors_1.AppColors.purpleShade50,
1477
- borderWidth: 1,
1478
- borderColor: `${AppColors_1.AppColors.purple}2E`,
1479
- alignItems: 'center',
1480
- justifyContent: 'center',
1481
- }}>
1482
- {opts.icon}
1483
- </react_native_1.View>
1484
- <react_native_1.View style={{ flex: 1 }}>
1485
- <react_native_1.Text style={{
1486
- fontFamily: AppFonts_1.AppFonts.interBold,
1487
- fontSize: 14,
1488
- lineHeight: 18,
1489
- color: AppColors_1.AppColors.primaryBlack,
1490
- }}>
1491
- {opts.label}
1492
- </react_native_1.Text>
1493
- {opts.description ? (<react_native_1.Text style={{
1494
- fontFamily: AppFonts_1.AppFonts.interRegular,
1495
- fontSize: 11,
1496
- lineHeight: 15,
1497
- color: AppColors_1.AppColors.grayText,
1498
- marginTop: 1,
1658
+ const renderSettingRow = (opts) => {
1659
+ return (<react_native_1.View style={{
1660
+ paddingVertical: 12,
1661
+ borderBottomWidth: opts.isLast ? 0 : 1,
1662
+ borderBottomColor: AppColors_1.AppColors.dividerColor,
1499
1663
  }}>
1500
- {opts.description}
1501
- </react_native_1.Text>) : null}
1502
- </react_native_1.View>
1503
- {opts.right || null}
1504
- </TouchableScale_1.default>
1505
- {opts.picker && (<react_native_1.View style={{
1664
+ <TouchableScale_1.default disabled={!opts.onPress} onPress={opts.onPress} style={{
1506
1665
  flexDirection: 'row',
1507
- backgroundColor: AppColors_1.AppColors.grayBackground,
1508
- borderRadius: 8,
1509
- padding: 2.5,
1510
- marginTop: 10,
1666
+ alignItems: 'center',
1667
+ gap: 12,
1668
+ }}>
1669
+ <react_native_1.View style={{
1670
+ width: 36,
1671
+ height: 36,
1672
+ borderRadius: 10,
1673
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
1511
1674
  borderWidth: 1,
1512
- borderColor: AppColors_1.AppColors.dividerColor,
1675
+ borderColor: `${AppColors_1.AppColors.purple}2E`,
1676
+ alignItems: 'center',
1677
+ justifyContent: 'center',
1513
1678
  }}>
1514
- {opts.picker.options.map(opt => {
1515
- const isActive = opts.picker.selectedValue === opt;
1516
- return (<TouchableScale_1.default key={String(opt)} onPress={() => opts.picker.onSelect(opt)} style={{
1517
- flex: 1,
1518
- paddingVertical: 6,
1519
- alignItems: 'center',
1520
- borderRadius: 6,
1521
- backgroundColor: isActive
1522
- ? AppColors_1.AppColors.purple
1523
- : 'transparent',
1524
- }}>
1525
- <react_native_1.Text style={{
1526
- fontFamily: AppFonts_1.AppFonts.interBold,
1527
- fontSize: 11,
1528
- lineHeight: 14,
1529
- color: isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayText,
1679
+ {opts.icon}
1680
+ </react_native_1.View>
1681
+ <react_native_1.View style={{ flex: 1 }}>
1682
+ <react_native_1.Text style={{
1683
+ fontFamily: AppFonts_1.AppFonts.interBold,
1684
+ fontSize: 14,
1685
+ lineHeight: 18,
1686
+ color: AppColors_1.AppColors.primaryBlack,
1687
+ }}>
1688
+ {opts.label}
1689
+ </react_native_1.Text>
1690
+ {opts.description ? (<react_native_1.Text style={{
1691
+ fontFamily: AppFonts_1.AppFonts.interRegular,
1692
+ fontSize: 11,
1693
+ lineHeight: 15,
1694
+ color: AppColors_1.AppColors.grayText,
1695
+ marginTop: 1,
1696
+ }}>
1697
+ {opts.description}
1698
+ </react_native_1.Text>) : null}
1699
+ </react_native_1.View>
1700
+ {opts.right || null}
1701
+ </TouchableScale_1.default>
1702
+ {opts.numericInput && (<react_native_1.View style={{ marginTop: 10, gap: 6 }}>
1703
+ <react_native_1.View style={{
1704
+ flexDirection: 'row',
1705
+ alignItems: 'center',
1706
+ backgroundColor: AppColors_1.AppColors.grayBackground,
1707
+ borderRadius: 8,
1708
+ borderWidth: 1,
1709
+ borderColor: AppColors_1.AppColors.dividerColor,
1710
+ paddingHorizontal: 12,
1711
+ paddingVertical: 4,
1712
+ }}>
1713
+ <react_native_1.TextInput style={{
1714
+ flex: 1,
1715
+ fontFamily: AppFonts_1.AppFonts.interMedium,
1716
+ fontSize: 14,
1717
+ lineHeight: 18,
1718
+ color: AppColors_1.AppColors.primaryBlack,
1719
+ paddingVertical: 6,
1720
+ }} value={String(opts.numericInput.value || '')} onChangeText={text => {
1721
+ const num = parseInt(text.replace(/[^0-9]/g, ''), 10);
1722
+ if (!isNaN(num)) {
1723
+ const clamped = Math.max(opts.numericInput?.min ?? 1, Math.min(opts.numericInput?.max ?? 10000, num));
1724
+ opts.numericInput?.onChange(clamped);
1725
+ }
1726
+ }} keyboardType={opts.numericInput.keyboardType ?? 'number-pad'} placeholder={opts.numericInput.placeholder} placeholderTextColor={AppColors_1.AppColors.grayTextWeak} maxLength={6} selectTextOnFocus/>
1727
+ <react_native_1.Text style={{
1728
+ fontFamily: AppFonts_1.AppFonts.interBold,
1729
+ fontSize: 11,
1730
+ color: AppColors_1.AppColors.purple,
1731
+ marginLeft: 6,
1732
+ }}>
1733
+ MAX
1734
+ </react_native_1.Text>
1735
+ </react_native_1.View>
1736
+ {opts.numericInput.min !== undefined || opts.numericInput.max !== undefined ? (<react_native_1.Text style={{
1737
+ fontFamily: AppFonts_1.AppFonts.interRegular,
1738
+ fontSize: 10,
1739
+ lineHeight: 13,
1740
+ color: AppColors_1.AppColors.grayTextWeak,
1530
1741
  }}>
1531
- {opts.picker.formatLabel
1532
- ? opts.picker.formatLabel(opt)
1533
- : opt}
1534
- </react_native_1.Text>
1535
- </TouchableScale_1.default>);
1536
- })}
1537
- </react_native_1.View>)}
1538
- </react_native_1.View>);
1742
+ Range: {opts.numericInput.min ?? 1} - {opts.numericInput.max ?? '∞'}
1743
+ </react_native_1.Text>) : null}
1744
+ </react_native_1.View>)}
1745
+ {opts.picker && (<react_native_1.View style={{
1746
+ flexDirection: 'row',
1747
+ backgroundColor: AppColors_1.AppColors.grayBackground,
1748
+ borderRadius: 8,
1749
+ padding: 2.5,
1750
+ marginTop: 10,
1751
+ borderWidth: 1,
1752
+ borderColor: AppColors_1.AppColors.dividerColor,
1753
+ }}>
1754
+ {opts.picker.options.map(opt => {
1755
+ const isActive = opts.picker.selectedValue === opt;
1756
+ return (<TouchableScale_1.default key={String(opt)} onPress={() => opts.picker.onSelect(opt)} style={{
1757
+ flex: 1,
1758
+ paddingVertical: 6,
1759
+ alignItems: 'center',
1760
+ borderRadius: 6,
1761
+ backgroundColor: isActive
1762
+ ? AppColors_1.AppColors.purple
1763
+ : 'transparent',
1764
+ }}>
1765
+ <react_native_1.Text style={{
1766
+ fontFamily: AppFonts_1.AppFonts.interBold,
1767
+ fontSize: 11,
1768
+ lineHeight: 14,
1769
+ color: isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayText,
1770
+ }}>
1771
+ {opts.picker.formatLabel
1772
+ ? opts.picker.formatLabel(opt)
1773
+ : opt}
1774
+ </react_native_1.Text>
1775
+ </TouchableScale_1.default>);
1776
+ })}
1777
+ </react_native_1.View>)}
1778
+ </react_native_1.View>);
1779
+ };
1539
1780
  let content = null;
1540
1781
  let title = '';
1541
1782
  let icon = null;
@@ -1556,10 +1797,12 @@ const SettingsPanel = () => {
1556
1797
  icon: <NetworkIcons_1.SignalIcon color={AppColors_1.AppColors.purple} size={16}/>,
1557
1798
  label: t('settings.apis.maxRequestLogs'),
1558
1799
  description: t('settings.apis.maxRequestLogsDescription'),
1559
- picker: {
1560
- options: [50, 100, 200, 500],
1561
- selectedValue: maxNetworkLogs,
1562
- onSelect: setMaxNetworkLogs,
1800
+ numericInput: {
1801
+ value: maxNetworkLogs,
1802
+ onChange: setMaxNetworkLogs,
1803
+ min: 10,
1804
+ max: 5000,
1805
+ placeholder: 'Enter max requests (10-5000)',
1563
1806
  },
1564
1807
  isLast: true,
1565
1808
  })}
@@ -1620,10 +1863,12 @@ const SettingsPanel = () => {
1620
1863
  icon: <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={16}/>,
1621
1864
  label: t('settings.logs.maxConsoleLogs'),
1622
1865
  description: t('settings.logs.maxConsoleLogsDescription'),
1623
- picker: {
1624
- options: [100, 200, 500, 1000],
1625
- selectedValue: maxConsoleLogs,
1626
- onSelect: setMaxConsoleLogs,
1866
+ numericInput: {
1867
+ value: maxConsoleLogs,
1868
+ onChange: setMaxConsoleLogs,
1869
+ min: 10,
1870
+ max: 10000,
1871
+ placeholder: 'Enter max logs (10-10000)',
1627
1872
  },
1628
1873
  })}
1629
1874
  <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
@@ -1740,6 +1985,13 @@ const SettingsPanel = () => {
1740
1985
  icon: <NetworkIcons_1.AnalyticsIcon color={AppColors_1.AppColors.purple} size={16}/>,
1741
1986
  label: t('settings.analytics.maxAnalyticsEvents'),
1742
1987
  description: t('settings.analytics.maxAnalyticsEventsDescription', { count: analyticsEvents.length }),
1988
+ numericInput: {
1989
+ value: maxAnalyticsEventsLimit,
1990
+ onChange: setMaxAnalyticsEventsLimit,
1991
+ min: 10,
1992
+ max: 5000,
1993
+ placeholder: 'Enter max events (10-5000)',
1994
+ },
1743
1995
  isLast: true,
1744
1996
  })}
1745
1997
  </react_native_1.View>
@@ -1886,10 +2138,12 @@ const SettingsPanel = () => {
1886
2138
  icon: <NetworkIcons_1.LayersIcon color={AppColors_1.AppColors.purple} size={16}/>,
1887
2139
  label: t('settings.crash.maxCrashLogs'),
1888
2140
  description: t('settings.crash.maxCrashLogsDesc'),
1889
- picker: {
1890
- options: [25, 50, 100, 200],
1891
- selectedValue: maxCrashLogs || 100,
1892
- onSelect: val => setMaxCrashLogs(val),
2141
+ numericInput: {
2142
+ value: maxCrashLogs,
2143
+ onChange: setMaxCrashLogs,
2144
+ min: 5,
2145
+ max: 500,
2146
+ placeholder: 'Enter max crashes (5-500)',
1893
2147
  },
1894
2148
  })}
1895
2149
  <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
@@ -6,12 +6,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = __importDefault(require("react"));
7
7
  const react_native_1 = require("react-native");
8
8
  const InspectorContext_1 = require("./InspectorContext");
9
- const TouchableScale_1 = __importDefault(require("../TouchableScale"));
10
9
  const styles_1 = __importDefault(require("../../styles"));
11
10
  const AppColors_1 = require("../../styles/AppColors");
12
11
  const NetworkIcons_1 = require("../NetworkIcons");
13
12
  const reduxLogger_1 = require("../../customHooks/reduxLogger");
14
13
  const analyticsLogger_1 = require("../../customHooks/analyticsLogger");
14
+ const NativeInspector_1 = require("../../native/NativeInspector");
15
15
  const TabBar = react_1.default.memo(() => {
16
16
  const { activeTab, switchActiveTab, tabVisibility, logs, consoleLogs, analyticsEvents, crashRecords, lastReadApisCount, lastReadLogsCount, lastReadCrashesCount, unreadPulseAnim, } = (0, InspectorContext_1.useInspector)();
17
17
  const isReduxAvail = (0, reduxLogger_1.isReduxConnected)();
@@ -85,7 +85,10 @@ const TabBar = react_1.default.memo(() => {
85
85
  consoleLogs.length > lastReadLogsCount;
86
86
  const hasUnreadCrashes = activeTab !== 'crash' &&
87
87
  (crashRecords?.length || 0) > (lastReadCrashesCount || 0);
88
- return (<TouchableScale_1.default key={tab.key} onPress={() => switchActiveTab(tab.key)} style={[
88
+ return (<react_native_1.TouchableOpacity key={tab.key} activeOpacity={0.7} onPress={() => {
89
+ switchActiveTab(tab.key);
90
+ (0, NativeInspector_1.triggerNativeHaptic)('light');
91
+ }} style={[
89
92
  styles_1.default.contentTabButton,
90
93
  isActive && styles_1.default.contentTabButtonActive,
91
94
  ]}>
@@ -121,7 +124,7 @@ const TabBar = react_1.default.memo(() => {
121
124
  transform: [{ scale: unreadPulseAnim }],
122
125
  }}/>)}
123
126
  </react_native_1.View>
124
- </TouchableScale_1.default>);
127
+ </react_native_1.TouchableOpacity>);
125
128
  })}
126
129
  </react_native_1.ScrollView>
127
130
  </react_native_1.View>);
@@ -124,3 +124,4 @@ export declare const SmartphoneIcon: ({ color, size }: IconProps) => React.JSX.E
124
124
  export declare const AlertTriangleIcon: ({ color, size }: IconProps) => React.JSX.Element;
125
125
  export declare const BugIcon: ({ color, size }: IconProps) => React.JSX.Element;
126
126
  export declare const TagIcon: ({ color, size }: IconProps) => React.JSX.Element;
127
+ export declare const NpmIcon: ({ color, size }: IconProps) => React.JSX.Element;
@@ -38,7 +38,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.InfoCircleIcon = exports.UserIcon = exports.LayersIcon = exports.WipeIcon = exports.FolderIcon = exports.SettingsIcon = exports.EyeIcon = exports.JsIcon = exports.CssIcon = exports.HtmlIcon = exports.BrandSquareIcon = exports.BrandCircleIcon = exports.MoonIcon = exports.SunIcon = exports.DebugIcon = exports.InsightsIcon = exports.AnalyticsIcon = exports.WhiteBackNavigation = exports.CloseWhite = exports.DownloadIcon = exports.FilterIcon = exports.ChevronIcon = exports.SortArrowIcon = exports.GlobeIcon = exports.DiffIcon = exports.SignalIcon = exports.ExportIcon = exports.HeaderPauseIcon = exports.TrashIcon = exports.FailIcon = exports.CircleAlertIcon = exports.CircleXIcon = exports.CircleCheckIcon = exports.CheckIcon = exports.TerminalIcon = exports.FetchIcon = exports.CopyIcon = exports.HeadersIcon = exports.ResponseIcon = exports.RequestIcon = exports.SizeIcon = exports.StatusIcon = exports.CalendarIcon = exports.ClockIcon = exports.ClearIcon = exports.SearchIcon = exports.ExpandCollapseIcon = exports.ScreenIcon = exports.MapPinIcon = exports.EmptyRadarIcon = void 0;
40
40
  exports.DiagnosticsIcon = exports.StackTraceIcon = exports.LayoutIcon = exports.ChipIcon = exports.SkullIcon = exports.ShieldAlertIcon = exports.CrashIcon = exports.UserCheckIcon = exports.TargetGoalIcon = exports.RepeatIcon = exports.PinIcon = exports.HourglassIcon = exports.FlameIcon = exports.CodeBracketsIcon = exports.AndroidIcon = exports.AppleIcon = exports.LinkChainIcon = exports.GitHubIcon = exports.PackageBoxIcon = exports.ExternalLinkIcon = exports.MoneyIcon = exports.CartIcon = exports.TextAaIcon = exports.BrainIcon = exports.AtomIcon = exports.MapIcon = exports.SparkleIcon = exports.LightbulbIcon = exports.DocIcon = exports.FolderOpenIcon = exports.BanIcon = exports.BoltIcon = exports.PerformanceIcon = exports.ReduxIcon = exports.MetadataIcon = exports.StorageIcon = exports.RefreshCcwIcon = exports.TimelineIcon = exports.LiveStateIcon = exports.BundleIcon = exports.ForwardChevronIcon = exports.PackageIcon = exports.TableIcon = exports.RawIcon = exports.PrettyIcon = exports.SortIcon = exports.MotionIcon = exports.TrendingUpIcon = exports.ErrorCircleIcon = exports.WarningTriangleIcon = void 0;
41
- exports.TagIcon = exports.BugIcon = exports.AlertTriangleIcon = exports.SmartphoneIcon = exports.KeyIcon = exports.BarChartIcon = exports.DiceIcon = exports.ZapIcon = exports.FlaskIcon = exports.LoadingSpinnerIcon = exports.ListenerIcon = exports.AllFramesIcon = exports.AppFramesIcon = exports.RawJsonIcon = exports.TrailIcon = void 0;
41
+ exports.NpmIcon = exports.TagIcon = exports.BugIcon = exports.AlertTriangleIcon = exports.SmartphoneIcon = exports.KeyIcon = exports.BarChartIcon = exports.DiceIcon = exports.ZapIcon = exports.FlaskIcon = exports.LoadingSpinnerIcon = exports.ListenerIcon = exports.AllFramesIcon = exports.AppFramesIcon = exports.RawJsonIcon = exports.TrailIcon = void 0;
42
42
  const react_1 = __importDefault(require("react"));
43
43
  const react_native_svg_1 = __importStar(require("react-native-svg"));
44
44
  // Stylesheet
@@ -855,3 +855,8 @@ const TagIcon = ({ color = AppColors_1.AppColors.grayTextWeak, size = 14 }) => (
855
855
  <react_native_svg_1.Circle cx="7.5" cy="7.5" r="1.5" fill={color}/>
856
856
  </react_native_svg_1.default>);
857
857
  exports.TagIcon = TagIcon;
858
+ const NpmIcon = ({ color = '#CB3837', size = 14 }) => (<react_native_svg_1.default width={size} height={size} viewBox="0 0 256 256" fill="none">
859
+ <react_native_svg_1.Rect width="256" height="256" rx="32" fill={color}/>
860
+ <react_native_svg_1.Path d="M48 48h160v160h-32V96h-32v112H48V48z" fill="#FFFFFF"/>
861
+ </react_native_svg_1.default>);
862
+ exports.NpmIcon = NpmIcon;
@@ -7,6 +7,7 @@ export interface TouchableScaleProps extends PressableProps {
7
7
  children?: React.ReactNode;
8
8
  hitSlop?: any;
9
9
  disabled?: boolean;
10
+ enableHaptics?: boolean;
10
11
  }
11
12
  declare const TouchableScale: React.NamedExoticComponent<TouchableScaleProps>;
12
13
  export default TouchableScale;
@@ -35,48 +35,46 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  const react_1 = __importStar(require("react"));
37
37
  const react_native_1 = require("react-native");
38
- const TouchableScale = react_1.default.memo(function TouchableScale({ onPress, onLongPress, style, children, hitSlop, disabled, accessible, accessibilityRole, accessibilityLabel, accessibilityHint, accessibilityState, accessibilityValue, ...rest }) {
39
- if (react_native_1.Platform.OS === 'android') {
40
- return (<react_native_1.Pressable accessible={accessible} accessibilityRole={accessibilityRole} accessibilityLabel={accessibilityLabel} accessibilityHint={accessibilityHint} accessibilityState={accessibilityState} accessibilityValue={accessibilityValue} disabled={disabled} onPress={onPress} onLongPress={onLongPress} hitSlop={hitSlop} style={({ pressed }) => [
41
- style,
42
- { opacity: pressed ? 0.75 : 1 },
43
- ]} {...rest}>
44
- {children}
45
- </react_native_1.Pressable>);
46
- }
38
+ const NativeInspector_1 = require("../native/NativeInspector");
39
+ const AnimatedPressable = react_native_1.Animated.createAnimatedComponent(react_native_1.Pressable);
40
+ const TouchableScale = react_1.default.memo(function TouchableScale({ onPress, onLongPress, style, children, hitSlop, disabled, enableHaptics = true, accessible, accessibilityRole, accessibilityLabel, accessibilityHint, accessibilityState, accessibilityValue, ...rest }) {
47
41
  const scale = (0, react_1.useRef)(new react_native_1.Animated.Value(1)).current;
48
42
  const opacity = (0, react_1.useRef)(new react_native_1.Animated.Value(1)).current;
49
- const animatePress = (pressed) => {
43
+ const handlePressIn = () => {
44
+ if (disabled)
45
+ return;
46
+ if (enableHaptics) {
47
+ (0, NativeInspector_1.triggerNativeHaptic)('light');
48
+ }
50
49
  react_native_1.Animated.parallel([
51
- react_native_1.Animated.spring(scale, {
52
- toValue: pressed ? 0.94 : 1,
53
- friction: 6,
54
- tension: 120,
50
+ react_native_1.Animated.timing(scale, {
51
+ toValue: 0.94,
52
+ duration: 50,
55
53
  useNativeDriver: true,
56
54
  }),
57
55
  react_native_1.Animated.timing(opacity, {
58
- toValue: pressed ? 0.86 : 1,
59
- duration: pressed ? 90 : 140,
56
+ toValue: 0.85,
57
+ duration: 50,
60
58
  useNativeDriver: true,
61
59
  }),
62
60
  ]).start();
63
61
  };
64
- const flattenedStyle = react_native_1.StyleSheet.flatten(style) || {};
65
- const layoutStyle = {
66
- flex: flattenedStyle.flex,
67
- flexDirection: flattenedStyle.flexDirection,
68
- alignItems: flattenedStyle.alignItems,
69
- justifyContent: flattenedStyle.justifyContent,
70
- flexWrap: flattenedStyle.flexWrap,
71
- alignSelf: flattenedStyle.alignSelf,
72
- flexGrow: flattenedStyle.flexGrow,
73
- flexShrink: flattenedStyle.flexShrink,
74
- gap: flattenedStyle.gap,
62
+ const handlePressOut = () => {
63
+ react_native_1.Animated.parallel([
64
+ react_native_1.Animated.timing(scale, {
65
+ toValue: 1,
66
+ duration: 100,
67
+ useNativeDriver: true,
68
+ }),
69
+ react_native_1.Animated.timing(opacity, {
70
+ toValue: 1,
71
+ duration: 100,
72
+ useNativeDriver: true,
73
+ }),
74
+ ]).start();
75
75
  };
76
- return (<react_native_1.Pressable accessible={accessible} accessibilityRole={accessibilityRole} accessibilityLabel={accessibilityLabel} accessibilityHint={accessibilityHint} accessibilityState={accessibilityState} accessibilityValue={accessibilityValue} disabled={disabled} style={style} onPressIn={() => animatePress(true)} onPressOut={() => animatePress(false)} onPress={onPress} onLongPress={onLongPress} hitSlop={hitSlop} {...rest}>
77
- <react_native_1.Animated.View style={[{ opacity, transform: [{ scale }] }, layoutStyle]}>
78
- {children}
79
- </react_native_1.Animated.View>
80
- </react_native_1.Pressable>);
76
+ return (<AnimatedPressable accessible={accessible} accessibilityRole={accessibilityRole} accessibilityLabel={accessibilityLabel} accessibilityHint={accessibilityHint} accessibilityState={accessibilityState} accessibilityValue={accessibilityValue} disabled={disabled} style={[style, { opacity, transform: [{ scale }] }]} onPressIn={handlePressIn} onPressOut={handlePressOut} onPress={onPress} onLongPress={onLongPress} hitSlop={hitSlop} {...rest}>
77
+ {children}
78
+ </AnimatedPressable>);
81
79
  });
82
80
  exports.default = TouchableScale;
@@ -1,6 +1,5 @@
1
1
  import { Method } from '../types';
2
- import { StatusFilter } from '../types';
3
- export declare const STATUS_FILTERS: StatusFilter[];
2
+ export declare const STATUS_FILTERS: string[];
4
3
  export declare const METHOD_COLORS: Record<Method, string>;
5
4
  export declare const DOMAIN_COLORS: string[];
6
5
  export declare const DURATION_FAST_MS = 200;