react-native-inapp-inspector 2.4.1 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/README.ar.md +163 -0
  2. package/README.de.md +163 -0
  3. package/README.es.md +164 -0
  4. package/README.fr.md +163 -0
  5. package/README.hi.md +163 -0
  6. package/README.ja.md +180 -0
  7. package/README.ko.md +163 -0
  8. package/README.md +340 -243
  9. package/README.pt-BR.md +163 -0
  10. package/README.ru.md +163 -0
  11. package/README.zh-CN.md +387 -0
  12. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +605 -23
  13. package/assets/banner_dark.svg +186 -0
  14. package/assets/banner_light.svg +186 -0
  15. package/assets/icon_circle.svg +148 -0
  16. package/assets/icon_square.svg +369 -0
  17. package/assets/inapp_inspector_icon.gif +0 -0
  18. package/assets/inapp_inspector_icon_original.gif +0 -0
  19. package/assets/social_preview.png +0 -0
  20. package/assets/walkthrough.gif +0 -0
  21. package/dist/commonjs/capture.d.ts +2 -0
  22. package/dist/commonjs/capture.js +1 -1
  23. package/dist/commonjs/components/AnalyticsDetail.js +23 -23
  24. package/dist/commonjs/components/AnalyticsEventCard.js +1 -1
  25. package/dist/commonjs/components/AnalyticsGraph.js +44 -44
  26. package/dist/commonjs/components/AnimatedBrandOwl.d.ts +7 -0
  27. package/dist/commonjs/components/AnimatedBrandOwl.js +175 -0
  28. package/dist/commonjs/components/AppHeaderLogo.d.ts +1 -0
  29. package/dist/commonjs/components/AppHeaderLogo.js +5 -3
  30. package/dist/commonjs/components/BrandCircleIcon.js +28 -28
  31. package/dist/commonjs/components/BrandSquareIcon.d.ts +5 -0
  32. package/dist/commonjs/components/BrandSquareIcon.js +139 -0
  33. package/dist/commonjs/components/ConsoleLogCard.d.ts +2 -1
  34. package/dist/commonjs/components/ConsoleLogCard.js +23 -39
  35. package/dist/commonjs/components/Inspector/AboutModal.js +44 -54
  36. package/dist/commonjs/components/Inspector/AnalyticsTab.js +6 -6
  37. package/dist/commonjs/components/Inspector/ConfirmationModal.d.ts +13 -0
  38. package/dist/commonjs/components/Inspector/ConfirmationModal.js +30 -0
  39. package/dist/commonjs/components/Inspector/ConsoleTab.js +12 -12
  40. package/dist/commonjs/components/Inspector/CrashTab.js +44 -9
  41. package/dist/commonjs/components/Inspector/DebuggingTab.js +17 -17
  42. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +1 -1
  43. package/dist/commonjs/components/Inspector/FabLauncher.js +30 -33
  44. package/dist/commonjs/components/Inspector/FeatureUnderDevNotice.js +2 -2
  45. package/dist/commonjs/components/Inspector/FloatingCaptureWidget.d.ts +3 -0
  46. package/dist/commonjs/components/Inspector/FloatingCaptureWidget.js +54 -0
  47. package/dist/commonjs/components/Inspector/GlobalCrashScreenModal.d.ts +11 -0
  48. package/dist/commonjs/components/Inspector/GlobalCrashScreenModal.js +234 -0
  49. package/dist/commonjs/components/Inspector/InspectorHeader.js +137 -127
  50. package/dist/commonjs/components/Inspector/LanguageSelectorModal.d.ts +15 -0
  51. package/dist/commonjs/components/Inspector/LanguageSelectorModal.js +172 -0
  52. package/dist/commonjs/components/Inspector/MainScreen.js +55 -35
  53. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +40 -35
  54. package/dist/commonjs/components/Inspector/MediaPreviewModal.d.ts +36 -0
  55. package/dist/commonjs/components/Inspector/MediaPreviewModal.js +341 -135
  56. package/dist/commonjs/components/Inspector/NetworkTab.js +50 -50
  57. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +1 -1
  58. package/dist/commonjs/components/Inspector/PushCard.d.ts +3 -2
  59. package/dist/commonjs/components/Inspector/PushCard.js +5 -4
  60. package/dist/commonjs/components/Inspector/PushDetail.js +41 -32
  61. package/dist/commonjs/components/Inspector/PushTab.js +12 -12
  62. package/dist/commonjs/components/Inspector/ReduxDetail.js +32 -32
  63. package/dist/commonjs/components/Inspector/ReduxTab.js +10 -8
  64. package/dist/commonjs/components/Inspector/SecondaryTelemetryStrip.d.ts +2 -0
  65. package/dist/commonjs/components/Inspector/SecondaryTelemetryStrip.js +43 -0
  66. package/dist/commonjs/components/Inspector/SettingsPanel.js +287 -139
  67. package/dist/commonjs/components/Inspector/SocketCard.d.ts +5 -0
  68. package/dist/commonjs/components/Inspector/SocketCard.js +116 -0
  69. package/dist/commonjs/components/Inspector/SocketDetail.d.ts +4 -0
  70. package/dist/commonjs/components/Inspector/SocketDetail.js +327 -0
  71. package/dist/commonjs/components/Inspector/SocketFilterModal.d.ts +13 -0
  72. package/dist/commonjs/components/Inspector/SocketFilterModal.js +69 -0
  73. package/dist/commonjs/components/Inspector/SocketTab.d.ts +3 -0
  74. package/dist/commonjs/components/Inspector/SocketTab.js +112 -0
  75. package/dist/commonjs/components/Inspector/StorageTab.js +39 -37
  76. package/dist/commonjs/components/Inspector/SupportModal.d.ts +7 -0
  77. package/dist/commonjs/components/Inspector/SupportModal.js +125 -0
  78. package/dist/commonjs/components/Inspector/SupportPage.d.ts +5 -0
  79. package/dist/commonjs/components/Inspector/SupportPage.js +227 -0
  80. package/dist/commonjs/components/Inspector/TabBar.js +24 -23
  81. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +24 -24
  82. package/dist/commonjs/components/JsonViewer.js +50 -48
  83. package/dist/commonjs/components/LogCard.d.ts +3 -2
  84. package/dist/commonjs/components/LogCard.js +27 -25
  85. package/dist/commonjs/components/LogSyntaxHighlighter.js +5 -5
  86. package/dist/commonjs/components/ModuleErrorBoundary.js +5 -5
  87. package/dist/commonjs/components/NetworkIcons.d.ts +42 -0
  88. package/dist/commonjs/components/NetworkIcons.js +139 -6
  89. package/dist/commonjs/components/SegmentedTabs.js +1 -1
  90. package/dist/commonjs/constants/version.d.ts +1 -1
  91. package/dist/commonjs/constants/version.js +1 -1
  92. package/dist/commonjs/crash.d.ts +1 -1
  93. package/dist/commonjs/crash.js +1 -1
  94. package/dist/commonjs/customHooks/crashHandler.d.ts +2 -1
  95. package/dist/commonjs/customHooks/crashHandler.js +7 -7
  96. package/dist/commonjs/customHooks/socketLogger.d.ts +26 -0
  97. package/dist/commonjs/customHooks/socketLogger.js +2 -0
  98. package/dist/commonjs/editor.d.ts +13 -0
  99. package/dist/commonjs/editor.js +1 -0
  100. package/dist/commonjs/helpers/index.d.ts +1 -0
  101. package/dist/commonjs/helpers/index.js +3 -3
  102. package/dist/commonjs/helpers/memoryManager.d.ts +1 -0
  103. package/dist/commonjs/helpers/memoryManager.js +1 -1
  104. package/dist/commonjs/helpers/searchQueryParser.d.ts +1 -1
  105. package/dist/commonjs/helpers/searchQueryParser.js +5 -1
  106. package/dist/commonjs/helpers/settingsStore.d.ts +1 -0
  107. package/dist/commonjs/helpers/settingsStore.js +1 -1
  108. package/dist/commonjs/helpers/shareFormatter.d.ts +3 -1
  109. package/dist/commonjs/helpers/shareFormatter.js +8 -7
  110. package/dist/commonjs/helpers/telemetry.js +1 -1
  111. package/dist/commonjs/i18n/index.d.ts +99 -1
  112. package/dist/commonjs/i18n/index.js +1 -1
  113. package/dist/commonjs/i18n/locales/ar.json +1 -1
  114. package/dist/commonjs/i18n/locales/bn.json +1 -0
  115. package/dist/commonjs/i18n/locales/de.json +1 -1
  116. package/dist/commonjs/i18n/locales/en.json +1 -1
  117. package/dist/commonjs/i18n/locales/es.json +1 -1
  118. package/dist/commonjs/i18n/locales/fr.json +1 -1
  119. package/dist/commonjs/i18n/locales/gu.json +1 -0
  120. package/dist/commonjs/i18n/locales/hi.json +1 -1
  121. package/dist/commonjs/i18n/locales/id.json +1 -0
  122. package/dist/commonjs/i18n/locales/it.json +1 -0
  123. package/dist/commonjs/i18n/locales/ja.json +1 -1
  124. package/dist/commonjs/i18n/locales/kn.json +1 -0
  125. package/dist/commonjs/i18n/locales/ko.json +1 -1
  126. package/dist/commonjs/i18n/locales/ml.json +1 -0
  127. package/dist/commonjs/i18n/locales/mr.json +1 -0
  128. package/dist/commonjs/i18n/locales/nl.json +1 -0
  129. package/dist/commonjs/i18n/locales/pa.json +1 -0
  130. package/dist/commonjs/i18n/locales/pl.json +1 -0
  131. package/dist/commonjs/i18n/locales/pt.json +1 -1
  132. package/dist/commonjs/i18n/locales/ru.json +1 -1
  133. package/dist/commonjs/i18n/locales/ta.json +1 -0
  134. package/dist/commonjs/i18n/locales/te.json +1 -0
  135. package/dist/commonjs/i18n/locales/tr.json +1 -0
  136. package/dist/commonjs/i18n/locales/vi.json +1 -0
  137. package/dist/commonjs/i18n/locales/zh.json +1 -1
  138. package/dist/commonjs/index.d.ts +16 -13
  139. package/dist/commonjs/index.js +5 -4
  140. package/dist/commonjs/native/NativeInspector.d.ts +4 -0
  141. package/dist/commonjs/native/NativeInspector.js +1 -1
  142. package/dist/commonjs/native/NativeNetworkInspector.d.ts +4 -0
  143. package/dist/commonjs/socket.d.ts +4 -0
  144. package/dist/commonjs/socket.js +1 -0
  145. package/dist/commonjs/styles/AppColors.d.ts +42 -2
  146. package/dist/commonjs/styles/AppColors.js +1 -1
  147. package/dist/commonjs/styles/common.js +1 -1
  148. package/dist/commonjs/styles/index.d.ts +30 -0
  149. package/dist/commonjs/styles/index.js +1 -1
  150. package/dist/commonjs/types/editor.d.ts +96 -0
  151. package/dist/commonjs/types/editor.js +1 -0
  152. package/dist/commonjs/types/enums.d.ts +40 -0
  153. package/dist/commonjs/types/enums.js +1 -1
  154. package/dist/commonjs/types/interfaces.d.ts +143 -1
  155. package/dist/esm/capture.d.ts +2 -0
  156. package/dist/esm/capture.js +1 -1
  157. package/dist/esm/components/AnalyticsDetail.js +31 -31
  158. package/dist/esm/components/AnalyticsEventCard.js +1 -1
  159. package/dist/esm/components/AnalyticsGraph.js +74 -74
  160. package/dist/esm/components/AnimatedBrandOwl.d.ts +7 -0
  161. package/dist/esm/components/AnimatedBrandOwl.js +175 -0
  162. package/dist/esm/components/AppHeaderLogo.d.ts +1 -0
  163. package/dist/esm/components/AppHeaderLogo.js +7 -5
  164. package/dist/esm/components/BrandCircleIcon.js +70 -70
  165. package/dist/esm/components/BrandSquareIcon.d.ts +5 -0
  166. package/dist/esm/components/BrandSquareIcon.js +139 -0
  167. package/dist/esm/components/ConsoleLogCard.d.ts +2 -1
  168. package/dist/esm/components/ConsoleLogCard.js +61 -77
  169. package/dist/esm/components/Inspector/AboutModal.js +85 -95
  170. package/dist/esm/components/Inspector/AnalyticsTab.js +24 -24
  171. package/dist/esm/components/Inspector/ConfirmationModal.d.ts +13 -0
  172. package/dist/esm/components/Inspector/ConfirmationModal.js +30 -0
  173. package/dist/esm/components/Inspector/ConsoleTab.js +48 -48
  174. package/dist/esm/components/Inspector/CrashTab.js +203 -168
  175. package/dist/esm/components/Inspector/DebuggingTab.js +29 -29
  176. package/dist/esm/components/Inspector/DeviceInfoTab.js +75 -75
  177. package/dist/esm/components/Inspector/FabLauncher.js +57 -60
  178. package/dist/esm/components/Inspector/FeatureUnderDevNotice.js +7 -7
  179. package/dist/esm/components/Inspector/FloatingCaptureWidget.d.ts +3 -0
  180. package/dist/esm/components/Inspector/FloatingCaptureWidget.js +54 -0
  181. package/dist/esm/components/Inspector/GlobalCrashScreenModal.d.ts +11 -0
  182. package/dist/esm/components/Inspector/GlobalCrashScreenModal.js +234 -0
  183. package/dist/esm/components/Inspector/InspectorHeader.js +162 -152
  184. package/dist/esm/components/Inspector/LanguageSelectorModal.d.ts +15 -0
  185. package/dist/esm/components/Inspector/LanguageSelectorModal.js +172 -0
  186. package/dist/esm/components/Inspector/MainScreen.js +130 -110
  187. package/dist/esm/components/Inspector/MediaGalleryTab.js +83 -78
  188. package/dist/esm/components/Inspector/MediaPreviewModal.d.ts +36 -0
  189. package/dist/esm/components/Inspector/MediaPreviewModal.js +345 -139
  190. package/dist/esm/components/Inspector/NetworkTab.js +130 -130
  191. package/dist/esm/components/Inspector/NpmUpdateToast.js +1 -1
  192. package/dist/esm/components/Inspector/PushCard.d.ts +3 -2
  193. package/dist/esm/components/Inspector/PushCard.js +23 -22
  194. package/dist/esm/components/Inspector/PushDetail.js +45 -36
  195. package/dist/esm/components/Inspector/PushTab.js +23 -23
  196. package/dist/esm/components/Inspector/ReduxDetail.js +42 -42
  197. package/dist/esm/components/Inspector/ReduxTab.js +20 -18
  198. package/dist/esm/components/Inspector/SecondaryTelemetryStrip.d.ts +2 -0
  199. package/dist/esm/components/Inspector/SecondaryTelemetryStrip.js +43 -0
  200. package/dist/esm/components/Inspector/SettingsPanel.js +526 -378
  201. package/dist/esm/components/Inspector/SocketCard.d.ts +5 -0
  202. package/dist/esm/components/Inspector/SocketCard.js +116 -0
  203. package/dist/esm/components/Inspector/SocketDetail.d.ts +4 -0
  204. package/dist/esm/components/Inspector/SocketDetail.js +327 -0
  205. package/dist/esm/components/Inspector/SocketFilterModal.d.ts +13 -0
  206. package/dist/esm/components/Inspector/SocketFilterModal.js +69 -0
  207. package/dist/esm/components/Inspector/SocketTab.d.ts +3 -0
  208. package/dist/esm/components/Inspector/SocketTab.js +112 -0
  209. package/dist/esm/components/Inspector/StorageTab.js +139 -137
  210. package/dist/esm/components/Inspector/SupportModal.d.ts +7 -0
  211. package/dist/esm/components/Inspector/SupportModal.js +125 -0
  212. package/dist/esm/components/Inspector/SupportPage.d.ts +5 -0
  213. package/dist/esm/components/Inspector/SupportPage.js +227 -0
  214. package/dist/esm/components/Inspector/TabBar.js +36 -35
  215. package/dist/esm/components/Inspector/UpdateAvailableModal.js +22 -22
  216. package/dist/esm/components/JsonViewer.js +66 -64
  217. package/dist/esm/components/LogCard.d.ts +3 -2
  218. package/dist/esm/components/LogCard.js +57 -55
  219. package/dist/esm/components/LogSyntaxHighlighter.js +5 -5
  220. package/dist/esm/components/ModuleErrorBoundary.js +23 -23
  221. package/dist/esm/components/NetworkIcons.d.ts +42 -0
  222. package/dist/esm/components/NetworkIcons.js +139 -6
  223. package/dist/esm/components/SegmentedTabs.js +7 -7
  224. package/dist/esm/constants/version.d.ts +1 -1
  225. package/dist/esm/constants/version.js +1 -1
  226. package/dist/esm/crash.d.ts +1 -1
  227. package/dist/esm/crash.js +1 -1
  228. package/dist/esm/customHooks/crashHandler.d.ts +2 -1
  229. package/dist/esm/customHooks/crashHandler.js +7 -7
  230. package/dist/esm/customHooks/socketLogger.d.ts +26 -0
  231. package/dist/esm/customHooks/socketLogger.js +2 -0
  232. package/dist/esm/editor.d.ts +13 -0
  233. package/dist/esm/editor.js +1 -0
  234. package/dist/esm/helpers/index.d.ts +1 -0
  235. package/dist/esm/helpers/index.js +4 -4
  236. package/dist/esm/helpers/memoryManager.d.ts +1 -0
  237. package/dist/esm/helpers/memoryManager.js +1 -1
  238. package/dist/esm/helpers/searchQueryParser.d.ts +1 -1
  239. package/dist/esm/helpers/searchQueryParser.js +5 -1
  240. package/dist/esm/helpers/settingsStore.d.ts +1 -0
  241. package/dist/esm/helpers/settingsStore.js +1 -1
  242. package/dist/esm/helpers/shareFormatter.d.ts +3 -1
  243. package/dist/esm/helpers/shareFormatter.js +8 -7
  244. package/dist/esm/helpers/telemetry.js +1 -1
  245. package/dist/esm/i18n/index.d.ts +99 -1
  246. package/dist/esm/i18n/index.js +1 -1
  247. package/dist/esm/i18n/locales/ar.json +1 -1
  248. package/dist/esm/i18n/locales/bn.json +1 -0
  249. package/dist/esm/i18n/locales/de.json +1 -1
  250. package/dist/esm/i18n/locales/en.json +1 -1
  251. package/dist/esm/i18n/locales/es.json +1 -1
  252. package/dist/esm/i18n/locales/fr.json +1 -1
  253. package/dist/esm/i18n/locales/gu.json +1 -0
  254. package/dist/esm/i18n/locales/hi.json +1 -1
  255. package/dist/esm/i18n/locales/id.json +1 -0
  256. package/dist/esm/i18n/locales/it.json +1 -0
  257. package/dist/esm/i18n/locales/ja.json +1 -1
  258. package/dist/esm/i18n/locales/kn.json +1 -0
  259. package/dist/esm/i18n/locales/ko.json +1 -1
  260. package/dist/esm/i18n/locales/ml.json +1 -0
  261. package/dist/esm/i18n/locales/mr.json +1 -0
  262. package/dist/esm/i18n/locales/nl.json +1 -0
  263. package/dist/esm/i18n/locales/pa.json +1 -0
  264. package/dist/esm/i18n/locales/pl.json +1 -0
  265. package/dist/esm/i18n/locales/pt.json +1 -1
  266. package/dist/esm/i18n/locales/ru.json +1 -1
  267. package/dist/esm/i18n/locales/ta.json +1 -0
  268. package/dist/esm/i18n/locales/te.json +1 -0
  269. package/dist/esm/i18n/locales/tr.json +1 -0
  270. package/dist/esm/i18n/locales/vi.json +1 -0
  271. package/dist/esm/i18n/locales/zh.json +1 -1
  272. package/dist/esm/index.d.ts +16 -13
  273. package/dist/esm/index.js +8 -7
  274. package/dist/esm/native/NativeInspector.d.ts +4 -0
  275. package/dist/esm/native/NativeInspector.js +1 -1
  276. package/dist/esm/native/NativeNetworkInspector.d.ts +4 -0
  277. package/dist/esm/socket.d.ts +4 -0
  278. package/dist/esm/socket.js +1 -0
  279. package/dist/esm/styles/AppColors.d.ts +42 -2
  280. package/dist/esm/styles/AppColors.js +1 -1
  281. package/dist/esm/styles/common.js +1 -1
  282. package/dist/esm/styles/index.d.ts +30 -0
  283. package/dist/esm/styles/index.js +1 -1
  284. package/dist/esm/types/editor.d.ts +96 -0
  285. package/dist/esm/types/editor.js +1 -0
  286. package/dist/esm/types/enums.d.ts +40 -0
  287. package/dist/esm/types/enums.js +1 -1
  288. package/dist/esm/types/interfaces.d.ts +143 -1
  289. package/editor.d.ts +1 -0
  290. package/editor.js +1 -0
  291. package/ios/NetworkInspectorModule.mm +531 -12
  292. package/package.json +213 -2
  293. package/react-native-inapp-inspector.podspec +1 -1
  294. package/src/native/NativeInspector.ts +65 -4
  295. package/src/native/NativeNetworkInspector.ts +4 -0
