react-native-inapp-inspector 2.3.15 → 2.3.17

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 (381) hide show
  1. package/README.md +1 -0
  2. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +438 -7
  3. package/bin/cli.js +0 -0
  4. package/dist/commonjs/capture.d.ts +26 -0
  5. package/dist/commonjs/capture.js +32 -0
  6. package/dist/commonjs/components/AnalyticsEventCard.js +11 -11
  7. package/dist/commonjs/components/AnimatedEntrance.js +6 -70
  8. package/dist/commonjs/components/DomainHeader.js +3 -48
  9. package/dist/commonjs/components/EmptyState.js +2 -2
  10. package/dist/commonjs/components/HeadersSection.js +14 -34
  11. package/dist/commonjs/components/Inspector/AnalyticsTab.js +1 -24
  12. package/dist/commonjs/components/Inspector/ConsoleTab.js +1 -23
  13. package/dist/commonjs/components/Inspector/CrashTab.js +4 -25
  14. package/dist/commonjs/components/Inspector/DebuggingTab.js +2 -2
  15. package/dist/commonjs/components/Inspector/FeedbackModal.d.ts +7 -0
  16. package/dist/commonjs/components/Inspector/FeedbackModal.js +552 -0
  17. package/dist/commonjs/components/Inspector/InspectorHeader.js +675 -285
  18. package/dist/commonjs/components/Inspector/MainScreen.js +66 -69
  19. package/dist/commonjs/components/Inspector/MediaGalleryTab.d.ts +2 -0
  20. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +307 -0
  21. package/dist/commonjs/components/Inspector/MediaPreviewModal.d.ts +11 -0
  22. package/dist/commonjs/components/Inspector/MediaPreviewModal.js +393 -0
  23. package/dist/commonjs/components/Inspector/NetworkTab.js +196 -206
  24. package/dist/commonjs/components/Inspector/NpmStarPrompt.d.ts +3 -0
  25. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +494 -0
  26. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +4 -9
  27. package/dist/commonjs/components/Inspector/PerformanceTab.js +8 -1
  28. package/dist/commonjs/components/Inspector/ReduxTab.js +4 -24
  29. package/dist/commonjs/components/Inspector/SettingsPanel.js +1280 -173
  30. package/dist/commonjs/components/Inspector/SkeletonPlaceholder.js +2 -2
  31. package/dist/commonjs/components/Inspector/StorageTab.js +3 -26
  32. package/dist/commonjs/components/Inspector/TabBar.js +55 -25
  33. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +5 -10
  34. package/dist/commonjs/components/JsonViewer.js +43 -20
  35. package/dist/commonjs/components/LogCard.js +5 -5
  36. package/dist/commonjs/components/MetaAccordion.js +78 -80
  37. package/dist/commonjs/components/NetworkIcons.d.ts +13 -0
  38. package/dist/commonjs/components/NetworkIcons.js +83 -2
  39. package/dist/commonjs/components/SectionHeader.js +3 -48
  40. package/dist/commonjs/components/SkeletonPlaceholder.js +2 -2
  41. package/dist/commonjs/components/SourcePageCard.js +43 -45
  42. package/dist/commonjs/components/Toast.js +4 -4
  43. package/dist/commonjs/components/TouchableScale.js +9 -65
  44. package/dist/commonjs/components/TreeNode.js +2 -14
  45. package/dist/commonjs/constants/telemetryConfig.d.ts +3 -3
  46. package/dist/commonjs/constants/telemetryConfig.js +3 -3
  47. package/dist/commonjs/constants/version.d.ts +1 -1
  48. package/dist/commonjs/constants/version.js +1 -1
  49. package/dist/commonjs/customHooks/useAccordion.d.ts +3 -8
  50. package/dist/commonjs/customHooks/useAccordion.js +6 -36
  51. package/dist/commonjs/helpers/index.d.ts +3 -1
  52. package/dist/commonjs/helpers/index.js +11 -1
  53. package/dist/commonjs/helpers/remoteConfig.d.ts +4 -0
  54. package/dist/commonjs/helpers/remoteConfig.js +165 -0
  55. package/dist/commonjs/helpers/searchQueryParser.js +2 -0
  56. package/dist/commonjs/helpers/telemetry.d.ts +5 -0
  57. package/dist/commonjs/helpers/telemetry.js +339 -8
  58. package/dist/commonjs/i18n/locales/en.json +66 -2
  59. package/dist/commonjs/index.d.ts +2 -0
  60. package/dist/commonjs/index.js +70 -23
  61. package/dist/commonjs/native/NativeInspector.d.ts +60 -0
  62. package/dist/commonjs/native/NativeInspector.js +109 -2
  63. package/dist/commonjs/native/NativeNetworkInspector.d.ts +8 -0
  64. package/dist/commonjs/styles/AppColors.d.ts +36 -0
  65. package/dist/commonjs/styles/AppColors.js +36 -0
  66. package/dist/commonjs/styles/AppFonts.d.ts +2 -0
  67. package/dist/commonjs/styles/AppFonts.js +1 -0
  68. package/dist/commonjs/styles/index.d.ts +25 -1
  69. package/dist/commonjs/styles/index.js +22 -1
  70. package/dist/commonjs/types/enums.d.ts +2 -0
  71. package/dist/commonjs/types/enums.js +2 -0
  72. package/dist/commonjs/types/index.d.ts +2 -2
  73. package/dist/commonjs/types/interfaces.d.ts +12 -0
  74. package/dist/esm/capture.d.ts +26 -0
  75. package/dist/esm/capture.js +29 -0
  76. package/dist/esm/components/AnalyticsEventCard.js +11 -11
  77. package/dist/esm/components/AnimatedEntrance.js +4 -38
  78. package/dist/esm/components/DomainHeader.js +4 -16
  79. package/dist/esm/components/EmptyState.js +2 -2
  80. package/dist/esm/components/HeadersSection.js +16 -36
  81. package/dist/esm/components/Inspector/AnalyticsTab.js +3 -26
  82. package/dist/esm/components/Inspector/ConsoleTab.js +3 -25
  83. package/dist/esm/components/Inspector/CrashTab.js +6 -27
  84. package/dist/esm/components/Inspector/DebuggingTab.js +3 -3
  85. package/dist/esm/components/Inspector/FeedbackModal.d.ts +7 -0
  86. package/dist/esm/components/Inspector/FeedbackModal.js +515 -0
  87. package/dist/esm/components/Inspector/InspectorHeader.js +678 -288
  88. package/dist/esm/components/Inspector/MainScreen.js +67 -70
  89. package/dist/esm/components/Inspector/MediaGalleryTab.d.ts +2 -0
  90. package/dist/esm/components/Inspector/MediaGalleryTab.js +267 -0
  91. package/dist/esm/components/Inspector/MediaPreviewModal.d.ts +11 -0
  92. package/dist/esm/components/Inspector/MediaPreviewModal.js +353 -0
  93. package/dist/esm/components/Inspector/NetworkTab.js +199 -209
  94. package/dist/esm/components/Inspector/NpmStarPrompt.d.ts +3 -0
  95. package/dist/esm/components/Inspector/NpmStarPrompt.js +454 -0
  96. package/dist/esm/components/Inspector/NpmUpdateToast.js +5 -10
  97. package/dist/esm/components/Inspector/PerformanceTab.js +8 -1
  98. package/dist/esm/components/Inspector/ReduxTab.js +6 -26
  99. package/dist/esm/components/Inspector/SettingsPanel.js +1283 -176
  100. package/dist/esm/components/Inspector/SkeletonPlaceholder.js +2 -2
  101. package/dist/esm/components/Inspector/StorageTab.js +3 -26
  102. package/dist/esm/components/Inspector/TabBar.js +56 -26
  103. package/dist/esm/components/Inspector/UpdateAvailableModal.js +6 -11
  104. package/dist/esm/components/JsonViewer.js +43 -20
  105. package/dist/esm/components/LogCard.js +5 -5
  106. package/dist/esm/components/MetaAccordion.js +79 -81
  107. package/dist/esm/components/NetworkIcons.d.ts +13 -0
  108. package/dist/esm/components/NetworkIcons.js +68 -0
  109. package/dist/esm/components/SectionHeader.js +4 -16
  110. package/dist/esm/components/SkeletonPlaceholder.js +2 -2
  111. package/dist/esm/components/SourcePageCard.js +44 -46
  112. package/dist/esm/components/Toast.js +4 -4
  113. package/dist/esm/components/TouchableScale.js +7 -33
  114. package/dist/esm/components/TreeNode.js +4 -16
  115. package/dist/esm/constants/telemetryConfig.d.ts +3 -3
  116. package/dist/esm/constants/telemetryConfig.js +3 -3
  117. package/dist/esm/constants/version.d.ts +1 -1
  118. package/dist/esm/constants/version.js +1 -1
  119. package/dist/esm/customHooks/useAccordion.d.ts +3 -8
  120. package/dist/esm/customHooks/useAccordion.js +7 -37
  121. package/dist/esm/helpers/index.d.ts +3 -1
  122. package/dist/esm/helpers/index.js +9 -0
  123. package/dist/esm/helpers/remoteConfig.d.ts +4 -0
  124. package/dist/esm/helpers/remoteConfig.js +160 -0
  125. package/dist/esm/helpers/searchQueryParser.js +2 -0
  126. package/dist/esm/helpers/telemetry.d.ts +5 -0
  127. package/dist/esm/helpers/telemetry.js +332 -9
  128. package/dist/esm/i18n/locales/en.json +66 -2
  129. package/dist/esm/index.d.ts +2 -0
  130. package/dist/esm/index.js +66 -23
  131. package/dist/esm/native/NativeInspector.d.ts +60 -0
  132. package/dist/esm/native/NativeInspector.js +100 -1
  133. package/dist/esm/native/NativeNetworkInspector.d.ts +8 -0
  134. package/dist/esm/styles/AppColors.d.ts +36 -0
  135. package/dist/esm/styles/AppColors.js +36 -0
  136. package/dist/esm/styles/AppFonts.d.ts +2 -0
  137. package/dist/esm/styles/AppFonts.js +1 -0
  138. package/dist/esm/styles/index.d.ts +25 -1
  139. package/dist/esm/styles/index.js +22 -1
  140. package/dist/esm/types/enums.d.ts +2 -0
  141. package/dist/esm/types/enums.js +2 -0
  142. package/dist/esm/types/index.d.ts +2 -2
  143. package/dist/esm/types/interfaces.d.ts +12 -0
  144. package/ios/NetworkInspectorModule.h +1 -0
  145. package/ios/NetworkInspectorModule.mm +736 -7
  146. package/package.json +10 -2
  147. package/react-native-inapp-inspector.podspec +1 -0
  148. package/src/capture.ts +101 -0
  149. package/src/components/AnalyticsEventCard.tsx +15 -13
  150. package/src/components/AnimatedEntrance.tsx +3 -47
  151. package/src/components/DomainHeader.tsx +4 -17
  152. package/src/components/EmptyState.tsx +2 -2
  153. package/src/components/HeadersSection.tsx +31 -56
  154. package/src/components/Inspector/AnalyticsTab.tsx +2 -25
  155. package/src/components/Inspector/ConsoleTab.tsx +2 -24
  156. package/src/components/Inspector/CrashTab.tsx +4 -25
  157. package/src/components/Inspector/DebuggingTab.tsx +2 -2
  158. package/src/components/Inspector/FeedbackModal.tsx +626 -0
  159. package/src/components/Inspector/InspectorHeader.tsx +1230 -728
  160. package/src/components/Inspector/MainScreen.tsx +97 -82
  161. package/src/components/Inspector/MediaGalleryTab.tsx +355 -0
  162. package/src/components/Inspector/MediaPreviewModal.tsx +435 -0
  163. package/src/components/Inspector/NetworkTab.tsx +83 -93
  164. package/src/components/Inspector/NpmStarPrompt.tsx +532 -0
  165. package/src/components/Inspector/NpmUpdateToast.tsx +4 -9
  166. package/src/components/Inspector/PerformanceTab.tsx +8 -1
  167. package/src/components/Inspector/ReduxTab.tsx +5 -25
  168. package/src/components/Inspector/SettingsPanel.tsx +1493 -225
  169. package/src/components/Inspector/SkeletonPlaceholder.tsx +2 -2
  170. package/src/components/Inspector/StorageTab.tsx +3 -26
  171. package/src/components/Inspector/TabBar.tsx +63 -32
  172. package/src/components/Inspector/UpdateAvailableModal.tsx +6 -10
  173. package/src/components/JsonViewer.tsx +101 -60
  174. package/src/components/LogCard.tsx +10 -8
  175. package/src/components/MetaAccordion.tsx +6 -6
  176. package/src/components/NetworkIcons.tsx +242 -0
  177. package/src/components/SectionHeader.tsx +4 -16
  178. package/src/components/SkeletonPlaceholder.tsx +2 -2
  179. package/src/components/SourcePageCard.tsx +57 -55
  180. package/src/components/Toast.tsx +4 -4
  181. package/src/components/TouchableScale.tsx +8 -38
  182. package/src/components/TreeNode.tsx +5 -20
  183. package/src/constants/telemetryConfig.ts +3 -5
  184. package/src/constants/version.ts +1 -1
  185. package/src/customHooks/useAccordion.tsx +10 -43
  186. package/src/helpers/index.ts +11 -1
  187. package/src/helpers/remoteConfig.ts +212 -0
  188. package/src/helpers/searchQueryParser.ts +3 -0
  189. package/src/helpers/telemetry.ts +381 -10
  190. package/src/i18n/locales/en.json +69 -2
  191. package/src/index.tsx +93 -23
  192. package/src/native/NativeInspector.ts +186 -1
  193. package/src/native/NativeNetworkInspector.ts +9 -0
  194. package/src/styles/AppColors.ts +38 -0
  195. package/src/styles/AppFonts.ts +2 -0
  196. package/src/styles/index.ts +23 -2
  197. package/src/types/enums.ts +4 -0
  198. package/src/types/index.ts +2 -2
  199. package/src/types/interfaces.ts +12 -0
  200. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  201. package/android/.gradle/8.9/checksums/md5-checksums.bin +0 -0
  202. package/android/.gradle/8.9/checksums/sha1-checksums.bin +0 -0
  203. package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
  204. package/android/.gradle/8.9/executionHistory/executionHistory.lock +0 -0
  205. package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
  206. package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
  207. package/android/.gradle/8.9/gc.properties +0 -0
  208. package/android/.gradle/9.2.0/checksums/checksums.lock +0 -0
  209. package/android/.gradle/9.2.0/fileChanges/last-build.bin +0 -0
  210. package/android/.gradle/9.2.0/fileHashes/fileHashes.bin +0 -0
  211. package/android/.gradle/9.2.0/fileHashes/fileHashes.lock +0 -0
  212. package/android/.gradle/9.2.0/gc.properties +0 -0
  213. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  214. package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
  215. package/android/.gradle/vcs-1/gc.properties +0 -0
  216. package/android/build/.transforms/6683d6eeaa3e1dfa689c3385111a0386/results.bin +0 -1
  217. package/android/build/.transforms/6683d6eeaa3e1dfa689c3385111a0386/transformed/classes/classes_dex/classes.dex +0 -0
  218. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/results.bin +0 -1
  219. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/BuildConfig.dex +0 -0
  220. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/InAppInspectorFloatingView$iconView$1.dex +0 -0
  221. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/InAppInspectorFloatingView.dex +0 -0
  222. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NativeNetworkInspectorSpec.dex +0 -0
  223. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule$Companion.dex +0 -0
  224. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule$frameCallback$1.dex +0 -0
  225. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule$shakeListener$1.dex +0 -0
  226. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule.dex +0 -0
  227. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorPackage.dex +0 -0
  228. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
  229. package/android/build/generated/source/buildConfig/debug/com/inappinspector/BuildConfig.java +0 -10
  230. package/android/build/generated/source/codegen/java/com/inappinspector/NativeNetworkInspectorSpec.java +0 -104
  231. package/android/build/generated/source/codegen/jni/CMakeLists.txt +0 -28
  232. package/android/build/generated/source/codegen/jni/RNInAppInspectorSpec-generated.cpp +0 -128
  233. package/android/build/generated/source/codegen/jni/RNInAppInspectorSpec.h +0 -31
  234. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ComponentDescriptors.cpp +0 -22
  235. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ComponentDescriptors.h +0 -24
  236. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/EventEmitters.cpp +0 -16
  237. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/EventEmitters.h +0 -17
  238. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/Props.cpp +0 -19
  239. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/Props.h +0 -18
  240. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/RNInAppInspectorSpecJSI.h +0 -177
  241. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ShadowNodes.cpp +0 -17
  242. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ShadowNodes.h +0 -23
  243. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/States.cpp +0 -16
  244. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/States.h +0 -20
  245. package/android/build/generated/source/codegen/schema.json +0 -1
  246. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +0 -7
  247. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +0 -18
  248. package/android/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar +0 -0
  249. package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +0 -6
  250. package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +0 -1
  251. package/android/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt +0 -0
  252. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  253. package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  254. package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +0 -0
  255. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +0 -1
  256. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +0 -2
  257. package/android/build/intermediates/incremental/debug-mergeJavaRes/merge-state +0 -0
  258. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +0 -2
  259. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +0 -2
  260. package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +0 -2
  261. package/android/build/intermediates/java_res/debug/processDebugJavaRes/out/META-INF/react-native-inapp-inspector_debug.kotlin_module +0 -0
  262. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/inappinspector/BuildConfig.class +0 -0
  263. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/inappinspector/NativeNetworkInspectorSpec.class +0 -0
  264. package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +0 -2
  265. package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +0 -7
  266. package/android/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-react-native-inapp-inspector.jar +0 -0
  267. package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +0 -7
  268. package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +0 -1
  269. package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +0 -1
  270. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/META-INF/react-native-inapp-inspector_debug.kotlin_module +0 -0
  271. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/BuildConfig.class +0 -0
  272. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/InAppInspectorFloatingView$iconView$1.class +0 -0
  273. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/InAppInspectorFloatingView.class +0 -0
  274. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NativeNetworkInspectorSpec.class +0 -0
  275. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule$Companion.class +0 -0
  276. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule$frameCallback$1.class +0 -0
  277. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule$shakeListener$1.class +0 -0
  278. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule.class +0 -0
  279. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorPackage.class +0 -0
  280. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  281. package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +0 -1
  282. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
  283. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
  284. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
  285. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len +0 -0
  286. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
  287. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i +0 -0
  288. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len +0 -0
  289. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
  290. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
  291. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
  292. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
  293. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
  294. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
  295. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len +0 -0
  296. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
  297. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
  298. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
  299. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
  300. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
  301. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
  302. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len +0 -0
  303. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab +0 -0
  304. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream +0 -0
  305. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len +0 -0
  306. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len +0 -0
  307. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at +0 -0
  308. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i +0 -0
  309. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len +0 -0
  310. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
  311. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
  312. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
  313. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
  314. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
  315. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
  316. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len +0 -0
  317. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
  318. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
  319. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
  320. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
  321. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
  322. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
  323. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len +0 -0
  324. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
  325. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
  326. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
  327. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len +0 -0
  328. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
  329. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
  330. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len +0 -0
  331. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
  332. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream +0 -0
  333. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len +0 -0
  334. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len +0 -0
  335. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
  336. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i +0 -0
  337. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len +0 -0
  338. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
  339. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream +0 -0
  340. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len +0 -0
  341. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len +0 -0
  342. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
  343. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i +0 -0
  344. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len +0 -0
  345. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab +0 -2
  346. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
  347. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
  348. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
  349. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len +0 -0
  350. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
  351. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i +0 -0
  352. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len +0 -0
  353. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
  354. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
  355. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
  356. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +0 -0
  357. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
  358. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i +0 -0
  359. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len +0 -0
  360. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
  361. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
  362. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
  363. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
  364. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
  365. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
  366. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len +0 -0
  367. package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
  368. package/android/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
  369. package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
  370. package/android/build/outputs/aar/react-native-inapp-inspector-debug.aar +0 -0
  371. package/android/build/outputs/logs/manifest-merger-debug-report.txt +0 -17
  372. package/android/build/reports/problems/problems-report.html +0 -659
  373. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  374. package/android/build/tmp/kotlin-classes/debug/META-INF/react-native-inapp-inspector_debug.kotlin_module +0 -0
  375. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/InAppInspectorFloatingView$iconView$1.class +0 -0
  376. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/InAppInspectorFloatingView.class +0 -0
  377. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule$Companion.class +0 -0
  378. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule$frameCallback$1.class +0 -0
  379. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule$shakeListener$1.class +0 -0
  380. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule.class +0 -0
  381. 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,11 +10,16 @@ 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, } 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(() => {
17
- 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, resetToDefaults, closeModal, detailTitle, activeTab, environment, visible, selectedCrash, setSelectedCrash, } = useInspector();
21
+ const { t } = useTranslation();
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;
20
25
  const isCompact = windowWidth < 400;
@@ -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();
@@ -75,7 +187,7 @@ const InspectorHeader = React.memo(() => {
75
187
  (selectedReduxSlice != null || selectedReduxAction != null)) ||
76
188
  (activeTab === 'crash' && selectedCrash != null);
77
189
  const isSettingsView = settingsPage !== null;
78
- const isAnySelected = isDetailView || isSettingsView;
190
+ const isAnySelected = isDetailView || isSettingsView || isFeedbackOpen;
79
191
  const settingsModuleTitle = useMemo(() => {
80
192
  switch (settingsPage) {
81
193
  case 'apis':
@@ -100,46 +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 (isSettingsView) {
125
- if (settingsPage === 'main') {
126
- 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;
127
252
  }
128
- else {
129
- setSettingsPage('main');
253
+ if (isSettingsView) {
254
+ if (settingsPage === 'main') {
255
+ setSettingsPage(null);
256
+ }
257
+ else {
258
+ setSettingsPage('main');
259
+ }
260
+ return;
130
261
  }
131
- return;
132
- }
133
- requestAnimationFrame(() => {
134
262
  setSelected(null);
135
263
  setSelectedEvent(null);
136
264
  setSelectedLog(null);
137
265
  setSelectedReduxSlice(null);
138
266
  setSelectedReduxAction(null);
139
267
  setSelectedCrash(null);
140
- });
141
- }} hitSlop={15} style={[
142
- {
268
+ }} hitSlop={15} style={{
143
269
  width: isNarrow ? 32 : 36,
144
270
  height: isNarrow ? 32 : 36,
145
271
  borderRadius: isNarrow ? 16 : 18,
@@ -148,30 +274,70 @@ const InspectorHeader = React.memo(() => {
148
274
  backgroundColor: `${AppColors.white}2E`,
149
275
  borderWidth: 1,
150
276
  borderColor: `${AppColors.white}4D`,
151
- },
152
- !isAnySelected && { display: 'none' },
153
- ]}>
154
- <View style={{
155
- position: 'absolute',
156
- width: isNarrow ? 40 : 44,
157
- height: isNarrow ? 40 : 44,
158
- borderRadius: 22,
159
- backgroundColor: `${AppColors.white}1A`,
160
- }}/>
161
- <WhiteBackNavigation />
162
- </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>)}
163
287
 
164
- {isSettingsView ? (<View style={{ gap: 2, flex: 1, minWidth: 0 }}>
165
- <View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
166
- <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={{
167
295
  fontFamily: AppFonts.interBold,
168
296
  fontSize: isNarrow ? 14 : 16,
169
297
  color: AppColors.white,
170
298
  letterSpacing: -0.2,
171
299
  }} numberOfLines={1}>
172
- {settingsModuleTitle}
300
+ Support & Feedback
301
+ </Text>
302
+ <View style={{
303
+ backgroundColor: `${AppColors.white}26`,
304
+ paddingHorizontal: isNarrow ? 4 : 6,
305
+ paddingVertical: 1.5,
306
+ borderRadius: 10,
307
+ borderWidth: 1,
308
+ borderColor: `${AppColors.white}20`,
309
+ }}>
310
+ <Text style={{
311
+ fontFamily: AppFonts.interBold,
312
+ fontSize: isNarrow ? 8 : 9,
313
+ color: AppColors.white,
314
+ }}>
315
+ v{LIB_VERSION}
316
+ </Text>
317
+ </View>
318
+ </View>
319
+ <Text style={{
320
+ fontFamily: AppFonts.interRegular,
321
+ fontSize: isNarrow ? 9.5 : 10.5,
322
+ color: `${AppColors.white}CC`,
323
+ }} numberOfLines={1}>
324
+ Direct line to maintainers & developers
173
325
  </Text>
174
- {settingsPage === 'main' && (<View style={{
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={{
333
+ fontFamily: AppFonts.interBold,
334
+ fontSize: isNarrow ? 14 : 16,
335
+ color: AppColors.white,
336
+ letterSpacing: -0.2,
337
+ }} numberOfLines={1}>
338
+ {settingsModuleTitle}
339
+ </Text>
340
+ {settingsPage === 'main' && (<View style={{
175
341
  backgroundColor: `${AppColors.white}26`,
176
342
  paddingHorizontal: isNarrow ? 4 : 6,
177
343
  paddingVertical: 1.5,
@@ -179,25 +345,25 @@ const InspectorHeader = React.memo(() => {
179
345
  borderWidth: 1,
180
346
  borderColor: `${AppColors.white}20`,
181
347
  }}>
182
- <Text style={{
348
+ <Text style={{
183
349
  fontFamily: AppFonts.interBold,
184
350
  fontSize: isNarrow ? 8 : 9,
185
351
  color: AppColors.white,
186
352
  }}>
187
- v{LIB_VERSION}
188
- </Text>
189
- </View>)}
190
- </View>
191
- <Text style={{
353
+ v{LIB_VERSION}
354
+ </Text>
355
+ </View>)}
356
+ </View>
357
+ <Text style={{
192
358
  fontFamily: AppFonts.interRegular,
193
359
  fontSize: isNarrow ? 9.5 : 10.5,
194
360
  color: `${AppColors.white}CC`,
195
361
  }} numberOfLines={1}>
196
- {settingsPage === 'main'
362
+ {settingsPage === 'main'
197
363
  ? 'Manage modules and preferences'
198
364
  : 'Configure module parameters'}
199
- </Text>
200
- </View>) : !isAnySelected ? (<View style={{
365
+ </Text>
366
+ </View>) : !isAnySelected ? (<View style={{
201
367
  flexDirection: 'row',
202
368
  alignItems: 'center',
203
369
  gap: isNarrow ? 6 : 8,
@@ -205,15 +371,15 @@ const InspectorHeader = React.memo(() => {
205
371
  minWidth: 0,
206
372
  marginRight: 4,
207
373
  }}>
208
- <AppHeaderLogo size={logoSize} customIcon={appIcon}/>
209
- <View style={{ gap: 2, flex: 1, minWidth: 0 }}>
210
- <View style={{
374
+ <AppHeaderLogo size={logoSize} customIcon={appIcon}/>
375
+ <View style={{ gap: 2, flex: 1, minWidth: 0 }}>
376
+ <View style={{
211
377
  flexDirection: 'row',
212
378
  alignItems: 'center',
213
379
  gap: isNarrow ? 4 : 6,
214
380
  minWidth: 0,
215
381
  }}>
216
- <Text style={[
382
+ <Text style={[
217
383
  styles.headerTitle,
218
384
  {
219
385
  fontSize: isNarrow ? 13.5 : isCompact ? 14.5 : 15.5,
@@ -221,9 +387,9 @@ const InspectorHeader = React.memo(() => {
221
387
  paddingBottom: 0,
222
388
  },
223
389
  ]} numberOfLines={1} ellipsizeMode="tail">
224
- {getAppName()}
225
- </Text>
226
- <View style={[
390
+ {getAppName()}
391
+ </Text>
392
+ <View style={[
227
393
  styles.envBadge,
228
394
  {
229
395
  backgroundColor: envConfig.bg,
@@ -234,59 +400,59 @@ const InspectorHeader = React.memo(() => {
234
400
  marginBottom: 0,
235
401
  },
236
402
  ]}>
237
- <Text style={[
403
+ <Text style={[
238
404
  styles.envBadgeText,
239
405
  {
240
406
  color: envConfig.text,
241
407
  fontSize: isNarrow ? 8.5 : 9.5,
242
408
  },
243
409
  ]}>
244
- {envConfig.label}
245
- </Text>
246
- </View>
247
- {updateAvailable && (<Pressable hitSlop={10} onPress={() => setShowUpdateModal(true)} style={{
410
+ {envConfig.label}
411
+ </Text>
412
+ </View>
413
+ {updateAvailable && (<Pressable hitSlop={10} onPress={() => setShowUpdateModal(true)} style={{
248
414
  flexDirection: 'row',
249
415
  alignItems: 'center',
250
- backgroundColor: '#F59E0B',
416
+ backgroundColor: AppColors.warningAmber,
251
417
  borderRadius: 5,
252
418
  paddingHorizontal: isNarrow ? 4 : 5.5,
253
419
  paddingVertical: 1.5,
254
420
  gap: 3,
255
- shadowColor: '#F59E0B',
421
+ shadowColor: AppColors.warningAmber,
256
422
  shadowOffset: { width: 0, height: 1.5 },
257
423
  shadowOpacity: 0.35,
258
424
  shadowRadius: 3,
259
425
  elevation: 3,
260
426
  flexShrink: 0,
261
427
  }}>
262
- <Animated.View style={{
428
+ <Animated.View style={{
263
429
  width: 5,
264
430
  height: 5,
265
431
  borderRadius: 2.5,
266
- backgroundColor: '#FFFFFF',
432
+ backgroundColor: AppColors.white,
267
433
  opacity: activePulseAnim,
268
434
  transform: [{ scale: unreadPulseAnim }],
269
435
  }}/>
270
- {!isNarrow && (<Text style={{
436
+ {!isNarrow && (<Text style={{
271
437
  fontFamily: AppFonts.interBold,
272
438
  fontSize: 8.5,
273
- color: '#FFFFFF',
439
+ color: AppColors.white,
274
440
  letterSpacing: 0.3,
275
441
  }}>
276
- UPDATE
277
- </Text>)}
278
- <BoltIcon size={isNarrow ? 8 : 9} color="#FFFFFF"/>
279
- </Pressable>)}
280
- </View>
442
+ UPDATE
443
+ </Text>)}
444
+ <BoltIcon size={isNarrow ? 8 : 9} color={AppColors.white}/>
445
+ </Pressable>)}
446
+ </View>
281
447
 
282
-
283
- <View style={{
448
+
449
+ <View style={{
284
450
  flexDirection: 'row',
285
451
  alignItems: 'center',
286
452
  gap: isNarrow ? 4 : 5,
287
453
  minWidth: 0,
288
454
  }}>
289
- <View style={{
455
+ <View style={{
290
456
  flexDirection: 'row',
291
457
  alignItems: 'center',
292
458
  backgroundColor: `${AppColors.white}1F`,
@@ -299,18 +465,18 @@ const InspectorHeader = React.memo(() => {
299
465
  flexShrink: 1,
300
466
  minWidth: 0,
301
467
  }}>
302
- {Platform.OS === 'ios' ? (<AppleIcon color={`${AppColors.white}E6`} size={isNarrow ? 9 : 10}/>) : (<AndroidIcon color={`${AppColors.white}E6`} size={isNarrow ? 9 : 10}/>)}
303
- <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={{
304
470
  fontFamily: AppFonts.interMedium,
305
471
  fontSize: isNarrow ? 8.5 : 9.5,
306
472
  color: `${AppColors.white}EB`,
307
473
  letterSpacing: 0.1,
308
474
  }} numberOfLines={1} ellipsizeMode="tail">
309
- {appVersionString}
310
- </Text>
311
- </View>
475
+ {appVersionString}
476
+ </Text>
477
+ </View>
312
478
 
313
- <Pressable onPress={() => {
479
+ <Pressable onPress={() => {
314
480
  if (updateAvailable) {
315
481
  setShowUpdateModal(true);
316
482
  }
@@ -329,32 +495,35 @@ const InspectorHeader = React.memo(() => {
329
495
  borderColor: `${AppColors.white}2E`,
330
496
  flexShrink: 0,
331
497
  }}>
332
- <NpmIcon size={isNarrow ? 9 : 10} color="#FF6B6B"/>
333
- <Text style={{
498
+ <NpmIcon size={isNarrow ? 9 : 10} color={AppColors.npmRedLight}/>
499
+ <Text style={{
334
500
  fontFamily: AppFonts.interMedium,
335
501
  fontSize: isNarrow ? 8.5 : 9.5,
336
502
  color: `${AppColors.white}EB`,
337
503
  letterSpacing: 0.1,
338
504
  }} numberOfLines={1}>
339
- v{LIB_VERSION}
340
- </Text>
341
- {updateAvailable && (<Text style={{
505
+ v{LIB_VERSION}
506
+ </Text>
507
+ {updateAvailable && (<Text style={{
342
508
  fontFamily: AppFonts.interBold,
343
509
  fontSize: 8.5,
344
- color: '#F59E0B',
510
+ color: AppColors.warningAmber,
345
511
  }}>
346
- ●
347
- </Text>)}
348
- </Pressable>
512
+ ●
513
+ </Text>)}
514
+ </Pressable>
515
+ </View>
349
516
  </View>
350
- </View>
351
- </View>) : null}
352
- </View>
517
+ </View>) : null}
518
+ </View>
353
519
 
354
- {isDetailView && (<View style={[styles.headerCenter, { paddingHorizontal: isNarrow ? 2 : 6 }]}>
355
- {activeTab === 'apis' && selected != null ? (<View style={styles.headerDetailCenter}>
356
- <View style={styles.headerDetailRow}>
357
- <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={[
358
527
  styles.headerMethodBadge,
359
528
  {
360
529
  backgroundColor: METHOD_COLORS[selected.method] ??
@@ -363,22 +532,28 @@ const InspectorHeader = React.memo(() => {
363
532
  paddingVertical: isNarrow ? 2 : 3,
364
533
  },
365
534
  ]}>
366
- <Text style={[styles.headerMethodText, { fontSize: isNarrow ? 9 : 10 }]}>
367
- {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}
368
547
  </Text>
369
548
  </View>
370
- <Text style={[styles.headerDetailTitle, { fontSize: isNarrow ? 13.5 : 15 }]} numberOfLines={1} ellipsizeMode="middle">
371
- {detailTitle}
372
- </Text>
373
- </View>
374
- <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{
549
+ <View style={{
375
550
  flexDirection: 'row',
376
551
  alignItems: 'center',
377
552
  gap: isNarrow ? 4 : 6,
378
553
  marginTop: 3,
379
554
  paddingVertical: 1,
380
555
  }}>
381
- <View style={{
556
+ <View style={{
382
557
  flexDirection: 'row',
383
558
  alignItems: 'center',
384
559
  gap: 4,
@@ -389,7 +564,7 @@ const InspectorHeader = React.memo(() => {
389
564
  borderWidth: 1,
390
565
  borderColor: `${getStatusColor(selected.status)}55`,
391
566
  }}>
392
- <View style={[
567
+ <View style={[
393
568
  styles.headerStatusDot,
394
569
  {
395
570
  backgroundColor: getStatusColor(selected.status),
@@ -397,16 +572,19 @@ const InspectorHeader = React.memo(() => {
397
572
  height: isNarrow ? 6 : 7,
398
573
  },
399
574
  ]}/>
400
- <Text style={[
575
+ <Text style={[
401
576
  styles.headerSubTitle,
402
- { fontFamily: AppFonts.interBold, fontSize: isNarrow ? 10 : 11 },
577
+ {
578
+ fontFamily: AppFonts.interBold,
579
+ fontSize: isNarrow ? 10 : 11,
580
+ },
403
581
  ]}>
404
- {selected.status === 0
582
+ {selected.status === 0
405
583
  ? 'Failed'
406
584
  : selected.status ?? 'Pending'}
407
- </Text>
408
- </View>
409
- <View style={{
585
+ </Text>
586
+ </View>
587
+ <View style={{
410
588
  flexDirection: 'row',
411
589
  alignItems: 'center',
412
590
  gap: 4,
@@ -415,14 +593,17 @@ const InspectorHeader = React.memo(() => {
415
593
  borderRadius: 20,
416
594
  backgroundColor: `${AppColors.white}29`,
417
595
  }}>
418
- <ClockIcon color={AppColors.white} size={isNarrow ? 10 : 11}/>
419
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
420
- {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
421
602
  ? `${selected.duration}ms`
422
603
  : '—'}
423
- </Text>
424
- </View>
425
- {selected.response != null && (<View style={{
604
+ </Text>
605
+ </View>
606
+ {selected.response != null && (<View style={{
426
607
  flexDirection: 'row',
427
608
  alignItems: 'center',
428
609
  gap: 4,
@@ -431,15 +612,18 @@ const InspectorHeader = React.memo(() => {
431
612
  borderRadius: 20,
432
613
  backgroundColor: `${AppColors.white}29`,
433
614
  }}>
434
- <SizeIcon color={AppColors.white} size={isNarrow ? 10 : 11}/>
435
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
436
- {getSize(selected.response)}
437
- </Text>
438
- </View>)}
439
- </ScrollView>
440
- </View>) : activeTab === 'analytics' && selectedEvent != null ? (<View style={styles.headerDetailCenter}>
441
- <View style={styles.headerDetailRow}>
442
- <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={[
443
627
  styles.headerMethodBadge,
444
628
  {
445
629
  backgroundColor: selectedEvent.source === 'firebase'
@@ -449,22 +633,28 @@ const InspectorHeader = React.memo(() => {
449
633
  paddingVertical: isNarrow ? 2 : 3,
450
634
  },
451
635
  ]}>
452
- <Text style={[styles.headerMethodText, { fontSize: isNarrow ? 9 : 10 }]}>
453
- {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}
454
648
  </Text>
455
649
  </View>
456
- <Text style={[styles.headerDetailTitle, { fontSize: isNarrow ? 13.5 : 15 }]} numberOfLines={1} ellipsizeMode="middle">
457
- {selectedEvent.name}
458
- </Text>
459
- </View>
460
- <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{
650
+ <View style={{
461
651
  flexDirection: 'row',
462
652
  alignItems: 'center',
463
653
  gap: isNarrow ? 4 : 6,
464
654
  marginTop: 3,
465
655
  paddingVertical: 1,
466
656
  }}>
467
- <View style={[
657
+ <View style={[
468
658
  styles.headerStatusDot,
469
659
  {
470
660
  backgroundColor: selectedEvent.source === 'firebase'
@@ -474,18 +664,21 @@ const InspectorHeader = React.memo(() => {
474
664
  height: isNarrow ? 6 : 7,
475
665
  },
476
666
  ]}/>
477
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
478
- {Object.keys(selectedEvent.params).length} param
479
- {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
480
673
  ? 's'
481
674
  : ''}
482
- {' · '}
483
- {selectedEvent.source}
484
- </Text>
485
- </ScrollView>
486
- </View>) : activeTab === 'logs' && selectedLog != null ? (<View style={styles.headerDetailCenter}>
487
- <View style={styles.headerDetailRow}>
488
- <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={[
489
682
  styles.headerMethodBadge,
490
683
  {
491
684
  backgroundColor: selectedLog.type === 'error'
@@ -497,23 +690,29 @@ const InspectorHeader = React.memo(() => {
497
690
  paddingVertical: isNarrow ? 2 : 3,
498
691
  },
499
692
  ]}>
500
- <Text style={[styles.headerMethodText, { fontSize: isNarrow ? 9 : 10 }]}>
501
- {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'}
502
706
  </Text>
503
707
  </View>
504
- <Text style={[styles.headerDetailTitle, { fontSize: isNarrow ? 13.5 : 15 }]} numberOfLines={1} ellipsizeMode="middle">
505
- console.
506
- {selectedLog.sourceMethod || selectedLog.type || 'log'}
507
- </Text>
508
- </View>
509
- <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{
708
+ <View style={{
510
709
  flexDirection: 'row',
511
710
  alignItems: 'center',
512
711
  gap: isNarrow ? 4 : 6,
513
712
  marginTop: 3,
514
713
  paddingVertical: 1,
515
714
  }}>
516
- <View style={{
715
+ <View style={{
517
716
  flexDirection: 'row',
518
717
  alignItems: 'center',
519
718
  gap: 4,
@@ -522,13 +721,16 @@ const InspectorHeader = React.memo(() => {
522
721
  borderRadius: 20,
523
722
  backgroundColor: `${AppColors.white}29`,
524
723
  }}>
525
- <ClockIcon color={AppColors.white} size={isNarrow ? 10 : 11}/>
526
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
527
- {formatTime(selectedLog.timestamp)}
528
- </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>
529
732
  </View>
530
- </ScrollView>
531
- </View>) : activeTab === 'redux' && selectedReduxSlice != null ? ((() => {
733
+ </View>) : activeTab === 'redux' && selectedReduxSlice != null ? ((() => {
532
734
  const sliceData = reduxState?.[selectedReduxSlice];
533
735
  const keyCount = sliceData && typeof sliceData === 'object'
534
736
  ? Object.keys(sliceData).length
@@ -538,8 +740,8 @@ const InspectorHeader = React.memo(() => {
538
740
  const sliceSize = getSize(sliceData);
539
741
  const lastAction = reduxLastActionMap[selectedReduxSlice];
540
742
  return (<View style={styles.headerDetailCenter}>
541
- <View style={styles.headerDetailRow}>
542
- <View style={[
743
+ <View style={styles.headerDetailRow}>
744
+ <View style={[
543
745
  styles.headerMethodBadge,
544
746
  {
545
747
  backgroundColor: `${AppColors.purple}4D`,
@@ -547,20 +749,28 @@ const InspectorHeader = React.memo(() => {
547
749
  paddingVertical: isNarrow ? 2 : 3,
548
750
  },
549
751
  ]}>
550
- <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>
551
765
  </View>
552
- <Text style={[styles.headerDetailTitle, { fontSize: isNarrow ? 13.5 : 15 }]} numberOfLines={1} ellipsizeMode="middle">
553
- {selectedReduxSlice}
554
- </Text>
555
- </View>
556
- <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{
766
+ <View style={{
557
767
  flexDirection: 'row',
558
768
  alignItems: 'center',
559
769
  gap: isNarrow ? 4 : 6,
560
770
  marginTop: 3,
561
771
  paddingVertical: 1,
562
772
  }}>
563
- <View style={[
773
+ <View style={[
564
774
  styles.headerStatusDot,
565
775
  {
566
776
  backgroundColor: AppColors.liveGreen,
@@ -568,37 +778,62 @@ const InspectorHeader = React.memo(() => {
568
778
  height: isNarrow ? 6 : 7,
569
779
  },
570
780
  ]}/>
571
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>Live</Text>
572
- <Text style={[styles.headerSubTitle, { opacity: 0.6, fontSize: isNarrow ? 10 : 11 }]}>
573
- •
574
- </Text>
575
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
576
- {keyCount} keys
577
- </Text>
578
- <Text style={[styles.headerSubTitle, { opacity: 0.6, fontSize: isNarrow ? 10 : 11 }]}>
579
- •
580
- </Text>
581
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>{sliceSize}</Text>
582
- {lastAction?.timestamp && (<>
583
- <Text style={[styles.headerSubTitle, { opacity: 0.6, fontSize: isNarrow ? 10 : 11 }]}>
584
- •
585
- </Text>
586
- <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={{
587
819
  flexDirection: 'row',
588
820
  alignItems: 'center',
589
821
  gap: 3,
590
822
  }}>
591
- <ClockIcon color={AppColors.white} size={isNarrow ? 9 : 10}/>
592
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
593
- {lastAction.timestamp}
594
- </Text>
595
- </View>
596
- </>)}
597
- </ScrollView>
598
- </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>);
599
834
  })()) : activeTab === 'redux' && selectedReduxAction != null ? (<View style={styles.headerDetailCenter}>
600
- <View style={styles.headerDetailRow}>
601
- <View style={[
835
+ <View style={styles.headerDetailRow}>
836
+ <View style={[
602
837
  styles.headerMethodBadge,
603
838
  {
604
839
  backgroundColor: `${AppColors.brandPurple}4D`,
@@ -606,20 +841,28 @@ const InspectorHeader = React.memo(() => {
606
841
  paddingVertical: isNarrow ? 2 : 3,
607
842
  },
608
843
  ]}>
609
- <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>
610
857
  </View>
611
- <Text style={[styles.headerDetailTitle, { fontSize: isNarrow ? 13.5 : 15 }]} numberOfLines={1} ellipsizeMode="middle">
612
- {selectedReduxAction.type}
613
- </Text>
614
- </View>
615
- <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{
858
+ <View style={{
616
859
  flexDirection: 'row',
617
860
  alignItems: 'center',
618
861
  gap: isNarrow ? 4 : 6,
619
862
  marginTop: 3,
620
863
  paddingVertical: 1,
621
864
  }}>
622
- <View style={[
865
+ <View style={[
623
866
  styles.headerStatusDot,
624
867
  {
625
868
  backgroundColor: AppColors.purple,
@@ -627,13 +870,16 @@ const InspectorHeader = React.memo(() => {
627
870
  height: isNarrow ? 6 : 7,
628
871
  },
629
872
  ]}/>
630
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
631
- {selectedReduxAction.timestamp || 'Dispatched'}
632
- </Text>
633
- </ScrollView>
634
- </View>) : activeTab === 'crash' && selectedCrash != null ? (<View style={styles.headerDetailCenter}>
635
- <View style={styles.headerDetailRow}>
636
- <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={[
637
883
  styles.headerMethodBadge,
638
884
  {
639
885
  backgroundColor: selectedCrash.isFatal
@@ -643,24 +889,30 @@ const InspectorHeader = React.memo(() => {
643
889
  paddingVertical: isNarrow ? 2 : 3,
644
890
  },
645
891
  ]}>
646
- <Text style={[styles.headerMethodText, { fontSize: isNarrow ? 9 : 10 }]}>
647
- {selectedCrash.isFatal
892
+ <Text style={[
893
+ styles.headerMethodText,
894
+ { fontSize: isNarrow ? 9 : 10 },
895
+ ]}>
896
+ {selectedCrash.isFatal
648
897
  ? 'FATAL'
649
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}
650
906
  </Text>
651
907
  </View>
652
- <Text style={[styles.headerDetailTitle, { fontSize: isNarrow ? 13.5 : 15 }]} numberOfLines={1} ellipsizeMode="middle">
653
- {selectedCrash.name || selectedCrash.message}
654
- </Text>
655
- </View>
656
- <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{
908
+ <View style={{
657
909
  flexDirection: 'row',
658
910
  alignItems: 'center',
659
911
  gap: isNarrow ? 4 : 6,
660
912
  marginTop: 3,
661
913
  paddingVertical: 1,
662
914
  }}>
663
- <View style={[
915
+ <View style={[
664
916
  styles.headerStatusDot,
665
917
  {
666
918
  backgroundColor: selectedCrash.isFatal
@@ -670,23 +922,32 @@ const InspectorHeader = React.memo(() => {
670
922
  height: isNarrow ? 6 : 7,
671
923
  },
672
924
  ]}/>
673
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
674
- {selectedCrash.timeStr ||
925
+ <Text style={[
926
+ styles.headerSubTitle,
927
+ { fontSize: isNarrow ? 10 : 11 },
928
+ ]}>
929
+ {selectedCrash.timeStr ||
675
930
  new Date(selectedCrash.timestamp).toLocaleTimeString()}
676
- </Text>
677
- {selectedCrash.deviceInfo?.platform && (<>
678
- <Text style={[styles.headerSubTitle, { opacity: 0.6, fontSize: isNarrow ? 10 : 11 }]}>
679
- •
680
- </Text>
681
- <Text style={[styles.headerSubTitle, { fontSize: isNarrow ? 10 : 11 }]}>
682
- {selectedCrash.deviceInfo.platform.toUpperCase()}
683
- </Text>
684
- </>)}
685
- </ScrollView>
686
- </View>) : null}
687
- </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>)}
688
949
 
689
- <View style={[
950
+ <View style={[
690
951
  styles.headerRight,
691
952
  {
692
953
  flexDirection: 'row',
@@ -696,7 +957,7 @@ const InspectorHeader = React.memo(() => {
696
957
  gap: isNarrow ? 5 : 7,
697
958
  },
698
959
  ]}>
699
- {isSettingsView && (<TouchableScale onPress={() => {
960
+ {isSettingsView && (<TouchableScale onPress={() => {
700
961
  Alert.alert('Reset All Settings', 'This restores all module visibility and UI preferences to defaults. Continue?', [
701
962
  { text: 'Cancel', style: 'cancel' },
702
963
  {
@@ -713,19 +974,10 @@ const InspectorHeader = React.memo(() => {
713
974
  borderRadius: isNarrow ? 6 : 7,
714
975
  },
715
976
  ]}>
716
- <ResetIcon color={AppColors.white} size={isNarrow ? 12 : 14}/>
717
- </TouchableScale>)}
977
+ <ResetIcon color={AppColors.white} size={isNarrow ? 12 : 14}/>
978
+ </TouchableScale>)}
718
979
 
719
- {!isAnySelected && (<TouchableScale onPress={() => {
720
- Alert.alert('Clear Everything', 'This clears all tabs — APIs, Logs, Analytics, Redux timeline and Crash history. Continue?', [
721
- { text: 'Cancel', style: 'cancel' },
722
- {
723
- text: 'Clear All',
724
- onPress: runClearAllWithAnimation,
725
- style: 'destructive',
726
- },
727
- ]);
728
- }} hitSlop={15} style={[
980
+ {!isAnySelected && (<TouchableScale accessible={true} accessibilityRole="button" accessibilityLabel="Settings" onPress={() => setSettingsPage('main')} hitSlop={15} style={[
729
981
  styles.closeButtonSquare,
730
982
  {
731
983
  width: buttonSize,
@@ -733,7 +985,112 @@ const InspectorHeader = React.memo(() => {
733
985
  borderRadius: isNarrow ? 6 : 7,
734
986
  },
735
987
  ]}>
736
- <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={{
737
1094
  transform: [
738
1095
  {
739
1096
  rotate: clearAnim.interpolate({
@@ -749,38 +1106,71 @@ const InspectorHeader = React.memo(() => {
749
1106
  },
750
1107
  ],
751
1108
  }}>
752
- <TrashIcon color={AppColors.white} size={isNarrow ? 12 : 14}/>
753
- </Animated.View>
754
- </TouchableScale>)}
755
-
756
- {!isAnySelected && (<TouchableScale onPress={() => setSettingsPage('main')} hitSlop={15} style={[
757
- styles.closeButtonSquare,
758
- {
759
- width: buttonSize,
760
- height: buttonSize,
761
- borderRadius: isNarrow ? 6 : 7,
762
- },
763
- ]}>
764
- <SettingsIcon color={AppColors.white} size={isNarrow ? 12 : 14}/>
765
- </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>
766
1119
 
767
- <TouchableOpacity onPress={closeModal} hitSlop={{ top: 12, bottom: 12, left: 12, right: 12 }} activeOpacity={0.6} style={[
768
- styles.closeButtonSquare,
769
- {
770
- width: buttonSize,
771
- height: buttonSize,
772
- borderRadius: isNarrow ? 6 : 7,
773
- },
774
- ]}>
775
- <CloseWhite size={isNarrow ? 12 : 14}/>
776
- </TouchableOpacity>
777
- </View>
1120
+
1121
+ <TouchableScale onPress={() => {
1122
+ setSettingsActiveSubTab('about');
1123
+ setSettingsPage('main');
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>)}
778
1146
  </View>
779
1147
  </View>
780
- </LinearGradient>
781
1148
 
782
-
783
- <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
+ }}/>
784
1174
  </>);
785
1175
  });
786
1176
  export default InspectorHeader;