react-native-inapp-inspector 2.3.16 → 2.3.18

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 (346) hide show
  1. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +438 -7
  2. package/bin/cli.js +0 -0
  3. package/dist/commonjs/capture.d.ts +26 -0
  4. package/dist/commonjs/capture.js +32 -0
  5. package/dist/commonjs/components/AnalyticsEventCard.js +11 -11
  6. package/dist/commonjs/components/AnimatedEntrance.js +6 -70
  7. package/dist/commonjs/components/DomainHeader.js +3 -48
  8. package/dist/commonjs/components/EmptyState.js +2 -2
  9. package/dist/commonjs/components/HeadersSection.js +14 -34
  10. package/dist/commonjs/components/Inspector/AnalyticsTab.js +1 -2
  11. package/dist/commonjs/components/Inspector/ConsoleTab.js +1 -1
  12. package/dist/commonjs/components/Inspector/CrashTab.js +4 -2
  13. package/dist/commonjs/components/Inspector/DebuggingTab.js +2 -2
  14. package/dist/commonjs/components/Inspector/InspectorHeader.js +651 -313
  15. package/dist/commonjs/components/Inspector/MainScreen.js +25 -70
  16. package/dist/commonjs/components/Inspector/MediaGalleryTab.d.ts +2 -0
  17. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +307 -0
  18. package/dist/commonjs/components/Inspector/MediaPreviewModal.d.ts +11 -0
  19. package/dist/commonjs/components/Inspector/MediaPreviewModal.js +393 -0
  20. package/dist/commonjs/components/Inspector/NetworkTab.js +183 -182
  21. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +4 -9
  22. package/dist/commonjs/components/Inspector/ReduxTab.js +4 -2
  23. package/dist/commonjs/components/Inspector/SettingsPanel.js +245 -0
  24. package/dist/commonjs/components/Inspector/SkeletonPlaceholder.js +2 -2
  25. package/dist/commonjs/components/Inspector/StorageTab.js +3 -3
  26. package/dist/commonjs/components/Inspector/TabBar.js +5 -10
  27. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +5 -10
  28. package/dist/commonjs/components/JsonViewer.js +43 -20
  29. package/dist/commonjs/components/LogCard.js +5 -5
  30. package/dist/commonjs/components/MetaAccordion.js +78 -80
  31. package/dist/commonjs/components/NetworkIcons.d.ts +8 -0
  32. package/dist/commonjs/components/NetworkIcons.js +51 -1
  33. package/dist/commonjs/components/SectionHeader.js +3 -48
  34. package/dist/commonjs/components/SkeletonPlaceholder.js +2 -2
  35. package/dist/commonjs/components/SourcePageCard.js +43 -45
  36. package/dist/commonjs/components/Toast.js +4 -4
  37. package/dist/commonjs/components/TouchableScale.js +9 -65
  38. package/dist/commonjs/components/TreeNode.js +2 -14
  39. package/dist/commonjs/constants/telemetryConfig.d.ts +3 -3
  40. package/dist/commonjs/constants/telemetryConfig.js +3 -3
  41. package/dist/commonjs/constants/version.d.ts +1 -1
  42. package/dist/commonjs/constants/version.js +1 -1
  43. package/dist/commonjs/customHooks/useAccordion.d.ts +3 -8
  44. package/dist/commonjs/customHooks/useAccordion.js +6 -36
  45. package/dist/commonjs/helpers/index.d.ts +2 -1
  46. package/dist/commonjs/helpers/index.js +10 -1
  47. package/dist/commonjs/i18n/locales/en.json +66 -2
  48. package/dist/commonjs/index.d.ts +1 -0
  49. package/dist/commonjs/index.js +39 -22
  50. package/dist/commonjs/native/NativeInspector.d.ts +60 -0
  51. package/dist/commonjs/native/NativeInspector.js +109 -2
  52. package/dist/commonjs/native/NativeNetworkInspector.d.ts +8 -0
  53. package/dist/commonjs/styles/AppColors.d.ts +36 -0
  54. package/dist/commonjs/styles/AppColors.js +36 -0
  55. package/dist/commonjs/styles/index.d.ts +3 -1
  56. package/dist/commonjs/styles/index.js +3 -1
  57. package/dist/commonjs/types/enums.d.ts +1 -0
  58. package/dist/commonjs/types/enums.js +1 -0
  59. package/dist/commonjs/types/index.d.ts +2 -2
  60. package/dist/esm/capture.d.ts +26 -0
  61. package/dist/esm/capture.js +29 -0
  62. package/dist/esm/components/AnalyticsEventCard.js +11 -11
  63. package/dist/esm/components/AnimatedEntrance.js +4 -38
  64. package/dist/esm/components/DomainHeader.js +4 -16
  65. package/dist/esm/components/EmptyState.js +2 -2
  66. package/dist/esm/components/HeadersSection.js +16 -36
  67. package/dist/esm/components/Inspector/AnalyticsTab.js +2 -3
  68. package/dist/esm/components/Inspector/ConsoleTab.js +2 -2
  69. package/dist/esm/components/Inspector/CrashTab.js +5 -3
  70. package/dist/esm/components/Inspector/DebuggingTab.js +3 -3
  71. package/dist/esm/components/Inspector/InspectorHeader.js +654 -316
  72. package/dist/esm/components/Inspector/MainScreen.js +25 -70
  73. package/dist/esm/components/Inspector/MediaGalleryTab.d.ts +2 -0
  74. package/dist/esm/components/Inspector/MediaGalleryTab.js +267 -0
  75. package/dist/esm/components/Inspector/MediaPreviewModal.d.ts +11 -0
  76. package/dist/esm/components/Inspector/MediaPreviewModal.js +353 -0
  77. package/dist/esm/components/Inspector/NetworkTab.js +185 -184
  78. package/dist/esm/components/Inspector/NpmUpdateToast.js +5 -10
  79. package/dist/esm/components/Inspector/ReduxTab.js +5 -3
  80. package/dist/esm/components/Inspector/SettingsPanel.js +246 -1
  81. package/dist/esm/components/Inspector/SkeletonPlaceholder.js +2 -2
  82. package/dist/esm/components/Inspector/StorageTab.js +3 -3
  83. package/dist/esm/components/Inspector/TabBar.js +6 -11
  84. package/dist/esm/components/Inspector/UpdateAvailableModal.js +6 -11
  85. package/dist/esm/components/JsonViewer.js +43 -20
  86. package/dist/esm/components/LogCard.js +5 -5
  87. package/dist/esm/components/MetaAccordion.js +79 -81
  88. package/dist/esm/components/NetworkIcons.d.ts +8 -0
  89. package/dist/esm/components/NetworkIcons.js +42 -0
  90. package/dist/esm/components/SectionHeader.js +4 -16
  91. package/dist/esm/components/SkeletonPlaceholder.js +2 -2
  92. package/dist/esm/components/SourcePageCard.js +44 -46
  93. package/dist/esm/components/Toast.js +4 -4
  94. package/dist/esm/components/TouchableScale.js +7 -33
  95. package/dist/esm/components/TreeNode.js +4 -16
  96. package/dist/esm/constants/telemetryConfig.d.ts +3 -3
  97. package/dist/esm/constants/telemetryConfig.js +3 -3
  98. package/dist/esm/constants/version.d.ts +1 -1
  99. package/dist/esm/constants/version.js +1 -1
  100. package/dist/esm/customHooks/useAccordion.d.ts +3 -8
  101. package/dist/esm/customHooks/useAccordion.js +7 -37
  102. package/dist/esm/helpers/index.d.ts +2 -1
  103. package/dist/esm/helpers/index.js +8 -0
  104. package/dist/esm/i18n/locales/en.json +66 -2
  105. package/dist/esm/index.d.ts +1 -0
  106. package/dist/esm/index.js +36 -21
  107. package/dist/esm/native/NativeInspector.d.ts +60 -0
  108. package/dist/esm/native/NativeInspector.js +100 -1
  109. package/dist/esm/native/NativeNetworkInspector.d.ts +8 -0
  110. package/dist/esm/styles/AppColors.d.ts +36 -0
  111. package/dist/esm/styles/AppColors.js +36 -0
  112. package/dist/esm/styles/index.d.ts +3 -1
  113. package/dist/esm/styles/index.js +3 -1
  114. package/dist/esm/types/enums.d.ts +1 -0
  115. package/dist/esm/types/enums.js +1 -0
  116. package/dist/esm/types/index.d.ts +2 -2
  117. package/ios/NetworkInspectorModule.h +1 -0
  118. package/ios/NetworkInspectorModule.mm +736 -7
  119. package/package.json +10 -2
  120. package/react-native-inapp-inspector.podspec +1 -0
  121. package/src/capture.ts +101 -0
  122. package/src/components/AnalyticsEventCard.tsx +15 -13
  123. package/src/components/AnimatedEntrance.tsx +3 -47
  124. package/src/components/DomainHeader.tsx +4 -17
  125. package/src/components/EmptyState.tsx +2 -2
  126. package/src/components/HeadersSection.tsx +31 -56
  127. package/src/components/Inspector/AnalyticsTab.tsx +2 -2
  128. package/src/components/Inspector/ConsoleTab.tsx +2 -1
  129. package/src/components/Inspector/CrashTab.tsx +4 -2
  130. package/src/components/Inspector/DebuggingTab.tsx +2 -2
  131. package/src/components/Inspector/InspectorHeader.tsx +1215 -789
  132. package/src/components/Inspector/MainScreen.tsx +44 -85
  133. package/src/components/Inspector/MediaGalleryTab.tsx +355 -0
  134. package/src/components/Inspector/MediaPreviewModal.tsx +435 -0
  135. package/src/components/Inspector/NetworkTab.tsx +14 -15
  136. package/src/components/Inspector/NpmUpdateToast.tsx +4 -9
  137. package/src/components/Inspector/ReduxTab.tsx +5 -2
  138. package/src/components/Inspector/SettingsPanel.tsx +303 -0
  139. package/src/components/Inspector/SkeletonPlaceholder.tsx +2 -2
  140. package/src/components/Inspector/StorageTab.tsx +3 -3
  141. package/src/components/Inspector/TabBar.tsx +6 -12
  142. package/src/components/Inspector/UpdateAvailableModal.tsx +6 -10
  143. package/src/components/JsonViewer.tsx +101 -60
  144. package/src/components/LogCard.tsx +10 -8
  145. package/src/components/MetaAccordion.tsx +6 -6
  146. package/src/components/NetworkIcons.tsx +150 -0
  147. package/src/components/SectionHeader.tsx +4 -16
  148. package/src/components/SkeletonPlaceholder.tsx +2 -2
  149. package/src/components/SourcePageCard.tsx +57 -55
  150. package/src/components/Toast.tsx +4 -4
  151. package/src/components/TouchableScale.tsx +8 -38
  152. package/src/components/TreeNode.tsx +5 -20
  153. package/src/constants/telemetryConfig.ts +3 -5
  154. package/src/constants/version.ts +1 -1
  155. package/src/customHooks/useAccordion.tsx +10 -43
  156. package/src/helpers/index.ts +10 -1
  157. package/src/i18n/locales/en.json +69 -2
  158. package/src/index.tsx +51 -23
  159. package/src/native/NativeInspector.ts +186 -1
  160. package/src/native/NativeNetworkInspector.ts +9 -0
  161. package/src/styles/AppColors.ts +38 -0
  162. package/src/styles/index.ts +3 -1
  163. package/src/types/enums.ts +3 -0
  164. package/src/types/index.ts +2 -2
  165. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  166. package/android/.gradle/8.9/checksums/md5-checksums.bin +0 -0
  167. package/android/.gradle/8.9/checksums/sha1-checksums.bin +0 -0
  168. package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
  169. package/android/.gradle/8.9/executionHistory/executionHistory.lock +0 -0
  170. package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
  171. package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
  172. package/android/.gradle/8.9/gc.properties +0 -0
  173. package/android/.gradle/9.2.0/checksums/checksums.lock +0 -0
  174. package/android/.gradle/9.2.0/fileChanges/last-build.bin +0 -0
  175. package/android/.gradle/9.2.0/fileHashes/fileHashes.bin +0 -0
  176. package/android/.gradle/9.2.0/fileHashes/fileHashes.lock +0 -0
  177. package/android/.gradle/9.2.0/gc.properties +0 -0
  178. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  179. package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
  180. package/android/.gradle/vcs-1/gc.properties +0 -0
  181. package/android/build/.transforms/6683d6eeaa3e1dfa689c3385111a0386/results.bin +0 -1
  182. package/android/build/.transforms/6683d6eeaa3e1dfa689c3385111a0386/transformed/classes/classes_dex/classes.dex +0 -0
  183. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/results.bin +0 -1
  184. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/BuildConfig.dex +0 -0
  185. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/InAppInspectorFloatingView$iconView$1.dex +0 -0
  186. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/InAppInspectorFloatingView.dex +0 -0
  187. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NativeNetworkInspectorSpec.dex +0 -0
  188. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule$Companion.dex +0 -0
  189. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule$frameCallback$1.dex +0 -0
  190. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule$shakeListener$1.dex +0 -0
  191. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule.dex +0 -0
  192. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorPackage.dex +0 -0
  193. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
  194. package/android/build/generated/source/buildConfig/debug/com/inappinspector/BuildConfig.java +0 -10
  195. package/android/build/generated/source/codegen/java/com/inappinspector/NativeNetworkInspectorSpec.java +0 -104
  196. package/android/build/generated/source/codegen/jni/CMakeLists.txt +0 -28
  197. package/android/build/generated/source/codegen/jni/RNInAppInspectorSpec-generated.cpp +0 -128
  198. package/android/build/generated/source/codegen/jni/RNInAppInspectorSpec.h +0 -31
  199. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ComponentDescriptors.cpp +0 -22
  200. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ComponentDescriptors.h +0 -24
  201. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/EventEmitters.cpp +0 -16
  202. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/EventEmitters.h +0 -17
  203. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/Props.cpp +0 -19
  204. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/Props.h +0 -18
  205. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/RNInAppInspectorSpecJSI.h +0 -177
  206. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ShadowNodes.cpp +0 -17
  207. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ShadowNodes.h +0 -23
  208. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/States.cpp +0 -16
  209. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/States.h +0 -20
  210. package/android/build/generated/source/codegen/schema.json +0 -1
  211. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +0 -7
  212. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +0 -18
  213. package/android/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar +0 -0
  214. package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +0 -6
  215. package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +0 -1
  216. package/android/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt +0 -0
  217. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  218. package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  219. package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +0 -0
  220. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +0 -1
  221. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +0 -2
  222. package/android/build/intermediates/incremental/debug-mergeJavaRes/merge-state +0 -0
  223. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +0 -2
  224. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +0 -2
  225. package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +0 -2
  226. package/android/build/intermediates/java_res/debug/processDebugJavaRes/out/META-INF/react-native-inapp-inspector_debug.kotlin_module +0 -0
  227. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/inappinspector/BuildConfig.class +0 -0
  228. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/inappinspector/NativeNetworkInspectorSpec.class +0 -0
  229. package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +0 -2
  230. package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +0 -7
  231. package/android/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-react-native-inapp-inspector.jar +0 -0
  232. package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +0 -7
  233. package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +0 -1
  234. package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +0 -1
  235. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/META-INF/react-native-inapp-inspector_debug.kotlin_module +0 -0
  236. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/BuildConfig.class +0 -0
  237. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/InAppInspectorFloatingView$iconView$1.class +0 -0
  238. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/InAppInspectorFloatingView.class +0 -0
  239. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NativeNetworkInspectorSpec.class +0 -0
  240. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule$Companion.class +0 -0
  241. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule$frameCallback$1.class +0 -0
  242. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule$shakeListener$1.class +0 -0
  243. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule.class +0 -0
  244. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorPackage.class +0 -0
  245. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  246. package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +0 -1
  247. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
  248. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
  249. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
  250. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len +0 -0
  251. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
  252. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i +0 -0
  253. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len +0 -0
  254. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
  255. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
  256. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
  257. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
  258. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
  259. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
  260. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len +0 -0
  261. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
  262. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
  263. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
  264. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
  265. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
  266. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
  267. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len +0 -0
  268. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab +0 -0
  269. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream +0 -0
  270. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len +0 -0
  271. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len +0 -0
  272. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at +0 -0
  273. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i +0 -0
  274. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len +0 -0
  275. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
  276. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
  277. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
  278. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
  279. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
  280. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
  281. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len +0 -0
  282. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
  283. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
  284. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
  285. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
  286. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
  287. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
  288. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len +0 -0
  289. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
  290. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
  291. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
  292. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len +0 -0
  293. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
  294. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
  295. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len +0 -0
  296. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
  297. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream +0 -0
  298. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len +0 -0
  299. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len +0 -0
  300. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
  301. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i +0 -0
  302. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len +0 -0
  303. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
  304. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream +0 -0
  305. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len +0 -0
  306. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len +0 -0
  307. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
  308. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i +0 -0
  309. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len +0 -0
  310. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab +0 -2
  311. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
  312. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
  313. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
  314. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len +0 -0
  315. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
  316. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i +0 -0
  317. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len +0 -0
  318. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
  319. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
  320. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
  321. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +0 -0
  322. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
  323. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i +0 -0
  324. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len +0 -0
  325. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
  326. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
  327. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
  328. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
  329. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
  330. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
  331. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len +0 -0
  332. package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
  333. package/android/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
  334. package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
  335. package/android/build/outputs/aar/react-native-inapp-inspector-debug.aar +0 -0
  336. package/android/build/outputs/logs/manifest-merger-debug-report.txt +0 -17
  337. package/android/build/reports/problems/problems-report.html +0 -659
  338. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  339. package/android/build/tmp/kotlin-classes/debug/META-INF/react-native-inapp-inspector_debug.kotlin_module +0 -0
  340. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/InAppInspectorFloatingView$iconView$1.class +0 -0
  341. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/InAppInspectorFloatingView.class +0 -0
  342. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule$Companion.class +0 -0
  343. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule$frameCallback$1.class +0 -0
  344. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule$shakeListener$1.class +0 -0
  345. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule.class +0 -0
  346. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorPackage.class +0 -0
