react-native-inapp-inspector 1.1.34 → 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 (122) 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/ConsoleLogCard.js +57 -56
  6. package/dist/commonjs/components/CopyButton.js +10 -1
  7. package/dist/commonjs/components/ErrorBoundary.js +3 -0
  8. package/dist/commonjs/components/Inspector/AnalyticsTab.js +7 -3
  9. package/dist/commonjs/components/Inspector/BundleTab.js +20 -20
  10. package/dist/commonjs/components/Inspector/ConsoleTab.js +1 -1
  11. package/dist/commonjs/components/Inspector/CrashDetail.js +16 -12
  12. package/dist/commonjs/components/Inspector/CrashTab.js +97 -90
  13. package/dist/commonjs/components/Inspector/InspectorHeader.js +28 -24
  14. package/dist/commonjs/components/Inspector/MainScreen.js +20 -103
  15. package/dist/commonjs/components/Inspector/NetworkTab.js +143 -10
  16. package/dist/commonjs/components/Inspector/PerformanceTab.js +96 -3
  17. package/dist/commonjs/components/Inspector/ReduxDetail.js +24 -19
  18. package/dist/commonjs/components/Inspector/ReduxTab.js +30 -18
  19. package/dist/commonjs/components/Inspector/SettingsPanel.js +1578 -754
  20. package/dist/commonjs/components/Inspector/TabBar.js +6 -3
  21. package/dist/commonjs/components/LogCard.js +27 -9
  22. package/dist/commonjs/components/MetaAccordion.js +42 -0
  23. package/dist/commonjs/components/NetworkIcons.d.ts +10 -0
  24. package/dist/commonjs/components/NetworkIcons.js +53 -1
  25. package/dist/commonjs/components/Toast.js +3 -3
  26. package/dist/commonjs/components/TouchableScale.d.ts +5 -2
  27. package/dist/commonjs/components/TouchableScale.js +30 -32
  28. package/dist/commonjs/constants/index.d.ts +1 -2
  29. package/dist/commonjs/constants/index.js +4 -0
  30. package/dist/commonjs/constants/version.d.ts +1 -1
  31. package/dist/commonjs/constants/version.js +1 -1
  32. package/dist/commonjs/customHooks/analyticsLogger.d.ts +6 -0
  33. package/dist/commonjs/customHooks/analyticsLogger.js +16 -5
  34. package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +2 -0
  35. package/dist/commonjs/customHooks/bundleAnalyzer.js +26 -17
  36. package/dist/commonjs/customHooks/consoleLogger.d.ts +2 -0
  37. package/dist/commonjs/customHooks/consoleLogger.js +10 -1
  38. package/dist/commonjs/customHooks/crashHandler.d.ts +2 -0
  39. package/dist/commonjs/customHooks/crashHandler.js +17 -1
  40. package/dist/commonjs/customHooks/networkLogger.d.ts +2 -0
  41. package/dist/commonjs/customHooks/networkLogger.js +12 -1
  42. package/dist/commonjs/customHooks/performanceTracker.d.ts +3 -1
  43. package/dist/commonjs/customHooks/performanceTracker.js +18 -4
  44. package/dist/commonjs/customHooks/reduxLogger.d.ts +2 -0
  45. package/dist/commonjs/customHooks/reduxLogger.js +10 -1
  46. package/dist/commonjs/helpers/index.js +10 -1
  47. package/dist/commonjs/helpers/settingsStore.d.ts +9 -0
  48. package/dist/commonjs/helpers/settingsStore.js +59 -3
  49. package/dist/commonjs/i18n/locales/en.json +96 -28
  50. package/dist/commonjs/index.d.ts +1 -0
  51. package/dist/commonjs/index.js +307 -73
  52. package/dist/commonjs/native/NativeInspector.d.ts +125 -0
  53. package/dist/commonjs/native/NativeInspector.js +313 -0
  54. package/dist/commonjs/native/NativeNetworkInspector.d.ts +22 -0
  55. package/dist/commonjs/native/NativeNetworkInspector.js +4 -0
  56. package/dist/commonjs/styles/AppColors.d.ts +28 -0
  57. package/dist/commonjs/styles/AppColors.js +30 -0
  58. package/dist/commonjs/styles/index.js +6 -6
  59. package/dist/commonjs/types/enums.d.ts +1 -1
  60. package/dist/commonjs/types/interfaces.d.ts +9 -0
  61. package/dist/esm/components/ConsoleLogCard.js +58 -57
  62. package/dist/esm/components/CopyButton.js +10 -1
  63. package/dist/esm/components/ErrorBoundary.js +3 -0
  64. package/dist/esm/components/Inspector/AnalyticsTab.js +7 -3
  65. package/dist/esm/components/Inspector/BundleTab.js +20 -20
  66. package/dist/esm/components/Inspector/ConsoleTab.js +1 -1
  67. package/dist/esm/components/Inspector/CrashDetail.js +16 -12
  68. package/dist/esm/components/Inspector/CrashTab.js +97 -90
  69. package/dist/esm/components/Inspector/InspectorHeader.js +29 -25
  70. package/dist/esm/components/Inspector/MainScreen.js +21 -71
  71. package/dist/esm/components/Inspector/NetworkTab.js +145 -12
  72. package/dist/esm/components/Inspector/PerformanceTab.js +96 -3
  73. package/dist/esm/components/Inspector/ReduxDetail.js +24 -19
  74. package/dist/esm/components/Inspector/ReduxTab.js +30 -18
  75. package/dist/esm/components/Inspector/SettingsPanel.js +1582 -758
  76. package/dist/esm/components/Inspector/TabBar.js +7 -4
  77. package/dist/esm/components/LogCard.js +27 -9
  78. package/dist/esm/components/MetaAccordion.js +42 -0
  79. package/dist/esm/components/NetworkIcons.d.ts +10 -0
  80. package/dist/esm/components/NetworkIcons.js +42 -0
  81. package/dist/esm/components/Toast.js +3 -3
  82. package/dist/esm/components/TouchableScale.d.ts +5 -2
  83. package/dist/esm/components/TouchableScale.js +31 -33
  84. package/dist/esm/constants/index.d.ts +1 -2
  85. package/dist/esm/constants/index.js +4 -0
  86. package/dist/esm/constants/version.d.ts +1 -1
  87. package/dist/esm/constants/version.js +1 -1
  88. package/dist/esm/customHooks/analyticsLogger.d.ts +6 -0
  89. package/dist/esm/customHooks/analyticsLogger.js +12 -4
  90. package/dist/esm/customHooks/bundleAnalyzer.d.ts +2 -0
  91. package/dist/esm/customHooks/bundleAnalyzer.js +23 -16
  92. package/dist/esm/customHooks/consoleLogger.d.ts +2 -0
  93. package/dist/esm/customHooks/consoleLogger.js +7 -0
  94. package/dist/esm/customHooks/crashHandler.d.ts +2 -0
  95. package/dist/esm/customHooks/crashHandler.js +14 -0
  96. package/dist/esm/customHooks/networkLogger.d.ts +2 -0
  97. package/dist/esm/customHooks/networkLogger.js +9 -0
  98. package/dist/esm/customHooks/performanceTracker.d.ts +3 -1
  99. package/dist/esm/customHooks/performanceTracker.js +15 -3
  100. package/dist/esm/customHooks/reduxLogger.d.ts +2 -0
  101. package/dist/esm/customHooks/reduxLogger.js +7 -0
  102. package/dist/esm/helpers/index.js +10 -1
  103. package/dist/esm/helpers/settingsStore.d.ts +9 -0
  104. package/dist/esm/helpers/settingsStore.js +58 -3
  105. package/dist/esm/i18n/locales/en.json +96 -28
  106. package/dist/esm/index.d.ts +1 -0
  107. package/dist/esm/index.js +279 -59
  108. package/dist/esm/native/NativeInspector.d.ts +125 -0
  109. package/dist/esm/native/NativeInspector.js +289 -0
  110. package/dist/esm/native/NativeNetworkInspector.d.ts +22 -0
  111. package/dist/esm/native/NativeNetworkInspector.js +2 -0
  112. package/dist/esm/styles/AppColors.d.ts +28 -0
  113. package/dist/esm/styles/AppColors.js +30 -0
  114. package/dist/esm/styles/index.js +6 -6
  115. package/dist/esm/types/enums.d.ts +1 -1
  116. package/dist/esm/types/interfaces.d.ts +9 -0
  117. package/ios/NetworkInspectorModule.h +6 -0
  118. package/ios/NetworkInspectorModule.m +720 -5
  119. package/package.json +15 -3
  120. package/react-native-inapp-inspector.podspec +7 -2
  121. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.java +0 -97
  122. package/android/src/main/java/com/inappinspector/NetworkInspectorPackage.java +0 -28
