react-native-inapp-inspector 2.3.18 → 2.3.20

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 (358) hide show
  1. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +57 -0
  2. package/dist/commonjs/analytics.js +1 -24
  3. package/dist/commonjs/bundle.js +1 -16
  4. package/dist/commonjs/capture.d.ts +2 -0
  5. package/dist/commonjs/capture.js +1 -32
  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.d.ts +1 -0
  19. package/dist/commonjs/components/EmptyState.js +10 -87
  20. package/dist/commonjs/components/EndOfListFooter.js +7 -81
  21. package/dist/commonjs/components/ErrorBoundary.js +72 -566
  22. package/dist/commonjs/components/HeadersSection.js +31 -110
  23. package/dist/commonjs/components/HighlightText.js +17 -58
  24. package/dist/commonjs/components/Inspector/AboutModal.d.ts +6 -0
  25. package/dist/commonjs/components/Inspector/AboutModal.js +351 -0
  26. package/dist/commonjs/components/Inspector/AnalyticsFilterModal.js +98 -797
  27. package/dist/commonjs/components/Inspector/AnalyticsTab.js +284 -930
  28. package/dist/commonjs/components/Inspector/BundleTab.js +551 -2918
  29. package/dist/commonjs/components/Inspector/ConsoleTab.js +79 -492
  30. package/dist/commonjs/components/Inspector/CrashDetail.js +123 -672
  31. package/dist/commonjs/components/Inspector/CrashFilterModal.js +66 -498
  32. package/dist/commonjs/components/Inspector/CrashTab.js +98 -670
  33. package/dist/commonjs/components/Inspector/DebuggingTab.js +64 -871
  34. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +143 -907
  35. package/dist/commonjs/components/Inspector/FabLauncher.js +85 -54
  36. package/dist/commonjs/components/Inspector/FeatureUnderDevNotice.js +6 -99
  37. package/dist/commonjs/components/Inspector/FeedbackModal.d.ts +9 -0
  38. package/dist/commonjs/components/Inspector/FeedbackModal.js +167 -521
  39. package/dist/commonjs/components/Inspector/InspectorContext.js +1 -21
  40. package/dist/commonjs/components/Inspector/InspectorHeader.js +219 -1093
  41. package/dist/commonjs/components/Inspector/LogDetail.js +168 -994
  42. package/dist/commonjs/components/Inspector/MainScreen.js +60 -332
  43. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +136 -278
  44. package/dist/commonjs/components/Inspector/MediaPreviewModal.js +134 -361
  45. package/dist/commonjs/components/Inspector/NavigationTracker.js +1 -12
  46. package/dist/commonjs/components/Inspector/NetworkDetail.js +96 -432
  47. package/dist/commonjs/components/Inspector/NetworkFilterModal.js +60 -576
  48. package/dist/commonjs/components/Inspector/NetworkTab.js +84 -514
  49. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +17 -433
  50. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +25 -298
  51. package/dist/commonjs/components/Inspector/PerformanceTab.js +182 -1397
  52. package/dist/commonjs/components/Inspector/ReduxDetail.js +188 -1089
  53. package/dist/commonjs/components/Inspector/ReduxTab.js +85 -701
  54. package/dist/commonjs/components/Inspector/SettingsPanel.js +431 -3431
  55. package/dist/commonjs/components/Inspector/SkeletonPlaceholder.js +11 -180
  56. package/dist/commonjs/components/Inspector/StorageTab.js +93 -826
  57. package/dist/commonjs/components/Inspector/TabBar.js +47 -183
  58. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +34 -408
  59. package/dist/commonjs/components/JsonViewer.js +168 -380
  60. package/dist/commonjs/components/LogCard.js +57 -567
  61. package/dist/commonjs/components/LogSyntaxHighlighter.js +11 -130
  62. package/dist/commonjs/components/MetaAccordion.js +69 -238
  63. package/dist/commonjs/components/MiniBarChart.js +3 -56
  64. package/dist/commonjs/components/MiniLineChart.js +3 -58
  65. package/dist/commonjs/components/NetworkIcons.d.ts +7 -0
  66. package/dist/commonjs/components/NetworkIcons.js +479 -997
  67. package/dist/commonjs/components/QRCodeView.js +5 -79
  68. package/dist/commonjs/components/SectionHeader.js +15 -37
  69. package/dist/commonjs/components/SegmentedTabs.js +7 -61
  70. package/dist/commonjs/components/SkeletonPlaceholder.js +11 -180
  71. package/dist/commonjs/components/Slider.js +15 -243
  72. package/dist/commonjs/components/SourcePageCard.js +30 -89
  73. package/dist/commonjs/components/Toast.js +5 -147
  74. package/dist/commonjs/components/TouchableScale.js +3 -24
  75. package/dist/commonjs/components/TreeNode.js +55 -130
  76. package/dist/commonjs/console.js +1 -16
  77. package/dist/commonjs/constants/index.js +1 -32
  78. package/dist/commonjs/constants/telemetryConfig.js +1 -6
  79. package/dist/commonjs/constants/version.d.ts +1 -1
  80. package/dist/commonjs/constants/version.js +1 -4
  81. package/dist/commonjs/crash.js +1 -23
  82. package/dist/commonjs/customHooks/analyticsLogger.js +1 -250
  83. package/dist/commonjs/customHooks/bundleAnalyzer.js +1 -957
  84. package/dist/commonjs/customHooks/consoleLogger.js +6 -445
  85. package/dist/commonjs/customHooks/crashHandler.js +7 -656
  86. package/dist/commonjs/customHooks/logFilters.js +1 -23
  87. package/dist/commonjs/customHooks/networkLogger.js +2 -536
  88. package/dist/commonjs/customHooks/performanceTracker.js +63 -750
  89. package/dist/commonjs/customHooks/reduxLogger.js +2 -313
  90. package/dist/commonjs/customHooks/storageInspector.js +1 -435
  91. package/dist/commonjs/customHooks/useAccordion.js +1 -18
  92. package/dist/commonjs/decorators/index.js +1 -100
  93. package/dist/commonjs/helpers/gaAnalyticsRegistry.js +1 -148
  94. package/dist/commonjs/helpers/index.js +8 -921
  95. package/dist/commonjs/helpers/memoryManager.js +1 -99
  96. package/dist/commonjs/helpers/qrGenerator.js +1 -367
  97. package/dist/commonjs/helpers/remoteConfig.js +1 -165
  98. package/dist/commonjs/helpers/searchQueryParser.js +1 -62
  99. package/dist/commonjs/helpers/settingsStore.js +1 -144
  100. package/dist/commonjs/helpers/telemetry.js +1 -501
  101. package/dist/commonjs/helpers/toast.js +1 -20
  102. package/dist/commonjs/i18n/index.js +1 -90
  103. package/dist/commonjs/i18n/locales/en.json +1 -1122
  104. package/dist/commonjs/index.js +5 -2153
  105. package/dist/commonjs/metro.js +6 -468
  106. package/dist/commonjs/native/NativeInspector.d.ts +3 -0
  107. package/dist/commonjs/native/NativeInspector.js +1 -402
  108. package/dist/commonjs/native/NativeNetworkInspector.d.ts +1 -0
  109. package/dist/commonjs/native/NativeNetworkInspector.js +1 -4
  110. package/dist/commonjs/network.js +1 -13
  111. package/dist/commonjs/performance.js +1 -29
  112. package/dist/commonjs/redux.js +1 -20
  113. package/dist/commonjs/storage.js +1 -14
  114. package/dist/commonjs/styles/AppColors.js +1 -423
  115. package/dist/commonjs/styles/AppFonts.js +1 -17
  116. package/dist/commonjs/styles/common.js +1 -190
  117. package/dist/commonjs/styles/index.d.ts +6 -0
  118. package/dist/commonjs/styles/index.js +1 -1589
  119. package/dist/commonjs/types/enums.d.ts +2 -1
  120. package/dist/commonjs/types/enums.js +1 -150
  121. package/dist/commonjs/types/index.js +1 -18
  122. package/dist/commonjs/types/interfaces.d.ts +7 -0
  123. package/dist/commonjs/types/interfaces.js +1 -2
  124. package/dist/esm/analytics.js +1 -2
  125. package/dist/esm/bundle.js +1 -2
  126. package/dist/esm/capture.d.ts +2 -0
  127. package/dist/esm/capture.js +1 -29
  128. package/dist/esm/components/AnalyticsDetail.js +171 -664
  129. package/dist/esm/components/AnalyticsEventCard.js +77 -335
  130. package/dist/esm/components/AnalyticsGraph.js +95 -357
  131. package/dist/esm/components/AnimatedEntrance.js +1 -6
  132. package/dist/esm/components/AppHeaderLogo.js +7 -94
  133. package/dist/esm/components/BrandCircleIcon.js +114 -119
  134. package/dist/esm/components/BrandSquareIcon.js +73 -78
  135. package/dist/esm/components/CodeSnippet.js +58 -595
  136. package/dist/esm/components/ConsoleLogCard.js +91 -526
  137. package/dist/esm/components/CopyButton.js +3 -51
  138. package/dist/esm/components/DiffViewer.js +22 -48
  139. package/dist/esm/components/DomainHeader.js +43 -138
  140. package/dist/esm/components/EmptyState.d.ts +1 -0
  141. package/dist/esm/components/EmptyState.js +17 -56
  142. package/dist/esm/components/EndOfListFooter.js +15 -83
  143. package/dist/esm/components/ErrorBoundary.js +125 -582
  144. package/dist/esm/components/HeadersSection.js +52 -93
  145. package/dist/esm/components/HighlightText.js +17 -53
  146. package/dist/esm/components/Inspector/AboutModal.d.ts +6 -0
  147. package/dist/esm/components/Inspector/AboutModal.js +351 -0
  148. package/dist/esm/components/Inspector/AnalyticsFilterModal.js +225 -886
  149. package/dist/esm/components/Inspector/AnalyticsTab.js +296 -904
  150. package/dist/esm/components/Inspector/BundleTab.js +1175 -3502
  151. package/dist/esm/components/Inspector/ConsoleTab.js +113 -488
  152. package/dist/esm/components/Inspector/CrashDetail.js +236 -747
  153. package/dist/esm/components/Inspector/CrashFilterModal.js +149 -541
  154. package/dist/esm/components/Inspector/CrashTab.js +177 -711
  155. package/dist/esm/components/Inspector/DebuggingTab.js +156 -923
  156. package/dist/esm/components/Inspector/DeviceInfoTab.js +199 -924
  157. package/dist/esm/components/Inspector/FabLauncher.js +85 -49
  158. package/dist/esm/components/Inspector/FeatureUnderDevNotice.js +14 -70
  159. package/dist/esm/components/Inspector/FeedbackModal.d.ts +9 -0
  160. package/dist/esm/components/Inspector/FeedbackModal.js +182 -499
  161. package/dist/esm/components/Inspector/InspectorContext.js +1 -12
  162. package/dist/esm/components/Inspector/InspectorHeader.js +309 -1145
  163. package/dist/esm/components/Inspector/LogDetail.js +235 -1023
  164. package/dist/esm/components/Inspector/MainScreen.js +86 -320
  165. package/dist/esm/components/Inspector/MediaGalleryTab.js +157 -259
  166. package/dist/esm/components/Inspector/MediaPreviewModal.js +153 -340
  167. package/dist/esm/components/Inspector/NavigationTracker.js +1 -10
  168. package/dist/esm/components/Inspector/NetworkDetail.js +141 -472
  169. package/dist/esm/components/Inspector/NetworkFilterModal.js +122 -597
  170. package/dist/esm/components/Inspector/NetworkTab.js +125 -517
  171. package/dist/esm/components/Inspector/NpmStarPrompt.js +58 -434
  172. package/dist/esm/components/Inspector/NpmUpdateToast.js +45 -281
  173. package/dist/esm/components/Inspector/PerformanceTab.js +393 -1570
  174. package/dist/esm/components/Inspector/ReduxDetail.js +307 -1170
  175. package/dist/esm/components/Inspector/ReduxTab.js +144 -722
  176. package/dist/esm/components/Inspector/SettingsPanel.js +647 -3609
  177. package/dist/esm/components/Inspector/SkeletonPlaceholder.js +30 -163
  178. package/dist/esm/components/Inspector/StorageTab.js +172 -866
  179. package/dist/esm/components/Inspector/TabBar.js +52 -183
  180. package/dist/esm/components/Inspector/UpdateAvailableModal.js +79 -416
  181. package/dist/esm/components/JsonViewer.js +179 -353
  182. package/dist/esm/components/LogCard.js +93 -565
  183. package/dist/esm/components/LogSyntaxHighlighter.js +11 -123
  184. package/dist/esm/components/MetaAccordion.js +136 -267
  185. package/dist/esm/components/MiniBarChart.js +3 -18
  186. package/dist/esm/components/MiniLineChart.js +3 -20
  187. package/dist/esm/components/NetworkIcons.d.ts +7 -0
  188. package/dist/esm/components/NetworkIcons.js +481 -817
  189. package/dist/esm/components/QRCodeView.js +8 -45
  190. package/dist/esm/components/SectionHeader.js +22 -39
  191. package/dist/esm/components/SegmentedTabs.js +8 -57
  192. package/dist/esm/components/SkeletonPlaceholder.js +30 -163
  193. package/dist/esm/components/Slider.js +24 -213
  194. package/dist/esm/components/SourcePageCard.js +65 -86
  195. package/dist/esm/components/Toast.js +10 -117
  196. package/dist/esm/components/TouchableScale.js +3 -19
  197. package/dist/esm/components/TreeNode.js +58 -95
  198. package/dist/esm/console.js +1 -2
  199. package/dist/esm/constants/index.js +1 -28
  200. package/dist/esm/constants/telemetryConfig.js +1 -3
  201. package/dist/esm/constants/version.d.ts +1 -1
  202. package/dist/esm/constants/version.js +1 -1
  203. package/dist/esm/crash.js +1 -2
  204. package/dist/esm/customHooks/analyticsLogger.js +1 -230
  205. package/dist/esm/customHooks/bundleAnalyzer.js +1 -944
  206. package/dist/esm/customHooks/consoleLogger.js +6 -432
  207. package/dist/esm/customHooks/crashHandler.js +7 -630
  208. package/dist/esm/customHooks/logFilters.js +1 -20
  209. package/dist/esm/customHooks/networkLogger.js +2 -519
  210. package/dist/esm/customHooks/performanceTracker.js +63 -723
  211. package/dist/esm/customHooks/reduxLogger.js +2 -293
  212. package/dist/esm/customHooks/storageInspector.js +1 -418
  213. package/dist/esm/customHooks/useAccordion.js +1 -16
  214. package/dist/esm/decorators/index.js +1 -95
  215. package/dist/esm/helpers/gaAnalyticsRegistry.js +1 -143
  216. package/dist/esm/helpers/index.js +8 -861
  217. package/dist/esm/helpers/memoryManager.js +1 -91
  218. package/dist/esm/helpers/qrGenerator.js +1 -364
  219. package/dist/esm/helpers/remoteConfig.js +1 -160
  220. package/dist/esm/helpers/searchQueryParser.js +1 -59
  221. package/dist/esm/helpers/settingsStore.js +1 -134
  222. package/dist/esm/helpers/telemetry.js +1 -489
  223. package/dist/esm/helpers/toast.js +1 -15
  224. package/dist/esm/i18n/index.js +1 -78
  225. package/dist/esm/i18n/locales/en.json +1 -1122
  226. package/dist/esm/index.js +7 -1967
  227. package/dist/esm/metro.js +6 -459
  228. package/dist/esm/native/NativeInspector.d.ts +3 -0
  229. package/dist/esm/native/NativeInspector.js +1 -370
  230. package/dist/esm/native/NativeNetworkInspector.d.ts +1 -0
  231. package/dist/esm/native/NativeNetworkInspector.js +1 -2
  232. package/dist/esm/network.js +1 -1
  233. package/dist/esm/performance.js +1 -2
  234. package/dist/esm/redux.js +1 -1
  235. package/dist/esm/storage.js +1 -1
  236. package/dist/esm/styles/AppColors.js +1 -417
  237. package/dist/esm/styles/AppFonts.js +1 -13
  238. package/dist/esm/styles/common.js +1 -186
  239. package/dist/esm/styles/index.d.ts +6 -0
  240. package/dist/esm/styles/index.js +1 -1551
  241. package/dist/esm/types/enums.d.ts +2 -1
  242. package/dist/esm/types/enums.js +1 -147
  243. package/dist/esm/types/index.js +1 -2
  244. package/dist/esm/types/interfaces.d.ts +7 -0
  245. package/dist/esm/types/interfaces.js +1 -1
  246. package/ios/NetworkInspectorModule.mm +253 -136
  247. package/package.json +5 -3
  248. package/react-native-inapp-inspector.podspec +1 -1
  249. package/src/native/NativeInspector.ts +17 -0
  250. package/src/native/NativeNetworkInspector.ts +1 -0
  251. package/src/analytics.ts +0 -35
  252. package/src/bundle.ts +0 -25
  253. package/src/capture.ts +0 -101
  254. package/src/components/AnalyticsDetail.tsx +0 -870
  255. package/src/components/AnalyticsEventCard.tsx +0 -444
  256. package/src/components/AnalyticsGraph.tsx +0 -583
  257. package/src/components/AnimatedEntrance.tsx +0 -20
  258. package/src/components/AppHeaderLogo.tsx +0 -143
  259. package/src/components/BrandCircleIcon.tsx +0 -144
  260. package/src/components/BrandSquareIcon.tsx +0 -184
  261. package/src/components/CodeSnippet.tsx +0 -725
  262. package/src/components/ConsoleLogCard.tsx +0 -679
  263. package/src/components/CopyButton.tsx +0 -87
  264. package/src/components/DiffViewer.tsx +0 -82
  265. package/src/components/DomainHeader.tsx +0 -224
  266. package/src/components/EmptyState.tsx +0 -95
  267. package/src/components/EndOfListFooter.tsx +0 -100
  268. package/src/components/ErrorBoundary.tsx +0 -688
  269. package/src/components/HeadersSection.tsx +0 -172
  270. package/src/components/HighlightText.tsx +0 -100
  271. package/src/components/Inspector/AnalyticsFilterModal.tsx +0 -1250
  272. package/src/components/Inspector/AnalyticsTab.tsx +0 -1362
  273. package/src/components/Inspector/BundleTab.tsx +0 -4768
  274. package/src/components/Inspector/ConsoleTab.tsx +0 -726
  275. package/src/components/Inspector/CrashDetail.tsx +0 -997
  276. package/src/components/Inspector/CrashFilterModal.tsx +0 -721
  277. package/src/components/Inspector/CrashTab.tsx +0 -933
  278. package/src/components/Inspector/DebuggingTab.tsx +0 -1103
  279. package/src/components/Inspector/DeviceInfoTab.tsx +0 -1397
  280. package/src/components/Inspector/FabLauncher.tsx +0 -80
  281. package/src/components/Inspector/FeatureUnderDevNotice.tsx +0 -94
  282. package/src/components/Inspector/FeedbackModal.tsx +0 -626
  283. package/src/components/Inspector/InspectorContext.tsx +0 -28
  284. package/src/components/Inspector/InspectorHeader.tsx +0 -1545
  285. package/src/components/Inspector/LogDetail.tsx +0 -1431
  286. package/src/components/Inspector/MainScreen.tsx +0 -459
  287. package/src/components/Inspector/MediaGalleryTab.tsx +0 -355
  288. package/src/components/Inspector/MediaPreviewModal.tsx +0 -435
  289. package/src/components/Inspector/NavigationTracker.tsx +0 -13
  290. package/src/components/Inspector/NetworkDetail.tsx +0 -795
  291. package/src/components/Inspector/NetworkFilterModal.tsx +0 -730
  292. package/src/components/Inspector/NetworkTab.tsx +0 -820
  293. package/src/components/Inspector/NpmStarPrompt.tsx +0 -532
  294. package/src/components/Inspector/NpmUpdateToast.tsx +0 -387
  295. package/src/components/Inspector/PerformanceTab.tsx +0 -1967
  296. package/src/components/Inspector/ReduxDetail.tsx +0 -1651
  297. package/src/components/Inspector/ReduxTab.tsx +0 -987
  298. package/src/components/Inspector/SettingsPanel.tsx +0 -4580
  299. package/src/components/Inspector/SkeletonPlaceholder.tsx +0 -206
  300. package/src/components/Inspector/StorageTab.tsx +0 -1159
  301. package/src/components/Inspector/TabBar.tsx +0 -263
  302. package/src/components/Inspector/UpdateAvailableModal.tsx +0 -555
  303. package/src/components/JsonViewer.tsx +0 -547
  304. package/src/components/LogCard.tsx +0 -694
  305. package/src/components/LogSyntaxHighlighter.tsx +0 -178
  306. package/src/components/MetaAccordion.tsx +0 -355
  307. package/src/components/MiniBarChart.tsx +0 -42
  308. package/src/components/MiniLineChart.tsx +0 -33
  309. package/src/components/NetworkIcons.tsx +0 -2599
  310. package/src/components/QRCodeView.tsx +0 -75
  311. package/src/components/SectionHeader.tsx +0 -101
  312. package/src/components/SegmentedTabs.tsx +0 -83
  313. package/src/components/SkeletonPlaceholder.tsx +0 -206
  314. package/src/components/Slider.tsx +0 -300
  315. package/src/components/SourcePageCard.tsx +0 -150
  316. package/src/components/Toast.tsx +0 -131
  317. package/src/components/TouchableScale.tsx +0 -61
  318. package/src/components/TreeNode.tsx +0 -171
  319. package/src/console.ts +0 -24
  320. package/src/constants/index.ts +0 -41
  321. package/src/constants/telemetryConfig.ts +0 -4
  322. package/src/constants/version.ts +0 -3
  323. package/src/crash.ts +0 -32
  324. package/src/customHooks/analyticsLogger.ts +0 -336
  325. package/src/customHooks/bundleAnalyzer.ts +0 -1256
  326. package/src/customHooks/consoleLogger.ts +0 -530
  327. package/src/customHooks/crashHandler.ts +0 -944
  328. package/src/customHooks/logFilters.ts +0 -32
  329. package/src/customHooks/networkLogger.ts +0 -624
  330. package/src/customHooks/performanceTracker.ts +0 -1014
  331. package/src/customHooks/reduxLogger.ts +0 -406
  332. package/src/customHooks/storageInspector.ts +0 -513
  333. package/src/customHooks/useAccordion.tsx +0 -27
  334. package/src/decorators/index.ts +0 -184
  335. package/src/helpers/gaAnalyticsRegistry.ts +0 -204
  336. package/src/helpers/index.ts +0 -1092
  337. package/src/helpers/memoryManager.ts +0 -138
  338. package/src/helpers/qrGenerator.ts +0 -430
  339. package/src/helpers/remoteConfig.ts +0 -212
  340. package/src/helpers/searchQueryParser.ts +0 -84
  341. package/src/helpers/settingsStore.ts +0 -171
  342. package/src/helpers/telemetry.ts +0 -568
  343. package/src/helpers/toast.ts +0 -17
  344. package/src/i18n/index.ts +0 -104
  345. package/src/i18n/locales/en.json +0 -1125
  346. package/src/index.tsx +0 -2635
  347. package/src/metro.ts +0 -598
  348. package/src/network.ts +0 -22
  349. package/src/performance.ts +0 -38
  350. package/src/redux.ts +0 -23
  351. package/src/storage.ts +0 -18
  352. package/src/styles/AppColors.ts +0 -455
  353. package/src/styles/AppFonts.ts +0 -26
  354. package/src/styles/common.ts +0 -209
  355. package/src/styles/index.ts +0 -1606
  356. package/src/types/enums.ts +0 -208
  357. package/src/types/index.ts +0 -34
  358. package/src/types/interfaces.ts +0 -530