@@ -1,5 +1,5 @@
1
1
  import React, { useMemo } from 'react';
2
- import { Alert, Animated, Linking, Platform, Pressable, ScrollView, Text, TouchableOpacity, useWindowDimensions, View, } from 'react-native';
2
+ import { Alert, Animated, Linking, Platform, Pressable, Text, TouchableOpacity, useWindowDimensions, View, } from 'react-native';
3
3
  import LinearGradient from 'react-native-linear-gradient';
4
4
  import { useInspector } from './InspectorContext';
5
5
  import TouchableScale from '../TouchableScale';
@@ -10,10 +10,15 @@ import { AppFonts } from '../../styles/AppFonts';
10
10
  import { METHOD_COLORS } from '../../constants';
11
11
  import { LIB_VERSION } from '../../constants';
12
12
  import { getStatusColor, getAppName, formatTime, getSize, getAppVersionAndBuild, } from '../../helpers';
13
- import { getNativeDeviceMetrics } from '../../native/NativeInspector';
13
+ import { triggerNativeHaptic, } from '../../native/NativeInspector';
14
+ import { ScreenCapture } from '../../capture';
15
+ import { showToast } from '../../helpers/toast';
14
16
  import { UpdateAvailableModal } from './UpdateAvailableModal';
15
- import { WhiteBackNavigation, TrashIcon, SettingsIcon, CloseWhite, ClockIcon, SizeIcon, AppleIcon, AndroidIcon, NpmIcon, ResetIcon, BoltIcon, InfoCircleIcon, } from '../NetworkIcons';
17
+ import { MediaPreviewModal } from './MediaPreviewModal';
18
+ import { WhiteBackNavigation, TrashIcon, SettingsIcon, CloseWhite, ClockIcon, SizeIcon, AppleIcon, AndroidIcon, NpmIcon, ResetIcon, BoltIcon, InfoCircleIcon, CameraIcon, VideoCameraIcon, } from '../NetworkIcons';
19
+ import { useTranslation } from '../../i18n';
16
20
  const InspectorHeader = React.memo(() => {
21
+ const { t } = useTranslation();
17
22
  const { modalHeightPercent, appIcon, selected, setSelected, selectedEvent, setSelectedEvent, selectedLog, setSelectedLog, selectedReduxSlice, setSelectedReduxSlice, selectedReduxAction, setSelectedReduxAction, reduxState, reduxLastActionMap, showHeaderInfo, setShowHeaderInfo, updateAvailable, latestNpmVersion, clearAnim, activePulseAnim, unreadPulseAnim, runClearAllWithAnimation, settingsPage, setSettingsPage, setSettingsActiveSubTab, isFeedbackOpen, setIsFeedbackOpen, resetToDefaults, closeModal, detailTitle, activeTab, environment, visible, selectedCrash, setSelectedCrash, } = useInspector();
18
23
  const { width: windowWidth } = useWindowDimensions();
19
24
  const isNarrow = windowWidth < 360;
@@ -23,17 +28,124 @@ const InspectorHeader = React.memo(() => {
23
28
  const [appVersionString, setAppVersionString] = React.useState(() => {
24
29
  return getAppVersionAndBuild().formatted;
25
30
  });
31
+ const [isRecording, setIsRecording] = React.useState(false);
32
+ const [recordingSeconds, setRecordingSeconds] = React.useState(0);
33
+ const recordingTimerRef = React.useRef(null);
26
34
  React.useEffect(() => {
27
- getNativeDeviceMetrics()
28
- .then(metrics => {
29
- if (metrics?.appVersion) {
30
- const v = metrics.appVersion;
31
- const b = metrics.appBuild || '1';
32
- setAppVersionString(`${v} (${b})`);
33
- }
35
+ ScreenCapture.isRecording()
36
+ .then(active => {
37
+ setIsRecording(active);
34
38
  })
35
39
  .catch(() => { });
36
40
  }, []);
41
+ React.useEffect(() => {
42
+ if (isRecording) {
43
+ setRecordingSeconds(0);
44
+ recordingTimerRef.current = setInterval(() => {
45
+ setRecordingSeconds(s => s + 1);
46
+ }, 1000);
47
+ }
48
+ else {
49
+ if (recordingTimerRef.current) {
50
+ clearInterval(recordingTimerRef.current);
51
+ recordingTimerRef.current = null;
52
+ }
53
+ setRecordingSeconds(0);
54
+ }
55
+ return () => {
56
+ if (recordingTimerRef.current) {
57
+ clearInterval(recordingTimerRef.current);
58
+ }
59
+ };
60
+ }, [isRecording]);
61
+ const [previewMediaItem, setPreviewMediaItem] = React.useState(null);
62
+ const handleTakeScreenshot = React.useCallback(async () => {
63
+ try {
64
+ triggerNativeHaptic('light');
65
+ const result = await ScreenCapture.takeScreenshot({
66
+ format: 'png',
67
+ quality: 0.9,
68
+ hideInspector: true,
69
+ });
70
+ if (result) {
71
+ triggerNativeHaptic('success');
72
+ const newItem = {
73
+ id: `screenshot_${result.timestamp}.png`,
74
+ type: 'image',
75
+ format: result.format,
76
+ uri: result.uri,
77
+ filename: result.uri.split('/').pop() || `screenshot_${result.timestamp}.png`,
78
+ sizeBytes: result.sizeBytes,
79
+ timestamp: result.timestamp,
80
+ width: result.width,
81
+ height: result.height,
82
+ };
83
+ setPreviewMediaItem(newItem);
84
+ showToast(t('header.screenshotCaptured'));
85
+ }
86
+ else {
87
+ showToast(t('header.screenshotFailed'));
88
+ }
89
+ }
90
+ catch {
91
+ showToast(t('header.screenshotError'));
92
+ }
93
+ }, [t]);
94
+ const handleToggleVideoRecording = React.useCallback(async () => {
95
+ try {
96
+ if (isRecording) {
97
+ triggerNativeHaptic('medium');
98
+ const result = await ScreenCapture.stopRecording();
99
+ setIsRecording(false);
100
+ if (result) {
101
+ triggerNativeHaptic('success');
102
+ const newItem = {
103
+ id: `video_${result.timestamp}.${result.format}`,
104
+ type: result.format === 'gif' ? 'gif' : 'video',
105
+ format: result.format,
106
+ uri: result.uri,
107
+ filename: result.uri.split('/').pop() ||
108
+ `video_${result.timestamp}.${result.format}`,
109
+ sizeBytes: result.sizeBytes,
110
+ timestamp: result.timestamp,
111
+ durationMs: result.durationMs,
112
+ width: result.width,
113
+ height: result.height,
114
+ hasAudio: result.hasAudio,
115
+ };
116
+ setPreviewMediaItem(newItem);
117
+ showToast(t('header.recordingSaved', {
118
+ duration: (result.durationMs / 1000).toFixed(1),
119
+ }));
120
+ }
121
+ }
122
+ else {
123
+ triggerNativeHaptic('medium');
124
+ const started = await ScreenCapture.startRecording({
125
+ fps: 24,
126
+ audioSource: 'none',
127
+ });
128
+ if (started) {
129
+ setIsRecording(true);
130
+ showToast(t('header.recordingStarted'));
131
+ }
132
+ else {
133
+ showToast(t('header.recordingStartFailed'));
134
+ }
135
+ }
136
+ }
137
+ catch {
138
+ showToast(t('header.recordingError'));
139
+ setIsRecording(false);
140
+ }
141
+ }, [isRecording, t]);
142
+ const formatTimer = (totalSeconds) => {
143
+ const mins = Math.floor(totalSeconds / 60);
144
+ const secs = totalSeconds % 60;
145
+ return `${mins.toString().padStart(2, '0')}:${secs
146
+ .toString()
147
+ .padStart(2, '0')}`;
148
+ };
37
149
  const envConfig = useMemo(() => {
38
150
  const rawEnv = (environment || (__DEV__ ? 'DEV' : 'PROD')).trim();
39
151
  const clean = rawEnv.toUpperCase();
@@ -100,50 +212,60 @@ const InspectorHeader = React.memo(() => {
100
212
  const buttonSize = isNarrow ? 28 : isCompact ? 30 : 32;
101
213
  const logoSize = isNarrow ? 36 : isCompact ? 40 : 44;
102
214
  return (<>
103
- <LinearGradient colors={['#4F46E5', '#7C3AED']} start={{ x: 0, y: 0 }} end={{ x: 1, y: 1 }} style={styles.headerGradient}>
104
- <View style={{ paddingTop: headerTopPadding, width: '100%' }}>
105
- <View style={[
106
- styles.header,
215
+ <View style={[
216
+ styles.headerGradient,
107
217
  {
108
- paddingHorizontal: isNarrow ? 8 : 12,
109
- paddingVertical: isNarrow ? 6 : 8,
110
- minHeight: isNarrow ? 48 : 52,
218
+ minHeight: (isNarrow ? 48 : 52) + headerTopPadding,
111
219
  },
112
220
  ]}>
221
+
222
+ <LinearGradient colors={[AppColors.indigo600, AppColors.violet600]} start={{ x: 0, y: 0 }} end={{ x: 1, y: 1 }} style={{
223
+ position: 'absolute',
224
+ top: 0,
225
+ left: 0,
226
+ right: 0,
227
+ bottom: 0,
228
+ borderTopLeftRadius: 20,
229
+ borderTopRightRadius: 20,
230
+ }} pointerEvents="none"/>
231
+ <View style={{ paddingTop: headerTopPadding, width: '100%' }}>
113
232
  <View style={[
114
- styles.headerLeft,
233
+ styles.header,
115
234
  {
116
- flexDirection: 'row',
117
- alignItems: 'center',
118
- gap: isNarrow ? 6 : 8,
119
- flex: !isDetailView ? 1 : 0,
120
- minWidth: 0,
235
+ paddingHorizontal: isNarrow ? 8 : 12,
236
+ paddingVertical: isNarrow ? 6 : 8,
237
+ minHeight: isNarrow ? 48 : 52,
121
238
  },
122
239
  ]}>
123
- <TouchableScale onPress={() => {
124
- if (isFeedbackOpen) {
125
- setIsFeedbackOpen(false);
126
- return;
127
- }
128
- if (isSettingsView) {
129
- if (settingsPage === 'main') {
130
- setSettingsPage(null);
240
+ <View style={{
241
+ flexDirection: 'row',
242
+ alignItems: 'center',
243
+ gap: isNarrow ? 6 : 8,
244
+ flexShrink: 0,
245
+ flex: isAnySelected ? undefined : 1,
246
+ minWidth: isAnySelected ? (isNarrow ? 32 : 36) : 0,
247
+ }}>
248
+ {isAnySelected && (<TouchableScale onPress={() => {
249
+ if (isFeedbackOpen) {
250
+ setIsFeedbackOpen(false);
251
+ return;
131
252
  }
132
- else {
133
- setSettingsPage('main');
253
+ if (isSettingsView) {
254
+ if (settingsPage === 'main') {
255
+ setSettingsPage(null);
256
+ }
257
+ else {
258
+ setSettingsPage('main');
259
+ }
260
+ return;
134
261
  }
135
- return;
136
- }
137
- requestAnimationFrame(() => {
138
262
  setSelected(null);
139
263
  setSelectedEvent(null);
140
264
  setSelectedLog(null);
141
265
  setSelectedReduxSlice(null);
142
266
  setSelectedReduxAction(null);
143
267
  setSelectedCrash(null);
144
- });
145
- }} hitSlop={15} style={[
146
- {
268
+ }} hitSlop={15} style={{
147
269
  width: isNarrow ? 32 : 36,
148
270
  height: isNarrow ? 32 : 36,
149
271
  borderRadius: isNarrow ? 16 : 18,
@@ -152,30 +274,32 @@ const InspectorHeader = React.memo(() => {
152
274
  backgroundColor: `${AppColors.white}2E`,
153
275
  borderWidth: 1,
154
276
  borderColor: `${AppColors.white}4D`,
155
- },
156
- !isAnySelected && { display: 'none' },
157
- ]}>
158
- <View style={{
159
- position: 'absolute',
160
- width: isNarrow ? 40 : 44,
161
- height: isNarrow ? 40 : 44,
162
- borderRadius: 22,
163
- backgroundColor: `${AppColors.white}1A`,
164
- }}/>
165
- <WhiteBackNavigation />
166
- </TouchableScale>
277
+ }}>
278
+ <View style={{
279
+ position: 'absolute',
280
+ width: isNarrow ? 40 : 44,
281
+ height: isNarrow ? 40 : 44,
282
+ borderRadius: 22,
283
+ backgroundColor: `${AppColors.white}1A`,
284
+ }}/>
285
+ <WhiteBackNavigation />
286
+ </TouchableScale>)}
167
287
 
168
- {isFeedbackOpen ? (<View style={{ gap: 2, flex: 1, minWidth: 0 }}>
169
- <View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
170
- <Text style={{
288
+ {isFeedbackOpen ? (<View style={{ gap: 2, flex: 1, minWidth: 0 }}>
289
+ <View style={{
290
+ flexDirection: 'row',
291
+ alignItems: 'center',
292
+ gap: 6,
293
+ }}>
294
+ <Text style={{
171
295
  fontFamily: AppFonts.interBold,
172
296
  fontSize: isNarrow ? 14 : 16,
173
297
  color: AppColors.white,
174
298
  letterSpacing: -0.2,
175
299
  }} numberOfLines={1}>
176
- Support & Feedback
177
- </Text>
178
- <View style={{
300
+ Support & Feedback
301
+ </Text>
302
+ <View style={{
179
303
  backgroundColor: `${AppColors.white}26`,
180
304
  paddingHorizontal: isNarrow ? 4 : 6,
181
305
  paddingVertical: 1.5,
@@ -183,33 +307,37 @@ const InspectorHeader = React.memo(() => {
183
307
  borderWidth: 1,
184
308
  borderColor: `${AppColors.white}20`,
185
309
  }}>
186
- <Text style={{
310
+ <Text style={{
187
311
  fontFamily: AppFonts.interBold,
188
312
  fontSize: isNarrow ? 8 : 9,
189
313
  color: AppColors.white,
190
314
  }}>
191
- v{LIB_VERSION}
192
- </Text>
315
+ v{LIB_VERSION}
316
+ </Text>
317
+ </View>
193
318
  </View>
194
- </View>
195
- <Text style={{
319
+ <Text style={{
196
320
  fontFamily: AppFonts.interRegular,
197
321
  fontSize: isNarrow ? 9.5 : 10.5,
198
322
  color: `${AppColors.white}CC`,
199
323
  }} numberOfLines={1}>
200
- Direct line to maintainers & developers
201
- </Text>
202
- </View>) : isSettingsView ? (<View style={{ gap: 2, flex: 1, minWidth: 0 }}>
203
- <View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
204
- <Text style={{
324
+ Direct line to maintainers & developers
325
+ </Text>
326
+ </View>) : isSettingsView ? (<View style={{ gap: 2, flex: 1, minWidth: 0 }}>
327
+ <View style={{
328
+ flexDirection: 'row',
329
+ alignItems: 'center',
330
+ gap: 6,
331
+ }}>
332
+ <Text style={{
205
333
  fontFamily: AppFonts.interBold,
206
334
  fontSize: isNarrow ? 14 : 16,
207
335
  color: AppColors.white,
208
336
  letterSpacing: -0.2,
209
337
  }} numberOfLines={1}>
210
- {settingsModuleTitle}
211
- </Text>
212
- {settingsPage === 'main' && (<View style={{
338
+ {settingsModuleTitle}
339
+ </Text>
340
+ {settingsPage === 'main' && (<View style={{
213
341
  backgroundColor: `${AppColors.white}26`,
214
342
  paddingHorizontal: isNarrow ? 4 : 6,
215
343
  paddingVertical: 1.5,
@@ -217,25 +345,25 @@ const InspectorHeader = React.memo(() => {
217
345
  borderWidth: 1,
218
346
  borderColor: `${AppColors.white}20`,
219
347
  }}>
220
- <Text style={{
348
+ <Text style={{
221
349
  fontFamily: AppFonts.interBold,
222
350
  fontSize: isNarrow ? 8 : 9,
223
351
  color: AppColors.white,
224
352
  }}>
225
- v{LIB_VERSION}
226
- </Text>
227
- </View>)}
228
- </View>
229
- <Text style={{
353
+ v{LIB_VERSION}
354
+ </Text>
355
+ </View>)}
356
+ </View>
357
+ <Text style={{
230
358
  fontFamily: AppFonts.interRegular,
231
359
  fontSize: isNarrow ? 9.5 : 10.5,
232
360
  color: `${AppColors.white}CC`,
233
361
  }} numberOfLines={1}>
234
- {settingsPage === 'main'
362
+ {settingsPage === 'main'
235
363
  ? 'Manage modules and preferences'
236
364
  : 'Configure module parameters'}
237
- </Text>
238
- </View>) : !isAnySelected ? (<View style={{
365
+ </Text>
366
+ </View>) : !isAnySelected ? (<View style={{
239
367
  flexDirection: 'row',
240
368
  alignItems: 'center',
241
369
  gap: isNarrow ? 6 : 8,
@@ -243,15 +371,15 @@ const InspectorHeader = React.memo(() => {
243
371
  minWidth: 0,
244
372
  marginRight: 4,
245
373
  }}>
246
- <AppHeaderLogo size={logoSize} customIcon={appIcon}/>
247
- <View style={{ gap: 2, flex: 1, minWidth: 0 }}>
248
- <View style={{
374
+ <AppHeaderLogo size={logoSize} customIcon={appIcon}/>
375
+ <View style={{ gap: 2, flex: 1, minWidth: 0 }}>
376
+ <View style={{
249
377
  flexDirection: 'row',
250
378
  alignItems: 'center',
251
379
  gap: isNarrow ? 4 : 6,
252
380
  minWidth: 0,
253
381
  }}>
254
- <Text style={[
382
+ <Text style={[
255
383
  styles.headerTitle,
256
384
  {
257
385
  fontSize: isNarrow ? 13.5 : isCompact ? 14.5 : 15.5,
@@ -259,9 +387,9 @@ const InspectorHeader = React.memo(() => {
259
387
  paddingBottom: 0,
260
388
  },
261
389
  ]} numberOfLines={1} ellipsizeMode="tail">
262
- {getAppName()}
263
- </Text>
264
- <View style={[
390
+ {getAppName()}
391
+ </Text>
392
+ <View style={[
265
393
  styles.envBadge,
266
394
  {
267
395
  backgroundColor: envConfig.bg,
@@ -272,59 +400,59 @@ const InspectorHeader = React.memo(() => {
272
400
  marginBottom: 0,
273
401
  },
274
402
  ]}>
275
- <Text style={[
403
+ <Text style={[
276
404
  styles.envBadgeText,
277
405
  {
278
406
  color: envConfig.text,
279
407
  fontSize: isNarrow ? 8.5 : 9.5,
280
408
  },
281
409
  ]}>
282
- {envConfig.label}
283
- </Text>
284
- </View>
285
- {updateAvailable && (<Pressable hitSlop={10} onPress={() => setShowUpdateModal(true)} style={{
410
+ {envConfig.label}
411
+ </Text>
412
+ </View>
413
+ {updateAvailable && (<Pressable hitSlop={10} onPress={() => setShowUpdateModal(true)} style={{
286
414
  flexDirection: 'row',
287
415
  alignItems: 'center',
288
- backgroundColor: '#F59E0B',
416
+ backgroundColor: AppColors.warningAmber,
289
417
  borderRadius: 5,
290
418
  paddingHorizontal: isNarrow ? 4 : 5.5,
291
419
  paddingVertical: 1.5,
292
420
  gap: 3,
293
- shadowColor: '#F59E0B',
421
+ shadowColor: AppColors.warningAmber,
294
422
  shadowOffset: { width: 0, height: 1.5 },
295
423
  shadowOpacity: 0.35,
296
424
  shadowRadius: 3,
297
425
  elevation: 3,
298
426
  flexShrink: 0,
299
427
  }}>
300
- <Animated.View style={{
428
+ <Animated.View style={{
301
429
  width: 5,
302
430
  height: 5,
303
431
  borderRadius: 2.5,
304
- backgroundColor: '#FFFFFF',
432
+ backgroundColor: AppColors.white,
305
433
  opacity: activePulseAnim,
306
434
  transform: [{ scale: unreadPulseAnim }],
307
435
  }}/>
308
- {!isNarrow && (<Text style={{
436
+ {!isNarrow && (<Text style={{
309
437
  fontFamily: AppFonts.interBold,
310
438
  fontSize: 8.5,
311
- color: '#FFFFFF',
439
+ color: AppColors.white,
312
440
  letterSpacing: 0.3,
313
441
  }}>
314
- UPDATE
315
- </Text>)}
316
- <BoltIcon size={isNarrow ? 8 : 9} color="#FFFFFF"/>
317
- </Pressable>)}
318
- </View>
442
+ UPDATE
443
+ </Text>)}
444
+ <BoltIcon size={isNarrow ? 8 : 9} color={AppColors.white}/>
445
+ </Pressable>)}
446
+ </View>
319
447
 
320
-
321
- <View style={{
448
+
449
+ <View style={{
322
450
  flexDirection: 'row',
323
451
  alignItems: 'center',
324
452
  gap: isNarrow ? 4 : 5,
325
453
  minWidth: 0,
326
454
  }}>
327
- <View style={{
455
+ <View style={{
328
456
  flexDirection: 'row',
329
457
  alignItems: 'center',
330
458
  backgroundColor: `${AppColors.white}1F`,
@@ -337,18 +465,18 @@ const InspectorHeader = React.memo(() => {
337
465
  flexShrink: 1,
338
466
  minWidth: 0,
339
467
  }}>
340
- {Platform.OS === 'ios' ? (<AppleIcon color={`${AppColors.white}E6`} size={isNarrow ? 9 : 10}/>) : (<AndroidIcon color={`${AppColors.white}E6`} size={isNarrow ? 9 : 10}/>)}
341
- <Text style={{
468
+ {Platform.OS === 'ios' ? (<AppleIcon color={`${AppColors.white}E6`} size={isNarrow ? 9 : 10}/>) : (<AndroidIcon color={`${AppColors.white}E6`} size={isNarrow ? 9 : 10}/>)}
469
+ <Text style={{
342
470
  fontFamily: AppFonts.interMedium,
343
471
  fontSize: isNarrow ? 8.5 : 9.5,
344
472
  color: `${AppColors.white}EB`,
345
473
  letterSpacing: 0.1,
346
474
  }} numberOfLines={1} ellipsizeMode="tail">
347
- {appVersionString}
348
- </Text>
349
- </View>
475
+ {appVersionString}
476
+ </Text>
477
+ </View>
350
478
 
351
- <Pressable onPress={() => {
479
+ <Pressable onPress={() => {
352
480
  if (updateAvailable) {
353
481
  setShowUpdateModal(true);
354
482
  }
@@ -367,32 +495,35 @@ const InspectorHeader = React.memo(() => {
367
495
  borderColor: `${AppColors.white}2E`,
368
496
  flexShrink: 0,
369
497
  }}>
370
- <NpmIcon size={isNarrow ? 9 : 10} color="#FF6B6B"/>
371
- <Text style={{
498
+ <NpmIcon size={isNarrow ? 9 : 10} color={AppColors.npmRedLight}/>
499
+ <Text style={{
372
500
  fontFamily: AppFonts.interMedium,
373
501
  fontSize: isNarrow ? 8.5 : 9.5,
374
502
  color: `${AppColors.white}EB`,
375
503
  letterSpacing: 0.1,
376
504
  }} numberOfLines={1}>
377
- v{LIB_VERSION}
378
- </Text>
379
- {updateAvailable && (<Text style={{
505
+ v{LIB_VERSION}
506
+ </Text>
507
+ {updateAvailable && (<Text style={{
380
508
  fontFamily: AppFonts.interBold,
381
509
  fontSize: 8.5,
382
- color: '#F59E0B',
510
+ color: AppColors.warningAmber,
383
511
  }}>
384
- ●
385
- </Text>)}
386
- </Pressable>
512
+ ●
513
+ </Text>)}
514
+ </Pressable>
515
+ </View>
387
516
  </View>
388
- </View>
389
- </View>) : null}
390
- </View>
517
+ </View>) : null}
518
+ </View>
391
519
 
392
- {isDetailView && (<View style={[styles.headerCenter, { paddingHorizontal: isNarrow ? 2 : 6 }]}>
393
- {activeTab === 'apis' && selected != null ? (<View style={styles.headerDetailCenter}>
394
- <View style={styles.headerDetailRow}>
395
- <View style={[
520
+ {isDetailView && (<View style={[
521
+ styles.headerCenter,
522
+ { paddingHorizontal: isNarrow ? 2 : 6 },
523
+ ]}>
524
+ {activeTab === 'apis' && selected != null ? (<View style={styles.headerDetailCenter}>
525
+ <View style={styles.headerDetailRow}>
526
+ <View style={[
396
527
  styles.headerMethodBadge,
397
528
  {
398
529
  backgroundColor: METHOD_COLORS[selected.method] ??
@@ -401,22 +532,28 @@ const InspectorHeader = React.memo(() => {
401
532
  paddingVertical: isNarrow ? 2 : 3,
402
533
  },
403
534
  ]}>
404
- <Text style={[styles.headerMethodText, { fontSize: isNarrow ? 9 : 10 }]}>
405
- {selected.method}
535
+ <Text style={[
536
+ styles.headerMethodText,
537
+ { fontSize: isNarrow ? 9 : 10 },
538
+ ]}>
539
+ {selected.method}
540
+ </Text>
541
+ </View>
542
+ <Text style={[
543
+ styles.headerDetailTitle,
544
+ { fontSize: isNarrow ? 13.5 : 15 },
545
+ ]} numberOfLines={1} ellipsizeMode="middle">
546
+ {detailTitle}
406
547
  </Text>
407
548
  </View>
408
- <Text style={[styles.headerDetailTitle, { fontSize: isNarrow ? 13.5 : 15 }]} numberOfLines={1} ellipsizeMode="middle">
409
- {detailTitle}
410
- </Text>
411
- </View>
412
- <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{
549
+ <View style={{
413
550
  flexDirection: 'row',
414
551
  alignItems: 'center',
415
552
  gap: isNarrow ? 4 : 6,
416
553
  marginTop: 3,
417
554
  paddingVertical: 1,
418
555
  }}>
419
- <View style={{
556
+ <View style={{
420
557
  flexDirection: 'row',
421
558
  alignItems: 'center',
422
559
  gap: 4,
@@ -427,7 +564,7 @@ const InspectorHeader = React.memo(() => {
427
564
  borderWidth: 1,
428
565
  borderColor: `${getStatusColor(selected.status)}55`,
429
566
  }}>
430
- <View style={[
567
+ <View style={[
431
568
  styles.headerStatusDot,
432
569
  {
433
570
  backgroundColor: getStatusColor(selected.status),
@@ -435,16 +572,19 @@ const InspectorHeader = React.memo(() => {
435
572
  height: isNarrow ? 6 : 7,
436
573
  },
437
574
  ]}/>
438
- <Text style={[
575
+ <Text style={[
439
576
  styles.headerSubTitle,
440
- { fontFamily: AppFonts.interBold, fontSize: isNarrow ? 10 : 11 },
577
+ {
578
+ fontFamily: AppFonts.interBold,
579
+ fontSize: isNarrow ? 10 : 11,
580
+ },
441
581
  ]}>
442
- {selected.status === 0
582
+ {selected.status === 0
443
583
  ? 'Failed'
444
584
  : selected.status ?? 'Pending'}
445
- </Text>
446
- </View>
447
- <View style={{
585
+ </Text>
586
+ </View>
587
+ <View style={{
448
588
  flexDirection: 'row',
449
589
  alignItems: 'center',
450
590
  gap: 4,
@@ -453,14 +593,17 @@ const InspectorHeader = React.memo(() => {
453
593
  borderRadius: 20,
454
594
  backgroundColor: `${AppColors.white}29`,
455
595
  }}>
456
- <ClockIcon color={AppColors.white} size={isNarrow ? 10 : 11}/>
457
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
458
- {selected.duration != null
596
+ <ClockIcon color={AppColors.white} size={isNarrow ? 10 : 11}/>
597
+ <Text style={[
598
+ styles.headerSubTitle,
599
+ { fontSize: isNarrow ? 10 : 11 },
600
+ ]}>
601
+ {selected.duration != null
459
602
  ? `${selected.duration}ms`
460
603
  : '—'}
461
- </Text>
462
- </View>
463
- {selected.response != null && (<View style={{
604
+ </Text>
605
+ </View>
606
+ {selected.response != null && (<View style={{
464
607
  flexDirection: 'row',
465
608
  alignItems: 'center',
466
609
  gap: 4,
@@ -469,15 +612,18 @@ const InspectorHeader = React.memo(() => {
469
612
  borderRadius: 20,
470
613
  backgroundColor: `${AppColors.white}29`,
471
614
  }}>
472
- <SizeIcon color={AppColors.white} size={isNarrow ? 10 : 11}/>
473
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
474
- {getSize(selected.response)}
475
- </Text>
476
- </View>)}
477
- </ScrollView>
478
- </View>) : activeTab === 'analytics' && selectedEvent != null ? (<View style={styles.headerDetailCenter}>
479
- <View style={styles.headerDetailRow}>
480
- <View style={[
615
+ <SizeIcon color={AppColors.white} size={isNarrow ? 10 : 11}/>
616
+ <Text style={[
617
+ styles.headerSubTitle,
618
+ { fontSize: isNarrow ? 10 : 11 },
619
+ ]}>
620
+ {getSize(selected.response)}
621
+ </Text>
622
+ </View>)}
623
+ </View>
624
+ </View>) : activeTab === 'analytics' && selectedEvent != null ? (<View style={styles.headerDetailCenter}>
625
+ <View style={styles.headerDetailRow}>
626
+ <View style={[
481
627
  styles.headerMethodBadge,
482
628
  {
483
629
  backgroundColor: selectedEvent.source === 'firebase'
@@ -487,22 +633,28 @@ const InspectorHeader = React.memo(() => {
487
633
  paddingVertical: isNarrow ? 2 : 3,
488
634
  },
489
635
  ]}>
490
- <Text style={[styles.headerMethodText, { fontSize: isNarrow ? 9 : 10 }]}>
491
- {selectedEvent.source === 'firebase' ? 'FB' : 'MAN'}
636
+ <Text style={[
637
+ styles.headerMethodText,
638
+ { fontSize: isNarrow ? 9 : 10 },
639
+ ]}>
640
+ {selectedEvent.source === 'firebase' ? 'FB' : 'MAN'}
641
+ </Text>
642
+ </View>
643
+ <Text style={[
644
+ styles.headerDetailTitle,
645
+ { fontSize: isNarrow ? 13.5 : 15 },
646
+ ]} numberOfLines={1} ellipsizeMode="middle">
647
+ {selectedEvent.name}
492
648
  </Text>
493
649
  </View>
494
- <Text style={[styles.headerDetailTitle, { fontSize: isNarrow ? 13.5 : 15 }]} numberOfLines={1} ellipsizeMode="middle">
495
- {selectedEvent.name}
496
- </Text>
497
- </View>
498
- <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{
650
+ <View style={{
499
651
  flexDirection: 'row',
500
652
  alignItems: 'center',
501
653
  gap: isNarrow ? 4 : 6,
502
654
  marginTop: 3,
503
655
  paddingVertical: 1,
504
656
  }}>
505
- <View style={[
657
+ <View style={[
506
658
  styles.headerStatusDot,
507
659
  {
508
660
  backgroundColor: selectedEvent.source === 'firebase'
@@ -512,18 +664,21 @@ const InspectorHeader = React.memo(() => {
512
664
  height: isNarrow ? 6 : 7,
513
665
  },
514
666
  ]}/>
515
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
516
- {Object.keys(selectedEvent.params).length} param
517
- {Object.keys(selectedEvent.params).length !== 1
667
+ <Text style={[
668
+ styles.headerSubTitle,
669
+ { fontSize: isNarrow ? 10 : 11 },
670
+ ]}>
671
+ {Object.keys(selectedEvent.params).length} param
672
+ {Object.keys(selectedEvent.params).length !== 1
518
673
  ? 's'
519
674
  : ''}
520
- {' · '}
521
- {selectedEvent.source}
522
- </Text>
523
- </ScrollView>
524
- </View>) : activeTab === 'logs' && selectedLog != null ? (<View style={styles.headerDetailCenter}>
525
- <View style={styles.headerDetailRow}>
526
- <View style={[
675
+ {' · '}
676
+ {selectedEvent.source}
677
+ </Text>
678
+ </View>
679
+ </View>) : activeTab === 'logs' && selectedLog != null ? (<View style={styles.headerDetailCenter}>
680
+ <View style={styles.headerDetailRow}>
681
+ <View style={[
527
682
  styles.headerMethodBadge,
528
683
  {
529
684
  backgroundColor: selectedLog.type === 'error'
@@ -535,23 +690,29 @@ const InspectorHeader = React.memo(() => {
535
690
  paddingVertical: isNarrow ? 2 : 3,
536
691
  },
537
692
  ]}>
538
- <Text style={[styles.headerMethodText, { fontSize: isNarrow ? 9 : 10 }]}>
539
- {selectedLog.type.toUpperCase()}
693
+ <Text style={[
694
+ styles.headerMethodText,
695
+ { fontSize: isNarrow ? 9 : 10 },
696
+ ]}>
697
+ {selectedLog.type.toUpperCase()}
698
+ </Text>
699
+ </View>
700
+ <Text style={[
701
+ styles.headerDetailTitle,
702
+ { fontSize: isNarrow ? 13.5 : 15 },
703
+ ]} numberOfLines={1} ellipsizeMode="middle">
704
+ console.
705
+ {selectedLog.sourceMethod || selectedLog.type || 'log'}
540
706
  </Text>
541
707
  </View>
542
- <Text style={[styles.headerDetailTitle, { fontSize: isNarrow ? 13.5 : 15 }]} numberOfLines={1} ellipsizeMode="middle">
543
- console.
544
- {selectedLog.sourceMethod || selectedLog.type || 'log'}
545
- </Text>
546
- </View>
547
- <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{
708
+ <View style={{
548
709
  flexDirection: 'row',
549
710
  alignItems: 'center',
550
711
  gap: isNarrow ? 4 : 6,
551
712
  marginTop: 3,
552
713
  paddingVertical: 1,
553
714
  }}>
554
- <View style={{
715
+ <View style={{
555
716
  flexDirection: 'row',
556
717
  alignItems: 'center',
557
718
  gap: 4,
@@ -560,13 +721,16 @@ const InspectorHeader = React.memo(() => {
560
721
  borderRadius: 20,
561
722
  backgroundColor: `${AppColors.white}29`,
562
723
  }}>
563
- <ClockIcon color={AppColors.white} size={isNarrow ? 10 : 11}/>
564
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
565
- {formatTime(selectedLog.timestamp)}
566
- </Text>
724
+ <ClockIcon color={AppColors.white} size={isNarrow ? 10 : 11}/>
725
+ <Text style={[
726
+ styles.headerSubTitle,
727
+ { fontSize: isNarrow ? 10 : 11 },
728
+ ]}>
729
+ {formatTime(selectedLog.timestamp)}
730
+ </Text>
731
+ </View>
567
732
  </View>
568
- </ScrollView>
569
- </View>) : activeTab === 'redux' && selectedReduxSlice != null ? ((() => {
733
+ </View>) : activeTab === 'redux' && selectedReduxSlice != null ? ((() => {
570
734
  const sliceData = reduxState?.[selectedReduxSlice];
571
735
  const keyCount = sliceData && typeof sliceData === 'object'
572
736
  ? Object.keys(sliceData).length
@@ -576,8 +740,8 @@ const InspectorHeader = React.memo(() => {
576
740
  const sliceSize = getSize(sliceData);
577
741
  const lastAction = reduxLastActionMap[selectedReduxSlice];
578
742
  return (<View style={styles.headerDetailCenter}>
579
- <View style={styles.headerDetailRow}>
580
- <View style={[
743
+ <View style={styles.headerDetailRow}>
744
+ <View style={[
581
745
  styles.headerMethodBadge,
582
746
  {
583
747
  backgroundColor: `${AppColors.purple}4D`,
@@ -585,20 +749,28 @@ const InspectorHeader = React.memo(() => {
585
749
  paddingVertical: isNarrow ? 2 : 3,
586
750
  },
587
751
  ]}>
588
- <Text style={[styles.headerMethodText, { fontSize: isNarrow ? 9 : 10 }]}>SLICE</Text>
752
+ <Text style={[
753
+ styles.headerMethodText,
754
+ { fontSize: isNarrow ? 9 : 10 },
755
+ ]}>
756
+ SLICE
757
+ </Text>
758
+ </View>
759
+ <Text style={[
760
+ styles.headerDetailTitle,
761
+ { fontSize: isNarrow ? 13.5 : 15 },
762
+ ]} numberOfLines={1} ellipsizeMode="middle">
763
+ {selectedReduxSlice}
764
+ </Text>
589
765
  </View>
590
- <Text style={[styles.headerDetailTitle, { fontSize: isNarrow ? 13.5 : 15 }]} numberOfLines={1} ellipsizeMode="middle">
591
- {selectedReduxSlice}
592
- </Text>
593
- </View>
594
- <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{
766
+ <View style={{
595
767
  flexDirection: 'row',
596
768
  alignItems: 'center',
597
769
  gap: isNarrow ? 4 : 6,
598
770
  marginTop: 3,
599
771
  paddingVertical: 1,
600
772
  }}>
601
- <View style={[
773
+ <View style={[
602
774
  styles.headerStatusDot,
603
775
  {
604
776
  backgroundColor: AppColors.liveGreen,
@@ -606,37 +778,62 @@ const InspectorHeader = React.memo(() => {
606
778
  height: isNarrow ? 6 : 7,
607
779
  },
608
780
  ]}/>
609
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>Live</Text>
610
- <Text style={[styles.headerSubTitle, { opacity: 0.6, fontSize: isNarrow ? 10 : 11 }]}>
611
- •
612
- </Text>
613
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
614
- {keyCount} keys
615
- </Text>
616
- <Text style={[styles.headerSubTitle, { opacity: 0.6, fontSize: isNarrow ? 10 : 11 }]}>
617
- •
618
- </Text>
619
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>{sliceSize}</Text>
620
- {lastAction?.timestamp && (<>
621
- <Text style={[styles.headerSubTitle, { opacity: 0.6, fontSize: isNarrow ? 10 : 11 }]}>
622
- •
623
- </Text>
624
- <View style={{
781
+ <Text style={[
782
+ styles.headerSubTitle,
783
+ { fontSize: isNarrow ? 10 : 11 },
784
+ ]}>
785
+ Live
786
+ </Text>
787
+ <Text style={[
788
+ styles.headerSubTitle,
789
+ { opacity: 0.6, fontSize: isNarrow ? 10 : 11 },
790
+ ]}>
791
+ •
792
+ </Text>
793
+ <Text style={[
794
+ styles.headerSubTitle,
795
+ { fontSize: isNarrow ? 10 : 11 },
796
+ ]}>
797
+ {keyCount} keys
798
+ </Text>
799
+ <Text style={[
800
+ styles.headerSubTitle,
801
+ { opacity: 0.6, fontSize: isNarrow ? 10 : 11 },
802
+ ]}>
803
+ •
804
+ </Text>
805
+ <Text style={[
806
+ styles.headerSubTitle,
807
+ { fontSize: isNarrow ? 10 : 11 },
808
+ ]}>
809
+ {sliceSize}
810
+ </Text>
811
+ {lastAction?.timestamp && (<>
812
+ <Text style={[
813
+ styles.headerSubTitle,
814
+ { opacity: 0.6, fontSize: isNarrow ? 10 : 11 },
815
+ ]}>
816
+ •
817
+ </Text>
818
+ <View style={{
625
819
  flexDirection: 'row',
626
820
  alignItems: 'center',
627
821
  gap: 3,
628
822
  }}>
629
- <ClockIcon color={AppColors.white} size={isNarrow ? 9 : 10}/>
630
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
631
- {lastAction.timestamp}
632
- </Text>
633
- </View>
634
- </>)}
635
- </ScrollView>
636
- </View>);
823
+ <ClockIcon color={AppColors.white} size={isNarrow ? 9 : 10}/>
824
+ <Text style={[
825
+ styles.headerSubTitle,
826
+ { fontSize: isNarrow ? 10 : 11 },
827
+ ]}>
828
+ {lastAction.timestamp}
829
+ </Text>
830
+ </View>
831
+ </>)}
832
+ </View>
833
+ </View>);
637
834
  })()) : activeTab === 'redux' && selectedReduxAction != null ? (<View style={styles.headerDetailCenter}>
638
- <View style={styles.headerDetailRow}>
639
- <View style={[
835
+ <View style={styles.headerDetailRow}>
836
+ <View style={[
640
837
  styles.headerMethodBadge,
641
838
  {
642
839
  backgroundColor: `${AppColors.brandPurple}4D`,
@@ -644,20 +841,28 @@ const InspectorHeader = React.memo(() => {
644
841
  paddingVertical: isNarrow ? 2 : 3,
645
842
  },
646
843
  ]}>
647
- <Text style={[styles.headerMethodText, { fontSize: isNarrow ? 9 : 10 }]}>ACTION</Text>
844
+ <Text style={[
845
+ styles.headerMethodText,
846
+ { fontSize: isNarrow ? 9 : 10 },
847
+ ]}>
848
+ ACTION
849
+ </Text>
850
+ </View>
851
+ <Text style={[
852
+ styles.headerDetailTitle,
853
+ { fontSize: isNarrow ? 13.5 : 15 },
854
+ ]} numberOfLines={1} ellipsizeMode="middle">
855
+ {selectedReduxAction.type}
856
+ </Text>
648
857
  </View>
649
- <Text style={[styles.headerDetailTitle, { fontSize: isNarrow ? 13.5 : 15 }]} numberOfLines={1} ellipsizeMode="middle">
650
- {selectedReduxAction.type}
651
- </Text>
652
- </View>
653
- <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{
858
+ <View style={{
654
859
  flexDirection: 'row',
655
860
  alignItems: 'center',
656
861
  gap: isNarrow ? 4 : 6,
657
862
  marginTop: 3,
658
863
  paddingVertical: 1,
659
864
  }}>
660
- <View style={[
865
+ <View style={[
661
866
  styles.headerStatusDot,
662
867
  {
663
868
  backgroundColor: AppColors.purple,
@@ -665,13 +870,16 @@ const InspectorHeader = React.memo(() => {
665
870
  height: isNarrow ? 6 : 7,
666
871
  },
667
872
  ]}/>
668
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
669
- {selectedReduxAction.timestamp || 'Dispatched'}
670
- </Text>
671
- </ScrollView>
672
- </View>) : activeTab === 'crash' && selectedCrash != null ? (<View style={styles.headerDetailCenter}>
673
- <View style={styles.headerDetailRow}>
674
- <View style={[
873
+ <Text style={[
874
+ styles.headerSubTitle,
875
+ { fontSize: isNarrow ? 10 : 11 },
876
+ ]}>
877
+ {selectedReduxAction.timestamp || 'Dispatched'}
878
+ </Text>
879
+ </View>
880
+ </View>) : activeTab === 'crash' && selectedCrash != null ? (<View style={styles.headerDetailCenter}>
881
+ <View style={styles.headerDetailRow}>
882
+ <View style={[
675
883
  styles.headerMethodBadge,
676
884
  {
677
885
  backgroundColor: selectedCrash.isFatal
@@ -681,24 +889,30 @@ const InspectorHeader = React.memo(() => {
681
889
  paddingVertical: isNarrow ? 2 : 3,
682
890
  },
683
891
  ]}>
684
- <Text style={[styles.headerMethodText, { fontSize: isNarrow ? 9 : 10 }]}>
685
- {selectedCrash.isFatal
892
+ <Text style={[
893
+ styles.headerMethodText,
894
+ { fontSize: isNarrow ? 9 : 10 },
895
+ ]}>
896
+ {selectedCrash.isFatal
686
897
  ? 'FATAL'
687
898
  : selectedCrash.type.toUpperCase()}
899
+ </Text>
900
+ </View>
901
+ <Text style={[
902
+ styles.headerDetailTitle,
903
+ { fontSize: isNarrow ? 13.5 : 15 },
904
+ ]} numberOfLines={1} ellipsizeMode="middle">
905
+ {selectedCrash.name || selectedCrash.message}
688
906
  </Text>
689
907
  </View>
690
- <Text style={[styles.headerDetailTitle, { fontSize: isNarrow ? 13.5 : 15 }]} numberOfLines={1} ellipsizeMode="middle">
691
- {selectedCrash.name || selectedCrash.message}
692
- </Text>
693
- </View>
694
- <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{
908
+ <View style={{
695
909
  flexDirection: 'row',
696
910
  alignItems: 'center',
697
911
  gap: isNarrow ? 4 : 6,
698
912
  marginTop: 3,
699
913
  paddingVertical: 1,
700
914
  }}>
701
- <View style={[
915
+ <View style={[
702
916
  styles.headerStatusDot,
703
917
  {
704
918
  backgroundColor: selectedCrash.isFatal
@@ -708,23 +922,32 @@ const InspectorHeader = React.memo(() => {
708
922
  height: isNarrow ? 6 : 7,
709
923
  },
710
924
  ]}/>
711
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
712
- {selectedCrash.timeStr ||
925
+ <Text style={[
926
+ styles.headerSubTitle,
927
+ { fontSize: isNarrow ? 10 : 11 },
928
+ ]}>
929
+ {selectedCrash.timeStr ||
713
930
  new Date(selectedCrash.timestamp).toLocaleTimeString()}
714
- </Text>
715
- {selectedCrash.deviceInfo?.platform && (<>
716
- <Text style={[styles.headerSubTitle, { opacity: 0.6, fontSize: isNarrow ? 10 : 11 }]}>
717
- •
718
- </Text>
719
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
720
- {selectedCrash.deviceInfo.platform.toUpperCase()}
721
- </Text>
722
- </>)}
723
- </ScrollView>
724
- </View>) : null}
725
- </View>)}
931
+ </Text>
932
+ {selectedCrash.deviceInfo?.platform && (<>
933
+ <Text style={[
934
+ styles.headerSubTitle,
935
+ { opacity: 0.6, fontSize: isNarrow ? 10 : 11 },
936
+ ]}>
937
+ •
938
+ </Text>
939
+ <Text style={[
940
+ styles.headerSubTitle,
941
+ { fontSize: isNarrow ? 10 : 11 },
942
+ ]}>
943
+ {selectedCrash.deviceInfo.platform.toUpperCase()}
944
+ </Text>
945
+ </>)}
946
+ </View>
947
+ </View>) : null}
948
+ </View>)}
726
949
 
727
- <View style={[
950
+ <View style={[
728
951
  styles.headerRight,
729
952
  {
730
953
  flexDirection: 'row',
@@ -734,7 +957,7 @@ const InspectorHeader = React.memo(() => {
734
957
  gap: isNarrow ? 5 : 7,
735
958
  },
736
959
  ]}>
737
- {isSettingsView && (<TouchableScale onPress={() => {
960
+ {isSettingsView && (<TouchableScale onPress={() => {
738
961
  Alert.alert('Reset All Settings', 'This restores all module visibility and UI preferences to defaults. Continue?', [
739
962
  { text: 'Cancel', style: 'cancel' },
740
963
  {
@@ -751,19 +974,10 @@ const InspectorHeader = React.memo(() => {
751
974
  borderRadius: isNarrow ? 6 : 7,
752
975
  },
753
976
  ]}>
754
- <ResetIcon color={AppColors.white} size={isNarrow ? 12 : 14}/>
755
- </TouchableScale>)}
977
+ <ResetIcon color={AppColors.white} size={isNarrow ? 12 : 14}/>
978
+ </TouchableScale>)}
756
979
 
757
- {!isAnySelected && (<TouchableScale onPress={() => {
758
- Alert.alert('Clear Everything', 'This clears all tabs — APIs, Logs, Analytics, Redux timeline and Crash history. Continue?', [
759
- { text: 'Cancel', style: 'cancel' },
760
- {
761
- text: 'Clear All',
762
- onPress: runClearAllWithAnimation,
763
- style: 'destructive',
764
- },
765
- ]);
766
- }} hitSlop={15} style={[
980
+ {!isAnySelected && (<TouchableScale accessible={true} accessibilityRole="button" accessibilityLabel="Settings" onPress={() => setSettingsPage('main')} hitSlop={15} style={[
767
981
  styles.closeButtonSquare,
768
982
  {
769
983
  width: buttonSize,
@@ -771,7 +985,112 @@ const InspectorHeader = React.memo(() => {
771
985
  borderRadius: isNarrow ? 6 : 7,
772
986
  },
773
987
  ]}>
774
- <Animated.View style={{
988
+ <SettingsIcon color={AppColors.white} size={isNarrow ? 12 : 14}/>
989
+ </TouchableScale>)}
990
+
991
+ <TouchableOpacity onPress={closeModal} hitSlop={{ top: 12, bottom: 12, left: 12, right: 12 }} activeOpacity={0.6} style={[
992
+ styles.closeButtonSquare,
993
+ {
994
+ width: buttonSize,
995
+ height: buttonSize,
996
+ borderRadius: isNarrow ? 6 : 7,
997
+ },
998
+ ]}>
999
+ <CloseWhite size={isNarrow ? 12 : 14}/>
1000
+ </TouchableOpacity>
1001
+ </View>
1002
+ </View>
1003
+
1004
+
1005
+ {!isAnySelected && (<View style={{
1006
+ flexDirection: 'row',
1007
+ alignItems: 'center',
1008
+ justifyContent: 'space-between',
1009
+ paddingHorizontal: isNarrow ? 8 : 12,
1010
+ paddingBottom: isNarrow ? 6 : 8,
1011
+ paddingTop: 0,
1012
+ gap: 6,
1013
+ }}>
1014
+ <View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
1015
+
1016
+ <TouchableScale onPress={handleTakeScreenshot} style={{
1017
+ flexDirection: 'row',
1018
+ alignItems: 'center',
1019
+ gap: 4.5,
1020
+ backgroundColor: `${AppColors.white}24`,
1021
+ paddingHorizontal: isNarrow ? 8 : 10,
1022
+ paddingVertical: isNarrow ? 4 : 5,
1023
+ borderRadius: 6,
1024
+ borderWidth: 1,
1025
+ borderColor: `${AppColors.white}33`,
1026
+ }}>
1027
+ <CameraIcon size={isNarrow ? 12 : 13} color={AppColors.white}/>
1028
+ <Text style={{
1029
+ fontFamily: AppFonts.interSemiBold,
1030
+ fontSize: isNarrow ? 10 : 11,
1031
+ color: AppColors.white,
1032
+ }}>
1033
+ {t('header.photo')}
1034
+ </Text>
1035
+ </TouchableScale>
1036
+
1037
+
1038
+ <TouchableScale onPress={handleToggleVideoRecording} style={{
1039
+ flexDirection: 'row',
1040
+ alignItems: 'center',
1041
+ gap: 4.5,
1042
+ backgroundColor: isRecording
1043
+ ? `${AppColors.red500}33`
1044
+ : `${AppColors.white}24`,
1045
+ paddingHorizontal: isNarrow ? 8 : 10,
1046
+ paddingVertical: isNarrow ? 4 : 5,
1047
+ borderRadius: 6,
1048
+ borderWidth: 1,
1049
+ borderColor: isRecording
1050
+ ? AppColors.red500
1051
+ : `${AppColors.white}33`,
1052
+ }}>
1053
+ {isRecording ? (<Animated.View style={{
1054
+ width: 6,
1055
+ height: 6,
1056
+ borderRadius: 3,
1057
+ backgroundColor: AppColors.red500,
1058
+ }}/>) : (<VideoCameraIcon size={isNarrow ? 12 : 13} color={AppColors.white}/>)}
1059
+ <Text style={{
1060
+ fontFamily: AppFonts.interSemiBold,
1061
+ fontSize: isNarrow ? 10 : 11,
1062
+ color: isRecording ? AppColors.red300 : AppColors.white,
1063
+ }}>
1064
+ {isRecording
1065
+ ? `${t('header.rec')} ${formatTimer(recordingSeconds)}`
1066
+ : t('header.record')}
1067
+ </Text>
1068
+ </TouchableScale>
1069
+ </View>
1070
+
1071
+ <View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
1072
+
1073
+ <TouchableScale onPress={() => {
1074
+ Alert.alert(t('header.clearEverythingTitle'), t('header.clearEverythingMessage'), [
1075
+ { text: t('common.cancel'), style: 'cancel' },
1076
+ {
1077
+ text: t('common.clearAll'),
1078
+ onPress: runClearAllWithAnimation,
1079
+ style: 'destructive',
1080
+ },
1081
+ ]);
1082
+ }} style={{
1083
+ flexDirection: 'row',
1084
+ alignItems: 'center',
1085
+ gap: 4,
1086
+ backgroundColor: `${AppColors.white}1A`,
1087
+ paddingHorizontal: isNarrow ? 7 : 9,
1088
+ paddingVertical: isNarrow ? 4 : 5,
1089
+ borderRadius: 6,
1090
+ borderWidth: 1,
1091
+ borderColor: `${AppColors.white}26`,
1092
+ }}>
1093
+ <Animated.View style={{
775
1094
  transform: [
776
1095
  {
777
1096
  rotate: clearAnim.interpolate({
@@ -787,52 +1106,71 @@ const InspectorHeader = React.memo(() => {
787
1106
  },
788
1107
  ],
789
1108
  }}>
790
- <TrashIcon color={AppColors.white} size={isNarrow ? 12 : 14}/>
791
- </Animated.View>
792
- </TouchableScale>)}
793
-
794
- {!isAnySelected && (<TouchableScale accessible={true} accessibilityRole="button" accessibilityLabel="Settings" onPress={() => setSettingsPage('main')} hitSlop={15} style={[
795
- styles.closeButtonSquare,
796
- {
797
- width: buttonSize,
798
- height: buttonSize,
799
- borderRadius: isNarrow ? 6 : 7,
800
- },
801
- ]}>
802
- <SettingsIcon color={AppColors.white} size={isNarrow ? 12 : 14}/>
803
- </TouchableScale>)}
1109
+ <TrashIcon color={AppColors.white} size={isNarrow ? 11 : 12}/>
1110
+ </Animated.View>
1111
+ <Text style={{
1112
+ fontFamily: AppFonts.interMedium,
1113
+ fontSize: isNarrow ? 10 : 11,
1114
+ color: `${AppColors.white}E6`,
1115
+ }}>
1116
+ {t('header.clear')}
1117
+ </Text>
1118
+ </TouchableScale>
804
1119
 
805
- {!isAnySelected && (<TouchableScale accessible={true} accessibilityRole="button" accessibilityLabel="About and System Specifications" onPress={() => {
1120
+
1121
+ <TouchableScale onPress={() => {
806
1122
  setSettingsActiveSubTab('about');
807
1123
  setSettingsPage('main');
808
- }} hitSlop={15} style={[
809
- styles.closeButtonSquare,
810
- {
811
- width: buttonSize,
812
- height: buttonSize,
813
- borderRadius: isNarrow ? 6 : 7,
814
- },
815
- ]}>
816
- <InfoCircleIcon color={AppColors.white} size={isNarrow ? 12 : 14}/>
817
- </TouchableScale>)}
818
-
819
- <TouchableOpacity onPress={closeModal} hitSlop={{ top: 12, bottom: 12, left: 12, right: 12 }} activeOpacity={0.6} style={[
820
- styles.closeButtonSquare,
821
- {
822
- width: buttonSize,
823
- height: buttonSize,
824
- borderRadius: isNarrow ? 6 : 7,
825
- },
826
- ]}>
827
- <CloseWhite size={isNarrow ? 12 : 14}/>
828
- </TouchableOpacity>
829
- </View>
1124
+ }} style={{
1125
+ flexDirection: 'row',
1126
+ alignItems: 'center',
1127
+ gap: 4,
1128
+ backgroundColor: `${AppColors.white}1A`,
1129
+ paddingHorizontal: isNarrow ? 7 : 9,
1130
+ paddingVertical: isNarrow ? 4 : 5,
1131
+ borderRadius: 6,
1132
+ borderWidth: 1,
1133
+ borderColor: `${AppColors.white}26`,
1134
+ }}>
1135
+ <InfoCircleIcon color={AppColors.white} size={isNarrow ? 11 : 12}/>
1136
+ <Text style={{
1137
+ fontFamily: AppFonts.interMedium,
1138
+ fontSize: isNarrow ? 10 : 11,
1139
+ color: `${AppColors.white}E6`,
1140
+ }}>
1141
+ {t('header.about')}
1142
+ </Text>
1143
+ </TouchableScale>
1144
+ </View>
1145
+ </View>)}
830
1146
  </View>
831
1147
  </View>
832
- </LinearGradient>
833
1148
 
834
-
835
- <UpdateAvailableModal visible={showUpdateModal} latestVersion={latestNpmVersion} onClose={() => setShowUpdateModal(false)}/>
1149
+
1150
+ <UpdateAvailableModal visible={showUpdateModal} latestVersion={latestNpmVersion} onClose={() => setShowUpdateModal(false)}/>
1151
+
1152
+
1153
+ <MediaPreviewModal item={previewMediaItem} visible={!!previewMediaItem} onClose={() => setPreviewMediaItem(null)} onDelete={async (item) => {
1154
+ await ScreenCapture.deleteMedia(item.uri);
1155
+ setPreviewMediaItem(null);
1156
+ }} onConvertToGif={async (item) => {
1157
+ const gif = await ScreenCapture.convertToGif(item.uri, {
1158
+ fps: 12,
1159
+ width: 480,
1160
+ });
1161
+ if (gif) {
1162
+ setPreviewMediaItem({
1163
+ id: `anim_${gif.timestamp}.gif`,
1164
+ type: 'gif',
1165
+ format: 'gif',
1166
+ uri: gif.uri,
1167
+ filename: gif.uri.split('/').pop() || `anim_${gif.timestamp}.gif`,
1168
+ sizeBytes: gif.sizeBytes,
1169
+ timestamp: gif.timestamp,
1170
+ durationMs: gif.durationMs,
1171
+ });
1172
+ }
1173
+ }}/>
836
1174
  </>);
837
1175
  });
838
1176
  export default InspectorHeader;