react-native-inapp-inspector 2.3.19 → 2.3.21

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 (353) hide show
  1. package/README.md +14 -14
  2. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +67 -0
  3. package/dist/commonjs/analytics.js +1 -24
  4. package/dist/commonjs/bundle.js +1 -16
  5. package/dist/commonjs/capture.js +1 -35
  6. package/dist/commonjs/components/AnalyticsDetail.js +92 -623
  7. package/dist/commonjs/components/AnalyticsEventCard.js +54 -350
  8. package/dist/commonjs/components/AnalyticsGraph.js +70 -370
  9. package/dist/commonjs/components/AnimatedEntrance.js +1 -11
  10. package/dist/commonjs/components/AppHeaderLogo.js +7 -134
  11. package/dist/commonjs/components/BrandCircleIcon.js +73 -118
  12. package/dist/commonjs/components/BrandSquareIcon.js +63 -108
  13. package/dist/commonjs/components/CodeSnippet.js +48 -623
  14. package/dist/commonjs/components/ConsoleLogCard.js +63 -537
  15. package/dist/commonjs/components/CopyButton.js +3 -89
  16. package/dist/commonjs/components/DiffViewer.js +19 -83
  17. package/dist/commonjs/components/DomainHeader.js +27 -127
  18. package/dist/commonjs/components/EmptyState.js +10 -87
  19. package/dist/commonjs/components/EndOfListFooter.js +7 -81
  20. package/dist/commonjs/components/ErrorBoundary.js +72 -566
  21. package/dist/commonjs/components/HeadersSection.js +31 -110
  22. package/dist/commonjs/components/HighlightText.js +17 -58
  23. package/dist/commonjs/components/Inspector/AboutModal.d.ts +6 -0
  24. package/dist/commonjs/components/Inspector/AboutModal.js +243 -0
  25. package/dist/commonjs/components/Inspector/AnalyticsFilterModal.js +98 -797
  26. package/dist/commonjs/components/Inspector/AnalyticsTab.js +284 -930
  27. package/dist/commonjs/components/Inspector/BundleTab.js +551 -2918
  28. package/dist/commonjs/components/Inspector/ConsoleTab.js +79 -492
  29. package/dist/commonjs/components/Inspector/CrashDetail.js +123 -672
  30. package/dist/commonjs/components/Inspector/CrashFilterModal.js +66 -498
  31. package/dist/commonjs/components/Inspector/CrashTab.js +98 -670
  32. package/dist/commonjs/components/Inspector/DebuggingTab.js +74 -875
  33. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +143 -907
  34. package/dist/commonjs/components/Inspector/FabLauncher.js +42 -466
  35. package/dist/commonjs/components/Inspector/FeatureUnderDevNotice.js +6 -99
  36. package/dist/commonjs/components/Inspector/InspectorContext.js +1 -21
  37. package/dist/commonjs/components/Inspector/InspectorHeader.js +191 -1110
  38. package/dist/commonjs/components/Inspector/LogDetail.js +168 -994
  39. package/dist/commonjs/components/Inspector/MainScreen.js +52 -335
  40. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +97 -644
  41. package/dist/commonjs/components/Inspector/MediaPreviewModal.js +90 -605
  42. package/dist/commonjs/components/Inspector/NavigationTracker.js +1 -12
  43. package/dist/commonjs/components/Inspector/NetworkDetail.js +89 -411
  44. package/dist/commonjs/components/Inspector/NetworkFilterModal.js +60 -576
  45. package/dist/commonjs/components/Inspector/NetworkTab.js +84 -514
  46. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +18 -434
  47. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +25 -298
  48. package/dist/commonjs/components/Inspector/PerformanceTab.js +182 -1397
  49. package/dist/commonjs/components/Inspector/ReduxDetail.js +188 -1089
  50. package/dist/commonjs/components/Inspector/ReduxTab.js +85 -701
  51. package/dist/commonjs/components/Inspector/SettingsPanel.js +427 -3807
  52. package/dist/commonjs/components/Inspector/SkeletonPlaceholder.js +11 -180
  53. package/dist/commonjs/components/Inspector/StorageTab.js +93 -826
  54. package/dist/commonjs/components/Inspector/TabBar.js +36 -334
  55. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +37 -412
  56. package/dist/commonjs/components/JsonViewer.js +168 -381
  57. package/dist/commonjs/components/LogCard.js +57 -567
  58. package/dist/commonjs/components/LogSyntaxHighlighter.js +11 -130
  59. package/dist/commonjs/components/MetaAccordion.js +69 -238
  60. package/dist/commonjs/components/MiniBarChart.js +3 -56
  61. package/dist/commonjs/components/MiniLineChart.js +3 -58
  62. package/dist/commonjs/components/NetworkIcons.d.ts +13 -0
  63. package/dist/commonjs/components/NetworkIcons.js +521 -1022
  64. package/dist/commonjs/components/QRCodeView.js +5 -79
  65. package/dist/commonjs/components/SectionHeader.js +15 -37
  66. package/dist/commonjs/components/SegmentedTabs.js +7 -62
  67. package/dist/commonjs/components/SkeletonPlaceholder.js +11 -180
  68. package/dist/commonjs/components/Slider.js +15 -243
  69. package/dist/commonjs/components/SourcePageCard.js +30 -89
  70. package/dist/commonjs/components/Toast.js +5 -147
  71. package/dist/commonjs/components/TouchableScale.js +3 -24
  72. package/dist/commonjs/components/TreeNode.js +55 -130
  73. package/dist/commonjs/console.js +1 -16
  74. package/dist/commonjs/constants/index.js +1 -32
  75. package/dist/commonjs/constants/telemetryConfig.js +1 -6
  76. package/dist/commonjs/constants/version.d.ts +1 -1
  77. package/dist/commonjs/constants/version.js +1 -4
  78. package/dist/commonjs/crash.js +1 -23
  79. package/dist/commonjs/customHooks/analyticsLogger.js +1 -250
  80. package/dist/commonjs/customHooks/bundleAnalyzer.js +1 -957
  81. package/dist/commonjs/customHooks/consoleLogger.js +6 -445
  82. package/dist/commonjs/customHooks/crashHandler.js +7 -656
  83. package/dist/commonjs/customHooks/logFilters.js +1 -23
  84. package/dist/commonjs/customHooks/networkLogger.js +2 -536
  85. package/dist/commonjs/customHooks/performanceTracker.js +63 -750
  86. package/dist/commonjs/customHooks/reduxLogger.js +2 -313
  87. package/dist/commonjs/customHooks/storageInspector.js +1 -435
  88. package/dist/commonjs/customHooks/useAccordion.js +1 -18
  89. package/dist/commonjs/decorators/index.js +1 -100
  90. package/dist/commonjs/helpers/gaAnalyticsRegistry.js +1 -148
  91. package/dist/commonjs/helpers/index.d.ts +1 -0
  92. package/dist/commonjs/helpers/index.js +8 -921
  93. package/dist/commonjs/helpers/memoryManager.js +1 -99
  94. package/dist/commonjs/helpers/qrGenerator.js +1 -367
  95. package/dist/commonjs/helpers/remoteConfig.js +1 -165
  96. package/dist/commonjs/helpers/searchQueryParser.js +1 -62
  97. package/dist/commonjs/helpers/settingsStore.js +1 -144
  98. package/dist/commonjs/helpers/telemetry.js +1 -501
  99. package/dist/commonjs/helpers/toast.js +1 -20
  100. package/dist/commonjs/i18n/index.js +1 -90
  101. package/dist/commonjs/i18n/locales/en.json +1 -1140
  102. package/dist/commonjs/index.js +5 -2168
  103. package/dist/commonjs/metro.js +6 -468
  104. package/dist/commonjs/native/NativeInspector.d.ts +1 -0
  105. package/dist/commonjs/native/NativeInspector.js +1 -415
  106. package/dist/commonjs/native/NativeNetworkInspector.js +1 -4
  107. package/dist/commonjs/network.js +1 -13
  108. package/dist/commonjs/performance.js +1 -29
  109. package/dist/commonjs/redux.js +1 -20
  110. package/dist/commonjs/storage.js +1 -14
  111. package/dist/commonjs/styles/AppColors.js +1 -423
  112. package/dist/commonjs/styles/AppFonts.js +1 -17
  113. package/dist/commonjs/styles/common.js +1 -190
  114. package/dist/commonjs/styles/index.d.ts +6 -0
  115. package/dist/commonjs/styles/index.js +1 -1589
  116. package/dist/commonjs/types/enums.d.ts +0 -1
  117. package/dist/commonjs/types/enums.js +1 -152
  118. package/dist/commonjs/types/index.js +1 -18
  119. package/dist/commonjs/types/interfaces.d.ts +2 -2
  120. package/dist/commonjs/types/interfaces.js +1 -2
  121. package/dist/esm/analytics.js +1 -2
  122. package/dist/esm/bundle.js +1 -2
  123. package/dist/esm/capture.js +1 -32
  124. package/dist/esm/components/AnalyticsDetail.js +171 -664
  125. package/dist/esm/components/AnalyticsEventCard.js +77 -335
  126. package/dist/esm/components/AnalyticsGraph.js +95 -357
  127. package/dist/esm/components/AnimatedEntrance.js +1 -6
  128. package/dist/esm/components/AppHeaderLogo.js +7 -94
  129. package/dist/esm/components/BrandCircleIcon.js +114 -119
  130. package/dist/esm/components/BrandSquareIcon.js +73 -78
  131. package/dist/esm/components/CodeSnippet.js +58 -595
  132. package/dist/esm/components/ConsoleLogCard.js +91 -526
  133. package/dist/esm/components/CopyButton.js +3 -51
  134. package/dist/esm/components/DiffViewer.js +22 -48
  135. package/dist/esm/components/DomainHeader.js +43 -138
  136. package/dist/esm/components/EmptyState.js +17 -56
  137. package/dist/esm/components/EndOfListFooter.js +15 -83
  138. package/dist/esm/components/ErrorBoundary.js +125 -582
  139. package/dist/esm/components/HeadersSection.js +52 -93
  140. package/dist/esm/components/HighlightText.js +17 -53
  141. package/dist/esm/components/Inspector/AboutModal.d.ts +6 -0
  142. package/dist/esm/components/Inspector/AboutModal.js +243 -0
  143. package/dist/esm/components/Inspector/AnalyticsFilterModal.js +225 -886
  144. package/dist/esm/components/Inspector/AnalyticsTab.js +296 -904
  145. package/dist/esm/components/Inspector/BundleTab.js +1175 -3502
  146. package/dist/esm/components/Inspector/ConsoleTab.js +113 -488
  147. package/dist/esm/components/Inspector/CrashDetail.js +236 -747
  148. package/dist/esm/components/Inspector/CrashFilterModal.js +149 -541
  149. package/dist/esm/components/Inspector/CrashTab.js +177 -711
  150. package/dist/esm/components/Inspector/DebuggingTab.js +164 -925
  151. package/dist/esm/components/Inspector/DeviceInfoTab.js +199 -924
  152. package/dist/esm/components/Inspector/FabLauncher.js +68 -454
  153. package/dist/esm/components/Inspector/FeatureUnderDevNotice.js +14 -70
  154. package/dist/esm/components/Inspector/InspectorContext.js +1 -12
  155. package/dist/esm/components/Inspector/InspectorHeader.js +282 -1163
  156. package/dist/esm/components/Inspector/LogDetail.js +235 -1023
  157. package/dist/esm/components/Inspector/MainScreen.js +78 -323
  158. package/dist/esm/components/Inspector/MediaGalleryTab.js +143 -650
  159. package/dist/esm/components/Inspector/MediaPreviewModal.js +138 -613
  160. package/dist/esm/components/Inspector/NavigationTracker.js +1 -10
  161. package/dist/esm/components/Inspector/NetworkDetail.js +138 -455
  162. package/dist/esm/components/Inspector/NetworkFilterModal.js +122 -597
  163. package/dist/esm/components/Inspector/NetworkTab.js +125 -517
  164. package/dist/esm/components/Inspector/NpmStarPrompt.js +58 -434
  165. package/dist/esm/components/Inspector/NpmUpdateToast.js +45 -281
  166. package/dist/esm/components/Inspector/PerformanceTab.js +393 -1570
  167. package/dist/esm/components/Inspector/ReduxDetail.js +307 -1170
  168. package/dist/esm/components/Inspector/ReduxTab.js +144 -722
  169. package/dist/esm/components/Inspector/SettingsPanel.js +643 -3985
  170. package/dist/esm/components/Inspector/SkeletonPlaceholder.js +30 -163
  171. package/dist/esm/components/Inspector/StorageTab.js +172 -866
  172. package/dist/esm/components/Inspector/TabBar.js +45 -305
  173. package/dist/esm/components/Inspector/UpdateAvailableModal.js +80 -418
  174. package/dist/esm/components/JsonViewer.js +179 -354
  175. package/dist/esm/components/LogCard.js +93 -565
  176. package/dist/esm/components/LogSyntaxHighlighter.js +11 -123
  177. package/dist/esm/components/MetaAccordion.js +136 -267
  178. package/dist/esm/components/MiniBarChart.js +3 -18
  179. package/dist/esm/components/MiniLineChart.js +3 -20
  180. package/dist/esm/components/NetworkIcons.d.ts +13 -0
  181. package/dist/esm/components/NetworkIcons.js +523 -838
  182. package/dist/esm/components/QRCodeView.js +8 -45
  183. package/dist/esm/components/SectionHeader.js +22 -39
  184. package/dist/esm/components/SegmentedTabs.js +8 -58
  185. package/dist/esm/components/SkeletonPlaceholder.js +30 -163
  186. package/dist/esm/components/Slider.js +24 -213
  187. package/dist/esm/components/SourcePageCard.js +65 -86
  188. package/dist/esm/components/Toast.js +10 -117
  189. package/dist/esm/components/TouchableScale.js +3 -19
  190. package/dist/esm/components/TreeNode.js +58 -95
  191. package/dist/esm/console.js +1 -2
  192. package/dist/esm/constants/index.js +1 -28
  193. package/dist/esm/constants/telemetryConfig.js +1 -3
  194. package/dist/esm/constants/version.d.ts +1 -1
  195. package/dist/esm/constants/version.js +1 -1
  196. package/dist/esm/crash.js +1 -2
  197. package/dist/esm/customHooks/analyticsLogger.js +1 -230
  198. package/dist/esm/customHooks/bundleAnalyzer.js +1 -944
  199. package/dist/esm/customHooks/consoleLogger.js +6 -432
  200. package/dist/esm/customHooks/crashHandler.js +7 -630
  201. package/dist/esm/customHooks/logFilters.js +1 -20
  202. package/dist/esm/customHooks/networkLogger.js +2 -519
  203. package/dist/esm/customHooks/performanceTracker.js +63 -723
  204. package/dist/esm/customHooks/reduxLogger.js +2 -293
  205. package/dist/esm/customHooks/storageInspector.js +1 -418
  206. package/dist/esm/customHooks/useAccordion.js +1 -16
  207. package/dist/esm/decorators/index.js +1 -95
  208. package/dist/esm/helpers/gaAnalyticsRegistry.js +1 -143
  209. package/dist/esm/helpers/index.d.ts +1 -0
  210. package/dist/esm/helpers/index.js +8 -861
  211. package/dist/esm/helpers/memoryManager.js +1 -91
  212. package/dist/esm/helpers/qrGenerator.js +1 -364
  213. package/dist/esm/helpers/remoteConfig.js +1 -160
  214. package/dist/esm/helpers/searchQueryParser.js +1 -59
  215. package/dist/esm/helpers/settingsStore.js +1 -134
  216. package/dist/esm/helpers/telemetry.js +1 -489
  217. package/dist/esm/helpers/toast.js +1 -15
  218. package/dist/esm/i18n/index.js +1 -78
  219. package/dist/esm/i18n/locales/en.json +1 -1140
  220. package/dist/esm/index.js +7 -1982
  221. package/dist/esm/metro.js +6 -459
  222. package/dist/esm/native/NativeInspector.d.ts +1 -0
  223. package/dist/esm/native/NativeInspector.js +1 -382
  224. package/dist/esm/native/NativeNetworkInspector.js +1 -2
  225. package/dist/esm/network.js +1 -1
  226. package/dist/esm/performance.js +1 -2
  227. package/dist/esm/redux.js +1 -1
  228. package/dist/esm/storage.js +1 -1
  229. package/dist/esm/styles/AppColors.js +1 -417
  230. package/dist/esm/styles/AppFonts.js +1 -13
  231. package/dist/esm/styles/common.js +1 -186
  232. package/dist/esm/styles/index.d.ts +6 -0
  233. package/dist/esm/styles/index.js +1 -1551
  234. package/dist/esm/types/enums.d.ts +0 -1
  235. package/dist/esm/types/enums.js +1 -149
  236. package/dist/esm/types/index.js +1 -2
  237. package/dist/esm/types/interfaces.d.ts +2 -2
  238. package/dist/esm/types/interfaces.js +1 -1
  239. package/ios/NetworkInspectorModule.mm +60 -12
  240. package/package.json +5 -3
  241. package/src/native/NativeInspector.ts +18 -0
  242. package/dist/commonjs/components/Inspector/FeedbackModal.d.ts +0 -7
  243. package/dist/commonjs/components/Inspector/FeedbackModal.js +0 -552
  244. package/dist/esm/components/Inspector/FeedbackModal.d.ts +0 -7
  245. package/dist/esm/components/Inspector/FeedbackModal.js +0 -515
  246. package/src/analytics.ts +0 -35
  247. package/src/bundle.ts +0 -25
  248. package/src/capture.ts +0 -109
  249. package/src/components/AnalyticsDetail.tsx +0 -870
  250. package/src/components/AnalyticsEventCard.tsx +0 -444
  251. package/src/components/AnalyticsGraph.tsx +0 -583
  252. package/src/components/AnimatedEntrance.tsx +0 -20
  253. package/src/components/AppHeaderLogo.tsx +0 -143
  254. package/src/components/BrandCircleIcon.tsx +0 -144
  255. package/src/components/BrandSquareIcon.tsx +0 -184
  256. package/src/components/CodeSnippet.tsx +0 -725
  257. package/src/components/ConsoleLogCard.tsx +0 -679
  258. package/src/components/CopyButton.tsx +0 -87
  259. package/src/components/DiffViewer.tsx +0 -82
  260. package/src/components/DomainHeader.tsx +0 -224
  261. package/src/components/EmptyState.tsx +0 -97
  262. package/src/components/EndOfListFooter.tsx +0 -100
  263. package/src/components/ErrorBoundary.tsx +0 -688
  264. package/src/components/HeadersSection.tsx +0 -172
  265. package/src/components/HighlightText.tsx +0 -100
  266. package/src/components/Inspector/AnalyticsFilterModal.tsx +0 -1250
  267. package/src/components/Inspector/AnalyticsTab.tsx +0 -1362
  268. package/src/components/Inspector/BundleTab.tsx +0 -4768
  269. package/src/components/Inspector/ConsoleTab.tsx +0 -726
  270. package/src/components/Inspector/CrashDetail.tsx +0 -997
  271. package/src/components/Inspector/CrashFilterModal.tsx +0 -721
  272. package/src/components/Inspector/CrashTab.tsx +0 -933
  273. package/src/components/Inspector/DebuggingTab.tsx +0 -1103
  274. package/src/components/Inspector/DeviceInfoTab.tsx +0 -1397
  275. package/src/components/Inspector/FabLauncher.tsx +0 -590
  276. package/src/components/Inspector/FeatureUnderDevNotice.tsx +0 -94
  277. package/src/components/Inspector/FeedbackModal.tsx +0 -626
  278. package/src/components/Inspector/InspectorContext.tsx +0 -28
  279. package/src/components/Inspector/InspectorHeader.tsx +0 -1583
  280. package/src/components/Inspector/LogDetail.tsx +0 -1431
  281. package/src/components/Inspector/MainScreen.tsx +0 -460
  282. package/src/components/Inspector/MediaGalleryTab.tsx +0 -829
  283. package/src/components/Inspector/MediaPreviewModal.tsx +0 -783
  284. package/src/components/Inspector/NavigationTracker.tsx +0 -13
  285. package/src/components/Inspector/NetworkDetail.tsx +0 -778
  286. package/src/components/Inspector/NetworkFilterModal.tsx +0 -730
  287. package/src/components/Inspector/NetworkTab.tsx +0 -820
  288. package/src/components/Inspector/NpmStarPrompt.tsx +0 -532
  289. package/src/components/Inspector/NpmUpdateToast.tsx +0 -387
  290. package/src/components/Inspector/PerformanceTab.tsx +0 -1967
  291. package/src/components/Inspector/ReduxDetail.tsx +0 -1651
  292. package/src/components/Inspector/ReduxTab.tsx +0 -987
  293. package/src/components/Inspector/SettingsPanel.tsx +0 -5136
  294. package/src/components/Inspector/SkeletonPlaceholder.tsx +0 -206
  295. package/src/components/Inspector/StorageTab.tsx +0 -1159
  296. package/src/components/Inspector/TabBar.tsx +0 -431
  297. package/src/components/Inspector/UpdateAvailableModal.tsx +0 -555
  298. package/src/components/JsonViewer.tsx +0 -549
  299. package/src/components/LogCard.tsx +0 -694
  300. package/src/components/LogSyntaxHighlighter.tsx +0 -178
  301. package/src/components/MetaAccordion.tsx +0 -355
  302. package/src/components/MiniBarChart.tsx +0 -42
  303. package/src/components/MiniLineChart.tsx +0 -33
  304. package/src/components/NetworkIcons.tsx +0 -2655
  305. package/src/components/QRCodeView.tsx +0 -75
  306. package/src/components/SectionHeader.tsx +0 -101
  307. package/src/components/SegmentedTabs.tsx +0 -84
  308. package/src/components/SkeletonPlaceholder.tsx +0 -206
  309. package/src/components/Slider.tsx +0 -300
  310. package/src/components/SourcePageCard.tsx +0 -150
  311. package/src/components/Toast.tsx +0 -131
  312. package/src/components/TouchableScale.tsx +0 -61
  313. package/src/components/TreeNode.tsx +0 -171
  314. package/src/console.ts +0 -24
  315. package/src/constants/index.ts +0 -41
  316. package/src/constants/telemetryConfig.ts +0 -4
  317. package/src/constants/version.ts +0 -3
  318. package/src/crash.ts +0 -32
  319. package/src/customHooks/analyticsLogger.ts +0 -336
  320. package/src/customHooks/bundleAnalyzer.ts +0 -1256
  321. package/src/customHooks/consoleLogger.ts +0 -530
  322. package/src/customHooks/crashHandler.ts +0 -944
  323. package/src/customHooks/logFilters.ts +0 -32
  324. package/src/customHooks/networkLogger.ts +0 -624
  325. package/src/customHooks/performanceTracker.ts +0 -1014
  326. package/src/customHooks/reduxLogger.ts +0 -406
  327. package/src/customHooks/storageInspector.ts +0 -513
  328. package/src/customHooks/useAccordion.tsx +0 -27
  329. package/src/decorators/index.ts +0 -184
  330. package/src/helpers/gaAnalyticsRegistry.ts +0 -204
  331. package/src/helpers/index.ts +0 -1092
  332. package/src/helpers/memoryManager.ts +0 -138
  333. package/src/helpers/qrGenerator.ts +0 -430
  334. package/src/helpers/remoteConfig.ts +0 -212
  335. package/src/helpers/searchQueryParser.ts +0 -84
  336. package/src/helpers/settingsStore.ts +0 -171
  337. package/src/helpers/telemetry.ts +0 -568
  338. package/src/helpers/toast.ts +0 -17
  339. package/src/i18n/index.ts +0 -104
  340. package/src/i18n/locales/en.json +0 -1141
  341. package/src/index.tsx +0 -2650
  342. package/src/metro.ts +0 -598
  343. package/src/network.ts +0 -22
  344. package/src/performance.ts +0 -38
  345. package/src/redux.ts +0 -23
  346. package/src/storage.ts +0 -18
  347. package/src/styles/AppColors.ts +0 -455
  348. package/src/styles/AppFonts.ts +0 -26
  349. package/src/styles/common.ts +0 -209
  350. package/src/styles/index.ts +0 -1606
  351. package/src/types/enums.ts +0 -210
  352. package/src/types/index.ts +0 -34
  353. package/src/types/interfaces.ts +0 -535