@@ -147,11 +147,16 @@ const CrashTab = react_1.default.memo(() => {
147
147
  }
148
148
  // Search filter
149
149
  if (searchQuery.trim().length > 0) {
150
- const q = searchQuery.toLowerCase();
151
- const msg = (item.message || '').toLowerCase();
152
- const name = (item.name || '').toLowerCase();
153
- const stack = (item.stack || '').toLowerCase();
154
- return msg.includes(q) || name.includes(q) || stack.includes(q);
150
+ const queryTokens = searchQuery.trim().toLowerCase().split(/\s+/).filter(Boolean);
151
+ const searchTarget = [
152
+ item.message || '',
153
+ item.name || '',
154
+ item.stack || '',
155
+ item.type || '',
156
+ item.deviceInfo?.platform || '',
157
+ ...(item.breadcrumbs || []).map(b => `${b.type || ''} ${b.message || ''}`),
158
+ ].join(' ').toLowerCase();
159
+ return queryTokens.every(token => searchTarget.includes(token));
155
160
  }
156
161
  return true;
157
162
  });
@@ -288,74 +293,75 @@ const CrashTab = react_1.default.memo(() => {
288
293
  </AnimatedEntrance_1.default>);
289
294
  }, [searchQuery, setSelectedCrash]);
290
295
  return (<react_native_1.View style={localStyles.container}>
291
- {/* ─── Top Stats Bar ─── */}
292
- <react_native_1.View style={localStyles.statsBar}>
293
- <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={localStyles.statsScrollContent}>
294
- <react_native_1.View style={[localStyles.statChip, localStyles.statChipActive]}>
295
- <react_native_1.Text style={localStyles.statChipValue}>{stats.total}</react_native_1.Text>
296
- <react_native_1.Text style={localStyles.statChipLabel}>{t('crash.statCrashes')}</react_native_1.Text>
297
- </react_native_1.View>
296
+ {crashRecords.length > 0 && (<>
297
+ {/* ─── Top Stats Bar ─── */}
298
+ <react_native_1.View style={localStyles.statsBar}>
299
+ <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={localStyles.statsScrollContent}>
300
+ <react_native_1.View style={[localStyles.statChip, localStyles.statChipActive]}>
301
+ <react_native_1.Text style={localStyles.statChipValue}>{stats.total}</react_native_1.Text>
302
+ <react_native_1.Text style={localStyles.statChipLabel}>{t('crash.statCrashes')}</react_native_1.Text>
303
+ </react_native_1.View>
298
304
 
299
- <react_native_1.View style={localStyles.statChip}>
300
- <react_native_1.Text style={[localStyles.statChipValue, { color: AppColors_1.AppColors.errorColor }]}>
301
- {stats.fatalCount}
302
- </react_native_1.Text>
303
- <react_native_1.Text style={localStyles.statChipLabel}>{t('crash.statFatal')}</react_native_1.Text>
304
- </react_native_1.View>
305
+ <react_native_1.View style={localStyles.statChip}>
306
+ <react_native_1.Text style={[localStyles.statChipValue, { color: AppColors_1.AppColors.errorColor }]}>
307
+ {stats.fatalCount}
308
+ </react_native_1.Text>
309
+ <react_native_1.Text style={localStyles.statChipLabel}>{t('crash.statFatal')}</react_native_1.Text>
310
+ </react_native_1.View>
305
311
 
306
- <react_native_1.View style={localStyles.statChip}>
307
- <react_native_1.Text style={[localStyles.statChipValue, { color: AppColors_1.AppColors.offerPurple }]}>
308
- {stats.jsCount}
309
- </react_native_1.Text>
310
- <react_native_1.Text style={localStyles.statChipLabel}>{t('crash.statJsErrors')}</react_native_1.Text>
311
- </react_native_1.View>
312
+ <react_native_1.View style={localStyles.statChip}>
313
+ <react_native_1.Text style={[localStyles.statChipValue, { color: AppColors_1.AppColors.offerPurple }]}>
314
+ {stats.jsCount}
315
+ </react_native_1.Text>
316
+ <react_native_1.Text style={localStyles.statChipLabel}>{t('crash.statJsErrors')}</react_native_1.Text>
317
+ </react_native_1.View>
312
318
 
313
- <react_native_1.View style={localStyles.statChip}>
314
- <react_native_1.Text style={[localStyles.statChipValue, { color: AppColors_1.AppColors.darkOrange }]}>
315
- {stats.promiseCount}
316
- </react_native_1.Text>
317
- <react_native_1.Text style={localStyles.statChipLabel}>{t('crash.statPromises')}</react_native_1.Text>
318
- </react_native_1.View>
319
+ <react_native_1.View style={localStyles.statChip}>
320
+ <react_native_1.Text style={[localStyles.statChipValue, { color: AppColors_1.AppColors.darkOrange }]}>
321
+ {stats.promiseCount}
322
+ </react_native_1.Text>
323
+ <react_native_1.Text style={localStyles.statChipLabel}>{t('crash.statPromises')}</react_native_1.Text>
324
+ </react_native_1.View>
319
325
 
320
- <react_native_1.View style={localStyles.statChip}>
321
- <react_native_1.Text style={[localStyles.statChipValue, { color: AppColors_1.AppColors.purple }]}>
322
- {stats.renderCount}
323
- </react_native_1.Text>
324
- <react_native_1.Text style={localStyles.statChipLabel}>{t('crash.statRender')}</react_native_1.Text>
325
- </react_native_1.View>
326
+ <react_native_1.View style={localStyles.statChip}>
327
+ <react_native_1.Text style={[localStyles.statChipValue, { color: AppColors_1.AppColors.purple }]}>
328
+ {stats.renderCount}
329
+ </react_native_1.Text>
330
+ <react_native_1.Text style={localStyles.statChipLabel}>{t('crash.statRender')}</react_native_1.Text>
331
+ </react_native_1.View>
326
332
 
327
- <react_native_1.View style={localStyles.statChip}>
328
- <react_native_1.Text style={[localStyles.statChipValue, { color: AppColors_1.AppColors.skyBlue }]}>
329
- {stats.nativeCount}
330
- </react_native_1.Text>
331
- <react_native_1.Text style={localStyles.statChipLabel}>{t('crash.statNative')}</react_native_1.Text>
333
+ <react_native_1.View style={localStyles.statChip}>
334
+ <react_native_1.Text style={[localStyles.statChipValue, { color: AppColors_1.AppColors.skyBlue }]}>
335
+ {stats.nativeCount}
336
+ </react_native_1.Text>
337
+ <react_native_1.Text style={localStyles.statChipLabel}>{t('crash.statNative')}</react_native_1.Text>
338
+ </react_native_1.View>
339
+ </react_native_1.ScrollView>
332
340
  </react_native_1.View>
333
- </react_native_1.ScrollView>
334
- </react_native_1.View>
335
341
 
336
- {/* ─── Search & Controls ─── */}
337
- <react_native_1.View style={localStyles.controlsContainer}>
338
- <react_native_1.View style={localStyles.searchRow}>
339
- <react_native_1.View style={localStyles.searchInputWrapper}>
340
- <NetworkIcons_1.SearchIcon color={AppColors_1.AppColors.grayTextWeak} size={14}/>
341
- <react_native_1.TextInput value={searchQuery} onChangeText={setSearchQuery} placeholder={t('crash.searchPlaceholder')} placeholderTextColor={AppColors_1.AppColors.grayTextWeak} style={localStyles.searchInput} autoCapitalize="none" autoCorrect={false}/>
342
- {searchQuery.length > 0 && (<react_native_1.TouchableOpacity onPress={() => setSearchQuery('')} hitSlop={8}>
343
- <NetworkIcons_1.ClearIcon color={AppColors_1.AppColors.grayTextWeak} size={14}/>
344
- </react_native_1.TouchableOpacity>)}
345
- </react_native_1.View>
342
+ {/* ─── Search & Controls ─── */}
343
+ <react_native_1.View style={localStyles.controlsContainer}>
344
+ <react_native_1.View style={localStyles.searchRow}>
345
+ <react_native_1.View style={localStyles.searchInputWrapper}>
346
+ <NetworkIcons_1.SearchIcon color={AppColors_1.AppColors.grayTextWeak} size={14}/>
347
+ <react_native_1.TextInput value={searchQuery} onChangeText={setSearchQuery} placeholder={t('crash.searchPlaceholder')} placeholderTextColor={AppColors_1.AppColors.grayTextWeak} style={localStyles.searchInput} autoCapitalize="none" autoCorrect={false}/>
348
+ {searchQuery.length > 0 && (<react_native_1.TouchableOpacity onPress={() => setSearchQuery('')} hitSlop={8}>
349
+ <NetworkIcons_1.ClearIcon color={AppColors_1.AppColors.grayTextWeak} size={14}/>
350
+ </react_native_1.TouchableOpacity>)}
351
+ </react_native_1.View>
346
352
 
347
- {/* Crash Filters */}
348
- {crashRecords.length > 0 && (<TouchableScale_1.default onPress={() => setIsFilterModalOpen(true)} style={[
353
+ {/* Crash Filters */}
354
+ <TouchableScale_1.default onPress={() => setIsFilterModalOpen(true)} style={[
349
355
  localStyles.filterButton,
350
356
  !(0, CrashFilterModal_1.isCrashFiltersDefault)(crashFilters) && {
351
357
  borderColor: `${AppColors_1.AppColors.brandPurple}60`,
352
358
  backgroundColor: `${AppColors_1.AppColors.brandPurple}15`,
353
359
  },
354
360
  ]}>
355
- <NetworkIcons_1.FilterIcon size={14} color={(0, CrashFilterModal_1.isCrashFiltersDefault)(crashFilters)
361
+ <NetworkIcons_1.FilterIcon size={14} color={(0, CrashFilterModal_1.isCrashFiltersDefault)(crashFilters)
356
362
  ? AppColors_1.AppColors.grayTextStrong
357
363
  : AppColors_1.AppColors.brandPurple}/>
358
- {!(0, CrashFilterModal_1.isCrashFiltersDefault)(crashFilters) && (<react_native_1.View style={{
364
+ {!(0, CrashFilterModal_1.isCrashFiltersDefault)(crashFilters) && (<react_native_1.View style={{
359
365
  position: 'absolute',
360
366
  top: 2,
361
367
  right: 2,
@@ -366,40 +372,41 @@ const CrashTab = react_1.default.memo(() => {
366
372
  borderWidth: 1,
367
373
  borderColor: AppColors_1.AppColors.white,
368
374
  }}/>)}
369
- </TouchableScale_1.default>)}
375
+ </TouchableScale_1.default>
370
376
 
371
- {/* Clear Crashes */}
372
- {crashRecords.length > 0 && (<TouchableScale_1.default onPress={handleClearAll} style={localStyles.clearButton}>
373
- <NetworkIcons_1.TrashIcon size={14} color={AppColors_1.AppColors.errorColor}/>
374
- </TouchableScale_1.default>)}
375
- </react_native_1.View>
377
+ {/* Clear Crashes */}
378
+ <TouchableScale_1.default onPress={handleClearAll} style={localStyles.clearButton}>
379
+ <NetworkIcons_1.TrashIcon size={14} color={AppColors_1.AppColors.errorColor}/>
380
+ </TouchableScale_1.default>
381
+ </react_native_1.View>
376
382
 
377
- {/* ─── Filter Chips ─── */}
378
- <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={localStyles.filterScrollContent}>
379
- {[
380
- { key: 'all', label: t('crash.filterAll'), Icon: NetworkIcons_1.LayersIcon },
381
- { key: 'fatal', label: t('crash.filterFatal'), Icon: NetworkIcons_1.SkullIcon },
382
- { key: 'js', label: t('crash.filterJsError'), Icon: NetworkIcons_1.JsIcon },
383
- { key: 'promise', label: t('crash.filterPromise'), Icon: NetworkIcons_1.HourglassIcon },
384
- { key: 'render', label: t('crash.filterRender'), Icon: NetworkIcons_1.LayoutIcon },
385
- { key: 'native', label: t('crash.filterNative'), Icon: NetworkIcons_1.ChipIcon },
386
- ].map(chip => {
387
- const isActive = filterType === chip.key;
388
- return (<react_native_1.TouchableOpacity key={chip.key} onPress={() => setFilterType(chip.key)} style={[
389
- localStyles.filterChip,
390
- isActive && localStyles.filterChipActive,
391
- ]}>
392
- <chip.Icon size={12} color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayTextStrong}/>
393
- <react_native_1.Text style={[
394
- localStyles.filterChipText,
395
- isActive && localStyles.filterChipTextActive,
396
- ]}>
397
- {chip.label}
398
- </react_native_1.Text>
399
- </react_native_1.TouchableOpacity>);
400
- })}
401
- </react_native_1.ScrollView>
402
- </react_native_1.View>
383
+ {/* ─── Filter Chips ─── */}
384
+ <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={localStyles.filterScrollContent}>
385
+ {[
386
+ { key: 'all', label: t('crash.filterAll'), Icon: NetworkIcons_1.LayersIcon },
387
+ { key: 'fatal', label: t('crash.filterFatal'), Icon: NetworkIcons_1.SkullIcon },
388
+ { key: 'js', label: t('crash.filterJsError'), Icon: NetworkIcons_1.JsIcon },
389
+ { key: 'promise', label: t('crash.filterPromise'), Icon: NetworkIcons_1.HourglassIcon },
390
+ { key: 'render', label: t('crash.filterRender'), Icon: NetworkIcons_1.LayoutIcon },
391
+ { key: 'native', label: t('crash.filterNative'), Icon: NetworkIcons_1.ChipIcon },
392
+ ].map(chip => {
393
+ const isActive = filterType === chip.key;
394
+ return (<react_native_1.TouchableOpacity key={chip.key} onPress={() => setFilterType(chip.key)} style={[
395
+ localStyles.filterChip,
396
+ isActive && localStyles.filterChipActive,
397
+ ]}>
398
+ <chip.Icon size={12} color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayTextStrong}/>
399
+ <react_native_1.Text style={[
400
+ localStyles.filterChipText,
401
+ isActive && localStyles.filterChipTextActive,
402
+ ]}>
403
+ {chip.label}
404
+ </react_native_1.Text>
405
+ </react_native_1.TouchableOpacity>);
406
+ })}
407
+ </react_native_1.ScrollView>
408
+ </react_native_1.View>
409
+ </>)}
403
410
 
404
411
  {/* ─── Crash List or Empty State ─── */}
405
412
  {filteredList.length === 0 ? (<react_native_1.ScrollView contentContainerStyle={localStyles.emptyContainer} showsVerticalScrollIndicator={false}>
@@ -412,7 +419,7 @@ const CrashTab = react_1.default.memo(() => {
412
419
  ? t('crash.emptySearchSubtitle')
413
420
  : t('crash.emptySubtitle')}
414
421
  </react_native_1.Text>
415
- </react_native_1.ScrollView>) : (<react_native_1.FlatList data={filteredList} keyExtractor={item => item.id} renderItem={renderCard} contentContainerStyle={localStyles.listContent} showsVerticalScrollIndicator={false} ListFooterComponent={<EndOfListFooter_1.default />}/>)}
422
+ </react_native_1.ScrollView>) : (<react_native_1.FlatList data={filteredList} keyExtractor={item => item.id} renderItem={renderCard} initialNumToRender={12} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={true} renderToHardwareTextureAndroid={true} contentContainerStyle={localStyles.listContent} showsVerticalScrollIndicator={false} ListFooterComponent={<EndOfListFooter_1.default />}/>)}
416
423
 
417
424
  {/* Filter Modal */}
418
425
  <CrashFilterModal_1.default visible={isFilterModalOpen} onClose={() => setIsFilterModalOpen(false)} filters={crashFilters} onApply={setCrashFilters} searchQuery={searchQuery}/>
@@ -57,33 +57,33 @@ const InspectorHeader = react_1.default.memo(() => {
57
57
  if (clean === 'DEV' || clean.includes('DEV') || clean === 'LOCAL') {
58
58
  return {
59
59
  label: rawEnv,
60
- bg: 'rgba(16, 185, 129, 0.25)', // emerald
61
- border: 'rgba(110, 231, 183, 0.55)',
62
- text: '#A7F3D0',
60
+ bg: `${AppColors_1.AppColors.emerald500}40`, // emerald
61
+ border: `${AppColors_1.AppColors.emerald400}8C`,
62
+ text: AppColors_1.AppColors.mintGreenBorder,
63
63
  };
64
64
  }
65
65
  if (clean === 'UAT' || clean === 'QA' || clean === 'TEST') {
66
66
  return {
67
67
  label: rawEnv,
68
- bg: 'rgba(245, 158, 11, 0.28)', // amber
69
- border: 'rgba(252, 211, 77, 0.6)',
70
- text: '#FDE68A',
68
+ bg: `${AppColors_1.AppColors.amber500}47`, // amber
69
+ border: `${AppColors_1.AppColors.amber400}99`,
70
+ text: AppColors_1.AppColors.amberWarmBorder,
71
71
  };
72
72
  }
73
73
  if (clean === 'PREPROD' || clean === 'STAGE' || clean === 'STAGING') {
74
74
  return {
75
75
  label: rawEnv,
76
- bg: 'rgba(139, 92, 246, 0.28)', // purple
77
- border: 'rgba(196, 181, 253, 0.6)',
78
- text: '#DDD6FE',
76
+ bg: `${AppColors_1.AppColors.purple500}47`, // purple
77
+ border: `${AppColors_1.AppColors.purple400}99`,
78
+ text: AppColors_1.AppColors.violetSoftBorder,
79
79
  };
80
80
  }
81
81
  // PROD / Live
82
82
  return {
83
83
  label: rawEnv,
84
- bg: 'rgba(244, 63, 94, 0.25)', // rose
85
- border: 'rgba(253, 164, 175, 0.55)',
86
- text: '#FECDD3',
84
+ bg: `${AppColors_1.AppColors.rose500}40`, // rose
85
+ border: `${AppColors_1.AppColors.roseBorder}8C`,
86
+ text: AppColors_1.AppColors.errorBorder,
87
87
  };
88
88
  }, [environment]);
89
89
  const isDetailView = (activeTab === 'apis' && selected != null) ||
@@ -226,23 +226,27 @@ const InspectorHeader = react_1.default.memo(() => {
226
226
  </react_native_1.Text>
227
227
  </react_native_1.View>
228
228
 
229
- <react_native_1.View style={{
230
- backgroundColor: `${AppColors_1.AppColors.white}14`,
229
+ <react_native_1.Pressable onPress={() => react_native_1.Linking.openURL('https://www.npmjs.com/package/react-native-inapp-inspector').catch(() => { })} style={{
230
+ backgroundColor: '#CB383726',
231
231
  borderRadius: 4,
232
- paddingHorizontal: 4.5,
232
+ paddingHorizontal: 5,
233
233
  paddingVertical: 1.5,
234
234
  borderWidth: 1,
235
- borderColor: `${AppColors_1.AppColors.white}20`,
235
+ borderColor: '#CB383780',
236
+ flexDirection: 'row',
237
+ alignItems: 'center',
238
+ gap: 3.5,
236
239
  flexShrink: 0,
237
240
  }}>
241
+ <NetworkIcons_1.NpmIcon size={11} color="#FF6B6B"/>
238
242
  <react_native_1.Text style={{
239
- fontFamily: AppFonts_1.AppFonts.interMedium,
240
- fontSize: 8.5,
241
- color: `${AppColors_1.AppColors.white}B3`,
243
+ fontFamily: AppFonts_1.AppFonts.interBold,
244
+ fontSize: 9,
245
+ color: '#FF6B6B',
242
246
  }} numberOfLines={1}>
243
247
  v{constants_2.LIB_VERSION}
244
248
  </react_native_1.Text>
245
- </react_native_1.View>
249
+ </react_native_1.Pressable>
246
250
  </react_native_1.View>
247
251
  </react_native_1.View>
248
252
  </react_native_1.View>) : null}
@@ -484,8 +488,8 @@ const InspectorHeader = react_1.default.memo(() => {
484
488
  styles_1.default.headerMethodBadge,
485
489
  {
486
490
  backgroundColor: selectedCrash.isFatal
487
- ? '#DC2626'
488
- : '#D97706',
491
+ ? AppColors_1.AppColors.red600
492
+ : AppColors_1.AppColors.amber600,
489
493
  },
490
494
  ]}>
491
495
  <react_native_1.Text style={styles_1.default.headerMethodText}>
@@ -501,8 +505,8 @@ const InspectorHeader = react_1.default.memo(() => {
501
505
  styles_1.default.headerStatusDot,
502
506
  {
503
507
  backgroundColor: selectedCrash.isFatal
504
- ? '#DC2626'
505
- : '#F59E0B',
508
+ ? AppColors_1.AppColors.red600
509
+ : AppColors_1.AppColors.amber500,
506
510
  },
507
511
  ]}/>
508
512
  <react_native_1.Text style={styles_1.default.headerSubTitle}>
@@ -1,42 +1,9 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
4
  };
38
5
  Object.defineProperty(exports, "__esModule", { value: true });
39
- const react_1 = __importStar(require("react"));
6
+ const react_1 = __importDefault(require("react"));
40
7
  const react_native_1 = require("react-native");
41
8
  const InspectorContext_1 = require("./InspectorContext");
42
9
  const ErrorBoundary_1 = __importDefault(require("../ErrorBoundary"));
@@ -61,32 +28,27 @@ const styles_1 = __importDefault(require("../../styles"));
61
28
  const AppColors_1 = require("../../styles/AppColors");
62
29
  const NavigationTracker_1 = __importDefault(require("./NavigationTracker"));
63
30
  const MainScreen = () => {
64
- const { visible, modalAnimationType, closeModal, modalHeightPercent, selected, selectedEvent, selectedLog, selectedReduxSlice, selectedReduxAction, selectedCrash, settingsPage, activeTab, isReady, isEnabled, hasNavigationContext, setNavState, } = (0, InspectorContext_1.useInspector)();
65
- // Lazy-mount each tab on first visit and cache it in memory for 0ms instantaneous switching
66
- const [mountedTabs, setMountedTabs] = (0, react_1.useState)({
67
- [activeTab]: true,
68
- });
69
- (0, react_1.useEffect)(() => {
70
- setMountedTabs(prev => {
71
- if (prev[activeTab])
72
- return prev;
73
- return { ...prev, [activeTab]: true };
74
- });
75
- }, [activeTab]);
31
+ const { visible, modalAnimationType, closeModal, modalHeightPercent, selected, selectedEvent, selectedLog, selectedReduxSlice, selectedReduxAction, selectedCrash, settingsPage, activeTab, isReady, isEnabled, useNativeFab, hasNavigationContext, setNavState, } = (0, InspectorContext_1.useInspector)();
76
32
  const isDetailActive = (activeTab === 'apis' && selected != null) ||
77
33
  (activeTab === 'analytics' && selectedEvent != null) ||
78
34
  (activeTab === 'logs' && selectedLog != null) ||
79
35
  (activeTab === 'redux' && (selectedReduxSlice != null || selectedReduxAction != null)) ||
80
36
  (activeTab === 'crash' && selectedCrash != null);
81
37
  return (<>
82
- {(react_native_1.Platform.OS === 'ios' || react_native_1.Platform.OS === 'android') && isEnabled && <FabLauncher_1.default />}
83
- <react_native_1.Modal visible={visible} animationType={modalAnimationType} transparent>
38
+ {(react_native_1.Platform.OS === 'ios' || react_native_1.Platform.OS === 'android') &&
39
+ isEnabled &&
40
+ !useNativeFab && <FabLauncher_1.default />}
41
+ <react_native_1.Modal visible={visible} animationType={modalAnimationType} transparent statusBarTranslucent={true}>
84
42
  {visible && (<ErrorBoundary_1.default onClose={closeModal}>
85
43
  <react_native_1.View style={styles_1.default.modalBackdrop}>
86
44
  <react_native_1.Pressable style={styles_1.default.modalBackdropPressable} onPress={closeModal}/>
87
45
  <react_native_1.View style={[
88
46
  styles_1.default.modalContentCard,
89
- { height: `${modalHeightPercent}%` },
47
+ {
48
+ height: `${modalHeightPercent}%`,
49
+ borderTopLeftRadius: modalHeightPercent >= 100 ? 0 : 20,
50
+ borderTopRightRadius: modalHeightPercent >= 100 ? 0 : 20,
51
+ },
90
52
  ]}>
91
53
  <react_native_1.StatusBar translucent backgroundColor="transparent" barStyle="light-content"/>
92
54
 
@@ -95,66 +57,21 @@ const MainScreen = () => {
95
57
  {/* ─── Horizontal Scrollable Tab Bar inside Content ─── */}
96
58
  {!isDetailActive && settingsPage === null ? (<TabBar_1.default />) : null}
97
59
 
98
- {isReady ? (isDetailActive ? (activeTab === 'apis' && selected != null ? (<NetworkDetail_1.default />) : activeTab === 'analytics' && selectedEvent != null ? (<AnalyticsDetail_1.default event={selectedEvent}/>) : activeTab === 'logs' && selectedLog != null ? (<LogDetail_1.default />) : activeTab === 'redux' ? (<ReduxDetail_1.default />) : activeTab === 'crash' && selectedCrash != null ? (<CrashDetail_1.default />) : null) : (<>
99
- <react_native_1.View style={{
100
- flex: 1,
101
- display: activeTab === 'apis' ? 'flex' : 'none',
102
- }}>
103
- {mountedTabs.apis && <NetworkTab_1.default />}
104
- </react_native_1.View>
105
- <react_native_1.View style={{
106
- flex: 1,
107
- display: activeTab === 'logs' ? 'flex' : 'none',
108
- }}>
109
- {mountedTabs.logs && <ConsoleTab_1.default />}
110
- </react_native_1.View>
111
- <react_native_1.View style={{
112
- flex: 1,
113
- display: activeTab === 'analytics' ? 'flex' : 'none',
114
- }}>
115
- {mountedTabs.analytics && <AnalyticsTab_1.default />}
116
- </react_native_1.View>
117
- <react_native_1.View style={{
118
- flex: 1,
119
- display: activeTab === 'redux' ? 'flex' : 'none',
120
- }}>
121
- {mountedTabs.redux && <ReduxTab_1.default />}
122
- </react_native_1.View>
123
- <react_native_1.View style={{
124
- flex: 1,
125
- display: activeTab === 'bundle' ? 'flex' : 'none',
126
- }}>
127
- {mountedTabs.bundle && <BundleTab_1.default />}
128
- </react_native_1.View>
129
- <react_native_1.View style={{
130
- flex: 1,
131
- display: activeTab === 'performance' ? 'flex' : 'none',
132
- }}>
133
- {mountedTabs.performance && <PerformanceTab_1.default />}
134
- </react_native_1.View>
135
- <react_native_1.View style={{
136
- flex: 1,
137
- display: activeTab === 'crash' ? 'flex' : 'none',
138
- }}>
139
- {mountedTabs.crash && <CrashTab_1.default />}
140
- </react_native_1.View>
141
- </>)) : (<react_native_1.View style={styles_1.default.empty}>
60
+ {settingsPage !== null ? (<SettingsPanel_1.default />) : isReady ? (isDetailActive ? (activeTab === 'apis' && selected != null ? (<NetworkDetail_1.default />) : activeTab === 'analytics' && selectedEvent != null ? (<AnalyticsDetail_1.default event={selectedEvent}/>) : activeTab === 'logs' && selectedLog != null ? (<LogDetail_1.default />) : activeTab === 'redux' ? (<ReduxDetail_1.default />) : activeTab === 'crash' && selectedCrash != null ? (<CrashDetail_1.default />) : null) : (<react_native_1.View style={{ flex: 1 }}>
61
+ {activeTab === 'apis' && <NetworkTab_1.default />}
62
+ {activeTab === 'logs' && <ConsoleTab_1.default />}
63
+ {activeTab === 'analytics' && <AnalyticsTab_1.default />}
64
+ {activeTab === 'redux' && <ReduxTab_1.default />}
65
+ {activeTab === 'bundle' && <BundleTab_1.default />}
66
+ {activeTab === 'performance' && <PerformanceTab_1.default />}
67
+ {activeTab === 'crash' && <CrashTab_1.default />}
68
+ </react_native_1.View>)) : (<react_native_1.View style={styles_1.default.empty}>
142
69
  <react_native_1.ActivityIndicator size="large" color={AppColors_1.AppColors.purple}/>
143
70
  <react_native_1.Text style={[styles_1.default.emptySub, { marginTop: 12 }]}>
144
71
  Loading logs...
145
72
  </react_native_1.Text>
146
73
  </react_native_1.View>)}
147
74
 
148
- {settingsPage !== null && (<react_native_1.View style={[
149
- react_native_1.StyleSheet.absoluteFill,
150
- {
151
- backgroundColor: AppColors_1.AppColors.grayBackground,
152
- zIndex: 99999,
153
- },
154
- ]}>
155
- <SettingsPanel_1.default />
156
- </react_native_1.View>)}
157
-
158
75
  {/* Bottom floating toast notification */}
159
76
  <Toast_1.default />
160
77
  </react_native_1.View>