@@ -1,733 +1,199 @@
1
- import React, { useCallback, useMemo, useRef, useState } from 'react';
2
- import { Alert, FlatList, Platform, ScrollView, StyleSheet, Text, TextInput, TouchableOpacity, View, } from 'react-native';
3
- import { useTranslation } from '../../i18n';
4
- import { useInspector } from './InspectorContext';
5
- import TouchableScale from '../TouchableScale';
6
- import AnimatedEntrance from '../AnimatedEntrance';
7
- import EndOfListFooter from '../EndOfListFooter';
8
- import FeatureUnderDevNotice from './FeatureUnderDevNotice';
9
- import HighlightText from '../HighlightText';
10
- import { AppColors } from '../../styles/AppColors';
11
- import { AppFonts } from '../../styles/AppFonts';
12
- import { clearCrashRecords, } from '../../customHooks/crashHandler';
13
- import CrashFilterModal, { DEFAULT_CRASH_FILTERS, isCrashFiltersDefault, } from './CrashFilterModal';
14
- import { SearchIcon, ClearIcon, TrashIcon, TerminalIcon, LayersIcon, ClockIcon, ShieldAlertIcon, FlameIcon, JsIcon, HourglassIcon, SkullIcon, LayoutIcon, ChipIcon, AppleIcon, AndroidIcon, RepeatIcon, CodeBracketsIcon, FilterIcon, } from '../NetworkIcons';
15
- const getRelativeTime = (timestamp) => {
16
- const now = Date.now();
17
- const diff = Math.max(0, now - timestamp);
18
- const seconds = Math.floor(diff / 1000);
19
- const minutes = Math.floor(seconds / 60);
20
- const hours = Math.floor(minutes / 60);
21
- const days = Math.floor(hours / 24);
22
- if (seconds < 60)
23
- return `${seconds}s ago`;
24
- if (minutes < 60)
25
- return `${minutes}m ago`;
26
- if (hours < 24)
27
- return `${hours}h ago`;
28
- return `${days}d ago`;
29
- };
30
- const CrashTab = React.memo(() => {
31
- const { t } = useTranslation();
32
- const { crashRecords, selectedCrash, setSelectedCrash } = useInspector();
33
- const listRef = useRef(null);
34
- const [searchQuery, setSearchQuery] = useState('');
35
- const [filterType, setFilterType] = useState('all');
36
- const [crashFilters, setCrashFilters] = useState(DEFAULT_CRASH_FILTERS);
37
- const [isFilterModalOpen, setIsFilterModalOpen] = useState(false);
38
- const [detailSubTab, setDetailSubTab] = useState('stack');
39
- const stats = useMemo(() => {
40
- const total = crashRecords.length;
41
- let fatalCount = 0;
42
- let jsCount = 0;
43
- let promiseCount = 0;
44
- let renderCount = 0;
45
- let nativeCount = 0;
46
- crashRecords.forEach(c => {
47
- if (c.isFatal)
48
- fatalCount++;
49
- if (c.type === 'js')
50
- jsCount++;
51
- else if (c.type === 'promise')
52
- promiseCount++;
53
- else if (c.type === 'render')
54
- renderCount++;
55
- else if (c.type === 'native')
56
- nativeCount++;
57
- });
58
- return { total, fatalCount, jsCount, promiseCount, renderCount, nativeCount };
59
- }, [crashRecords]);
60
- const filteredList = useMemo(() => {
61
- let list = crashRecords.filter(item => {
62
- if (filterType === 'fatal' && !item.isFatal)
63
- return false;
64
- if (filterType === 'js' && item.type !== 'js')
65
- return false;
66
- if (filterType === 'promise' && item.type !== 'promise')
67
- return false;
68
- if (filterType === 'render' && item.type !== 'render')
69
- return false;
70
- if (filterType === 'native' && item.type !== 'native')
71
- return false;
72
- if (crashFilters.types.size > 0 && !crashFilters.types.has('all')) {
73
- const matches = (crashFilters.types.has('fatal') && item.isFatal) ||
74
- (crashFilters.types.has('js') && item.type === 'js') ||
75
- (crashFilters.types.has('promise') && item.type === 'promise') ||
76
- (crashFilters.types.has('render') && item.type === 'render') ||
77
- (crashFilters.types.has('native') && item.type === 'native');
78
- if (!matches)
79
- return false;
80
- }
81
- if (crashFilters.timeWindow !== 'all') {
82
- const now = Date.now();
83
- const cutoff = crashFilters.timeWindow === '15m'
84
- ? now - 15 * 60 * 1000
85
- : crashFilters.timeWindow === '1h'
86
- ? now - 60 * 60 * 1000
87
- : crashFilters.timeWindow === '24h'
88
- ? now - 24 * 60 * 60 * 1000
89
- : now - 7 * 24 * 60 * 60 * 1000;
90
- if (item.timestamp < cutoff)
91
- return false;
92
- }
93
- if (crashFilters.platform !== 'all') {
94
- const platform = (item.deviceInfo?.platform || '').toLowerCase();
95
- if (platform !== crashFilters.platform)
96
- return false;
97
- }
98
- if (crashFilters.engine !== 'all') {
99
- const isHermes = item.deviceInfo?.isHermes;
100
- if (crashFilters.engine === 'hermes' && isHermes !== true)
101
- return false;
102
- if (crashFilters.engine === 'jsc' && (isHermes === true))
103
- return false;
104
- }
105
- if (searchQuery.trim().length > 0) {
106
- const queryTokens = searchQuery.trim().toLowerCase().split(/\s+/).filter(Boolean);
107
- const searchTarget = [
108
- item.message || '',
109
- item.name || '',
110
- item.stack || '',
111
- item.type || '',
112
- item.deviceInfo?.platform || '',
113
- ...(item.breadcrumbs || []).map(b => `${b.type || ''} ${b.message || ''}`),
114
- ].join(' ').toLowerCase();
115
- return queryTokens.every(token => searchTarget.includes(token));
116
- }
117
- return true;
118
- });
119
- if (crashFilters.sortBy === 'time_asc') {
120
- list = [...list].sort((a, b) => a.timestamp - b.timestamp);
121
- }
122
- return list;
123
- }, [crashRecords, filterType, searchQuery, crashFilters]);
124
- const handleClearAll = () => {
125
- Alert.alert(t('crash.clearTitle'), t('crash.clearMessage'), [
126
- { text: t('crash.clearCancel'), style: 'cancel' },
127
- {
128
- text: t('crash.clearConfirm'),
129
- style: 'destructive',
130
- onPress: () => clearCrashRecords(),
131
- },
132
- ]);
133
- };
134
- const renderCard = useCallback(({ item, index }) => {
135
- const isFatal = item.isFatal;
136
- const typeLabel = item.type.toUpperCase();
137
- const topFrame = item.parsedStack && item.parsedStack.length > 0
138
- ? item.parsedStack.find(f => f.isAppCode) || item.parsedStack[0]
139
- : null;
140
- const typeBadgeBg = item.type === 'native'
141
- ? `${AppColors.errorColor}22`
142
- : item.type === 'render'
143
- ? `${AppColors.purple}22`
144
- : item.type === 'promise'
145
- ? `${AppColors.darkOrange}22`
146
- : `${AppColors.offerPurple}22`;
147
- const typeBadgeColor = item.type === 'native'
148
- ? AppColors.errorColor
149
- : item.type === 'render'
150
- ? AppColors.purple
151
- : item.type === 'promise'
152
- ? AppColors.darkOrange
153
- : AppColors.offerPurple;
154
- return (<AnimatedEntrance index={index} distance={8}>
155
- <TouchableScale onPress={() => {
156
- setSelectedCrash(item);
157
- }} style={[
158
- localStyles.cardContainer,
159
- isFatal && localStyles.fatalCardBorder,
160
- ]}>
1
+ import Y,{useCallback as Z,useMemo as U,useRef as ee,useState as W}from"react";import{Alert as te,FlatList as Ce,Platform as Te,ScrollView as M,StyleSheet as be,Text as T,TextInput as Se,TouchableOpacity as Q,View as C}from"react-native";import{useTranslation as ke}from"../../i18n";import{useInspector as Ie}from"./InspectorContext";import A from"../TouchableScale";import Be from"../AnimatedEntrance";import Ve from"../EndOfListFooter";import Fe from"./FeatureUnderDevNotice";import Re from"../HighlightText";import{AppColors as e}from"../../styles/AppColors";import{AppFonts as S}from"../../styles/AppFonts";import{clearCrashRecords as ve}from"../../customHooks/crashHandler";import Pe,{DEFAULT_CRASH_FILTERS as _,isCrashFiltersDefault as P}from"./CrashFilterModal";import{SearchIcon as He,ClearIcon as Le,TrashIcon as We,TerminalIcon as $e,LayersIcon as Ae,ClockIcon as De,ShieldAlertIcon as Me,FlameIcon as Oe,JsIcon as Ne,HourglassIcon as Ee,SkullIcon as Je,LayoutIcon as Ue,ChipIcon as Qe,AppleIcon as _e,AndroidIcon as Ge,RepeatIcon as Ke,CodeBracketsIcon as Xe,FilterIcon as Ye}from"../NetworkIcons";const Ze=x=>{const V=Date.now(),O=Math.max(0,V-x),R=Math.floor(O/1e3),H=Math.floor(R/60),k=Math.floor(H/60),L=Math.floor(k/24);return R<60?`${R}s ago`:H<60?`${H}m ago`:k<24?`${k}h ago`:`${L}d ago`},et=Y.memo(()=>{const{t:x}=ke(),{crashRecords:V,selectedCrash:O,setSelectedCrash:R}=Ie(),H=ee(null),[k,L]=W(""),[B,N]=W("all"),[b,E]=W(_),[q,J]=W(!1),[tt,rt]=W("stack"),v=U(()=>{const r=V.length;let o=0,w=0,z=0,I=0,$=0;return V.forEach(F=>{F.isFatal&&o++,F.type==="js"?w++:F.type==="promise"?z++:F.type==="render"?I++:F.type==="native"&&$++}),{total:r,fatalCount:o,jsCount:w,promiseCount:z,renderCount:I,nativeCount:$}},[V]),D=U(()=>{let r=V.filter(o=>{if(B==="fatal"&&!o.isFatal||B==="js"&&o.type!=="js"||B==="promise"&&o.type!=="promise"||B==="render"&&o.type!=="render"||B==="native"&&o.type!=="native"||b.types.size>0&&!b.types.has("all")&&!(b.types.has("fatal")&&o.isFatal||b.types.has("js")&&o.type==="js"||b.types.has("promise")&&o.type==="promise"||b.types.has("render")&&o.type==="render"||b.types.has("native")&&o.type==="native"))return!1;if(b.timeWindow!=="all"){const w=Date.now(),z=b.timeWindow==="15m"?w-900*1e3:b.timeWindow==="1h"?w-3600*1e3:b.timeWindow==="24h"?w-1440*60*1e3:w-10080*60*1e3;if(o.timestamp<z)return!1}if(b.platform!=="all"&&(o.deviceInfo?.platform||"").toLowerCase()!==b.platform)return!1;if(b.engine!=="all"){const w=o.deviceInfo?.isHermes;if(b.engine==="hermes"&&w!==!0||b.engine==="jsc"&&w===!0)return!1}if(k.trim().length>0){const w=k.trim().toLowerCase().split(/\s+/).filter(Boolean),z=[o.message||"",o.name||"",o.stack||"",o.type||"",o.deviceInfo?.platform||"",...(o.breadcrumbs||[]).map(I=>`${I.type||""} ${I.message||""}`)].join(" ").toLowerCase();return w.every(I=>z.includes(I))}return!0});return b.sortBy==="time_asc"&&(r=[...r].sort((o,w)=>o.timestamp-w.timestamp)),r},[V,B,k,b]),G=()=>{te.alert(x("crash.clearTitle"),x("crash.clearMessage"),[{text:x("crash.clearCancel"),style:"cancel"},{text:x("crash.clearConfirm"),style:"destructive",onPress:()=>ve()}])},K=Z(({item:r,index:o})=>{const w=r.isFatal,z=r.type.toUpperCase(),I=r.parsedStack&&r.parsedStack.length>0?r.parsedStack.find(X=>X.isAppCode)||r.parsedStack[0]:null,$=r.type==="native"?`${e.errorColor}22`:r.type==="render"?`${e.purple}22`:r.type==="promise"?`${e.darkOrange}22`:`${e.offerPurple}22`,F=r.type==="native"?e.errorColor:r.type==="render"?e.purple:r.type==="promise"?e.darkOrange:e.offerPurple;return<Be index={o}distance={8}>
2
+ <A onPress={()=>{R(r)}}style={[t.cardContainer,w&&t.fatalCardBorder]}>
161
3
 
162
- <View style={localStyles.cardHeader}>
163
- <View style={localStyles.badgeRow}>
164
- <View style={localStyles.sNoBadge}>
165
- <Text style={localStyles.sNoBadgeText}>#{index + 1}</Text>
166
- </View>
167
-
168
- {isFatal ? (<View style={localStyles.fatalBadge}>
169
- <FlameIcon size={10} color={AppColors.white}/>
170
- <Text style={localStyles.fatalBadgeText}>{t('crash.fatalBadge')}</Text>
171
- </View>) : (<View style={localStyles.caughtBadge}>
172
- <Text style={localStyles.caughtBadgeText}>{t('crash.handledBadge')}</Text>
173
- </View>)}
174
-
175
- <View style={[
176
- localStyles.typeBadge,
177
- { backgroundColor: typeBadgeBg },
178
- ]}>
179
- <Text style={[
180
- localStyles.typeBadgeText,
181
- { color: typeBadgeColor },
182
- ]}>
183
- {typeLabel}
184
- </Text>
185
- </View>
186
- </View>
187
-
188
- <View style={localStyles.timeRow}>
189
- <ClockIcon size={11} color={AppColors.grayTextWeak}/>
190
- <Text style={localStyles.timestampText}>
191
- {item.timeStr || new Date(item.timestamp).toLocaleTimeString()}
192
- </Text>
193
- <Text style={localStyles.relativeTimeText}>
194
- {getRelativeTime(item.timestamp)}
195
- </Text>
196
- </View>
197
- </View>
4
+ <C style={t.cardHeader}>
5
+ <C style={t.badgeRow}>
6
+ <C style={t.sNoBadge}>
7
+ <T style={t.sNoBadgeText}>#{o+1}</T>
8
+ </C>
9
+
10
+ {w?<C style={t.fatalBadge}>
11
+ <Oe size={10}color={e.white}/>
12
+ <T style={t.fatalBadgeText}>{x("crash.fatalBadge")}</T>
13
+ </C>:<C style={t.caughtBadge}>
14
+ <T style={t.caughtBadgeText}>{x("crash.handledBadge")}</T>
15
+ </C>}
16
+
17
+ <C style={[t.typeBadge,{backgroundColor:$}]}>
18
+ <T style={[t.typeBadgeText,{color:F}]}>
19
+ {z}
20
+ </T>
21
+ </C>
22
+ </C>
23
+
24
+ <C style={t.timeRow}>
25
+ <De size={11}color={e.grayTextWeak}/>
26
+ <T style={t.timestampText}>
27
+ {r.timeStr||new Date(r.timestamp).toLocaleTimeString()}
28
+ </T>
29
+ <T style={t.relativeTimeText}>
30
+ {Ze(r.timestamp)}
31
+ </T>
32
+ </C>
33
+ </C>
198
34
 
199
35
 
200
- <View style={{ marginVertical: 6 }}>
201
- <HighlightText text={item.message || t('crash.unknownException')} highlight={searchQuery} numberOfLines={3} style={localStyles.errorMessageText}/>
202
- </View>
36
+ <C style={{marginVertical:6}}>
37
+ <Re text={r.message||x("crash.unknownException")}highlight={k}numberOfLines={3}style={t.errorMessageText}/>
38
+ </C>
203
39
 
204
40
 
205
- {topFrame && (<View style={localStyles.locationRow}>
206
- <TerminalIcon size={12} color={AppColors.grayTextWeak}/>
207
- <Text numberOfLines={1} ellipsizeMode="middle" style={localStyles.locationText}>
208
- {topFrame.method !== '<anonymous>' ? `${topFrame.method} ` : ''}
209
- <Text style={{ color: AppColors.purple, fontFamily: AppFonts.interBold }}>
210
- {topFrame.file}:{topFrame.lineNumber}
211
- </Text>
212
- </Text>
213
- </View>)}
41
+ {I&&<C style={t.locationRow}>
42
+ <$e size={12}color={e.grayTextWeak}/>
43
+ <T numberOfLines={1}ellipsizeMode="middle"style={t.locationText}>
44
+ {I.method!=="<anonymous>"?`${I.method} `:""}
45
+ <T style={{color:e.purple,fontFamily:S.interBold}}>
46
+ {I.file}:{I.lineNumber}
47
+ </T>
48
+ </T>
49
+ </C>}
214
50
 
215
51
 
216
- <View style={localStyles.cardFooter}>
217
- <View style={{ flexDirection: 'row', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>
218
- {item.deviceInfo && (<View style={localStyles.metaPill}>
219
- {item.deviceInfo.platform === 'ios' ? (<AppleIcon size={10} color={AppColors.grayText}/>) : item.deviceInfo.platform === 'android' ? (<AndroidIcon size={10} color={AppColors.grayText}/>) : null}
220
- <Text style={localStyles.metaPillText}>
221
- {item.deviceInfo.platform?.toUpperCase()}{' '}
222
- {item.deviceInfo.osVersion || ''}
223
- </Text>
224
- </View>)}
225
- {item.deviceInfo && (<View style={localStyles.metaPill}>
226
- <Text style={localStyles.metaPillText}>
227
- {item.deviceInfo.isHermes ? 'Hermes' : 'JSC'}
228
- </Text>
229
- </View>)}
230
- {item.parsedStack && item.parsedStack.length > 0 && (<View style={localStyles.metaPill}>
231
- <CodeBracketsIcon size={10} color={AppColors.grayText}/>
232
- <Text style={localStyles.metaPillText}>
233
- {item.parsedStack.length}
234
- </Text>
235
- </View>)}
236
- {item.breadcrumbs && item.breadcrumbs.length > 0 && (<View style={localStyles.metaPill}>
237
- <RepeatIcon size={10} color={AppColors.grayText}/>
238
- <Text style={localStyles.metaPillText}>
239
- {item.breadcrumbs.length} trail
240
- </Text>
241
- </View>)}
242
- {item.memoryInfo && (<View style={localStyles.metaPill}>
243
- <Text style={localStyles.metaPillText}>
244
- {item.memoryInfo.usedJSHeapSize} MB
245
- </Text>
246
- </View>)}
247
- </View>
248
- </View>
249
- </TouchableScale>
250
- </AnimatedEntrance>);
251
- }, [searchQuery, setSelectedCrash]);
252
- return (<View style={localStyles.container}>
253
- {crashRecords.length > 0 && (<>
52
+ <C style={t.cardFooter}>
53
+ <C style={{flexDirection:"row",alignItems:"center",gap:6,flexWrap:"wrap"}}>
54
+ {r.deviceInfo&&<C style={t.metaPill}>
55
+ {r.deviceInfo.platform==="ios"?<_e size={10}color={e.grayText}/>:r.deviceInfo.platform==="android"?<Ge size={10}color={e.grayText}/>:null}
56
+ <T style={t.metaPillText}>
57
+ {r.deviceInfo.platform?.toUpperCase()}{" "}
58
+ {r.deviceInfo.osVersion||""}
59
+ </T>
60
+ </C>}
61
+ {r.deviceInfo&&<C style={t.metaPill}>
62
+ <T style={t.metaPillText}>
63
+ {r.deviceInfo.isHermes?"Hermes":"JSC"}
64
+ </T>
65
+ </C>}
66
+ {r.parsedStack&&r.parsedStack.length>0&&<C style={t.metaPill}>
67
+ <Xe size={10}color={e.grayText}/>
68
+ <T style={t.metaPillText}>
69
+ {r.parsedStack.length}
70
+ </T>
71
+ </C>}
72
+ {r.breadcrumbs&&r.breadcrumbs.length>0&&<C style={t.metaPill}>
73
+ <Ke size={10}color={e.grayText}/>
74
+ <T style={t.metaPillText}>
75
+ {r.breadcrumbs.length} trail
76
+ </T>
77
+ </C>}
78
+ {r.memoryInfo&&<C style={t.metaPill}>
79
+ <T style={t.metaPillText}>
80
+ {r.memoryInfo.usedJSHeapSize} MB
81
+ </T>
82
+ </C>}
83
+ </C>
84
+ </C>
85
+ </A>
86
+ </Be>},[k,R]);return<C style={t.container}>
87
+ {V.length>0&&<>
254
88
 
255
- <View style={localStyles.statsBar}>
256
- <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={localStyles.statsScrollContent}>
257
- <View style={[localStyles.statChip, localStyles.statChipActive]}>
258
- <Text style={localStyles.statChipValue}>{stats.total}</Text>
259
- <Text style={localStyles.statChipLabel}>{t('crash.statCrashes')}</Text>
260
- </View>
261
-
262
- <View style={localStyles.statChip}>
263
- <Text style={[localStyles.statChipValue, { color: AppColors.errorColor }]}>
264
- {stats.fatalCount}
265
- </Text>
266
- <Text style={localStyles.statChipLabel}>{t('crash.statFatal')}</Text>
267
- </View>
268
-
269
- <View style={localStyles.statChip}>
270
- <Text style={[localStyles.statChipValue, { color: AppColors.offerPurple }]}>
271
- {stats.jsCount}
272
- </Text>
273
- <Text style={localStyles.statChipLabel}>{t('crash.statJsErrors')}</Text>
274
- </View>
275
-
276
- <View style={localStyles.statChip}>
277
- <Text style={[localStyles.statChipValue, { color: AppColors.darkOrange }]}>
278
- {stats.promiseCount}
279
- </Text>
280
- <Text style={localStyles.statChipLabel}>{t('crash.statPromises')}</Text>
281
- </View>
282
-
283
- <View style={localStyles.statChip}>
284
- <Text style={[localStyles.statChipValue, { color: AppColors.purple }]}>
285
- {stats.renderCount}
286
- </Text>
287
- <Text style={localStyles.statChipLabel}>{t('crash.statRender')}</Text>
288
- </View>
289
-
290
- <View style={localStyles.statChip}>
291
- <Text style={[localStyles.statChipValue, { color: AppColors.skyBlue }]}>
292
- {stats.nativeCount}
293
- </Text>
294
- <Text style={localStyles.statChipLabel}>{t('crash.statNative')}</Text>
295
- </View>
296
- </ScrollView>
297
- </View>
89
+ <C style={t.statsBar}>
90
+ <M horizontal showsHorizontalScrollIndicator={!1}contentContainerStyle={t.statsScrollContent}>
91
+ <C style={[t.statChip,t.statChipActive]}>
92
+ <T style={t.statChipValue}>{v.total}</T>
93
+ <T style={t.statChipLabel}>{x("crash.statCrashes")}</T>
94
+ </C>
95
+
96
+ <C style={t.statChip}>
97
+ <T style={[t.statChipValue,{color:e.errorColor}]}>
98
+ {v.fatalCount}
99
+ </T>
100
+ <T style={t.statChipLabel}>{x("crash.statFatal")}</T>
101
+ </C>
102
+
103
+ <C style={t.statChip}>
104
+ <T style={[t.statChipValue,{color:e.offerPurple}]}>
105
+ {v.jsCount}
106
+ </T>
107
+ <T style={t.statChipLabel}>{x("crash.statJsErrors")}</T>
108
+ </C>
109
+
110
+ <C style={t.statChip}>
111
+ <T style={[t.statChipValue,{color:e.darkOrange}]}>
112
+ {v.promiseCount}
113
+ </T>
114
+ <T style={t.statChipLabel}>{x("crash.statPromises")}</T>
115
+ </C>
116
+
117
+ <C style={t.statChip}>
118
+ <T style={[t.statChipValue,{color:e.purple}]}>
119
+ {v.renderCount}
120
+ </T>
121
+ <T style={t.statChipLabel}>{x("crash.statRender")}</T>
122
+ </C>
123
+
124
+ <C style={t.statChip}>
125
+ <T style={[t.statChipValue,{color:e.skyBlue}]}>
126
+ {v.nativeCount}
127
+ </T>
128
+ <T style={t.statChipLabel}>{x("crash.statNative")}</T>
129
+ </C>
130
+ </M>
131
+ </C>
298
132
 
299
133
 
300
- <View style={localStyles.controlsContainer}>
301
- <View style={localStyles.searchRow}>
302
- <View style={localStyles.searchInputWrapper}>
303
- <SearchIcon color={AppColors.grayTextWeak} size={14}/>
304
- <TextInput value={searchQuery} onChangeText={setSearchQuery} placeholder={t('crash.searchPlaceholder')} placeholderTextColor={AppColors.grayTextWeak} style={localStyles.searchInput} autoCapitalize="none" autoCorrect={false}/>
305
- {searchQuery.length > 0 && (<View style={{ flexDirection: 'row', alignItems: 'center', gap: 4 }}>
306
- <View style={{
307
- backgroundColor: `${AppColors.purple}20`,
308
- borderRadius: 10,
309
- paddingHorizontal: 6,
310
- paddingVertical: 1.5,
311
- }}>
312
- <Text style={{
313
- color: AppColors.purple,
314
- fontSize: 9.5,
315
- fontFamily: AppFonts.interBold,
316
- }}>
317
- {filteredList.length}
318
- </Text>
319
- </View>
320
- <TouchableOpacity onPress={() => setSearchQuery('')} hitSlop={8}>
321
- <ClearIcon color={AppColors.grayTextWeak} size={14}/>
322
- </TouchableOpacity>
323
- </View>)}
324
- </View>
134
+ <C style={t.controlsContainer}>
135
+ <C style={t.searchRow}>
136
+ <C style={t.searchInputWrapper}>
137
+ <He color={e.grayTextWeak}size={14}/>
138
+ <Se value={k}onChangeText={L}placeholder={x("crash.searchPlaceholder")}placeholderTextColor={e.grayTextWeak}style={t.searchInput}autoCapitalize="none"autoCorrect={!1}/>
139
+ {k.length>0&&<C style={{flexDirection:"row",alignItems:"center",gap:4}}>
140
+ <C style={{backgroundColor:`${e.purple}20`,borderRadius:10,paddingHorizontal:6,paddingVertical:1.5}}>
141
+ <T style={{color:e.purple,fontSize:9.5,fontFamily:S.interBold}}>
142
+ {D.length}
143
+ </T>
144
+ </C>
145
+ <Q onPress={()=>L("")}hitSlop={8}>
146
+ <Le color={e.grayTextWeak}size={14}/>
147
+ </Q>
148
+ </C>}
149
+ </C>
325
150
 
326
151
 
327
- <TouchableScale onPress={() => setIsFilterModalOpen(true)} style={[
328
- localStyles.filterButton,
329
- !isCrashFiltersDefault(crashFilters) && {
330
- borderColor: `${AppColors.brandPurple}60`,
331
- backgroundColor: `${AppColors.brandPurple}15`,
332
- },
333
- ]}>
334
- <FilterIcon size={14} color={isCrashFiltersDefault(crashFilters)
335
- ? AppColors.grayTextStrong
336
- : AppColors.brandPurple}/>
337
- {!isCrashFiltersDefault(crashFilters) && (<View style={{
338
- position: 'absolute',
339
- top: 2,
340
- right: 2,
341
- width: 7,
342
- height: 7,
343
- borderRadius: 3.5,
344
- backgroundColor: AppColors.darkOrange,
345
- borderWidth: 1,
346
- borderColor: AppColors.white,
347
- }}/>)}
348
- </TouchableScale>
152
+ <A onPress={()=>J(!0)}style={[t.filterButton,!P(b)&&{borderColor:`${e.brandPurple}60`,backgroundColor:`${e.brandPurple}15`}]}>
153
+ <Ye size={14}color={P(b)?e.grayTextStrong:e.brandPurple}/>
154
+ {!P(b)&&<C style={{position:"absolute",top:2,right:2,width:7,height:7,borderRadius:3.5,backgroundColor:e.darkOrange,borderWidth:1,borderColor:e.white}}/>}
155
+ </A>
349
156
 
350
157
 
351
- <TouchableScale onPress={handleClearAll} style={localStyles.clearButton}>
352
- <TrashIcon size={14} color={AppColors.errorColor}/>
353
- </TouchableScale>
354
- </View>
158
+ <A onPress={G}style={t.clearButton}>
159
+ <We size={14}color={e.errorColor}/>
160
+ </A>
161
+ </C>
355
162
 
356
- <FeatureUnderDevNotice featureName="Crash & Exception Sentinel"/>
163
+ <Fe featureName="Crash & Exception Sentinel"/>
357
164
 
358
165
 
359
- <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={localStyles.filterScrollContent}>
360
- {[
361
- { key: 'all', label: t('crash.filterAll'), Icon: LayersIcon },
362
- { key: 'fatal', label: t('crash.filterFatal'), Icon: SkullIcon },
363
- { key: 'js', label: t('crash.filterJsError'), Icon: JsIcon },
364
- { key: 'promise', label: t('crash.filterPromise'), Icon: HourglassIcon },
365
- { key: 'render', label: t('crash.filterRender'), Icon: LayoutIcon },
366
- { key: 'native', label: t('crash.filterNative'), Icon: ChipIcon },
367
- ].map(chip => {
368
- const isActive = filterType === chip.key;
369
- return (<TouchableOpacity key={chip.key} onPress={() => setFilterType(chip.key)} style={[
370
- localStyles.filterChip,
371
- isActive && localStyles.filterChipActive,
372
- ]}>
373
- <chip.Icon size={12} color={isActive ? AppColors.white : AppColors.grayTextStrong}/>
374
- <Text style={[
375
- localStyles.filterChipText,
376
- isActive && localStyles.filterChipTextActive,
377
- ]}>
378
- {chip.label}
379
- </Text>
380
- </TouchableOpacity>);
381
- })}
382
- </ScrollView>
383
- </View>
384
- </>)}
166
+ <M horizontal showsHorizontalScrollIndicator={!1}contentContainerStyle={t.filterScrollContent}>
167
+ {[{key:"all",label:x("crash.filterAll"),Icon:Ae},{key:"fatal",label:x("crash.filterFatal"),Icon:Je},{key:"js",label:x("crash.filterJsError"),Icon:Ne},{key:"promise",label:x("crash.filterPromise"),Icon:Ee},{key:"render",label:x("crash.filterRender"),Icon:Ue},{key:"native",label:x("crash.filterNative"),Icon:Qe}].map(r=>{const o=B===r.key;return<Q key={r.key}onPress={()=>N(r.key)}style={[t.filterChip,o&&t.filterChipActive]}>
168
+ <r.Icon size={12}color={o?e.white:e.grayTextStrong}/>
169
+ <T style={[t.filterChipText,o&&t.filterChipTextActive]}>
170
+ {r.label}
171
+ </T>
172
+ </Q>})}
173
+ </M>
174
+ </C>
175
+ </>}
385
176
 
386
177
 
387
- {filteredList.length === 0 ? (<ScrollView contentContainerStyle={localStyles.emptyContainer} showsVerticalScrollIndicator={false}>
388
- <View style={localStyles.emptyIconCircle}>
389
- <ShieldAlertIcon size={38} color={AppColors.greenColor}/>
390
- </View>
391
- <Text style={localStyles.emptyTitle}>
392
- {searchQuery.length > 0
393
- ? 'No matching crash entries'
394
- : filterType !== 'all' || !isCrashFiltersDefault(crashFilters)
395
- ? 'No crashes match filters'
396
- : t('crash.emptyTitle')}
397
- </Text>
398
- <Text style={localStyles.emptySub}>
399
- {searchQuery
400
- ? `No crash entries matched "${searchQuery}"`
401
- : filterType !== 'all' || !isCrashFiltersDefault(crashFilters)
402
- ? 'Try adjusting your filters or search keywords.'
403
- : t('crash.emptySubtitle')}
404
- </Text>
405
- {(searchQuery.length > 0 ||
406
- filterType !== 'all' ||
407
- !isCrashFiltersDefault(crashFilters)) && (<TouchableScale onPress={() => {
408
- setSearchQuery('');
409
- setFilterType('all');
410
- setCrashFilters(DEFAULT_CRASH_FILTERS);
411
- }} style={{
412
- marginTop: 10,
413
- paddingHorizontal: 14,
414
- paddingVertical: 7,
415
- borderRadius: 8,
416
- backgroundColor: AppColors.purple,
417
- }}>
418
- <Text style={{
419
- fontFamily: AppFonts.interBold,
420
- fontSize: 11.5,
421
- color: AppColors.white,
422
- }}>
178
+ {D.length===0?<M contentContainerStyle={t.emptyContainer}showsVerticalScrollIndicator={!1}>
179
+ <C style={t.emptyIconCircle}>
180
+ <Me size={38}color={e.greenColor}/>
181
+ </C>
182
+ <T style={t.emptyTitle}>
183
+ {k.length>0?"No matching crash entries":B!=="all"||!P(b)?"No crashes match filters":x("crash.emptyTitle")}
184
+ </T>
185
+ <T style={t.emptySub}>
186
+ {k?`No crash entries matched "${k}"`:B!=="all"||!P(b)?"Try adjusting your filters or search keywords.":x("crash.emptySubtitle")}
187
+ </T>
188
+ {(k.length>0||B!=="all"||!P(b))&&<A onPress={()=>{L(""),N("all"),E(_)}}style={{marginTop:10,paddingHorizontal:14,paddingVertical:7,borderRadius:8,backgroundColor:e.purple}}>
189
+ <T style={{fontFamily:S.interBold,fontSize:11.5,color:e.white}}>
423
190
  Clear Search & Filters
424
- </Text>
425
- </TouchableScale>)}
426
- </ScrollView>) : (<>
427
- <FlatList ref={listRef} data={filteredList} keyExtractor={item => item.id} renderItem={renderCard} initialNumToRender={12} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={Platform.OS === 'android'} renderToHardwareTextureAndroid={true} contentContainerStyle={localStyles.listContent} showsVerticalScrollIndicator={false} ListFooterComponent={<EndOfListFooter />}/>
428
- </>)}
191
+ </T>
192
+ </A>}
193
+ </M>:<>
194
+ <Ce ref={H}data={D}keyExtractor={r=>r.id}renderItem={K}initialNumToRender={12}maxToRenderPerBatch={8}windowSize={5}removeClippedSubviews={Te.OS==="android"}renderToHardwareTextureAndroid={!0}contentContainerStyle={t.listContent}showsVerticalScrollIndicator={!1}ListFooterComponent={<Ve/>}/>
195
+ </>}
429
196
 
430
197
 
431
- <CrashFilterModal visible={isFilterModalOpen} onClose={() => setIsFilterModalOpen(false)} filters={crashFilters} onApply={setCrashFilters} searchQuery={searchQuery}/>
432
- </View>);
433
- });
434
- export default CrashTab;
435
- const localStyles = StyleSheet.create({
436
- container: {
437
- flex: 1,
438
- backgroundColor: AppColors.grayBackground,
439
- },
440
- statsBar: {
441
- backgroundColor: AppColors.primaryLight,
442
- borderBottomWidth: 1,
443
- borderBottomColor: AppColors.grayBorderSecondary,
444
- paddingVertical: 10,
445
- },
446
- statsScrollContent: {
447
- paddingHorizontal: 16,
448
- gap: 8,
449
- },
450
- statChip: {
451
- flexDirection: 'row',
452
- alignItems: 'center',
453
- gap: 6,
454
- paddingHorizontal: 10,
455
- paddingVertical: 5,
456
- borderRadius: 8,
457
- backgroundColor: AppColors.purpleShade50,
458
- borderWidth: 1,
459
- borderColor: `${AppColors.purple}14`,
460
- },
461
- statChipActive: {
462
- backgroundColor: `${AppColors.purple}14`,
463
- borderColor: `${AppColors.purple}33`,
464
- },
465
- statChipValue: {
466
- fontFamily: AppFonts.interBold,
467
- fontSize: 13,
468
- color: AppColors.primaryBlack,
469
- },
470
- statChipLabel: {
471
- fontFamily: AppFonts.interMedium,
472
- fontSize: 11,
473
- color: AppColors.grayText,
474
- },
475
- controlsContainer: {
476
- paddingHorizontal: 16,
477
- paddingTop: 12,
478
- paddingBottom: 6,
479
- backgroundColor: AppColors.grayBackground,
480
- },
481
- searchRow: {
482
- flexDirection: 'row',
483
- alignItems: 'center',
484
- gap: 8,
485
- },
486
- searchInputWrapper: {
487
- flex: 1,
488
- flexDirection: 'row',
489
- alignItems: 'center',
490
- backgroundColor: AppColors.primaryLight,
491
- borderWidth: 1,
492
- borderColor: AppColors.grayBorderSecondary,
493
- borderRadius: 10,
494
- paddingHorizontal: 10,
495
- height: 38,
496
- gap: 8,
497
- },
498
- searchInput: {
499
- flex: 1,
500
- fontFamily: AppFonts.interRegular,
501
- fontSize: 13,
502
- color: AppColors.primaryBlack,
503
- paddingVertical: 0,
504
- },
505
- clearButton: {
506
- width: 38,
507
- height: 38,
508
- borderRadius: 10,
509
- backgroundColor: `${AppColors.errorColor}14`,
510
- borderWidth: 1,
511
- borderColor: `${AppColors.errorColor}22`,
512
- alignItems: 'center',
513
- justifyContent: 'center',
514
- },
515
- filterButton: {
516
- width: 38,
517
- height: 38,
518
- borderRadius: 10,
519
- backgroundColor: `${AppColors.brandPurple}0F`,
520
- borderWidth: 1,
521
- borderColor: `${AppColors.brandPurple}30`,
522
- alignItems: 'center',
523
- justifyContent: 'center',
524
- },
525
- filterScrollContent: {
526
- paddingVertical: 10,
527
- gap: 6,
528
- },
529
- filterChip: {
530
- flexDirection: 'row',
531
- alignItems: 'center',
532
- gap: 5,
533
- paddingHorizontal: 12,
534
- paddingVertical: 6,
535
- borderRadius: 8,
536
- backgroundColor: AppColors.primaryLight,
537
- borderWidth: 1,
538
- borderColor: AppColors.grayBorderSecondary,
539
- },
540
- filterChipActive: {
541
- backgroundColor: AppColors.purple,
542
- borderColor: AppColors.purple,
543
- },
544
- filterChipText: {
545
- fontFamily: AppFonts.interMedium,
546
- fontSize: 12,
547
- color: AppColors.grayText,
548
- },
549
- filterChipTextActive: {
550
- fontFamily: AppFonts.interBold,
551
- color: AppColors.white,
552
- },
553
- listContent: {
554
- paddingHorizontal: 16,
555
- paddingTop: 4,
556
- paddingBottom: 24,
557
- gap: 10,
558
- },
559
- cardContainer: {
560
- backgroundColor: AppColors.primaryLight,
561
- borderRadius: 12,
562
- borderWidth: 1,
563
- borderColor: AppColors.grayBorderSecondary,
564
- padding: 14,
565
- shadowColor: AppColors.shadowColorString,
566
- shadowOffset: { width: 0, height: 1 },
567
- shadowOpacity: 0.05,
568
- shadowRadius: 3,
569
- elevation: 2,
570
- },
571
- fatalCardBorder: {
572
- borderColor: `${AppColors.errorColor}44`,
573
- },
574
- cardHeader: {
575
- flexDirection: 'row',
576
- alignItems: 'center',
577
- justifyContent: 'space-between',
578
- },
579
- badgeRow: {
580
- flexDirection: 'row',
581
- alignItems: 'center',
582
- gap: 6,
583
- flexShrink: 1,
584
- },
585
- sNoBadge: {
586
- backgroundColor: AppColors.grayBackground,
587
- borderWidth: 1,
588
- borderColor: AppColors.grayBorderSecondary,
589
- paddingHorizontal: 6,
590
- paddingVertical: 3,
591
- borderRadius: 5,
592
- },
593
- sNoBadgeText: {
594
- fontFamily: AppFonts.interBold,
595
- fontSize: 9.5,
596
- color: AppColors.grayText,
597
- letterSpacing: 0.3,
598
- },
599
- fatalBadge: {
600
- flexDirection: 'row',
601
- alignItems: 'center',
602
- gap: 4,
603
- backgroundColor: AppColors.errorColor,
604
- paddingHorizontal: 6,
605
- paddingVertical: 3,
606
- borderRadius: 5,
607
- },
608
- fatalBadgeText: {
609
- fontFamily: AppFonts.interBold,
610
- fontSize: 9.5,
611
- color: AppColors.white,
612
- letterSpacing: 0.5,
613
- },
614
- caughtBadge: {
615
- backgroundColor: `${AppColors.greenColor}1F`,
616
- paddingHorizontal: 6,
617
- paddingVertical: 3,
618
- borderRadius: 5,
619
- },
620
- caughtBadgeText: {
621
- fontFamily: AppFonts.interBold,
622
- fontSize: 9.5,
623
- color: AppColors.greenColor,
624
- letterSpacing: 0.5,
625
- },
626
- typeBadge: {
627
- paddingHorizontal: 6,
628
- paddingVertical: 3,
629
- borderRadius: 5,
630
- },
631
- typeBadgeText: {
632
- fontFamily: AppFonts.interBold,
633
- fontSize: 9.5,
634
- letterSpacing: 0.5,
635
- },
636
- timeRow: {
637
- flexDirection: 'row',
638
- alignItems: 'center',
639
- gap: 4,
640
- flexShrink: 1,
641
- },
642
- timestampText: {
643
- fontFamily: AppFonts.interRegular,
644
- fontSize: 11,
645
- color: AppColors.grayTextWeak,
646
- },
647
- relativeTimeText: {
648
- fontFamily: AppFonts.interBold,
649
- fontSize: 10,
650
- color: AppColors.grayTextWeak,
651
- backgroundColor: AppColors.grayBackground,
652
- paddingHorizontal: 5,
653
- paddingVertical: 1,
654
- borderRadius: 4,
655
- overflow: 'hidden',
656
- },
657
- errorMessageText: {
658
- fontFamily: AppFonts.interBold,
659
- fontSize: 13.5,
660
- color: AppColors.primaryBlack,
661
- lineHeight: 18,
662
- },
663
- locationRow: {
664
- flexDirection: 'row',
665
- alignItems: 'center',
666
- gap: 6,
667
- marginTop: 2,
668
- marginBottom: 6,
669
- backgroundColor: AppColors.purpleShade50,
670
- paddingHorizontal: 8,
671
- paddingVertical: 4,
672
- borderRadius: 6,
673
- },
674
- locationText: {
675
- fontFamily: AppFonts.interRegular,
676
- fontSize: 11,
677
- color: AppColors.grayText,
678
- flex: 1,
679
- },
680
- cardFooter: {
681
- flexDirection: 'row',
682
- alignItems: 'center',
683
- justifyContent: 'space-between',
684
- marginTop: 6,
685
- paddingTop: 8,
686
- borderTopWidth: 1,
687
- borderTopColor: AppColors.dividerColor,
688
- },
689
- metaPill: {
690
- flexDirection: 'row',
691
- alignItems: 'center',
692
- gap: 4,
693
- backgroundColor: AppColors.purpleShade50,
694
- paddingHorizontal: 6,
695
- paddingVertical: 2,
696
- borderRadius: 4,
697
- },
698
- metaPillText: {
699
- fontFamily: AppFonts.interMedium,
700
- fontSize: 10,
701
- color: AppColors.grayTextWeak,
702
- },
703
- emptyContainer: {
704
- flexGrow: 1,
705
- alignItems: 'center',
706
- justifyContent: 'center',
707
- padding: 32,
708
- paddingBottom: 80,
709
- },
710
- emptyIconCircle: {
711
- width: 72,
712
- height: 72,
713
- borderRadius: 36,
714
- backgroundColor: `${AppColors.greenColor}1F`,
715
- alignItems: 'center',
716
- justifyContent: 'center',
717
- marginBottom: 16,
718
- },
719
- emptyTitle: {
720
- fontFamily: AppFonts.interBold,
721
- fontSize: 17,
722
- color: AppColors.primaryBlack,
723
- marginBottom: 6,
724
- },
725
- emptySub: {
726
- fontFamily: AppFonts.interRegular,
727
- fontSize: 13,
728
- color: AppColors.grayText,
729
- textAlign: 'center',
730
- lineHeight: 18,
731
- maxWidth: 280,
732
- },
733
- });
198
+ <Pe visible={q}onClose={()=>J(!1)}filters={b}onApply={E}searchQuery={k}/>
199
+ </C>});export default et;const t=be.create({container:{flex:1,backgroundColor:e.grayBackground},statsBar:{backgroundColor:e.primaryLight,borderBottomWidth:1,borderBottomColor:e.grayBorderSecondary,paddingVertical:10},statsScrollContent:{paddingHorizontal:16,gap:8},statChip:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:10,paddingVertical:5,borderRadius:8,backgroundColor:e.purpleShade50,borderWidth:1,borderColor:`${e.purple}14`},statChipActive:{backgroundColor:`${e.purple}14`,borderColor:`${e.purple}33`},statChipValue:{fontFamily:S.interBold,fontSize:13,color:e.primaryBlack},statChipLabel:{fontFamily:S.interMedium,fontSize:11,color:e.grayText},controlsContainer:{paddingHorizontal:16,paddingTop:12,paddingBottom:6,backgroundColor:e.grayBackground},searchRow:{flexDirection:"row",alignItems:"center",gap:8},searchInputWrapper:{flex:1,flexDirection:"row",alignItems:"center",backgroundColor:e.primaryLight,borderWidth:1,borderColor:e.grayBorderSecondary,borderRadius:10,paddingHorizontal:10,height:38,gap:8},searchInput:{flex:1,fontFamily:S.interRegular,fontSize:13,color:e.primaryBlack,paddingVertical:0},clearButton:{width:38,height:38,borderRadius:10,backgroundColor:`${e.errorColor}14`,borderWidth:1,borderColor:`${e.errorColor}22`,alignItems:"center",justifyContent:"center"},filterButton:{width:38,height:38,borderRadius:10,backgroundColor:`${e.brandPurple}0F`,borderWidth:1,borderColor:`${e.brandPurple}30`,alignItems:"center",justifyContent:"center"},filterScrollContent:{paddingVertical:10,gap:6},filterChip:{flexDirection:"row",alignItems:"center",gap:5,paddingHorizontal:12,paddingVertical:6,borderRadius:8,backgroundColor:e.primaryLight,borderWidth:1,borderColor:e.grayBorderSecondary},filterChipActive:{backgroundColor:e.purple,borderColor:e.purple},filterChipText:{fontFamily:S.interMedium,fontSize:12,color:e.grayText},filterChipTextActive:{fontFamily:S.interBold,color:e.white},listContent:{paddingHorizontal:16,paddingTop:4,paddingBottom:24,gap:10},cardContainer:{backgroundColor:e.primaryLight,borderRadius:12,borderWidth:1,borderColor:e.grayBorderSecondary,padding:14,shadowColor:e.shadowColorString,shadowOffset:{width:0,height:1},shadowOpacity:.05,shadowRadius:3,elevation:2},fatalCardBorder:{borderColor:`${e.errorColor}44`},cardHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},badgeRow:{flexDirection:"row",alignItems:"center",gap:6,flexShrink:1},sNoBadge:{backgroundColor:e.grayBackground,borderWidth:1,borderColor:e.grayBorderSecondary,paddingHorizontal:6,paddingVertical:3,borderRadius:5},sNoBadgeText:{fontFamily:S.interBold,fontSize:9.5,color:e.grayText,letterSpacing:.3},fatalBadge:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:e.errorColor,paddingHorizontal:6,paddingVertical:3,borderRadius:5},fatalBadgeText:{fontFamily:S.interBold,fontSize:9.5,color:e.white,letterSpacing:.5},caughtBadge:{backgroundColor:`${e.greenColor}1F`,paddingHorizontal:6,paddingVertical:3,borderRadius:5},caughtBadgeText:{fontFamily:S.interBold,fontSize:9.5,color:e.greenColor,letterSpacing:.5},typeBadge:{paddingHorizontal:6,paddingVertical:3,borderRadius:5},typeBadgeText:{fontFamily:S.interBold,fontSize:9.5,letterSpacing:.5},timeRow:{flexDirection:"row",alignItems:"center",gap:4,flexShrink:1},timestampText:{fontFamily:S.interRegular,fontSize:11,color:e.grayTextWeak},relativeTimeText:{fontFamily:S.interBold,fontSize:10,color:e.grayTextWeak,backgroundColor:e.grayBackground,paddingHorizontal:5,paddingVertical:1,borderRadius:4,overflow:"hidden"},errorMessageText:{fontFamily:S.interBold,fontSize:13.5,color:e.primaryBlack,lineHeight:18},locationRow:{flexDirection:"row",alignItems:"center",gap:6,marginTop:2,marginBottom:6,backgroundColor:e.purpleShade50,paddingHorizontal:8,paddingVertical:4,borderRadius:6},locationText:{fontFamily:S.interRegular,fontSize:11,color:e.grayText,flex:1},cardFooter:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginTop:6,paddingTop:8,borderTopWidth:1,borderTopColor:e.dividerColor},metaPill:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:e.purpleShade50,paddingHorizontal:6,paddingVertical:2,borderRadius:4},metaPillText:{fontFamily:S.interMedium,fontSize:10,color:e.grayTextWeak},emptyContainer:{flexGrow:1,alignItems:"center",justifyContent:"center",padding:32,paddingBottom:80},emptyIconCircle:{width:72,height:72,borderRadius:36,backgroundColor:`${e.greenColor}1F`,alignItems:"center",justifyContent:"center",marginBottom:16},emptyTitle:{fontFamily:S.interBold,fontSize:17,color:e.primaryBlack,marginBottom:6},emptySub:{fontFamily:S.interRegular,fontSize:13,color:e.grayText,textAlign:"center",lineHeight:18,maxWidth:280}});