@@ -1,84 +1,81 @@
1
- import{useCallback as W,useEffect as H,useRef as M,useState as k}from"react";import{Animated as v,PanResponder as le,Platform as X,StyleSheet as ce,Text as A,TouchableOpacity as Se,useWindowDimensions as xe,View as S}from"react-native";import _ from"react-native-linear-gradient";import{useInspector as Re}from"./InspectorContext";import $ from"../TouchableScale";import Ce from"../AppHeaderLogo";import Te from"../BrandCircleIcon";import{AndroidIcon as Ie,AppleIcon as Ve,CameraIcon as Pe,CloseWhite as Be,MaximizeIcon as Me,NpmIcon as Ae,VideoCameraIcon as $e}from"../NetworkIcons";import{ScreenCapture as z}from"../../capture";import{triggerNativeHaptic as x}from"../../native/NativeInspector";import{showToast as C}from"../../helpers/toast";import{getAppName as Ee,getAppVersionAndBuild as Le}from"../../helpers";import{LIB_VERSION as Oe}from"../../constants";import{AppColors as i}from"../../styles/AppColors";import{AppFonts as G}from"../../styles/AppFonts";import D from"../../styles";import{useTranslation as We}from"../../i18n";import{MediaPreviewModal as De}from"./MediaPreviewModal";const Fe=()=>{const{setVisible:P,isMinimized:Y,setIsMinimized:E,appIcon:J,fabPan:K,fabPanResponder:Q,fabDraggedRef:U,pulseAnim:Z,fabShineAnim:N,refreshMediaCount:T}=Re(),{width:ee}=xe(),{t:o}=We(),[te]=k(()=>Le().formatted),[a,L]=k(!1),[re,F]=k(0),I=M(null),[j,B]=k(null),n=M(new v.ValueXY({x:0,y:0})).current,O=M({x:0,y:0});H(()=>{const e=n.x.addListener(V=>O.current.x=V.value),r=n.y.addListener(V=>O.current.y=V.value);return()=>{n.x.removeListener(e),n.y.removeListener(r)}},[n]);const R=M(!1),ie=M(le.create({onStartShouldSetPanResponder:()=>!1,onMoveShouldSetPanResponder:(e,r)=>Math.abs(r.dx)>4||Math.abs(r.dy)>4,onPanResponderGrant:()=>{R.current=!0,n.setOffset({x:O.current.x,y:O.current.y}),n.setValue({x:0,y:0})},onPanResponderMove:v.event([null,{dx:n.x,dy:n.y}],{useNativeDriver:!1}),onPanResponderRelease:()=>{n.flattenOffset(),setTimeout(()=>{R.current=!1},50)},onPanResponderTerminate:()=>{n.flattenOffset(),R.current=!1}})).current;H(()=>{z.isRecording().then(e=>{L(!!e)}).catch(()=>{})},[]),H(()=>(a?(F(0),I.current=setInterval(()=>{F(e=>e+1)},1e3)):(I.current&&(clearInterval(I.current),I.current=null),F(0)),()=>{I.current&&clearInterval(I.current)}),[a]);const oe=W(async()=>{if(!R.current)try{x("light");const e=await z.takeScreenshot({format:"png",quality:.9,hideInspector:!0});if(e){x("success");const r={id:`screenshot_${e.timestamp}.png`,type:"image",format:e.format,uri:e.uri,filename:e.uri.split("/").pop()||`screenshot_${e.timestamp}.png`,sizeBytes:e.sizeBytes,timestamp:e.timestamp,width:e.width,height:e.height};B(r),T?.().catch(()=>{}),C(o("header.screenshotCaptured","Screenshot captured"))}else C(o("header.screenshotFailed","Failed to capture screenshot"))}catch{C(o("header.screenshotError","Error capturing screenshot"))}},[T,o]),ne=W(async()=>{if(!R.current)try{if(a){x("medium");const e=await z.stopRecording();if(L(!1),e){x("success");const r={id:`video_${e.timestamp}.${e.format}`,type:e.format==="gif"?"gif":"video",format:e.format,uri:e.uri,filename:e.uri.split("/").pop()||`video_${e.timestamp}.${e.format}`,sizeBytes:e.sizeBytes,timestamp:e.timestamp,durationMs:e.durationMs,width:e.width,height:e.height,hasAudio:e.hasAudio};B(r),T?.().catch(()=>{}),C(o("header.recordingSaved",{duration:(e.durationMs/1e3).toFixed(1),defaultValue:`Recording saved (${(e.durationMs/1e3).toFixed(1)}s)`}))}}else x("medium"),await z.startRecording({fps:24,audioSource:"none"})?(L(!0),C(o("header.recordingStarted","Recording started"))):C(o("header.recordingStartFailed","Failed to start recording"))}catch{C(o("header.recordingError","Error during screen recording")),L(!1)}},[a,T,o]),q=W(()=>{R.current||(x("light"),E?.(!1),P(!0))},[E,P]),ae=W(()=>{R.current||(x("light"),E?.(!1),P(!1))},[E,P]),se=e=>{const r=Math.floor(e/60),V=e%60;return`${r}:${V<10?"0":""}${V}`};return<>
1
+ import{useCallback as E,useEffect as G,useRef as d,useState as I}from"react";import{Animated as s,PanResponder as ae,Platform as b,StyleSheet as $e,Text as V,TouchableOpacity as We,useWindowDimensions as ke,View as S}from"react-native";import Ne from"react-native-linear-gradient";import{useInspector as _e}from"./InspectorContext";import F from"../TouchableScale";import Se from"../AppHeaderLogo";import{AndroidIcon as He,AppleIcon as Ye,ScreenshotCaptureIcon as Ge,ScreenRecordIcon as Xe,CloseWhite as Re,MaximizeIcon as Ze,NpmIcon as Ue}from"../NetworkIcons";import{ScreenCapture as P}from"../../capture";import{triggerNativeHaptic as u}from"../../native/NativeInspector";import{showToast as f}from"../../helpers/toast";import{getAppName as Je,getAppVersionAndBuild as Ke}from"../../helpers";import{LIB_VERSION as Qe}from"../../constants";import{AppColors as r}from"../../styles/AppColors";import{AppFonts as $}from"../../styles/AppFonts";import Ce from"../../styles";import{useTranslation as et}from"../../i18n";import{MediaPreviewModal as St}from"./MediaPreviewModal";const vt=()=>{const{setVisible:D,isMinimized:Te,setIsMinimized:W,dismissInspector:Ie,appIcon:K,fabPan:a,fabPanResponder:xt,fabDraggedRef:k,pulseAnim:Ve,fabShineAnim:Rt,refreshMediaCount:v,captureFps:Q,captureScale:ee,captureBitrate:X,captureMaxDurationSeconds:te,captureAudioMode:re}=_e(),{width:M,height:x}=ke(),{t:o}=et(),[Pe]=I(()=>Ke().formatted),[m,N]=I(!1),[De,Z]=I(0),R=d(null),[ie,O]=I(null),[Me,j]=I(!1),[q,z]=I(!1),p=d(!1),B=d(new s.Value(0)).current,_=d(new s.Value(1)).current,C=d({x:0,y:0});G(()=>{const e=a.x.addListener(n=>C.current.x=n.value),t=a.y.addListener(n=>C.current.y=n.value);return()=>{a.x.removeListener(e),a.y.removeListener(t)}},[a]);const l=68,H=8,Oe=E(()=>{const e=C.current.x,t=C.current.y,n=20,A=180,g=M-n-l/2+e,Y=x-A-l/2+t;let U=e,J=t,L=!1;g<H+l/2?(U=e+(H+l/2-g),L=!0):g>M-H-l/2&&(U=e-(g-(M-H-l/2)),L=!0);const ne=b.OS==="ios"?60:40,se=b.OS==="ios"?40:24;Y<ne+l/2?(J=t+(ne+l/2-Y),L=!0):Y>x-se-l/2&&(J=t-(Y-(x-se-l/2)),L=!0),L&&s.spring(a,{toValue:{x:U,y:J},useNativeDriver:!1,tension:80,friction:8}).start()},[a,M,x]),ze=d(ae.create({onStartShouldSetPanResponder:()=>!1,onMoveShouldSetPanResponder:(e,t)=>Math.abs(t.dx)>4||Math.abs(t.dy)>4,onPanResponderGrant:()=>{k.current=!0,a.setOffset({x:C.current.x,y:C.current.y}),a.setValue({x:0,y:0}),p.current=!1,z(!1),j(!0),_.setValue(1),s.spring(B,{toValue:1,useNativeDriver:!0,tension:80,friction:8}).start()},onPanResponderMove:(e,t)=>{a.setValue({x:t.dx,y:t.dy});const n=t.moveY,A=t.moveX,g=n>x-140&&Math.abs(A-M/2)<85;g&&!p.current?(p.current=!0,z(!0),u("medium"),s.spring(_,{toValue:1.25,useNativeDriver:!0,tension:100,friction:6}).start()):!g&&p.current&&(p.current=!1,z(!1),s.spring(_,{toValue:1,useNativeDriver:!0,tension:100,friction:6}).start())},onPanResponderRelease:()=>{const e=p.current;a.flattenOffset(),s.timing(B,{toValue:0,duration:180,useNativeDriver:!0}).start(()=>{j(!1),z(!1),p.current=!1}),e?(u("heavy"),Ie(),f(o("common.inspectorDismissed","In-App Inspector closed for this session"))):Oe(),setTimeout(()=>{k.current=!1},100)},onPanResponderTerminate:()=>{a.flattenOffset(),k.current=!1,s.timing(B,{toValue:0,duration:180,useNativeDriver:!0}).start(()=>{j(!1),z(!1),p.current=!1})}})).current,c=d(new s.ValueXY({x:0,y:0})).current,T=d({x:0,y:0});G(()=>{const e=c.x.addListener(n=>T.current.x=n.value),t=c.y.addListener(n=>T.current.y=n.value);return()=>{c.x.removeListener(e),c.y.removeListener(t)}},[c]);const h=d(!1),Be=d(ae.create({onStartShouldSetPanResponder:()=>!1,onMoveShouldSetPanResponder:(e,t)=>Math.abs(t.dx)>4||Math.abs(t.dy)>4,onPanResponderGrant:()=>{h.current=!0,c.setOffset({x:T.current.x,y:T.current.y}),c.setValue({x:0,y:0})},onPanResponderMove:s.event([null,{dx:c.x,dy:c.y}],{useNativeDriver:!1}),onPanResponderRelease:()=>{c.flattenOffset();const e=T.current.y,t=-(x-(b.OS==="ios"?34:18)-70),n=b.OS==="ios"?34:18;if(e<t||e>n){const A=Math.max(t,Math.min(n,e));s.spring(c,{toValue:{x:T.current.x,y:A},useNativeDriver:!1,tension:80,friction:8}).start()}setTimeout(()=>{h.current=!1},50)},onPanResponderTerminate:()=>{c.flattenOffset(),h.current=!1}})).current;G(()=>{P.isRecording().then(e=>{N(!!e)}).catch(()=>{})},[]),G(()=>(m?(Z(0),R.current=setInterval(()=>{Z(e=>e+1)},1e3)):(R.current&&(clearInterval(R.current),R.current=null),Z(0)),()=>{R.current&&clearInterval(R.current)}),[m]);const Ae=E(async()=>{if(!h.current)try{u("light");const e=await P.takeScreenshot({format:"png",quality:.9,hideInspector:!0});if(e){u("success");const t={id:`screenshot_${e.timestamp}.png`,type:"image",format:e.format,uri:e.uri,filename:e.uri.split("/").pop()||`screenshot_${e.timestamp}.png`,sizeBytes:e.sizeBytes,timestamp:e.timestamp,width:e.width,height:e.height};O(t),v?.().catch(()=>{}),f(o("header.screenshotCaptured","Screenshot captured"))}else f(o("header.screenshotFailed","Failed to capture screenshot"))}catch{f(o("header.screenshotError","Error capturing screenshot"))}},[v,o]),Le=E(async()=>{if(!h.current)try{if(m){u("medium");const e=await P.stopRecording();if(N(!1),e){u("success");const t={id:`video_${e.timestamp}.${e.format}`,type:e.format==="gif"?"gif":"video",format:e.format,uri:e.uri,filename:e.uri.split("/").pop()||`video_${e.timestamp}.${e.format}`,sizeBytes:e.sizeBytes,timestamp:e.timestamp,durationMs:e.durationMs,width:e.width,height:e.height,hasAudio:e.hasAudio,thumbnailUri:e.thumbnailUri};O(t),v?.().catch(()=>{}),f(o("header.recordingSaved",{duration:(e.durationMs/1e3).toFixed(1),defaultValue:`Recording saved (${(e.durationMs/1e3).toFixed(1)}s)`}))}}else u("medium"),await P.startRecording({fps:Q,scale:ee,audioSource:re,bitrate:X>0?X:void 0,maxDurationSeconds:te})?(N(!0),f(o("header.recordingStarted","Recording started"))):f(o("header.recordingStartFailed","Failed to start recording"))}catch{f(o("header.recordingError","Error during screen recording")),N(!1)}},[m,Q,ee,X,te,re,v,o]),oe=E(()=>{h.current||(u("light"),W?.(!1),D(!0))},[W,D]),Ee=E(()=>{h.current||(u("light"),W?.(!1),D(!1))},[W,D]),Fe=e=>{const t=Math.floor(e/60),n=e%60;return`${t}:${n<10?"0":""}${n}`};return<>
2
2
 
3
- {Y?<v.View style={[t.playerContainer,{transform:n.getTranslateTransform()}]}{...ie.panHandlers}>
3
+ {Te?<s.View style={[i.playerContainer,{transform:c.getTranslateTransform()}]}{...Be.panHandlers}>
4
4
 
5
- <_ colors={[i.indigo600,i.violet600]}start={{x:0,y:0}}end={{x:1,y:1}}style={t.gradientBg}pointerEvents="none"/>
5
+ <Ne colors={[r.indigo600,r.violet600]}start={{x:0,y:0}}end={{x:1,y:1}}style={i.gradientBg}pointerEvents="none"/>
6
6
 
7
7
 
8
- <S pointerEvents="none"style={t.playerShineClip}>
9
- <v.View style={[t.playerShineStreak,{transform:[{translateX:N.interpolate({inputRange:[0,1],outputRange:[-80,ee+80]})},{rotate:"28deg"}]}]}>
10
- <_ colors={["rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0.18)","rgba(255, 255, 255, 0.70)","rgba(255, 255, 255, 1)","rgba(255, 255, 255, 0.70)","rgba(255, 255, 255, 0.18)","rgba(255, 255, 255, 0)"]}locations={[0,.22,.44,.5,.56,.78,1]}start={{x:0,y:.5}}end={{x:1,y:.5}}style={{flex:1}}/>
11
- </v.View>
12
- </S>
13
-
14
-
15
- <Se activeOpacity={.75}onPress={q}style={t.brandSection}accessibilityRole="button"accessibilityLabel={o("mediaGallery.expand","Expand Inspector")}>
16
- <Ce size={36}customIcon={J}/>
17
- <S style={t.titleWrapper}>
18
- <A style={t.appTitle}numberOfLines={1}>
19
- {Ee()}
20
- </A>
21
- <S style={t.versionRow}>
8
+ <We activeOpacity={.75}onPress={oe}style={i.brandSection}accessibilityRole="button"accessibilityLabel={o("mediaGallery.expand","Expand Inspector")}>
9
+ <Se size={36}customIcon={K}shape="circle"/>
10
+ <S style={i.titleWrapper}>
11
+ <V style={i.appTitle}numberOfLines={1}>
12
+ {Je()}
13
+ </V>
14
+ <S style={i.versionRow}>
22
15
 
23
- <S style={t.versionChip}>
24
- {X.OS==="ios"?<Ve color={`${i.white}E6`}size={9}/>:<Ie color={`${i.white}E6`}size={9}/>}
25
- <A style={t.versionChipText}numberOfLines={1}>
26
- {te}
27
- </A>
16
+ <S style={i.versionChip}>
17
+ {b.OS==="ios"?<Ye color={`${r.white}E6`}size={9}/>:<He color={`${r.white}E6`}size={9}/>}
18
+ <V style={i.versionChipText}numberOfLines={1}>
19
+ {Pe}
20
+ </V>
28
21
  </S>
29
22
 
30
23
 
31
- <S style={t.versionChip}>
32
- <Ae size={9}color={i.npmRedLight}/>
33
- <A style={t.versionChipText}numberOfLines={1}>
34
- v{Oe}
35
- </A>
24
+ <S style={i.versionChip}>
25
+ <Ue size={9}color={r.npmRedLight}/>
26
+ <V style={i.versionChipText}numberOfLines={1}>
27
+ v{Qe}
28
+ </V>
36
29
  </S>
37
30
  </S>
38
31
  </S>
39
- </Se>
32
+ </We>
40
33
 
41
34
 
42
- <S style={t.actionsRow}>
35
+ <S style={i.actionsRow}>
43
36
 
44
- <$ onPress={oe}hitSlop={{top:6,bottom:6,left:4,right:4}}style={t.actionBtn}>
45
- <Pe size={12}color={i.white}/>
46
- <A style={t.actionText}>
37
+ <F onPress={Ae}hitSlop={{top:6,bottom:6,left:4,right:4}}style={i.actionBtn}>
38
+ <Ge size={12}color={r.white}/>
39
+ <V style={i.actionText}>
47
40
  {o("header.photo","Photo")}
48
- </A>
49
- </$>
41
+ </V>
42
+ </F>
50
43
 
51
44
 
52
- <$ onPress={ne}hitSlop={{top:6,bottom:6,left:4,right:4}}style={[t.actionBtn,a&&t.recordingBtnActive]}>
53
- {a?<S style={t.recordingDot}/>:<$e size={12}color={i.white}/>}
54
- <A style={[t.actionText,a&&{color:i.red300}]}>
55
- {a?`${o("header.rec","REC")} ${se(re)}`:o("header.record","Record")}
56
- </A>
57
- </$>
45
+ <F onPress={Le}hitSlop={{top:6,bottom:6,left:4,right:4}}style={[i.actionBtn,m&&i.recordingBtnActive]}>
46
+ {m?<S style={i.recordingDot}/>:<Xe size={12}color={r.white}/>}
47
+ <V style={[i.actionText,m&&{color:r.red300}]}>
48
+ {m?`${o("header.rec","REC")} ${Fe(De)}`:o("header.record","Record")}
49
+ </V>
50
+ </F>
58
51
 
59
52
 
60
- <$ onPress={q}hitSlop={{top:6,bottom:6,left:4,right:4}}accessibilityRole="button"accessibilityLabel={o("common.expand","Expand")}style={t.actionBtnSquare}>
61
- <Me size={12}color={i.white}/>
62
- </$>
53
+ <F onPress={oe}hitSlop={{top:6,bottom:6,left:4,right:4}}accessibilityRole="button"accessibilityLabel={o("common.expand","Expand")}style={i.actionBtnSquare}>
54
+ <Ze size={12}color={r.white}/>
55
+ </F>
63
56
 
64
57
 
65
- <$ onPress={ae}hitSlop={{top:6,bottom:6,left:4,right:6}}accessibilityRole="button"accessibilityLabel={o("common.close","Close")}style={t.actionBtnSquare}>
66
- <Be size={10}color={i.white}/>
67
- </$>
58
+ <F onPress={Ee}hitSlop={{top:6,bottom:6,left:4,right:6}}accessibilityRole="button"accessibilityLabel={o("common.close","Close")}style={i.actionBtnSquare}>
59
+ <Re size={10}color={r.white}/>
60
+ </F>
68
61
  </S>
69
- </v.View>:<v.View style={[D.fabWrapper,{transform:K.getTranslateTransform()}]}{...Q.panHandlers}>
70
- <$ style={{alignItems:"center",justifyContent:"center"}}onPress={()=>{U.current||(x("light"),P(!0))}}hitSlop={10}>
71
- <v.View style={[D.fabPulseRing,{transform:[{scale:Z}]}]}/>
72
- <Te size={62}/>
73
-
74
- <S pointerEvents="none"style={D.fabShineClip}>
75
- <v.View style={[D.fabShineStreak,{transform:[{translateX:N.interpolate({inputRange:[0,1],outputRange:[-48,96]})},{rotate:"25deg"}]}]}>
76
- <_ colors={["rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0.25)","rgba(255, 255, 255, 0.95)","rgba(255, 255, 255, 0.25)","rgba(255, 255, 255, 0)"]}locations={[0,.25,.5,.75,1]}start={{x:0,y:.5}}end={{x:1,y:.5}}style={{flex:1}}/>
77
- </v.View>
78
- </S>
79
- </$>
80
- </v.View>}
62
+ </s.View>:<s.View style={[Ce.fabWrapper,{transform:a.getTranslateTransform()}]}{...ze.panHandlers}>
63
+ <F style={{alignItems:"center",justifyContent:"center"}}onPress={()=>{k.current||(u("light"),D(!0))}}hitSlop={10}>
64
+ <s.View style={[Ce.fabPulseRing,{transform:[{scale:Ve}]}]}/>
65
+ <Se size={68}customIcon={K}shape="circle"/>
66
+ </F>
67
+ </s.View>}
68
+
69
+
70
+ {Me&&<s.View pointerEvents="none"style={[i.dismissTargetContainer,{opacity:B,transform:[{translateY:B.interpolate({inputRange:[0,1],outputRange:[30,0]})},{scale:_}]}]}>
71
+ <S style={[i.dismissTargetCircle,q&&i.dismissTargetCircleActive]}>
72
+ <Re size={18}color={r.white}/>
73
+ </S>
74
+ <V style={[i.dismissTargetLabel,q&&i.dismissTargetLabelActive]}>
75
+ {q?o("common.releaseToHide","Release to hide"):o("common.dragToHide","Drag here to hide")}
76
+ </V>
77
+ </s.View>}
81
78
 
82
79
 
83
- <De item={j}visible={!!j}onClose={()=>B(null)}onDelete={async e=>{await z.deleteMedia(e.uri),T?.().catch(()=>{}),B(null)}}onConvertToGif={async e=>{const r=await z.convertToGif(e.uri,{fps:12,width:480});r&&(T?.().catch(()=>{}),B({id:`anim_${r.timestamp}.gif`,type:"gif",format:"gif",uri:r.uri,filename:r.uri.split("/").pop()||`anim_${r.timestamp}.gif`,sizeBytes:r.sizeBytes,timestamp:r.timestamp,durationMs:r.durationMs}))}}/>
84
- </>},t=ce.create({playerContainer:{position:"absolute",bottom:X.OS==="ios"?34:18,left:12,right:12,minHeight:58,flexDirection:"row",alignItems:"center",justifyContent:"space-between",borderRadius:16,borderWidth:1,borderColor:"rgba(255, 255, 255, 0.28)",paddingHorizontal:12,paddingVertical:7,gap:8,zIndex:99999,elevation:25,shadowColor:i.indigo600,shadowOffset:{width:0,height:8},shadowOpacity:.45,shadowRadius:14,overflow:"hidden"},gradientBg:{position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:16},playerShineClip:{position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:16,overflow:"hidden"},playerShineStreak:{position:"absolute",top:-60,width:75,height:200},brandSection:{flexDirection:"row",alignItems:"center",gap:9,flex:1,minWidth:0,paddingVertical:2},titleWrapper:{flex:1,minWidth:0,justifyContent:"center",gap:2},appTitle:{fontFamily:G.interBold,fontSize:13.5,color:i.white,letterSpacing:-.2},versionRow:{flexDirection:"row",alignItems:"center",gap:4,minWidth:0},versionChip:{flexDirection:"row",alignItems:"center",backgroundColor:`${i.white}1F`,borderRadius:5,paddingHorizontal:5,paddingVertical:1.5,gap:3,borderWidth:1,borderColor:`${i.white}2E`,flexShrink:1,minWidth:0},versionChipText:{fontFamily:G.interMedium,fontSize:8.5,color:`${i.white}EB`,letterSpacing:.1},actionsRow:{flexDirection:"row",alignItems:"center",gap:4.5,flexShrink:0},actionBtn:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:"rgba(255, 255, 255, 0.22)",paddingHorizontal:8,paddingVertical:5.5,borderRadius:7,borderWidth:1,borderColor:"rgba(255, 255, 255, 0.32)"},actionBtnSquare:{alignItems:"center",justifyContent:"center",width:27,height:27,backgroundColor:"rgba(255, 255, 255, 0.22)",borderRadius:7,borderWidth:1,borderColor:"rgba(255, 255, 255, 0.32)"},recordingBtnActive:{backgroundColor:"rgba(239, 68, 68, 0.32)",borderColor:i.red500},recordingDot:{width:6,height:6,borderRadius:3,backgroundColor:i.red500},actionText:{fontFamily:G.interSemiBold,fontSize:10.5,color:i.white}});export default Fe;
80
+ <St item={ie}visible={!!ie}onClose={()=>O(null)}onDelete={async e=>{await P.deleteMedia(e.uri),v?.().catch(()=>{}),O(null)}}onConvertToGif={async e=>{const t=await P.convertToGif(e.uri,{fps:12,width:480});t&&(v?.().catch(()=>{}),O({id:`anim_${t.timestamp}.gif`,type:"gif",format:"gif",uri:t.uri,filename:t.uri.split("/").pop()||`anim_${t.timestamp}.gif`,sizeBytes:t.sizeBytes,timestamp:t.timestamp,durationMs:t.durationMs}))}}/>
81
+ </>},i=$e.create({dismissTargetContainer:{position:"absolute",bottom:b.OS==="ios"?42:26,left:0,right:0,alignItems:"center",justifyContent:"center",zIndex:999998},dismissTargetCircle:{width:54,height:54,borderRadius:27,backgroundColor:"rgba(23, 23, 37, 0.82)",borderWidth:1.5,borderColor:"rgba(255, 255, 255, 0.28)",alignItems:"center",justifyContent:"center",shadowColor:r.black,shadowOffset:{width:0,height:6},shadowOpacity:.4,shadowRadius:10,elevation:16},dismissTargetCircleActive:{backgroundColor:r.red600,borderColor:r.red300,shadowColor:r.red600,shadowOpacity:.65,shadowRadius:18,transform:[{scale:1.06}]},dismissTargetLabel:{marginTop:6,fontFamily:$.interSemiBold,fontSize:11,color:"rgba(255, 255, 255, 0.85)",textShadowColor:"rgba(0, 0, 0, 0.6)",textShadowOffset:{width:0,height:1},textShadowRadius:3},dismissTargetLabelActive:{color:r.red300,fontFamily:$.interBold},playerContainer:{position:"absolute",bottom:b.OS==="ios"?34:18,left:12,right:12,minHeight:58,flexDirection:"row",alignItems:"center",justifyContent:"space-between",borderRadius:16,borderWidth:1,borderColor:"rgba(255, 255, 255, 0.28)",paddingHorizontal:12,paddingVertical:7,gap:8,zIndex:99999,elevation:25,shadowColor:r.indigo600,shadowOffset:{width:0,height:8},shadowOpacity:.45,shadowRadius:14,overflow:"hidden"},gradientBg:{position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:16},playerShineClip:{position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:16,overflow:"hidden"},playerShineStreak:{position:"absolute",top:-60,width:75,height:200},brandSection:{flexDirection:"row",alignItems:"center",gap:9,flex:1,minWidth:0,paddingVertical:2,overflow:"hidden"},titleWrapper:{flex:1,minWidth:0,justifyContent:"center",gap:2},appTitle:{fontFamily:$.interBold,fontSize:13.5,color:r.white,letterSpacing:-.2},versionRow:{flexDirection:"row",alignItems:"center",gap:4,minWidth:0},versionChip:{flexDirection:"row",alignItems:"center",backgroundColor:`${r.white}1F`,borderRadius:5,paddingHorizontal:5,paddingVertical:1.5,gap:3,borderWidth:1,borderColor:`${r.white}2E`,flexShrink:1,minWidth:0},versionChipText:{fontFamily:$.interMedium,fontSize:8.5,color:`${r.white}EB`,letterSpacing:.1},actionsRow:{flexDirection:"row",alignItems:"center",gap:4.5,flexShrink:0},actionBtn:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:"rgba(255, 255, 255, 0.22)",paddingHorizontal:8,paddingVertical:5.5,borderRadius:7,borderWidth:1,borderColor:"rgba(255, 255, 255, 0.32)"},actionBtnSquare:{alignItems:"center",justifyContent:"center",width:27,height:27,backgroundColor:"rgba(255, 255, 255, 0.22)",borderRadius:7,borderWidth:1,borderColor:"rgba(255, 255, 255, 0.32)"},recordingBtnActive:{backgroundColor:"rgba(239, 68, 68, 0.32)",borderColor:r.red500},recordingDot:{width:6,height:6,borderRadius:3,backgroundColor:r.red500},actionText:{fontFamily:$.interSemiBold,fontSize:10.5,color:r.white}});export default vt;
@@ -1,13 +1,13 @@
1
- import{useState as R}from"react";import{StyleSheet as S,Text as I,View as T,Pressable as B}from"react-native";import{AppColors as t}from"../../styles/AppColors";import{AppFonts as C}from"../../styles/AppFonts";import{WarningTriangleIcon as W,ClearIcon as E}from"../NetworkIcons";export const FeatureUnderDevNotice=({featureName:w,compact:V=!1})=>{const[z,D]=R(!1);return z?null:<T style={[e.container,V&&e.containerCompact]}>
1
+ import{useState as z}from"react";import{StyleSheet as R,Text as I,View as T,Pressable as S}from"react-native";import{AppColors as t}from"../../styles/AppColors";import{AppFonts as C}from"../../styles/AppFonts";import{WarningTriangleIcon as B,ClearIcon as W}from"../NetworkIcons";import{t as A}from"../../i18n";export const FeatureUnderDevNotice=({featureName:w,compact:D=!1})=>{const[V,v]=z(!1);return V?null:<T style={[e.container,D&&e.containerCompact]}>
2
2
  <T style={e.contentRow}>
3
3
  <T style={e.badgeWrap}>
4
- <W color={t.warningIconGold}size={12}/>
5
- <I style={e.badgeText}>IN ACTIVE DEVELOPMENT</I>
4
+ <B color={t.warningIconGold}size={12}/>
5
+ <I style={e.badgeText}>{A("common.inActiveDevelopment","IN ACTIVE DEVELOPMENT")}</I>
6
6
  </T>
7
7
 
8
- <B onPress={()=>D(!0)}hitSlop={8}style={e.dismissBtn}accessible={!0}accessibilityRole="button"accessibilityLabel="Dismiss notice">
9
- <E color={t.grayTextWeak}size={11}/>
10
- </B>
8
+ <S onPress={()=>v(!0)}hitSlop={8}style={e.dismissBtn}accessible={!0}accessibilityRole="button"accessibilityLabel="Dismiss notice">
9
+ <W color={t.grayTextWeak}size={11}/>
10
+ </S>
11
11
  </T>
12
12
 
13
13
  <I style={e.messageText}>
@@ -15,4 +15,4 @@ import{useState as R}from"react";import{StyleSheet as S,Text as I,View as T,Pres
15
15
  development. Results and metrics may vary in accuracy. We are continuously
16
16
  improving this feature for upcoming releases.
17
17
  </I>
18
- </T>};const e=S.create({container:{marginHorizontal:12,marginTop:8,marginBottom:6,paddingHorizontal:12,paddingVertical:9,borderRadius:8,backgroundColor:`${t.warningIconGold}12`,borderWidth:1,borderColor:`${t.warningIconGold}30`},containerCompact:{marginTop:4,marginBottom:4,paddingVertical:7,paddingHorizontal:10},contentRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:4},badgeWrap:{flexDirection:"row",alignItems:"center",gap:4.5},badgeText:{fontFamily:C.interBold,fontSize:9.5,color:t.warningIconGold,letterSpacing:.4},dismissBtn:{padding:2},messageText:{fontFamily:C.interRegular,fontSize:10.5,color:t.grayText,lineHeight:15}});export default FeatureUnderDevNotice;
18
+ </T>};const e=R.create({container:{marginHorizontal:12,marginTop:8,marginBottom:6,paddingHorizontal:12,paddingVertical:9,borderRadius:8,backgroundColor:`${t.warningIconGold}12`,borderWidth:1,borderColor:`${t.warningIconGold}30`},containerCompact:{marginTop:4,marginBottom:4,paddingVertical:7,paddingHorizontal:10},contentRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:4},badgeWrap:{flexDirection:"row",alignItems:"center",gap:4.5},badgeText:{fontFamily:C.interBold,fontSize:9.5,color:t.warningIconGold,letterSpacing:.4},dismissBtn:{padding:2},messageText:{fontFamily:C.interRegular,fontSize:10.5,color:t.grayText,lineHeight:15}});export default FeatureUnderDevNotice;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare const FloatingCaptureWidget: React.FC;
3
+ export default FloatingCaptureWidget;
@@ -0,0 +1,54 @@
1
+ import{useCallback as Z,useEffect as G,useRef as x,useState as E}from"react";import{Animated as o,Dimensions as Be,PanResponder as De,Platform as _,StyleSheet as ee,Text as W,View as S}from"react-native";import Se from"react-native-linear-gradient";import{useInspector as ze}from"./InspectorContext";import N from"../TouchableScale";import{GripVerticalIcon as Ee,ScreenshotCaptureIcon as Fe,ScreenRecordIcon as $e}from"../NetworkIcons";import{ScreenCapture as V}from"../../capture";import{triggerNativeHaptic as B}from"../../native/NativeInspector";import{showToast as v}from"../../helpers/toast";import{AppColors as s}from"../../styles/AppColors";import{AppFonts as xe}from"../../styles/AppFonts";import{useTranslation as Ae}from"../../i18n";import{MediaPreviewModal as Le}from"./MediaPreviewModal";export const FloatingCaptureWidget=()=>{const{refreshMediaCount:R,captureFps:X,captureScale:Y,captureBitrate:F,captureMaxDurationSeconds:j,captureAudioMode:q,activeTab:ve,settingsPage:Re,peekMode:Oe}=ze(),{t:n}=Ae(),[M,D]=E(!1),[Ie,$]=E(!1),[Ce,A]=E(0),I=x(null),[H,T]=E(null),k=x(new o.Value(1)).current,z=x(new o.Value(0)).current,i=x(new o.ValueXY({x:0,y:0})).current,C=x({x:0,y:0});G(()=>{const e=i.x.addListener(a=>C.current.x=a.value),t=i.y.addListener(a=>C.current.y=a.value);return()=>{i.x.removeListener(e),i.y.removeListener(t)}},[i]);const P=x(!1),Ve=x(De.create({onStartShouldSetPanResponder:()=>!1,onStartShouldSetPanResponderCapture:()=>!1,onMoveShouldSetPanResponder:(e,t)=>Math.abs(t.dx)>2||Math.abs(t.dy)>2,onMoveShouldSetPanResponderCapture:(e,t)=>Math.abs(t.dx)>2||Math.abs(t.dy)>2,onPanResponderGrant:()=>{P.current=!0,i.setOffset({x:C.current.x,y:C.current.y}),i.setValue({x:0,y:0})},onPanResponderMove:(e,t)=>{i.setValue({x:t.dx,y:t.dy})},onPanResponderTerminationRequest:()=>!1,onShouldBlockNativeResponder:()=>!0,onPanResponderRelease:()=>{i.flattenOffset(),setTimeout(()=>{P.current=!1},150);const{width:e,height:t}=Be.get("window"),a=e/2-30,J=-a,K=20,Q=-(t-120),L=C.current.x,O=C.current.y;if(L<J||L>a||O<Q||O>K){const ke=Math.min(Math.max(L,J),a),Pe=Math.min(Math.max(O,Q),K);o.spring(i,{toValue:{x:ke,y:Pe},friction:7,tension:50,useNativeDriver:!1}).start()}},onPanResponderTerminate:()=>{i.flattenOffset(),P.current=!1}})).current;G(()=>{V.isRecording().then(e=>{D(e)}).catch(()=>{})},[]),G(()=>{let e=null;return M?(A(0),I.current=setInterval(()=>{A(t=>t+1)},1e3),e=o.loop(o.sequence([o.timing(k,{toValue:1.15,duration:500,useNativeDriver:!0}),o.timing(k,{toValue:1,duration:500,useNativeDriver:!0})])),e.start()):(I.current&&(clearInterval(I.current),I.current=null),A(0),k.setValue(1)),()=>{I.current&&clearInterval(I.current),e&&e.stop()}},[M,k]);const Me=Z(async()=>{if(!P.current)try{B("light"),$(!0),await new Promise(t=>setTimeout(t,60));const e=await V.takeScreenshot({format:"png",quality:.9,hideInspector:!1});if($(!1),o.sequence([o.timing(z,{toValue:.65,duration:70,useNativeDriver:!0}),o.timing(z,{toValue:0,duration:200,useNativeDriver:!0})]).start(),e){B("success");const t={id:`screenshot_${e.timestamp}.png`,type:"image",format:e.format,uri:e.uri,filename:e.uri.split("/").pop()||`screenshot_${e.timestamp}.png`,sizeBytes:e.sizeBytes,timestamp:e.timestamp,width:e.width,height:e.height};T(t),R?.().catch(()=>{}),v(n("header.screenshotCaptured","Screenshot captured"))}else v(n("header.screenshotFailed","Failed to capture screenshot"))}catch{$(!1),v(n("header.screenshotError","Error capturing screenshot"))}},[R,z,n]),U=Z(async()=>{if(!P.current)try{if(M){B("medium");const e=await V.stopRecording();if(D(!1),e){B("success");const t={id:`video_${e.timestamp}.${e.format}`,type:e.format==="gif"?"gif":"video",format:e.format,uri:e.uri,filename:e.uri.split("/").pop()||`video_${e.timestamp}.${e.format}`,sizeBytes:e.sizeBytes,timestamp:e.timestamp,durationMs:e.durationMs,width:e.width,height:e.height,hasAudio:e.hasAudio,thumbnailUri:e.thumbnailUri};T(t),R?.().catch(()=>{}),v(n("header.recordingSaved",{duration:(e.durationMs/1e3).toFixed(1),defaultValue:`Recording saved (${(e.durationMs/1e3).toFixed(1)}s)`}))}}else B("medium"),await V.startRecording({fps:X,scale:Y,audioSource:q,bitrate:F>0?F:void 0,maxDurationSeconds:j})?(D(!0),v(n("header.recordingStarted","Recording started"))):v(n("header.recordingStartFailed","Failed to start recording"))}catch{v(n("header.recordingError","Error during screen recording")),D(!1)}},[M,X,Y,F,j,q,R,n]),Te=e=>{const t=Math.floor(e/60),a=e%60;return`${t<10?"0":""}${t}:${a<10?"0":""}${a}`};return ve==="media"||Re==="media"?null:<>
2
+
3
+ <o.View pointerEvents="none"style={[r.flashOverlay,{opacity:z}]}/>
4
+
5
+ {!Ie&&<o.View{...Ve.panHandlers}style={[r.container,{transform:[{translateX:i.x},{translateY:i.y}]}]}>
6
+
7
+ {M?<S style={r.recordingShadowWrapper}>
8
+ <N onPress={U}style={r.recordingPillWrapper}>
9
+ <Se colors={["#E11D48","#BE123C"]}start={{x:0,y:0}}end={{x:1,y:0}}style={r.recordingPill}>
10
+ <o.View style={[r.recordingDot,{transform:[{scale:k}]}]}/>
11
+ <W style={r.recordingText}>
12
+ REC {Te(Ce)}
13
+ </W>
14
+ <S style={r.stopIconBadge}>
15
+ <S style={r.stopIconSquare}/>
16
+ </S>
17
+ </Se>
18
+ </N>
19
+ </S>:<S style={r.dockShadowWrapper}>
20
+ <Se colors={["#0E1326","#1A1E38","#0E1326"]}start={{x:0,y:0}}end={{x:1,y:0}}style={r.dockBar}>
21
+
22
+ <S style={r.dragGripArea}pointerEvents="none">
23
+ <Ee size={13}color="rgba(255, 255, 255, 0.45)"/>
24
+ </S>
25
+
26
+
27
+ <N onPress={Me}style={r.menuItemBtn}accessible={!0}accessibilityLabel="Take Screenshot">
28
+ <S style={[r.menuItemIconCircle,{backgroundColor:"rgba(56, 189, 248, 0.22)"}]}>
29
+ <Fe size={14}color={s.sky400}/>
30
+ </S>
31
+ <W style={r.menuItemText}>
32
+ {n("header.screenshot","Screenshot")}
33
+ </W>
34
+ </N>
35
+
36
+
37
+ <S style={r.dockDivider}/>
38
+
39
+
40
+ <N onPress={U}style={r.menuItemBtn}accessible={!0}accessibilityLabel={n("header.recordScreen","Record Screen")}>
41
+ <S style={[r.menuItemIconCircle,{backgroundColor:"rgba(244, 63, 94, 0.24)"}]}>
42
+ <$e size={14}color={s.rose400||"#FB7185"}/>
43
+ </S>
44
+ <W style={r.menuItemText}>
45
+ {n("header.record","Record")}
46
+ </W>
47
+ </N>
48
+ </Se>
49
+ </S>}
50
+ </o.View>}
51
+
52
+
53
+ <Le item={H}visible={!!H}onClose={()=>T(null)}onDelete={async e=>{await V.deleteMedia(e.uri),R?.().catch(()=>{}),T(null)}}onConvertToGif={async e=>{const t=await V.convertToGif(e.uri,{fps:12,width:480});t&&(R?.().catch(()=>{}),T({id:`anim_${t.timestamp}.gif`,type:"gif",format:"gif",uri:t.uri,filename:t.uri.split("/").pop()||`anim_${t.timestamp}.gif`,sizeBytes:t.sizeBytes,timestamp:t.timestamp,durationMs:t.durationMs}))}}/>
54
+ </>};const r=ee.create({flashOverlay:{...ee.absoluteFillObject,backgroundColor:s.white,zIndex:999999},container:{position:"absolute",bottom:_.OS==="ios"?22:16,alignSelf:"center",alignItems:"center",justifyContent:"center",zIndex:999999,elevation:999999},dockShadowWrapper:{borderRadius:24,backgroundColor:"#0D1120",..._.select({ios:{shadowColor:s.black,shadowOffset:{width:0,height:6},shadowOpacity:.45,shadowRadius:14},android:{elevation:16}})},dockBar:{flexDirection:"row",alignItems:"center",borderRadius:24,width:272,paddingVertical:0,paddingHorizontal:0,overflow:"hidden"},dragGripArea:{paddingLeft:10,paddingRight:2,paddingVertical:10,alignItems:"center",justifyContent:"center"},dockDivider:{width:1,height:20,backgroundColor:"rgba(255, 255, 255, 0.12)"},menuItemBtn:{flex:1,flexDirection:"row",alignItems:"center",justifyContent:"center",gap:7,paddingVertical:9,paddingHorizontal:10},menuItemIconCircle:{width:24,height:24,borderRadius:12,alignItems:"center",justifyContent:"center"},menuItemText:{fontFamily:xe.interSemiBold,fontSize:12,color:s.white,letterSpacing:.1},recordingShadowWrapper:{borderRadius:20,..._.select({ios:{shadowColor:s.black,shadowOffset:{width:0,height:4},shadowOpacity:.4,shadowRadius:10},android:{elevation:12}})},recordingPillWrapper:{borderRadius:20,overflow:"hidden"},recordingPill:{flexDirection:"row",alignItems:"center",gap:7,paddingVertical:6.5,paddingHorizontal:12,borderRadius:20,borderWidth:1.5,borderColor:"rgba(255, 255, 255, 0.35)"},recordingDot:{width:7,height:7,borderRadius:3.5,backgroundColor:s.white},recordingText:{fontFamily:xe.interBold,fontSize:11,color:s.white,letterSpacing:.3},stopIconBadge:{width:16,height:16,borderRadius:8,backgroundColor:"rgba(255, 255, 255, 0.28)",alignItems:"center",justifyContent:"center",marginLeft:2},stopIconSquare:{width:5.5,height:5.5,borderRadius:1,backgroundColor:s.white}});export default FloatingCaptureWidget;
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { CrashRecord } from '../../types';
3
+ interface GlobalCrashScreenModalProps {
4
+ visible: boolean;
5
+ crash: CrashRecord | null;
6
+ onDismiss: () => void;
7
+ onOpenInspector: () => void;
8
+ onRetry?: () => void;
9
+ }
10
+ export declare const GlobalCrashScreenModal: React.FC<GlobalCrashScreenModalProps>;
11
+ export default GlobalCrashScreenModal;
@@ -0,0 +1,234 @@
1
+ import j,{useMemo as G}from"react";import{Modal as U,StyleSheet as J,Text as T,View as C,ScrollView as Y,SafeAreaView as K,Platform as X}from"react-native";import E from"react-native-linear-gradient";import F from"../TouchableScale";import{AppColors as e}from"../../styles/AppColors";import{AppFonts as S}from"../../styles/AppFonts";import{exportCrashReport as Q}from"../../customHooks/crashHandler";import{copyToClipboard as Z}from"../../helpers";import{showToast as _}from"../../helpers/toast";import{useTranslation as ee}from"../../i18n";import{WarningTriangleIcon as Te,CopyIcon as Ce,RefreshCcwIcon as Se,CloseWhite as Be,CircleAlertIcon as Ve,TerminalIcon as Re,CodeBracketsIcon as Ie,RepeatIcon as Fe,ShieldAlertIcon as W,FlameIcon as He,ChipIcon as Le,LayoutIcon as D,HourglassIcon as Ae,JsIcon as Me}from"../NetworkIcons";export const GlobalCrashScreenModal=j.memo(({visible:H,crash:h,onDismiss:L,onOpenInspector:O,onRetry:A})=>{const{t:B}=ee(),M=G(()=>h?Q(h,"markdown"):"",[h]);if(!H||!h)return null;const z=h.isFatal,P=h.type||"js",R=h.parsedStack&&h.parsedStack.length>0?h.parsedStack.find(V=>V.isAppCode)||h.parsedStack[0]:null,N=()=>{M&&(Z(M,B("errors.errorReport","Crash Report")),_(B("common.copied","Copied crash diagnostics to clipboard")))},v=()=>{switch(P){case"native":return<Le size={12}color={e.cyan600}/>;case"render":return<D size={12}color={e.purple400}/>;case"promise":return<Ae size={12}color={e.amber400}/>;default:return<Me size={12}color={e.yellow400}/>}};return<U visible={H}transparent={!1}animationType="fade"statusBarTranslucent={!0}onRequestClose={L}>
2
+ <K style={t.safeArea}>
3
+ <C style={t.container}>
4
+
5
+ <C style={t.header}>
6
+ <E colors={[e.red600,e.rose600]}start={{x:0,y:0}}end={{x:1,y:1}}style={t.iconGlowWrap}>
7
+ <Te color={e.white}size={24}/>
8
+ </E>
9
+
10
+ <C style={t.headerTextCol}>
11
+ <C style={t.badgeRow}>
12
+ <C style={[t.crashBadge,z&&t.crashBadgeFatal]}>
13
+ {z?<He size={10}color={e.red500}/>:v()}
14
+ <T style={[t.crashBadgeText,z&&t.crashBadgeTextFatal]}>
15
+ {z?B("crash.fatalBadge","FATAL CRASH"):`${P.toUpperCase()} ERROR`}
16
+ </T>
17
+ </C>
18
+
19
+ <C style={t.shieldBadge}>
20
+ <W size={10}color={e.emerald400}/>
21
+ <T style={t.shieldBadgeText}>
22
+ {B("errors.protected","SHIELD PROTECTED")}
23
+ </T>
24
+ </C>
25
+ </C>
26
+
27
+ <T style={t.title}>
28
+ {B("errors.rootCauseTitle","Crash Intercepted")}
29
+ </T>
30
+ <T style={t.subtitle}numberOfLines={1}>
31
+ {B("errors.rootCauseSubtitle","Native crash prevented \u2022 Diagnostics captured")}
32
+ </T>
33
+ </C>
34
+
35
+ <F onPress={L}hitSlop={10}style={t.closeBtn}>
36
+ <Be size={12}color={e.slate400}/>
37
+ </F>
38
+ </C>
39
+
40
+
41
+ <Y style={t.scrollArea}contentContainerStyle={t.scrollContent}showsVerticalScrollIndicator={!0}>
42
+
43
+ <C style={t.errorBox}>
44
+ <C style={t.errorBoxHeader}>
45
+ <Ve size={14}color={e.red500}/>
46
+ <T style={t.errorBoxTitle}>
47
+ {h.name||B("crash.unknownException","Exception")}
48
+ </T>
49
+ </C>
50
+ <T style={t.errorMessage}selectable={!0}>
51
+ {h.message||B("crash.unknownException","Unknown Exception")}
52
+ </T>
53
+ </C>
54
+
55
+
56
+ {R&&<C style={t.locationCard}>
57
+ <C style={t.cardHeaderRow}>
58
+ <Re size={13}color={e.sky400}/>
59
+ <T style={t.cardHeaderTitle}>
60
+ {B("errors.exactLocation","EXACT ROOT CAUSE")}
61
+ </T>
62
+ </C>
63
+
64
+ <C style={t.locRow}>
65
+ <T style={t.locLabel}>
66
+ {B("errors.file","File:")}
67
+ </T>
68
+ <T style={t.locValFile}numberOfLines={1}selectable={!0}>
69
+ {R.file}
70
+ </T>
71
+ </C>
72
+
73
+ <C style={t.locRow}>
74
+ <T style={t.locLabel}>
75
+ {B("errors.lineCol","Line / Col:")}
76
+ </T>
77
+ <T style={t.locValNum}>
78
+ {R.lineNumber}:{R.column}
79
+ </T>
80
+ </C>
81
+
82
+ <C style={t.locRow}>
83
+ <T style={t.locLabel}>
84
+ {B("errors.function","Function:")}
85
+ </T>
86
+ <T style={t.locValMethod}numberOfLines={1}>
87
+ {R.method}()
88
+ </T>
89
+ </C>
90
+
91
+ {R.raw&&<T style={t.fullPathText}numberOfLines={2}selectable={!0}>
92
+ {R.raw}
93
+ </T>}
94
+ </C>}
95
+
96
+
97
+ {h.parsedStack&&h.parsedStack.length>0&&<C style={t.stackCard}>
98
+ <C style={t.cardHeaderRow}>
99
+ <Ie size={13}color={e.purple400}/>
100
+ <T style={t.cardHeaderTitle}>
101
+ {B("errors.callStack","CALL STACK")}
102
+ </T>
103
+ <T style={t.cardHeaderCount}>
104
+ {h.parsedStack.length} frames
105
+ </T>
106
+ </C>
107
+
108
+ {h.parsedStack.slice(0,10).map((V,I)=><C key={I}style={[t.frameItem,V.isAppCode&&t.frameItemProject]}>
109
+ <C style={t.frameNumBadge}>
110
+ <T style={[t.frameNumText,V.isAppCode&&{color:e.sky400}]}>
111
+ #{I+1}
112
+ </T>
113
+ </C>
114
+ <C style={{flex:1}}>
115
+ <T style={[t.frameMethod,V.isAppCode&&t.frameMethodProject]}numberOfLines={1}>
116
+ {V.method}
117
+ </T>
118
+ <T style={t.frameLoc}numberOfLines={1}>
119
+ {V.file}:{V.lineNumber}
120
+ </T>
121
+ </C>
122
+ {V.isAppCode&&<C style={t.appTag}>
123
+ <T style={t.appTagText}>APP</T>
124
+ </C>}
125
+ </C>)}
126
+ </C>}
127
+
128
+
129
+ {h.componentStack&&<C style={t.stackCard}>
130
+ <C style={t.cardHeaderRow}>
131
+ <D size={13}color={e.purple400}/>
132
+ <T style={t.cardHeaderTitle}>
133
+ {B("crash.componentHierarchy","COMPONENT HIERARCHY")}
134
+ </T>
135
+ </C>
136
+ <T style={t.rawStackText}selectable={!0}>
137
+ {h.componentStack}
138
+ </T>
139
+ </C>}
140
+
141
+
142
+ {h.breadcrumbs&&h.breadcrumbs.length>0&&<C style={t.stackCard}>
143
+ <C style={t.cardHeaderRow}>
144
+ <Fe size={13}color={e.amber400}/>
145
+ <T style={t.cardHeaderTitle}>
146
+ {B("crash.breadcrumbTrail","RECENT TRAIL")}
147
+ </T>
148
+ <T style={t.cardHeaderCount}>
149
+ {h.breadcrumbs.length} events
150
+ </T>
151
+ </C>
152
+
153
+ {h.breadcrumbs.slice(0,6).map((V,I)=>{const $=new Date(V.timestamp).toLocaleTimeString();return<C key={I}style={t.breadcrumbItem}>
154
+ <C style={t.breadcrumbTag}>
155
+ <T style={t.breadcrumbTagText}>
156
+ {V.type.toUpperCase()}
157
+ </T>
158
+ </C>
159
+ <T style={t.breadcrumbMsg}numberOfLines={2}>
160
+ {V.message}
161
+ </T>
162
+ <T style={t.breadcrumbTime}>{$}</T>
163
+ </C>})}
164
+ </C>}
165
+
166
+
167
+ {h.deviceInfo&&<C style={t.telemetryCard}>
168
+ <T style={t.telemetryTitle}>
169
+ {B("crash.deviceDiagnostics","HARDWARE & RUNTIME TELEMETRY")}
170
+ </T>
171
+ <C style={t.telemetryGrid}>
172
+ <C style={t.telemetryPill}>
173
+ <T style={t.telemetryLabel}>OS</T>
174
+ <T style={t.telemetryValue}>
175
+ {h.deviceInfo.platform?.toUpperCase()}{" "}
176
+ {h.deviceInfo.osVersion}
177
+ </T>
178
+ </C>
179
+ <C style={t.telemetryPill}>
180
+ <T style={t.telemetryLabel}>RN Version</T>
181
+ <T style={t.telemetryValue}>
182
+ {h.deviceInfo.rnVersion||"N/A"}
183
+ </T>
184
+ </C>
185
+ <C style={t.telemetryPill}>
186
+ <T style={t.telemetryLabel}>Engine</T>
187
+ <T style={t.telemetryValue}>
188
+ {h.deviceInfo.isHermes?"Hermes":"JSC"}
189
+ </T>
190
+ </C>
191
+ <C style={t.telemetryPill}>
192
+ <T style={t.telemetryLabel}>Architecture</T>
193
+ <T style={t.telemetryValue}>
194
+ {h.deviceInfo.isFabric?"Fabric (New)":"Paper"}
195
+ </T>
196
+ </C>
197
+ {h.memoryInfo&&<C style={t.telemetryPill}>
198
+ <T style={t.telemetryLabel}>JS Heap</T>
199
+ <T style={t.telemetryValue}>
200
+ {h.memoryInfo.usedJSHeapSize} / {h.memoryInfo.totalJSHeapSize} MB
201
+ </T>
202
+ </C>}
203
+ </C>
204
+ </C>}
205
+ </Y>
206
+
207
+
208
+ <C style={t.footer}>
209
+ {A&&<F onPress={A}style={t.retryBtn}>
210
+ <Se size={14}color={e.white}/>
211
+ <T style={t.retryBtnText}>
212
+ {B("errors.retry","Try Again")}
213
+ </T>
214
+ </F>}
215
+
216
+ <F onPress={O}style={t.inspectorBtn}>
217
+ <E colors={[e.indigo600,e.violet600]}start={{x:0,y:0}}end={{x:1,y:1}}style={t.inspectorBtnGradient}>
218
+ <W size={14}color={e.white}/>
219
+ <T style={t.inspectorBtnText}>
220
+ {B("crash.openInInspector","Open in Inspector")}
221
+ </T>
222
+ </E>
223
+ </F>
224
+
225
+ <F onPress={N}style={t.copyBtn}>
226
+ <Ce size={14}color={e.slate200}/>
227
+ <T style={t.copyBtnText}>
228
+ {B("errors.copy","Copy")}
229
+ </T>
230
+ </F>
231
+ </C>
232
+ </C>
233
+ </K>
234
+ </U>});const t=J.create({safeArea:{flex:1,backgroundColor:e.slate900},container:{flex:1,backgroundColor:e.slate900},header:{flexDirection:"row",alignItems:"center",paddingHorizontal:16,paddingTop:X.OS==="android"?24:12,paddingBottom:12,backgroundColor:e.slate850,borderBottomWidth:1,borderBottomColor:e.slate800,gap:12},iconGlowWrap:{width:42,height:42,borderRadius:12,alignItems:"center",justifyContent:"center",shadowColor:e.red500,shadowOffset:{width:0,height:4},shadowOpacity:.35,shadowRadius:8,elevation:4},headerTextCol:{flex:1},badgeRow:{flexDirection:"row",alignItems:"center",gap:6,marginBottom:3},crashBadge:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:`${e.red500}22`,paddingHorizontal:6,paddingVertical:2,borderRadius:5,borderWidth:1,borderColor:`${e.red500}44`},crashBadgeFatal:{backgroundColor:`${e.red500}33`,borderColor:e.red500},crashBadgeText:{fontFamily:S.interBold,fontSize:9.5,color:e.red500,letterSpacing:.4},crashBadgeTextFatal:{color:e.red500},shieldBadge:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:`${e.emerald500}20`,paddingHorizontal:6,paddingVertical:2,borderRadius:5,borderWidth:1,borderColor:`${e.emerald500}44`},shieldBadgeText:{fontFamily:S.interBold,fontSize:9,color:e.emerald400,letterSpacing:.4},title:{fontFamily:S.interBold,fontSize:16,color:e.white,letterSpacing:-.2},subtitle:{fontFamily:S.interRegular,fontSize:11,color:e.slate400,marginTop:1},closeBtn:{width:30,height:30,borderRadius:15,backgroundColor:e.slate800,alignItems:"center",justifyContent:"center"},scrollArea:{flex:1},scrollContent:{padding:16,gap:12,paddingBottom:24},errorBox:{backgroundColor:`${e.red500}16`,borderRadius:12,borderWidth:1,borderColor:`${e.red500}40`,padding:14,gap:6},errorBoxHeader:{flexDirection:"row",alignItems:"center",gap:6},errorBoxTitle:{fontFamily:S.interBold,fontSize:12,color:e.red500,letterSpacing:.4},errorMessage:{fontFamily:S.interBold,fontSize:13.5,color:e.red100,lineHeight:19},locationCard:{backgroundColor:e.slate850,borderRadius:12,padding:14,borderWidth:1,borderColor:e.slate800,gap:8},cardHeaderRow:{flexDirection:"row",alignItems:"center",gap:6,marginBottom:4},cardHeaderTitle:{fontFamily:S.interBold,fontSize:10.5,color:e.slate200,letterSpacing:.6,flex:1},cardHeaderCount:{fontFamily:S.interMedium,fontSize:10,color:e.slate400},locRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:8},locLabel:{fontFamily:S.interMedium,fontSize:11.5,color:e.slate400,minWidth:80},locValFile:{fontFamily:S.interBold,fontSize:12,color:e.sky400,flex:1,textAlign:"right"},locValNum:{fontFamily:S.interBold,fontSize:12,color:e.white},locValMethod:{fontFamily:S.interMedium,fontSize:12,color:e.purple400},fullPathText:{fontFamily:S.interRegular,fontSize:10,color:e.slate400,marginTop:4,paddingTop:6,borderTopWidth:1,borderTopColor:e.slate800},stackCard:{backgroundColor:e.slate850,borderRadius:12,padding:14,borderWidth:1,borderColor:e.slate800,gap:6},frameItem:{flexDirection:"row",alignItems:"center",backgroundColor:e.slate900,padding:9,borderRadius:8,gap:8,borderWidth:1,borderColor:e.slate800},frameItemProject:{borderColor:`${e.sky400}44`,backgroundColor:`${e.sky400}0F`},frameNumBadge:{width:22,alignItems:"center"},frameNumText:{fontFamily:S.interBold,fontSize:10,color:e.slate400},frameMethod:{fontFamily:S.interBold,fontSize:11.5,color:e.slate200},frameMethodProject:{color:e.white},frameLoc:{fontFamily:S.interRegular,fontSize:10,color:e.slate400,marginTop:1},appTag:{backgroundColor:`${e.sky400}26`,paddingHorizontal:5,paddingVertical:2,borderRadius:4},appTagText:{fontFamily:S.interBold,fontSize:8.5,color:e.sky400},rawStackText:{fontFamily:S.interRegular,fontSize:10.5,color:e.slate200,lineHeight:16,backgroundColor:e.slate900,padding:10,borderRadius:8},breadcrumbItem:{flexDirection:"row",alignItems:"center",gap:8,backgroundColor:e.slate900,padding:8,borderRadius:7,borderWidth:1,borderColor:e.slate800},breadcrumbTag:{backgroundColor:`${e.indigo600}20`,paddingHorizontal:5,paddingVertical:2,borderRadius:4},breadcrumbTagText:{fontFamily:S.interBold,fontSize:8.5,color:e.purple400},breadcrumbMsg:{flex:1,fontFamily:S.interRegular,fontSize:11,color:e.slate200},breadcrumbTime:{fontFamily:S.interMedium,fontSize:9.5,color:e.slate400},telemetryCard:{backgroundColor:e.slate850,borderRadius:12,padding:14,borderWidth:1,borderColor:e.slate800,gap:8},telemetryTitle:{fontFamily:S.interBold,fontSize:10,color:e.slate400,letterSpacing:.6},telemetryGrid:{flexDirection:"row",flexWrap:"wrap",gap:8},telemetryPill:{backgroundColor:e.slate900,paddingHorizontal:10,paddingVertical:6,borderRadius:8,borderWidth:1,borderColor:e.slate800},telemetryLabel:{fontFamily:S.interMedium,fontSize:9.5,color:e.slate400},telemetryValue:{fontFamily:S.interBold,fontSize:11,color:e.white,marginTop:2},footer:{flexDirection:"row",padding:14,backgroundColor:e.slate850,borderTopWidth:1,borderTopColor:e.slate800,gap:10,alignItems:"center"},retryBtn:{flexDirection:"row",alignItems:"center",justifyContent:"center",gap:6,backgroundColor:e.red600,paddingHorizontal:14,height:42,borderRadius:10},retryBtnText:{fontFamily:S.interBold,fontSize:12.5,color:e.white},inspectorBtn:{flex:1,height:42,borderRadius:10,overflow:"hidden"},inspectorBtnGradient:{flex:1,flexDirection:"row",alignItems:"center",justifyContent:"center",gap:6,paddingHorizontal:12},inspectorBtnText:{fontFamily:S.interBold,fontSize:12.5,color:e.white},copyBtn:{flexDirection:"row",alignItems:"center",justifyContent:"center",gap:6,backgroundColor:e.slate800,borderWidth:1,borderColor:e.slate700,paddingHorizontal:14,height:42,borderRadius:10},copyBtnText:{fontFamily:S.interBold,fontSize:12.5,color:e.slate200}});export default GlobalCrashScreenModal;