@@ -1,641 +1,166 @@
1
- import React, { useState } from 'react';
2
- import { Alert, Image, Modal, Platform, StyleSheet, Text, TouchableOpacity, View, } from 'react-native';
3
- import { AppColors } from '../../styles/AppColors';
4
- import { AppFonts } from '../../styles/AppFonts';
5
- import TouchableScale from '../TouchableScale';
6
- import { ChevronDownIcon, ExpandCollapseIcon, FilmIcon, GifIcon, ImageIcon, PauseIcon, PlayIcon, RepeatIcon, TrashIcon, } from '../NetworkIcons';
7
- import { ScreenCapture } from '../../capture';
8
- import { formatBytes } from '../../helpers';
9
- import { showToast } from '../../helpers/toast';
10
- import { useTranslation } from '../../i18n';
11
- export const MediaPreviewModal = ({ item, visible, onClose, onDelete, onConvertToGif, }) => {
12
- const { t } = useTranslation();
13
- const [isConverting, setIsConverting] = useState(false);
14
- const [imageError, setImageError] = useState(false);
15
- const [isExpanded, setIsExpanded] = useState(false);
16
- const [isPlaying, setIsPlaying] = useState(false);
17
- const [playbackSpeed, setPlaybackSpeed] = useState('1.0x');
18
- const [isLooping, setIsLooping] = useState(true);
19
- const [scrubPosition, setScrubPosition] = useState(0.4);
20
- if (!item)
21
- return null;
22
- const handlePlayVideo = async () => {
23
- try {
24
- setIsPlaying(true);
25
- await ScreenCapture.playVideo(item.uri);
26
- }
27
- catch {
28
- showToast(t('mediaGallery.playError', 'Unable to play video'));
29
- }
30
- finally {
31
- setIsPlaying(false);
32
- }
33
- };
34
- const handleDelete = () => {
35
- Alert.alert(t('mediaGallery.deleteTitle'), t('mediaGallery.deleteMessage', { filename: item.filename }), [
36
- { text: t('common.cancel'), style: 'cancel' },
37
- {
38
- text: t('mediaGallery.delete'),
39
- style: 'destructive',
40
- onPress: () => {
41
- onDelete(item);
42
- onClose();
43
- },
44
- },
45
- ]);
46
- };
47
- const handleConvert = async () => {
48
- if (!onConvertToGif)
49
- return;
50
- setIsConverting(true);
51
- try {
52
- await onConvertToGif(item);
53
- showToast(t('mediaGallery.convertedSuccess'));
54
- }
55
- catch {
56
- showToast(t('mediaGallery.convertFailed'));
57
- }
58
- finally {
59
- setIsConverting(false);
60
- }
61
- };
62
- const isVideo = item.type === 'video';
63
- const isGif = item.type === 'gif';
64
- const durationSec = item.durationMs ? (item.durationMs / 1000).toFixed(1) : null;
65
- const formattedDuration = durationSec
66
- ? `00:${Number(durationSec) < 10 ? '0' : ''}${durationSec}`
67
- : '00:05.0';
68
- const hasBottomToolbar = isVideo || isGif;
69
- return (<Modal visible={visible} transparent={true} animationType="fade" onRequestClose={onClose}>
70
- <View style={previewStyles.overlay}>
1
+ import{useState as P}from"react";import{Alert as Ve,Image as _,Modal as De,Platform as V,Share as ee,StyleSheet as oe,Text as T,TouchableOpacity as I,View as C}from"react-native";import{AppColors as e}from"../../styles/AppColors";import{AppFonts as S}from"../../styles/AppFonts";import R from"../TouchableScale";import{ChevronDownIcon as Me,CopyIcon as L,ExpandCollapseIcon as We,FilmIcon as E,GifIcon as H,ImageIcon as Le,PauseIcon as Ee,PlayIcon as Ce,RepeatIcon as He,ShareIcon as Te,TrashIcon as Ue}from"../NetworkIcons";import{ScreenCapture as Ne}from"../../capture";import{copyImageOrMediaToClipboard as qe,formatBytes as Se}from"../../helpers";import{showToast as G}from"../../helpers/toast";import{useTranslation as Je}from"../../i18n";export const MediaPreviewModal=({item:t,visible:ve,onClose:D,onDelete:Ae,onConvertToGif:M})=>{const{t:r}=Je(),[U,N]=P(!1),[Ie,q]=P(!1),[z,ze]=P(!1),[J,K]=P(!1),[Q,Pe]=P("1.0x"),[$,Be]=P(!0),[W,Re]=P(.4);if(!t)return null;const O=()=>{t?.uri&&qe(t.uri,t.type==="image"?"Image":"Media")},X=async()=>{try{K(!0),await Ne.playVideo(t.uri)}catch{G(r("mediaGallery.playError","Unable to play video"))}finally{K(!1)}},$e=()=>{Ve.alert(r("mediaGallery.deleteTitle"),r("mediaGallery.deleteMessage",{filename:t.filename}),[{text:r("common.cancel"),style:"cancel"},{text:r("mediaGallery.delete"),style:"destructive",onPress:()=>{Ae(t),D()}}])},Fe=async()=>{if(M){N(!0);try{await M(t),G(r("mediaGallery.convertedSuccess"))}catch{G(r("mediaGallery.convertFailed"))}finally{N(!1)}}},Y=async()=>{try{const v=t.uri.startsWith("file://")||t.uri.startsWith("content://")||t.uri.startsWith("http")?t.uri:`file://${t.uri}`,Oe=V.select({ios:{url:v,title:t.filename},default:{title:t.filename,message:t.filename,url:v}});(await ee.share(Oe)).action===ee.sharedAction&&G(r("mediaGallery.shareSuccess","Shared successfully"))}catch(v){v?.message!=="User did not share"&&G(r("mediaGallery.shareUnavailable","Sharing not available on this device"))}},A=t.type==="video",F=t.type==="gif",B=t.durationMs?(t.durationMs/1e3).toFixed(1):null,Ge=B?`00:${Number(B)<10?"0":""}${B}`:"00:05.0",Z=!0;return<De visible={ve}transparent={!0}animationType="fade"onRequestClose={D}>
2
+ <C style={o.overlay}>
71
3
 
72
- <View style={previewStyles.header}>
73
- <View style={previewStyles.headerLeft}>
74
- <View style={[
75
- previewStyles.badge,
76
- {
77
- borderColor: isVideo
78
- ? `${AppColors.sky400}80`
79
- : isGif
80
- ? `${AppColors.warningAmber}80`
81
- : `${AppColors.emerald500}80`,
82
- backgroundColor: isVideo
83
- ? `${AppColors.sky400}20`
84
- : isGif
85
- ? `${AppColors.warningAmber}20`
86
- : `${AppColors.emerald500}20`,
87
- },
88
- ]}>
89
- {isVideo ? (<FilmIcon size={13} color={AppColors.sky400}/>) : isGif ? (<GifIcon size={13} color={AppColors.warningAmber}/>) : (<ImageIcon size={13} color={AppColors.emerald500}/>)}
90
- <Text style={[
91
- previewStyles.badgeText,
92
- {
93
- color: isVideo
94
- ? AppColors.sky400
95
- : isGif
96
- ? AppColors.warningAmber
97
- : AppColors.emerald500,
98
- },
99
- ]}>
100
- {item.format.toUpperCase()}
101
- </Text>
102
- </View>
103
- <View style={{ flex: 1, minWidth: 0 }}>
104
- <Text style={previewStyles.title} numberOfLines={1}>
105
- {item.filename}
106
- </Text>
107
- <Text style={previewStyles.subtitle}>
108
- {formatBytes(item.sizeBytes)} • {new Date(item.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' })}
109
- </Text>
110
- </View>
111
- </View>
4
+ <C style={o.header}>
5
+ <I activeOpacity={.8}onPress={O}style={o.headerLeft}>
6
+ <C style={[o.badge,{borderColor:A?`${e.sky400}80`:F?`${e.warningAmber}80`:`${e.emerald500}80`,backgroundColor:A?`${e.sky400}20`:F?`${e.warningAmber}20`:`${e.emerald500}20`}]}>
7
+ {A?<E size={13}color={e.sky400}/>:F?<H size={13}color={e.warningAmber}/>:<Le size={13}color={e.emerald500}/>}
8
+ <T style={[o.badgeText,{color:A?e.sky400:F?e.warningAmber:e.emerald500}]}>
9
+ {t.format.toUpperCase()}
10
+ </T>
11
+ </C>
12
+ <C style={{flex:1,minWidth:0}}>
13
+ <T style={o.title}numberOfLines={1}>
14
+ {t.filename}
15
+ </T>
16
+ <T style={o.subtitle}>
17
+ {Se(t.sizeBytes)} • {new Date(t.timestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}
18
+ </T>
19
+ </C>
20
+ </I>
112
21
 
113
22
 
114
- <View style={previewStyles.headerRight}>
115
- <TouchableScale accessible={true} accessibilityRole="button" accessibilityLabel={t('mediaGallery.delete')} onPress={handleDelete} style={previewStyles.headerDeleteBtn} hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}>
116
- <TrashIcon size={14} color={AppColors.red500}/>
117
- </TouchableScale>
23
+ <C style={o.headerRight}>
24
+ <R accessible={!0}accessibilityRole="button"accessibilityLabel={r("mediaGallery.copyUri","Copy URI")}onPress={O}style={o.headerActionBtn}hitSlop={{top:10,bottom:10,left:10,right:10}}>
25
+ <L size={14}color={e.slate200}/>
26
+ </R>
118
27
 
119
- <TouchableOpacity accessible={true} accessibilityRole="button" accessibilityLabel={isExpanded ? t('mediaGallery.collapse', 'Exit Fullscreen') : t('mediaGallery.expand', 'Expand Fullscreen')} onPress={() => setIsExpanded(!isExpanded)} style={[
120
- previewStyles.headerIconBtn,
121
- isExpanded && { backgroundColor: `${AppColors.sky400}30`, borderColor: `${AppColors.sky400}70` },
122
- ]} hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}>
123
- <ExpandCollapseIcon size={14} isExpanded={isExpanded} color={isExpanded ? AppColors.sky400 : AppColors.white}/>
124
- </TouchableOpacity>
28
+ <R accessible={!0}accessibilityRole="button"accessibilityLabel={r("mediaGallery.share","Share")}onPress={Y}style={[o.headerActionBtn,{backgroundColor:`${e.sky400}20`,borderColor:`${e.sky400}60`}]}hitSlop={{top:10,bottom:10,left:10,right:10}}>
29
+ <Te size={14}color={e.sky400}/>
30
+ </R>
125
31
 
126
- <TouchableOpacity accessible={true} accessibilityRole="button" accessibilityLabel={t('mediaGallery.minimize', 'Minimize')} onPress={onClose} style={previewStyles.headerIconBtn} hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}>
127
- <ChevronDownIcon size={15} color={AppColors.white}/>
128
- </TouchableOpacity>
129
- </View>
130
- </View>
32
+ <R accessible={!0}accessibilityRole="button"accessibilityLabel={r("mediaGallery.delete")}onPress={$e}style={o.headerDeleteBtn}hitSlop={{top:10,bottom:10,left:10,right:10}}>
33
+ <Ue size={14}color={e.red500}/>
34
+ </R>
35
+
36
+ <I accessible={!0}accessibilityRole="button"accessibilityLabel={z?r("mediaGallery.collapse","Exit Fullscreen"):r("mediaGallery.expand","Expand Fullscreen")}onPress={()=>ze(!z)}style={[o.headerIconBtn,z&&{backgroundColor:`${e.sky400}30`,borderColor:`${e.sky400}70`}]}hitSlop={{top:10,bottom:10,left:10,right:10}}>
37
+ <We size={14}isExpanded={z}color={z?e.sky400:e.white}/>
38
+ </I>
39
+
40
+ <I accessible={!0}accessibilityRole="button"accessibilityLabel={r("mediaGallery.minimize","Minimize")}onPress={D}style={o.headerIconBtn}hitSlop={{top:10,bottom:10,left:10,right:10}}>
41
+ <Me size={15}color={e.white}/>
42
+ </I>
43
+ </C>
44
+ </C>
131
45
 
132
46
 
133
- <View style={[
134
- previewStyles.stage,
135
- isExpanded && previewStyles.stageExpanded,
136
- !hasBottomToolbar && {
137
- paddingBottom: Platform.OS === 'ios' ? 34 : 16,
138
- },
139
- ]}>
140
- <TouchableOpacity activeOpacity={isVideo ? 0.9 : 1} onPress={isVideo ? handlePlayVideo : undefined} style={[
141
- previewStyles.previewCard,
142
- isExpanded && previewStyles.previewCardExpanded,
143
- ]}>
144
- {isVideo ? (item.thumbnailUri && !imageError ? (<>
145
- <Image source={{ uri: item.thumbnailUri }} style={previewStyles.image} resizeMode="contain" onError={() => setImageError(true)}/>
146
- <View style={previewStyles.videoImageOverlay}/>
147
- </>) : (<View style={previewStyles.videoFallbackBackdrop}>
148
- <View style={previewStyles.videoFallbackGlow}/>
149
- <FilmIcon size={52} color={AppColors.sky400}/>
150
- <Text style={previewStyles.videoFallbackTitle}>
151
- {t('mediaGallery.playVideo', 'Play Video')}
152
- </Text>
153
- <Text style={previewStyles.videoFallbackSubtitle}>
154
- {item.width && item.height ? `${item.width} × ${item.height}` : 'HD Video'} • MP4
155
- </Text>
156
- </View>)) : (<Image source={{ uri: item.uri }} style={previewStyles.image} resizeMode="contain" onError={() => setImageError(true)}/>)}
47
+ <C style={[o.stage,z&&o.stageExpanded,!Z&&{paddingBottom:V.OS==="ios"?34:16}]}>
48
+ <I activeOpacity={A?.9:1}onPress={A?X:void 0}style={[o.previewCard,z&&o.previewCardExpanded]}>
49
+ {A?t.thumbnailUri&&!Ie?<>
50
+ <_ source={{uri:t.thumbnailUri}}style={o.image}resizeMode="contain"onError={()=>q(!0)}/>
51
+ <C style={o.videoImageOverlay}/>
52
+ </>:<C style={o.videoFallbackBackdrop}>
53
+ <C style={o.videoFallbackGlow}/>
54
+ <E size={44}color={e.sky400}/>
55
+ <T style={o.videoFallbackSubtitle}>
56
+ {t.width&&t.height?`${t.width} \xD7 ${t.height}`:"HD Video"} • MP4
57
+ </T>
58
+ </C>:<_ source={{uri:t.uri}}style={o.image}resizeMode="contain"onError={()=>q(!0)}/>}
157
59
 
158
60
 
159
- {isVideo && (<View style={previewStyles.centerPlayOverlay}>
160
- <View style={previewStyles.centerPlayCircle}>
161
- <PlayIcon size={30} color={AppColors.white}/>
162
- </View>
163
- <Text style={previewStyles.centerPlayText}>
164
- {t('mediaGallery.playVideo', 'Play Video')}
165
- </Text>
166
- </View>)}
61
+ {A&&<C style={o.centerPlayOverlay}>
62
+ <C style={o.centerPlayCircle}>
63
+ <Ce size={28}color={e.white}/>
64
+ </C>
65
+ <T style={o.centerPlayText}>
66
+ {r("mediaGallery.playVideo","Play Video")}
67
+ </T>
68
+ </C>}
167
69
 
168
70
 
169
- {isVideo && (<View style={previewStyles.videoBadgeOverlay}>
170
- <View style={previewStyles.playPill}>
171
- <FilmIcon size={13} color={AppColors.white}/>
172
- <Text style={previewStyles.playPillText}>
173
- {durationSec ? `${durationSec}s` : 'VIDEO'}
174
- </Text>
175
- </View>
176
- </View>)}
71
+ {A&&<C style={o.videoBadgeOverlay}>
72
+ <C style={o.playPill}>
73
+ <E size={12}color={e.sky400}/>
74
+ <T style={o.playPillText}>
75
+ {B?`${B}s`:"VIDEO"}
76
+ </T>
77
+ </C>
78
+ </C>}
177
79
 
178
80
 
179
- {isGif && (<View style={previewStyles.videoBadgeOverlay}>
180
- <View style={[previewStyles.playPill, { backgroundColor: `${AppColors.warningAmber}CC` }]}>
181
- <GifIcon size={13} color={AppColors.white}/>
182
- <Text style={previewStyles.playPillText}>ANIMATED GIF</Text>
183
- </View>
184
- </View>)}
81
+ {F&&<C style={o.videoBadgeOverlay}>
82
+ <C style={[o.playPill,{backgroundColor:`${e.warningAmber}CC`}]}>
83
+ <H size={12}color={e.white}/>
84
+ <T style={o.playPillText}>ANIMATED GIF</T>
85
+ </C>
86
+ </C>}
185
87
 
186
88
 
187
- <View style={previewStyles.floatingMetaBadge}>
188
- <Text style={previewStyles.floatingMetaText}>
189
- {item.width && item.height ? `${item.width} × ${item.height} • ` : ''}
190
- {formatBytes(item.sizeBytes)}
191
- {durationSec ? ` • ${durationSec}s` : ''}
192
- </Text>
193
- </View>
194
- </TouchableOpacity>
195
- </View>
89
+ <I activeOpacity={.8}onPress={O}style={o.floatingMetaBadge}>
90
+ <L size={11}color={e.sky400}/>
91
+ <T style={o.floatingMetaText}>
92
+ {t.width&&t.height?`${t.width} \xD7 ${t.height} \u2022 `:""}
93
+ {Se(t.sizeBytes)}
94
+ </T>
95
+ </I>
96
+ </I>
97
+ </C>
196
98
 
197
99
 
198
- {isVideo && (<View style={previewStyles.videoControlsPanel}>
100
+ {A&&<C style={o.videoControlsPanel}>
199
101
 
200
- <View style={previewStyles.progressSection}>
201
- <Text style={previewStyles.timeLabel}>
202
- 00:0{Math.floor(scrubPosition * (Number(durationSec) || 5))}
203
- </Text>
204
- <TouchableOpacity activeOpacity={0.8} onPress={() => setScrubPosition(pos => (pos >= 0.9 ? 0.1 : pos + 0.3))} style={previewStyles.progressTrack}>
205
- <View style={[
206
- previewStyles.progressFill,
207
- { width: `${Math.max(10, Math.min(100, scrubPosition * 100))}%` },
208
- ]}/>
209
- <View style={[
210
- previewStyles.scrubberThumb,
211
- { left: `${Math.max(8, Math.min(96, scrubPosition * 100))}%` },
212
- ]}/>
213
- </TouchableOpacity>
214
- <Text style={previewStyles.timeLabel}>{formattedDuration}</Text>
215
- </View>
102
+ <C style={o.progressSection}>
103
+ <T style={o.timeLabel}>
104
+ 00:0{Math.floor(W*(Number(B)||5))}
105
+ </T>
106
+ <I activeOpacity={.8}onPress={()=>Re(v=>v>=.9?.1:v+.3)}style={o.progressTrack}>
107
+ <C style={[o.progressFill,{width:`${Math.max(10,Math.min(100,W*100))}%`}]}/>
108
+ <C style={[o.scrubberThumb,{left:`${Math.max(8,Math.min(96,W*100))}%`}]}/>
109
+ </I>
110
+ <T style={o.timeLabel}>{Ge}</T>
111
+ </C>
216
112
 
217
113
 
218
- <View style={previewStyles.controlsRow}>
114
+ <C style={o.controlsRow}>
219
115
 
220
- <TouchableOpacity onPress={handlePlayVideo} style={previewStyles.controlActionPill}>
221
- {isPlaying ? (<PauseIcon size={14} color={AppColors.sky400}/>) : (<PlayIcon size={14} color={AppColors.sky400}/>)}
222
- <Text style={[previewStyles.controlActionText, { color: AppColors.sky400 }]}>
223
- {isPlaying ? t('mediaGallery.pause', 'Pause') : t('mediaGallery.play', 'Play')}
224
- </Text>
225
- </TouchableOpacity>
116
+ <I onPress={X}style={o.controlActionPill}>
117
+ {J?<Ee size={14}color={e.sky400}/>:<Ce size={14}color={e.sky400}/>}
118
+ <T style={[o.controlActionText,{color:e.sky400}]}>
119
+ {J?r("mediaGallery.pause","Pause"):r("mediaGallery.play","Play")}
120
+ </T>
121
+ </I>
226
122
 
227
123
 
228
- <View style={previewStyles.speedGroup}>
229
- {['1.0x', '1.5x', '2.0x'].map(speed => (<TouchableOpacity key={speed} onPress={() => setPlaybackSpeed(speed)} style={[
230
- previewStyles.speedBtn,
231
- playbackSpeed === speed && previewStyles.speedBtnActive,
232
- ]}>
233
- <Text style={[
234
- previewStyles.speedText,
235
- playbackSpeed === speed && previewStyles.speedTextActive,
236
- ]}>
237
- {speed}
238
- </Text>
239
- </TouchableOpacity>))}
240
- </View>
124
+ <C style={o.speedGroup}>
125
+ {["1.0x","1.5x","2.0x"].map(v=><I key={v}onPress={()=>Pe(v)}style={[o.speedBtn,Q===v&&o.speedBtnActive]}>
126
+ <T style={[o.speedText,Q===v&&o.speedTextActive]}>
127
+ {v}
128
+ </T>
129
+ </I>)}
130
+ </C>
241
131
 
242
132
 
243
- <TouchableOpacity onPress={() => setIsLooping(!isLooping)} style={[
244
- previewStyles.loopPill,
245
- isLooping && previewStyles.loopPillActive,
246
- ]}>
247
- <RepeatIcon size={12} color={isLooping ? AppColors.sky400 : AppColors.whiteAlpha60}/>
248
- <Text style={[
249
- previewStyles.loopText,
250
- isLooping && previewStyles.loopTextActive,
251
- ]}>
252
- {isLooping ? 'Loop: ON' : 'Loop: OFF'}
253
- </Text>
254
- </TouchableOpacity>
255
- </View>
256
- </View>)}
133
+ <I onPress={()=>Be(!$)}style={[o.loopPill,$&&o.loopPillActive]}>
134
+ <He size={12}color={$?e.sky400:e.whiteAlpha60}/>
135
+ <T style={[o.loopText,$&&o.loopTextActive]}>
136
+ {$?"Loop: ON":"Loop: OFF"}
137
+ </T>
138
+ </I>
139
+ </C>
140
+ </C>}
257
141
 
258
142
 
259
- {hasBottomToolbar && (<View style={previewStyles.footer}>
260
- {isVideo && (<TouchableScale onPress={handlePlayVideo} style={[
261
- previewStyles.actionBtn,
262
- {
263
- backgroundColor: `${AppColors.sky400}25`,
264
- borderColor: `${AppColors.sky400}70`,
265
- },
266
- ]}>
267
- <PlayIcon size={15} color={AppColors.sky400}/>
268
- <Text style={[previewStyles.actionText, { color: AppColors.sky400, fontFamily: AppFonts.interSemiBold }]}>
269
- {t('mediaGallery.playVideo', 'Play Video')}
270
- </Text>
271
- </TouchableScale>)}
143
+ {Z&&<C style={o.footer}>
144
+ <R onPress={O}style={[o.actionBtn,{backgroundColor:e.whiteAlpha08,borderColor:e.whiteAlpha15}]}>
145
+ <L size={14}color={e.slate200}/>
146
+ <T style={[o.actionText,{color:e.slate200}]}>
147
+ {r("mediaGallery.copyUri","Copy URI")}
148
+ </T>
149
+ </R>
150
+
151
+ {M&&A&&<R onPress={Fe}disabled={U}style={[o.actionBtn,{backgroundColor:`${e.warningAmber}22`,borderColor:`${e.warningAmber}70`}]}>
152
+ <H size={15}color={e.warningAmber}/>
153
+ <T style={[o.actionText,{color:e.warningAmber}]}>
154
+ {r(U?"mediaGallery.converting":"mediaGallery.convertToGif")}
155
+ </T>
156
+ </R>}
272
157
 
273
- {onConvertToGif && isVideo && (<TouchableScale onPress={handleConvert} disabled={isConverting} style={[
274
- previewStyles.actionBtn,
275
- {
276
- backgroundColor: `${AppColors.warningAmber}25`,
277
- borderColor: `${AppColors.warningAmber}70`,
278
- },
279
- ]}>
280
- <GifIcon size={15} color={AppColors.warningAmber}/>
281
- <Text style={[previewStyles.actionText, { color: AppColors.warningAmber }]}>
282
- {isConverting ? t('mediaGallery.converting') : t('mediaGallery.convertToGif')}
283
- </Text>
284
- </TouchableScale>)}
285
- </View>)}
286
- </View>
287
- </Modal>);
288
- };
289
- const previewStyles = StyleSheet.create({
290
- overlay: {
291
- flex: 1,
292
- backgroundColor: '#090D16FA',
293
- justifyContent: 'space-between',
294
- },
295
- header: {
296
- flexDirection: 'row',
297
- alignItems: 'center',
298
- justifyContent: 'space-between',
299
- paddingHorizontal: 16,
300
- paddingTop: Platform.OS === 'ios' ? 52 : 20,
301
- paddingBottom: 14,
302
- borderBottomWidth: 1,
303
- borderBottomColor: AppColors.borderGlassLight,
304
- backgroundColor: AppColors.headerGlassDark,
305
- },
306
- headerLeft: {
307
- flexDirection: 'row',
308
- alignItems: 'center',
309
- gap: 10,
310
- flex: 1,
311
- minWidth: 0,
312
- marginRight: 10,
313
- },
314
- headerRight: {
315
- flexDirection: 'row',
316
- alignItems: 'center',
317
- gap: 8,
318
- },
319
- badge: {
320
- flexDirection: 'row',
321
- alignItems: 'center',
322
- gap: 4,
323
- paddingHorizontal: 8,
324
- paddingVertical: 4,
325
- borderRadius: 6,
326
- borderWidth: 1,
327
- },
328
- badgeText: {
329
- fontFamily: AppFonts.interBold,
330
- fontSize: 10.5,
331
- letterSpacing: 0.4,
332
- },
333
- title: {
334
- fontFamily: AppFonts.interSemiBold,
335
- fontSize: 13.5,
336
- color: AppColors.white,
337
- },
338
- subtitle: {
339
- fontFamily: AppFonts.interRegular,
340
- fontSize: 11,
341
- color: AppColors.whiteAlpha60,
342
- marginTop: 1,
343
- },
344
- headerDeleteBtn: {
345
- width: 32,
346
- height: 32,
347
- borderRadius: 16,
348
- backgroundColor: `${AppColors.red500}20`,
349
- borderWidth: 1,
350
- borderColor: `${AppColors.red500}60`,
351
- alignItems: 'center',
352
- justifyContent: 'center',
353
- },
354
- headerIconBtn: {
355
- width: 32,
356
- height: 32,
357
- borderRadius: 16,
358
- backgroundColor: AppColors.whiteAlpha12,
359
- borderWidth: 1,
360
- borderColor: AppColors.whiteAlpha20,
361
- alignItems: 'center',
362
- justifyContent: 'center',
363
- },
364
- stage: {
365
- flex: 1,
366
- alignItems: 'center',
367
- justifyContent: 'center',
368
- paddingHorizontal: 10,
369
- paddingTop: 10,
370
- paddingBottom: 10,
371
- },
372
- stageExpanded: {
373
- paddingHorizontal: 0,
374
- paddingTop: 0,
375
- paddingBottom: 0,
376
- },
377
- previewCard: {
378
- flex: 1,
379
- width: '100%',
380
- borderRadius: 14,
381
- overflow: 'hidden',
382
- backgroundColor: '#05070D',
383
- borderWidth: 1,
384
- borderColor: AppColors.borderGlassLight,
385
- alignItems: 'center',
386
- justifyContent: 'center',
387
- position: 'relative',
388
- },
389
- previewCardExpanded: {
390
- borderRadius: 0,
391
- borderWidth: 0,
392
- },
393
- image: {
394
- width: '100%',
395
- height: '100%',
396
- },
397
- videoImageOverlay: {
398
- ...StyleSheet.absoluteFillObject,
399
- backgroundColor: 'rgba(5, 7, 13, 0.25)',
400
- },
401
- videoFallbackBackdrop: {
402
- flex: 1,
403
- width: '100%',
404
- backgroundColor: '#070C18',
405
- alignItems: 'center',
406
- justifyContent: 'center',
407
- gap: 8,
408
- },
409
- videoFallbackGlow: {
410
- position: 'absolute',
411
- width: 140,
412
- height: 140,
413
- borderRadius: 70,
414
- backgroundColor: `${AppColors.sky400}18`,
415
- },
416
- videoFallbackTitle: {
417
- fontFamily: AppFonts.interSemiBold,
418
- fontSize: 15,
419
- color: AppColors.white,
420
- marginTop: 8,
421
- },
422
- videoFallbackSubtitle: {
423
- fontFamily: AppFonts.interRegular,
424
- fontSize: 12,
425
- color: AppColors.whiteAlpha60,
426
- },
427
- centerPlayOverlay: {
428
- position: 'absolute',
429
- alignItems: 'center',
430
- justifyContent: 'center',
431
- gap: 8,
432
- },
433
- centerPlayCircle: {
434
- width: 64,
435
- height: 64,
436
- borderRadius: 32,
437
- backgroundColor: `${AppColors.sky400}E0`,
438
- alignItems: 'center',
439
- justifyContent: 'center',
440
- paddingLeft: 3,
441
- shadowColor: AppColors.sky400,
442
- shadowOffset: { width: 0, height: 4 },
443
- shadowOpacity: 0.5,
444
- shadowRadius: 10,
445
- elevation: 8,
446
- },
447
- centerPlayText: {
448
- fontFamily: AppFonts.interSemiBold,
449
- fontSize: 13,
450
- color: AppColors.white,
451
- letterSpacing: 0.3,
452
- textShadowColor: 'rgba(0,0,0,0.7)',
453
- textShadowOffset: { width: 0, height: 1 },
454
- textShadowRadius: 3,
455
- },
456
- videoBadgeOverlay: {
457
- position: 'absolute',
458
- bottom: 12,
459
- left: 12,
460
- },
461
- playPill: {
462
- flexDirection: 'row',
463
- alignItems: 'center',
464
- gap: 6,
465
- backgroundColor: `${AppColors.slate900}D9`,
466
- paddingHorizontal: 10,
467
- paddingVertical: 5,
468
- borderRadius: 16,
469
- borderWidth: 1,
470
- borderColor: AppColors.whiteAlpha20,
471
- },
472
- playPillText: {
473
- fontFamily: AppFonts.interSemiBold,
474
- fontSize: 11,
475
- color: AppColors.white,
476
- letterSpacing: 0.3,
477
- },
478
- floatingMetaBadge: {
479
- position: 'absolute',
480
- bottom: 10,
481
- backgroundColor: `${AppColors.slate900}D9`,
482
- paddingHorizontal: 10,
483
- paddingVertical: 4.5,
484
- borderRadius: 8,
485
- borderWidth: 1,
486
- borderColor: AppColors.whiteAlpha15,
487
- alignItems: 'center',
488
- justifyContent: 'center',
489
- },
490
- floatingMetaText: {
491
- fontFamily: AppFonts.interMedium,
492
- fontSize: 10.5,
493
- color: AppColors.slate200,
494
- letterSpacing: 0.2,
495
- },
496
- videoControlsPanel: {
497
- paddingHorizontal: 16,
498
- paddingTop: 8,
499
- paddingBottom: 6,
500
- backgroundColor: AppColors.headerGlassDark,
501
- borderTopWidth: 1,
502
- borderTopColor: AppColors.borderGlassLight,
503
- gap: 8,
504
- },
505
- progressSection: {
506
- flexDirection: 'row',
507
- alignItems: 'center',
508
- gap: 10,
509
- },
510
- timeLabel: {
511
- fontFamily: AppFonts.interMedium,
512
- fontSize: 11,
513
- color: AppColors.whiteAlpha60,
514
- minWidth: 42,
515
- },
516
- progressTrack: {
517
- flex: 1,
518
- height: 6,
519
- borderRadius: 3,
520
- backgroundColor: AppColors.whiteAlpha15,
521
- justifyContent: 'center',
522
- position: 'relative',
523
- },
524
- progressFill: {
525
- height: '100%',
526
- borderRadius: 3,
527
- backgroundColor: AppColors.sky400,
528
- },
529
- scrubberThumb: {
530
- position: 'absolute',
531
- width: 12,
532
- height: 12,
533
- borderRadius: 6,
534
- backgroundColor: AppColors.white,
535
- borderWidth: 2,
536
- borderColor: AppColors.sky400,
537
- top: -3,
538
- marginLeft: -6,
539
- },
540
- controlsRow: {
541
- flexDirection: 'row',
542
- alignItems: 'center',
543
- justifyContent: 'space-between',
544
- paddingVertical: 2,
545
- },
546
- controlActionPill: {
547
- flexDirection: 'row',
548
- alignItems: 'center',
549
- gap: 5,
550
- paddingHorizontal: 10,
551
- paddingVertical: 5,
552
- borderRadius: 6,
553
- backgroundColor: `${AppColors.sky400}18`,
554
- borderWidth: 1,
555
- borderColor: `${AppColors.sky400}50`,
556
- },
557
- controlActionText: {
558
- fontFamily: AppFonts.interSemiBold,
559
- fontSize: 11.5,
560
- },
561
- speedGroup: {
562
- flexDirection: 'row',
563
- alignItems: 'center',
564
- backgroundColor: AppColors.whiteAlpha08,
565
- borderRadius: 6,
566
- borderWidth: 1,
567
- borderColor: AppColors.whiteAlpha12,
568
- padding: 2,
569
- gap: 2,
570
- },
571
- speedBtn: {
572
- paddingHorizontal: 7,
573
- paddingVertical: 3,
574
- borderRadius: 4,
575
- },
576
- speedBtnActive: {
577
- backgroundColor: `${AppColors.sky400}30`,
578
- },
579
- speedText: {
580
- fontFamily: AppFonts.interMedium,
581
- fontSize: 10.5,
582
- color: AppColors.whiteAlpha60,
583
- },
584
- speedTextActive: {
585
- color: AppColors.sky400,
586
- fontFamily: AppFonts.interBold,
587
- },
588
- loopPill: {
589
- flexDirection: 'row',
590
- alignItems: 'center',
591
- gap: 4,
592
- paddingHorizontal: 8,
593
- paddingVertical: 5,
594
- borderRadius: 6,
595
- backgroundColor: AppColors.whiteAlpha08,
596
- borderWidth: 1,
597
- borderColor: AppColors.whiteAlpha12,
598
- },
599
- loopPillActive: {
600
- backgroundColor: `${AppColors.sky400}18`,
601
- borderColor: `${AppColors.sky400}50`,
602
- },
603
- loopText: {
604
- fontFamily: AppFonts.interMedium,
605
- fontSize: 10.5,
606
- color: AppColors.whiteAlpha60,
607
- },
608
- loopTextActive: {
609
- color: AppColors.sky400,
610
- fontFamily: AppFonts.interSemiBold,
611
- },
612
- footer: {
613
- flexDirection: 'row',
614
- alignItems: 'center',
615
- justifyContent: 'center',
616
- flexWrap: 'wrap',
617
- gap: 8,
618
- paddingHorizontal: 16,
619
- paddingTop: 8,
620
- paddingBottom: Platform.OS === 'ios' ? 34 : 16,
621
- borderTopWidth: 1,
622
- borderTopColor: AppColors.borderGlassLight,
623
- backgroundColor: AppColors.headerGlassDark,
624
- },
625
- actionBtn: {
626
- flexDirection: 'row',
627
- alignItems: 'center',
628
- gap: 6,
629
- paddingHorizontal: 16,
630
- paddingVertical: 9,
631
- borderRadius: 8,
632
- backgroundColor: AppColors.whiteAlpha08,
633
- borderWidth: 1,
634
- borderColor: AppColors.whiteAlpha15,
635
- },
636
- actionText: {
637
- fontFamily: AppFonts.interMedium,
638
- fontSize: 12,
639
- color: AppColors.white,
640
- },
641
- });
158
+ <R onPress={Y}style={[o.actionBtn,{backgroundColor:`${e.sky400}22`,borderColor:`${e.sky400}70`}]}>
159
+ <Te size={14}color={e.sky400}/>
160
+ <T style={[o.actionText,{color:e.sky400,fontFamily:S.interSemiBold}]}>
161
+ {r("mediaGallery.share","Share")}
162
+ </T>
163
+ </R>
164
+ </C>}
165
+ </C>
166
+ </De>};const o=oe.create({overlay:{flex:1,backgroundColor:"#090D16FA",justifyContent:"space-between"},header:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingHorizontal:16,paddingTop:V.OS==="ios"?52:20,paddingBottom:14,borderBottomWidth:1,borderBottomColor:e.borderGlassLight,backgroundColor:e.headerGlassDark},headerLeft:{flexDirection:"row",alignItems:"center",gap:10,flex:1,minWidth:0,marginRight:10},headerRight:{flexDirection:"row",alignItems:"center",gap:8},badge:{flexDirection:"row",alignItems:"center",gap:4,paddingHorizontal:8,paddingVertical:4,borderRadius:6,borderWidth:1},badgeText:{fontFamily:S.interBold,fontSize:10.5,letterSpacing:.4},title:{fontFamily:S.interSemiBold,fontSize:13.5,color:e.white},subtitle:{fontFamily:S.interRegular,fontSize:11,color:e.whiteAlpha60,marginTop:1},headerActionBtn:{width:32,height:32,borderRadius:16,backgroundColor:e.whiteAlpha12,borderWidth:1,borderColor:e.whiteAlpha20,alignItems:"center",justifyContent:"center"},headerShareBtn:{width:32,height:32,borderRadius:16,backgroundColor:`${e.sky400}20`,borderWidth:1,borderColor:`${e.sky400}60`,alignItems:"center",justifyContent:"center"},headerDeleteBtn:{width:32,height:32,borderRadius:16,backgroundColor:`${e.red500}20`,borderWidth:1,borderColor:`${e.red500}60`,alignItems:"center",justifyContent:"center"},headerIconBtn:{width:32,height:32,borderRadius:16,backgroundColor:e.whiteAlpha12,borderWidth:1,borderColor:e.whiteAlpha20,alignItems:"center",justifyContent:"center"},stage:{flex:1,alignItems:"center",justifyContent:"center",paddingHorizontal:10,paddingTop:10,paddingBottom:10},stageExpanded:{paddingHorizontal:0,paddingTop:0,paddingBottom:0},previewCard:{flex:1,width:"100%",borderRadius:14,overflow:"hidden",backgroundColor:"#05070D",borderWidth:1,borderColor:e.borderGlassLight,alignItems:"center",justifyContent:"center",position:"relative"},previewCardExpanded:{borderRadius:0,borderWidth:0},image:{width:"100%",height:"100%"},videoImageOverlay:{...oe.absoluteFillObject,backgroundColor:"rgba(5, 7, 13, 0.25)"},videoFallbackBackdrop:{flex:1,width:"100%",backgroundColor:"#070C18",alignItems:"center",justifyContent:"center",gap:8},videoFallbackGlow:{position:"absolute",width:140,height:140,borderRadius:70,backgroundColor:`${e.sky400}18`},videoFallbackTitle:{fontFamily:S.interSemiBold,fontSize:15,color:e.white,marginTop:8},videoFallbackSubtitle:{fontFamily:S.interRegular,fontSize:12,color:e.whiteAlpha60},centerPlayOverlay:{position:"absolute",alignItems:"center",justifyContent:"center",gap:8},centerPlayCircle:{width:64,height:64,borderRadius:32,backgroundColor:`${e.sky400}E0`,alignItems:"center",justifyContent:"center",paddingLeft:3,shadowColor:e.sky400,shadowOffset:{width:0,height:4},shadowOpacity:.5,shadowRadius:10,elevation:8},centerPlayText:{fontFamily:S.interSemiBold,fontSize:13,color:e.white,letterSpacing:.3,textShadowColor:"rgba(0,0,0,0.7)",textShadowOffset:{width:0,height:1},textShadowRadius:3},videoBadgeOverlay:{position:"absolute",bottom:12,left:12},playPill:{flexDirection:"row",alignItems:"center",gap:6,backgroundColor:`${e.slate900}D9`,paddingHorizontal:10,paddingVertical:5,borderRadius:16,borderWidth:1,borderColor:e.whiteAlpha20},playPillText:{fontFamily:S.interSemiBold,fontSize:11,color:e.white,letterSpacing:.3},floatingMetaBadge:{position:"absolute",bottom:10,backgroundColor:`${e.slate900}D9`,paddingHorizontal:10,paddingVertical:4.5,borderRadius:8,borderWidth:1,borderColor:e.whiteAlpha15,alignItems:"center",justifyContent:"center"},floatingMetaText:{fontFamily:S.interMedium,fontSize:10.5,color:e.slate200,letterSpacing:.2},videoControlsPanel:{paddingHorizontal:16,paddingTop:8,paddingBottom:6,backgroundColor:e.headerGlassDark,borderTopWidth:1,borderTopColor:e.borderGlassLight,gap:8},progressSection:{flexDirection:"row",alignItems:"center",gap:10},timeLabel:{fontFamily:S.interMedium,fontSize:11,color:e.whiteAlpha60,minWidth:42},progressTrack:{flex:1,height:6,borderRadius:3,backgroundColor:e.whiteAlpha15,justifyContent:"center",position:"relative"},progressFill:{height:"100%",borderRadius:3,backgroundColor:e.sky400},scrubberThumb:{position:"absolute",width:12,height:12,borderRadius:6,backgroundColor:e.white,borderWidth:2,borderColor:e.sky400,top:-3,marginLeft:-6},controlsRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingVertical:2},controlActionPill:{flexDirection:"row",alignItems:"center",gap:5,paddingHorizontal:10,paddingVertical:5,borderRadius:6,backgroundColor:`${e.sky400}18`,borderWidth:1,borderColor:`${e.sky400}50`},controlActionText:{fontFamily:S.interSemiBold,fontSize:11.5},speedGroup:{flexDirection:"row",alignItems:"center",backgroundColor:e.whiteAlpha08,borderRadius:6,borderWidth:1,borderColor:e.whiteAlpha12,padding:2,gap:2},speedBtn:{paddingHorizontal:7,paddingVertical:3,borderRadius:4},speedBtnActive:{backgroundColor:`${e.sky400}30`},speedText:{fontFamily:S.interMedium,fontSize:10.5,color:e.whiteAlpha60},speedTextActive:{color:e.sky400,fontFamily:S.interBold},loopPill:{flexDirection:"row",alignItems:"center",gap:4,paddingHorizontal:8,paddingVertical:5,borderRadius:6,backgroundColor:e.whiteAlpha08,borderWidth:1,borderColor:e.whiteAlpha12},loopPillActive:{backgroundColor:`${e.sky400}18`,borderColor:`${e.sky400}50`},loopText:{fontFamily:S.interMedium,fontSize:10.5,color:e.whiteAlpha60},loopTextActive:{color:e.sky400,fontFamily:S.interSemiBold},footer:{flexDirection:"row",alignItems:"center",justifyContent:"center",flexWrap:"wrap",gap:8,paddingHorizontal:16,paddingTop:8,paddingBottom:V.OS==="ios"?34:16,borderTopWidth:1,borderTopColor:e.borderGlassLight,backgroundColor:e.headerGlassDark},actionBtn:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:16,paddingVertical:9,borderRadius:8,backgroundColor:e.whiteAlpha08,borderWidth:1,borderColor:e.whiteAlpha15},actionText:{fontFamily:S.interMedium,fontSize:12,color:e.white}});