@buoy-gg/network 7.0.40 → 7.0.42

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 (275) hide show
  1. package/README.md +11 -79
  2. package/lib/commonjs/index.js +1 -325
  3. package/lib/commonjs/index.web.js +1 -420
  4. package/lib/commonjs/network/components/DataViewer.web.js +1 -879
  5. package/lib/commonjs/network/components/NetworkCopyScreen.web.js +1 -48
  6. package/lib/commonjs/network/components/NetworkCopySettingsView.js +27 -755
  7. package/lib/commonjs/network/components/NetworkCopySettingsView.web.js +14 -1242
  8. package/lib/commonjs/network/components/NetworkDetailScreen.web.js +1 -101
  9. package/lib/commonjs/network/components/NetworkDetailStepper.js +1 -108
  10. package/lib/commonjs/network/components/NetworkDetailStepper.web.js +1 -298
  11. package/lib/commonjs/network/components/NetworkEventDetailView.js +15 -1130
  12. package/lib/commonjs/network/components/NetworkEventDetailView.web.js +15 -1484
  13. package/lib/commonjs/network/components/NetworkEventItemCompact.js +2 -401
  14. package/lib/commonjs/network/components/NetworkEventItemCompact.web.js +2 -820
  15. package/lib/commonjs/network/components/NetworkFilterScreen.web.js +1 -55
  16. package/lib/commonjs/network/components/NetworkFilterViewV3.js +1 -442
  17. package/lib/commonjs/network/components/NetworkFilterViewV3.web.js +1 -1310
  18. package/lib/commonjs/network/components/NetworkHeaderLive.js +1 -375
  19. package/lib/commonjs/network/components/NetworkHeaderLive.web.js +1 -623
  20. package/lib/commonjs/network/components/NetworkHeaderMenu.js +1 -190
  21. package/lib/commonjs/network/components/NetworkListScreen.js +1 -404
  22. package/lib/commonjs/network/components/NetworkListScreen.web.js +1 -625
  23. package/lib/commonjs/network/components/NetworkModal.js +1 -786
  24. package/lib/commonjs/network/components/NetworkNumberPrompt.js +1 -178
  25. package/lib/commonjs/network/components/NetworkNumberPrompt.web.js +1 -232
  26. package/lib/commonjs/network/components/NetworkOverrideEditor.js +1 -814
  27. package/lib/commonjs/network/components/NetworkOverrideEditor.web.js +1 -942
  28. package/lib/commonjs/network/components/NetworkOverrideHeaderButton.js +1 -107
  29. package/lib/commonjs/network/components/NetworkOverrideHeaderButton.web.js +1 -133
  30. package/lib/commonjs/network/components/NetworkOverridesButton.js +1 -90
  31. package/lib/commonjs/network/components/NetworkOverridesButton.web.js +1 -143
  32. package/lib/commonjs/network/components/NetworkOverridesScreen.js +1 -543
  33. package/lib/commonjs/network/components/NetworkOverridesScreen.web.js +1 -830
  34. package/lib/commonjs/network/components/NetworkSavedScreen.js +1 -226
  35. package/lib/commonjs/network/components/NetworkSavedScreen.web.js +1 -463
  36. package/lib/commonjs/network/components/NetworkUpgradeBanner.js +1 -76
  37. package/lib/commonjs/network/components/response-editor/Explorer.js +1 -973
  38. package/lib/commonjs/network/components/response-editor/Explorer.web.js +1 -1136
  39. package/lib/commonjs/network/components/response-editor/deleteNestedDataByPath.js +1 -56
  40. package/lib/commonjs/network/components/response-editor/editorContext.js +1 -33
  41. package/lib/commonjs/network/components/response-editor/updateNestedDataByPath.js +1 -61
  42. package/lib/commonjs/network/conditions/NetworkConditionsControl.js +1 -235
  43. package/lib/commonjs/network/conditions/NetworkConditionsControl.test.js +1 -136
  44. package/lib/commonjs/network/conditions/NetworkConditionsIcon.js +1 -33
  45. package/lib/commonjs/network/conditions/NetworkFloatingTool.js +1 -310
  46. package/lib/commonjs/network/conditions/NetworkFloatingTool.test.js +1 -219
  47. package/lib/commonjs/network/conditions/store.js +1 -75
  48. package/lib/commonjs/network/conditions/wait.js +1 -43
  49. package/lib/commonjs/network/conditions/xhr.js +1 -110
  50. package/lib/commonjs/network/hooks/useLiveNetworkEvent.js +1 -62
  51. package/lib/commonjs/network/hooks/useNetworkBadgeCounts.js +1 -83
  52. package/lib/commonjs/network/hooks/useNetworkEventList.js +1 -108
  53. package/lib/commonjs/network/hooks/useNetworkEvents.js +1 -318
  54. package/lib/commonjs/network/hooks/useNetworkHasMatches.js +1 -56
  55. package/lib/commonjs/network/hooks/useNetworkSaved.js +1 -38
  56. package/lib/commonjs/network/hooks/useNetworkSelection.js +1 -53
  57. package/lib/commonjs/network/hooks/useOverrideRules.js +1 -36
  58. package/lib/commonjs/network/hooks/useTickEveryMinute.js +1 -21
  59. package/lib/commonjs/network/overrides/applyToFetch.js +1 -80
  60. package/lib/commonjs/network/overrides/applyToXhr.js +2 -453
  61. package/lib/commonjs/network/overrides/engine.js +1 -93
  62. package/lib/commonjs/network/overrides/matchRule.js +1 -81
  63. package/lib/commonjs/network/overrides/overriddenRows.js +1 -0
  64. package/lib/commonjs/network/overrides/overrideRulesStore.js +1 -550
  65. package/lib/commonjs/network/overrides/presets.js +1 -70
  66. package/lib/commonjs/network/overrides/resolveOverride.js +1 -158
  67. package/lib/commonjs/network/overrides/types.js +1 -90
  68. package/lib/commonjs/network/sync/networkBodyResolver.js +1 -39
  69. package/lib/commonjs/network/sync/networkSyncAdapter.js +1 -882
  70. package/lib/commonjs/network/sync/overrideHonesty.release.test.js +1 -36
  71. package/lib/commonjs/network/types/index.js +1 -5
  72. package/lib/commonjs/network/utils/extractOperationName.js +1 -80
  73. package/lib/commonjs/network/utils/filterNetworkEvents.js +1 -96
  74. package/lib/commonjs/network/utils/formatGraphQLVariables.js +1 -219
  75. package/lib/commonjs/network/utils/formatting.js +1 -30
  76. package/lib/commonjs/network/utils/generateCurl.js +2 -71
  77. package/lib/commonjs/network/utils/generateNetworkCopyText.js +37 -166
  78. package/lib/commonjs/network/utils/httpCompletion.js +1 -37
  79. package/lib/commonjs/network/utils/networkEventStore.js +1 -393
  80. package/lib/commonjs/network/utils/networkListener.js +4 -1259
  81. package/lib/commonjs/network/utils/networkSavedStore.js +3 -577
  82. package/lib/commonjs/network/utils/networkSelectionStore.js +1 -193
  83. package/lib/commonjs/network/utils/realNow.js +1 -0
  84. package/lib/commonjs/network/utils/requestId.js +1 -0
  85. package/lib/commonjs/network/utils/resolveRequestUrl.js +1 -0
  86. package/lib/commonjs/network/utils/selectSavedEvents.js +1 -39
  87. package/lib/commonjs/network/utils/startNetworkCapture.js +1 -0
  88. package/lib/commonjs/network/utils/withPinnedFirst.js +1 -32
  89. package/lib/commonjs/preset.js +1 -102
  90. package/lib/module/index.js +1 -103
  91. package/lib/module/index.web.js +1 -82
  92. package/lib/module/network/components/DataViewer.web.js +1 -875
  93. package/lib/module/network/components/NetworkCopyScreen.web.js +1 -44
  94. package/lib/module/network/components/NetworkCopySettingsView.js +27 -750
  95. package/lib/module/network/components/NetworkCopySettingsView.web.js +14 -1237
  96. package/lib/module/network/components/NetworkDetailScreen.web.js +1 -97
  97. package/lib/module/network/components/NetworkDetailStepper.js +1 -104
  98. package/lib/module/network/components/NetworkDetailStepper.web.js +1 -296
  99. package/lib/module/network/components/NetworkEventDetailView.js +15 -1129
  100. package/lib/module/network/components/NetworkEventDetailView.web.js +15 -1482
  101. package/lib/module/network/components/NetworkEventItemCompact.js +2 -398
  102. package/lib/module/network/components/NetworkEventItemCompact.web.js +2 -818
  103. package/lib/module/network/components/NetworkFilterScreen.web.js +1 -51
  104. package/lib/module/network/components/NetworkFilterViewV3.js +1 -438
  105. package/lib/module/network/components/NetworkFilterViewV3.web.js +1 -1306
  106. package/lib/module/network/components/NetworkHeaderLive.js +1 -366
  107. package/lib/module/network/components/NetworkHeaderLive.web.js +1 -617
  108. package/lib/module/network/components/NetworkHeaderMenu.js +1 -184
  109. package/lib/module/network/components/NetworkListScreen.js +1 -400
  110. package/lib/module/network/components/NetworkListScreen.web.js +1 -623
  111. package/lib/module/network/components/NetworkModal.js +1 -781
  112. package/lib/module/network/components/NetworkNumberPrompt.js +1 -174
  113. package/lib/module/network/components/NetworkNumberPrompt.web.js +1 -230
  114. package/lib/module/network/components/NetworkOverrideEditor.js +1 -811
  115. package/lib/module/network/components/NetworkOverrideEditor.web.js +1 -939
  116. package/lib/module/network/components/NetworkOverrideHeaderButton.js +1 -104
  117. package/lib/module/network/components/NetworkOverrideHeaderButton.web.js +1 -131
  118. package/lib/module/network/components/NetworkOverridesButton.js +1 -87
  119. package/lib/module/network/components/NetworkOverridesButton.web.js +1 -141
  120. package/lib/module/network/components/NetworkOverridesScreen.js +1 -539
  121. package/lib/module/network/components/NetworkOverridesScreen.web.js +1 -826
  122. package/lib/module/network/components/NetworkSavedScreen.js +1 -222
  123. package/lib/module/network/components/NetworkSavedScreen.web.js +1 -461
  124. package/lib/module/network/components/NetworkUpgradeBanner.js +1 -72
  125. package/lib/module/network/components/response-editor/Explorer.js +1 -972
  126. package/lib/module/network/components/response-editor/Explorer.web.js +1 -1133
  127. package/lib/module/network/components/response-editor/deleteNestedDataByPath.js +1 -51
  128. package/lib/module/network/components/response-editor/editorContext.js +1 -29
  129. package/lib/module/network/components/response-editor/updateNestedDataByPath.js +1 -56
  130. package/lib/module/network/conditions/NetworkConditionsControl.js +1 -231
  131. package/lib/module/network/conditions/NetworkConditionsControl.test.js +1 -135
  132. package/lib/module/network/conditions/NetworkConditionsIcon.js +1 -29
  133. package/lib/module/network/conditions/NetworkFloatingTool.js +1 -304
  134. package/lib/module/network/conditions/NetworkFloatingTool.test.js +1 -218
  135. package/lib/module/network/conditions/store.js +1 -65
  136. package/lib/module/network/conditions/wait.js +1 -38
  137. package/lib/module/network/conditions/xhr.js +1 -106
  138. package/lib/module/network/hooks/useLiveNetworkEvent.js +1 -58
  139. package/lib/module/network/hooks/useNetworkBadgeCounts.js +1 -79
  140. package/lib/module/network/hooks/useNetworkEventList.js +1 -104
  141. package/lib/module/network/hooks/useNetworkEvents.js +1 -314
  142. package/lib/module/network/hooks/useNetworkHasMatches.js +1 -52
  143. package/lib/module/network/hooks/useNetworkSaved.js +1 -34
  144. package/lib/module/network/hooks/useNetworkSelection.js +1 -46
  145. package/lib/module/network/hooks/useOverrideRules.js +1 -32
  146. package/lib/module/network/hooks/useTickEveryMinute.js +1 -11
  147. package/lib/module/network/overrides/applyToFetch.js +1 -72
  148. package/lib/module/network/overrides/applyToXhr.js +2 -446
  149. package/lib/module/network/overrides/engine.js +1 -85
  150. package/lib/module/network/overrides/matchRule.js +1 -75
  151. package/lib/module/network/overrides/overriddenRows.js +1 -0
  152. package/lib/module/network/overrides/overrideRulesStore.js +1 -547
  153. package/lib/module/network/overrides/presets.js +1 -65
  154. package/lib/module/network/overrides/resolveOverride.js +1 -152
  155. package/lib/module/network/overrides/types.js +1 -86
  156. package/lib/module/network/sync/networkBodyResolver.js +1 -34
  157. package/lib/module/network/sync/networkSyncAdapter.js +1 -880
  158. package/lib/module/network/sync/overrideHonesty.release.test.js +1 -35
  159. package/lib/module/network/types/index.js +1 -3
  160. package/lib/module/network/utils/extractOperationName.js +1 -76
  161. package/lib/module/network/utils/filterNetworkEvents.js +1 -92
  162. package/lib/module/network/utils/formatGraphQLVariables.js +1 -213
  163. package/lib/module/network/utils/formatting.js +1 -9
  164. package/lib/module/network/utils/generateCurl.js +2 -67
  165. package/lib/module/network/utils/generateNetworkCopyText.js +37 -162
  166. package/lib/module/network/utils/httpCompletion.js +1 -32
  167. package/lib/module/network/utils/networkEventStore.js +1 -391
  168. package/lib/module/network/utils/networkListener.js +4 -1249
  169. package/lib/module/network/utils/networkSavedStore.js +3 -572
  170. package/lib/module/network/utils/networkSelectionStore.js +1 -188
  171. package/lib/module/network/utils/realNow.js +1 -0
  172. package/lib/module/network/utils/requestId.js +1 -0
  173. package/lib/module/network/utils/resolveRequestUrl.js +1 -0
  174. package/lib/module/network/utils/selectSavedEvents.js +1 -35
  175. package/lib/module/network/utils/startNetworkCapture.js +1 -0
  176. package/lib/module/network/utils/withPinnedFirst.js +1 -28
  177. package/lib/module/preset.js +1 -100
  178. package/lib/typescript/index.d.ts +1 -0
  179. package/lib/typescript/network/overrides/applyToXhr.d.ts +1 -0
  180. package/lib/typescript/network/overrides/engine.d.ts +1 -1
  181. package/lib/typescript/network/overrides/matchRule.d.ts +1 -1
  182. package/lib/typescript/network/overrides/overriddenRows.d.ts +16 -0
  183. package/lib/typescript/network/overrides/resolveOverride.d.ts +2 -2
  184. package/lib/typescript/network/overrides/types.d.ts +9 -0
  185. package/lib/typescript/network/utils/networkListener.d.ts +14 -4
  186. package/lib/typescript/network/utils/networkSavedStore.d.ts +4 -4
  187. package/lib/typescript/network/utils/realNow.d.ts +18 -0
  188. package/lib/typescript/network/utils/requestId.d.ts +2 -0
  189. package/lib/typescript/network/utils/resolveRequestUrl.d.ts +3 -0
  190. package/lib/typescript/network/utils/startNetworkCapture.d.ts +6 -0
  191. package/lib/web/index.mjs +145 -0
  192. package/package.json +32 -10
  193. package/lib/typescript/index.d.ts.map +0 -1
  194. package/lib/typescript/index.web.d.ts.map +0 -1
  195. package/lib/typescript/network/components/DataViewer.web.d.ts.map +0 -1
  196. package/lib/typescript/network/components/NetworkCopyScreen.web.d.ts.map +0 -1
  197. package/lib/typescript/network/components/NetworkCopySettingsView.d.ts.map +0 -1
  198. package/lib/typescript/network/components/NetworkCopySettingsView.web.d.ts.map +0 -1
  199. package/lib/typescript/network/components/NetworkDetailScreen.web.d.ts.map +0 -1
  200. package/lib/typescript/network/components/NetworkDetailStepper.d.ts.map +0 -1
  201. package/lib/typescript/network/components/NetworkDetailStepper.web.d.ts.map +0 -1
  202. package/lib/typescript/network/components/NetworkEventDetailView.d.ts.map +0 -1
  203. package/lib/typescript/network/components/NetworkEventDetailView.web.d.ts.map +0 -1
  204. package/lib/typescript/network/components/NetworkEventItemCompact.d.ts.map +0 -1
  205. package/lib/typescript/network/components/NetworkEventItemCompact.web.d.ts.map +0 -1
  206. package/lib/typescript/network/components/NetworkFilterScreen.web.d.ts.map +0 -1
  207. package/lib/typescript/network/components/NetworkFilterViewV3.d.ts.map +0 -1
  208. package/lib/typescript/network/components/NetworkFilterViewV3.web.d.ts.map +0 -1
  209. package/lib/typescript/network/components/NetworkHeaderLive.d.ts.map +0 -1
  210. package/lib/typescript/network/components/NetworkHeaderLive.web.d.ts.map +0 -1
  211. package/lib/typescript/network/components/NetworkHeaderMenu.d.ts.map +0 -1
  212. package/lib/typescript/network/components/NetworkListScreen.d.ts.map +0 -1
  213. package/lib/typescript/network/components/NetworkListScreen.web.d.ts.map +0 -1
  214. package/lib/typescript/network/components/NetworkModal.d.ts.map +0 -1
  215. package/lib/typescript/network/components/NetworkNumberPrompt.d.ts.map +0 -1
  216. package/lib/typescript/network/components/NetworkNumberPrompt.web.d.ts.map +0 -1
  217. package/lib/typescript/network/components/NetworkOverrideEditor.d.ts.map +0 -1
  218. package/lib/typescript/network/components/NetworkOverrideEditor.web.d.ts.map +0 -1
  219. package/lib/typescript/network/components/NetworkOverrideHeaderButton.d.ts.map +0 -1
  220. package/lib/typescript/network/components/NetworkOverrideHeaderButton.web.d.ts.map +0 -1
  221. package/lib/typescript/network/components/NetworkOverridesButton.d.ts.map +0 -1
  222. package/lib/typescript/network/components/NetworkOverridesButton.web.d.ts.map +0 -1
  223. package/lib/typescript/network/components/NetworkOverridesScreen.d.ts.map +0 -1
  224. package/lib/typescript/network/components/NetworkOverridesScreen.web.d.ts.map +0 -1
  225. package/lib/typescript/network/components/NetworkSavedScreen.d.ts.map +0 -1
  226. package/lib/typescript/network/components/NetworkSavedScreen.web.d.ts.map +0 -1
  227. package/lib/typescript/network/components/NetworkUpgradeBanner.d.ts.map +0 -1
  228. package/lib/typescript/network/components/response-editor/Explorer.d.ts.map +0 -1
  229. package/lib/typescript/network/components/response-editor/Explorer.web.d.ts.map +0 -1
  230. package/lib/typescript/network/components/response-editor/deleteNestedDataByPath.d.ts.map +0 -1
  231. package/lib/typescript/network/components/response-editor/editorContext.d.ts.map +0 -1
  232. package/lib/typescript/network/components/response-editor/updateNestedDataByPath.d.ts.map +0 -1
  233. package/lib/typescript/network/conditions/NetworkConditionsControl.d.ts.map +0 -1
  234. package/lib/typescript/network/conditions/NetworkConditionsControl.test.d.ts.map +0 -1
  235. package/lib/typescript/network/conditions/NetworkConditionsIcon.d.ts.map +0 -1
  236. package/lib/typescript/network/conditions/NetworkFloatingTool.d.ts.map +0 -1
  237. package/lib/typescript/network/conditions/NetworkFloatingTool.test.d.ts.map +0 -1
  238. package/lib/typescript/network/conditions/store.d.ts.map +0 -1
  239. package/lib/typescript/network/conditions/wait.d.ts.map +0 -1
  240. package/lib/typescript/network/conditions/xhr.d.ts.map +0 -1
  241. package/lib/typescript/network/hooks/useLiveNetworkEvent.d.ts.map +0 -1
  242. package/lib/typescript/network/hooks/useNetworkBadgeCounts.d.ts.map +0 -1
  243. package/lib/typescript/network/hooks/useNetworkEventList.d.ts.map +0 -1
  244. package/lib/typescript/network/hooks/useNetworkEvents.d.ts.map +0 -1
  245. package/lib/typescript/network/hooks/useNetworkHasMatches.d.ts.map +0 -1
  246. package/lib/typescript/network/hooks/useNetworkSaved.d.ts.map +0 -1
  247. package/lib/typescript/network/hooks/useNetworkSelection.d.ts.map +0 -1
  248. package/lib/typescript/network/hooks/useOverrideRules.d.ts.map +0 -1
  249. package/lib/typescript/network/hooks/useTickEveryMinute.d.ts.map +0 -1
  250. package/lib/typescript/network/overrides/applyToFetch.d.ts.map +0 -1
  251. package/lib/typescript/network/overrides/applyToXhr.d.ts.map +0 -1
  252. package/lib/typescript/network/overrides/engine.d.ts.map +0 -1
  253. package/lib/typescript/network/overrides/matchRule.d.ts.map +0 -1
  254. package/lib/typescript/network/overrides/overrideRulesStore.d.ts.map +0 -1
  255. package/lib/typescript/network/overrides/presets.d.ts.map +0 -1
  256. package/lib/typescript/network/overrides/resolveOverride.d.ts.map +0 -1
  257. package/lib/typescript/network/overrides/types.d.ts.map +0 -1
  258. package/lib/typescript/network/sync/networkBodyResolver.d.ts.map +0 -1
  259. package/lib/typescript/network/sync/networkSyncAdapter.d.ts.map +0 -1
  260. package/lib/typescript/network/sync/overrideHonesty.release.test.d.ts.map +0 -1
  261. package/lib/typescript/network/types/index.d.ts.map +0 -1
  262. package/lib/typescript/network/utils/extractOperationName.d.ts.map +0 -1
  263. package/lib/typescript/network/utils/filterNetworkEvents.d.ts.map +0 -1
  264. package/lib/typescript/network/utils/formatGraphQLVariables.d.ts.map +0 -1
  265. package/lib/typescript/network/utils/formatting.d.ts.map +0 -1
  266. package/lib/typescript/network/utils/generateCurl.d.ts.map +0 -1
  267. package/lib/typescript/network/utils/generateNetworkCopyText.d.ts.map +0 -1
  268. package/lib/typescript/network/utils/httpCompletion.d.ts.map +0 -1
  269. package/lib/typescript/network/utils/networkEventStore.d.ts.map +0 -1
  270. package/lib/typescript/network/utils/networkListener.d.ts.map +0 -1
  271. package/lib/typescript/network/utils/networkSavedStore.d.ts.map +0 -1
  272. package/lib/typescript/network/utils/networkSelectionStore.d.ts.map +0 -1
  273. package/lib/typescript/network/utils/selectSavedEvents.d.ts.map +0 -1
  274. package/lib/typescript/network/utils/withPinnedFirst.d.ts.map +0 -1
  275. package/lib/typescript/preset.d.ts.map +0 -1
@@ -1,786 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.NetworkModal = NetworkModal;
7
- exports.NetworkToolView = NetworkToolView;
8
- var _NetworkFloatingTool = require("../conditions/NetworkFloatingTool");
9
- var _react = require("react");
10
- var _reactNative = require("react-native");
11
- var _sharedUi = require("@buoy-gg/shared-ui");
12
- var _NetworkFilterViewV = require("./NetworkFilterViewV3");
13
- var _useTickEveryMinute = require("../hooks/useTickEveryMinute");
14
- var _NetworkEventDetailView = require("./NetworkEventDetailView");
15
- var _NetworkCopySettingsView = require("./NetworkCopySettingsView");
16
- var _NetworkHeaderLive = require("./NetworkHeaderLive");
17
- var _NetworkListScreen = require("./NetworkListScreen");
18
- var _NetworkSavedScreen = require("./NetworkSavedScreen");
19
- var _NetworkOverridesScreen = require("./NetworkOverridesScreen");
20
- var _NetworkOverridesButton = require("./NetworkOverridesButton");
21
- var _NetworkOverrideHeaderButton = require("./NetworkOverrideHeaderButton");
22
- var _NetworkHeaderMenu = require("./NetworkHeaderMenu");
23
- var _NetworkDetailStepper = require("./NetworkDetailStepper");
24
- var _useNetworkEventList = require("../hooks/useNetworkEventList");
25
- var _useLiveNetworkEvent = require("../hooks/useLiveNetworkEvent");
26
- var _useNetworkSelection = require("../hooks/useNetworkSelection");
27
- var _networkSelectionStore = require("../utils/networkSelectionStore");
28
- var _networkSavedStore = require("../utils/networkSavedStore");
29
- var _types = require("../overrides/types");
30
- var _jsxRuntime = require("react/jsx-runtime");
31
- // ============================================================================
32
- // Screens (rule4 stable router: each gates itself with `return null`; the
33
- // root renders all four as stable siblings instead of a nested ternary).
34
- // Subscribing screens run their hooks unconditionally and pass
35
- // `paused || !visible` so hidden screens don't subscribe.
36
- // ============================================================================
37
-
38
- function NetworkDetailScreen({
39
- visible,
40
- paused,
41
- ignoredPatternValues,
42
- onTogglePattern,
43
- isPro,
44
- filter,
45
- ignoredPatterns,
46
- fromSaved,
47
- savedSearch,
48
- applySafeAreaInset
49
- }) {
50
- /**
51
- * The detail renders at the IMMEDIATE selection — every step, no delay.
52
- * Measured, 100 steps at a 150ms tap interval over 64KB payloads:
53
- *
54
- * whole detail, bodies included ... 647ms/step
55
- * detail with no bodies at all .... 43ms/step (over the 150ms tap gap)
56
- *
57
- * So ~93% of a step is the request/response BODY trees, and everything else
58
- * — status, URL breakdown, timing, header counts — is affordable at any tap
59
- * rate. Deferring the whole detail (which is what this used to do) therefore
60
- * bought nothing a user could feel: it made the cheap 43ms wait alongside
61
- * the expensive 450ms instead of splitting them.
62
- *
63
- * So only the expensive part waits. `bodyId` trails `selectedId` by the
64
- * settle window, so `heavyReady` is false exactly while the cursor is still
65
- * moving — the JSON trees are skipped during a burst and mount once you land.
66
- */
67
- const eventId = (0, _useNetworkSelection.useSelectedNetworkEventId)();
68
- const settledId = (0, _useNetworkSelection.useNetworkBodyEventId)();
69
- const heavyReady = eventId != null && eventId === settledId;
70
- // Resolve the ID to the live event so a request opened while pending picks
71
- // up its response/error in place instead of freezing on the snapshot taken
72
- // when the row was tapped.
73
- const event = (0, _useLiveNetworkEvent.useLiveNetworkEvent)(eventId, {
74
- paused: paused || !visible
75
- });
76
-
77
- // Instrumentation for the benchmark harness. Gated on `heavyReady` on
78
- // purpose: the cheap chrome now renders on every step, so reporting here
79
- // unconditionally would make `bodyMs` a duplicate of `cursorMs`. What the
80
- // harness needs to know is when the expensive TREES landed.
81
- (0, _react.useEffect)(() => {
82
- if (visible && event && heavyReady) {
83
- _networkSelectionStore.networkSelectionStore.reportRendered(event.id);
84
- }
85
- }, [visible, event, heavyReady]);
86
- if (!visible) return null;
87
- // Column: the detail body scrolls, the stepper stays pinned under it. The
88
- // body owns its scroll here (see `bodyOwnsScroll`) — inside JsModal's
89
- // wrapper the footer would scroll away with the content. The spacer keeps
90
- // the footer at the bottom on the rare frame where the ID resolves to
91
- // nothing (cleared, aged out, and not saved).
92
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
93
- style: styles.detailRoot,
94
- children: [event ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkEventDetailView.NetworkEventDetailView, {
95
- event: event,
96
- ignoredPatterns: ignoredPatternValues,
97
- onTogglePattern: onTogglePattern,
98
- showBodies: heavyReady
99
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
100
- style: styles.detailBodyFallback
101
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkDetailStepper.NetworkDetailStepper, {
102
- paused: paused,
103
- filter: filter,
104
- ignoredPatterns: ignoredPatterns,
105
- isPro: isPro,
106
- fromSaved: fromSaved,
107
- savedSearch: savedSearch,
108
- applySafeAreaInset: applySafeAreaInset
109
- })]
110
- });
111
- }
112
- function NetworkFilterScreen({
113
- visible,
114
- paused,
115
- isPro,
116
- filter,
117
- onFilterChange,
118
- ignoredPatterns,
119
- onRemovePattern,
120
- onAddPattern,
121
- onTogglePatternMode
122
- }) {
123
- // Facet counts read the same filtered list the user is looking at.
124
- const {
125
- events
126
- } = (0, _useNetworkEventList.useNetworkEventList)({
127
- filter,
128
- ignoredPatterns,
129
- paused,
130
- visible,
131
- isPro
132
- });
133
- if (!visible) return null;
134
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkFilterViewV.NetworkFilterViewV3, {
135
- events: events,
136
- filter: filter,
137
- onFilterChange: onFilterChange,
138
- ignoredPatterns: ignoredPatterns,
139
- onRemovePattern: onRemovePattern,
140
- onAddPattern: onAddPattern,
141
- onTogglePatternMode: onTogglePatternMode
142
- });
143
- }
144
- function NetworkCopyScreen({
145
- visible,
146
- paused,
147
- isPro,
148
- filter,
149
- ignoredPatterns,
150
- settings,
151
- onSettingsChange
152
- }) {
153
- const {
154
- events
155
- } = (0, _useNetworkEventList.useNetworkEventList)({
156
- filter,
157
- ignoredPatterns,
158
- paused,
159
- visible,
160
- isPro
161
- });
162
- if (!visible) return null;
163
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkCopySettingsView.NetworkCopySettingsView, {
164
- settings: settings,
165
- onSettingsChange: onSettingsChange,
166
- events: events
167
- });
168
- }
169
-
170
- // ============================================================================
171
- // Root — UI-state orchestration ONLY (rule3). No event-store subscription
172
- // lives here: live data is consumed by the header leaves
173
- // (NetworkHeaderLive) and the screens, so network events never re-render
174
- // the modal shell/header. Profiling evidence: tool-bench 2026-07-06 —
175
- // with the subscription here, 15 events re-rendered JsModal + every
176
- // header button 15× and all visible rows 105×.
177
- // ============================================================================
178
-
179
- function NetworkModalInner({
180
- visible,
181
- onClose,
182
- onBack,
183
- onMinimize,
184
- enableSharedModalDimensions = false,
185
- inline = false,
186
- paused: pausedProp,
187
- onPausedChange,
188
- remoteConditions
189
- }) {
190
- const {
191
- isPro
192
- } = (0, _sharedUi.useFeatureGate)();
193
-
194
- // Capture pause (the power toggle's freeze-stream semantic) — gates
195
- // every subscriber in this modal's tree via props. Controlled when the host
196
- // supplies both halves; otherwise this local state is the source of truth.
197
- const [pausedState, setPausedState] = (0, _react.useState)(false);
198
- const controlledPause = pausedProp != null && onPausedChange != null;
199
- const paused = controlledPause ? pausedProp : pausedState;
200
- const setPaused = next => {
201
- const value = typeof next === "function" ? next(paused) : next;
202
- if (controlledPause) onPausedChange(value);else setPausedState(value);
203
- };
204
- const [filter, setFilter] = (0, _react.useState)({});
205
- /**
206
- * The cursor lives in `networkSelectionStore`, and the root subscribes to
207
- * the BOOLEAN only. That is the whole point: this component re-renders
208
- * `JsModal` (which can never bail — its `header` prop is a fresh object
209
- * every render), the entire header, and all five screens. None of them care
210
- * WHICH request is selected, only THAT one is, and this flips twice a
211
- * session instead of once per tap.
212
- */
213
- const hasSelection = (0, _useNetworkSelection.useHasNetworkSelection)();
214
- const [showFilterView, setShowFilterView] = (0, _react.useState)(false);
215
- const [showSavedView, setShowSavedView] = (0, _react.useState)(false);
216
- const [showOverridesView, setShowOverridesView] = (0, _react.useState)(false);
217
- const [showHeaderMenu, setShowHeaderMenu] = (0, _react.useState)(false);
218
- const [minimizeRequest, setMinimizeRequest] = (0, _react.useState)(0);
219
- const [remoteConditionsSource] = (0, _react.useState)(_NetworkFloatingTool.createRemoteConditionsSource);
220
- (0, _react.useEffect)(() => {
221
- remoteConditionsSource.update(remoteConditions);
222
- }, [remoteConditionsSource, remoteConditions]);
223
- (0, _react.useEffect)(() => () => remoteConditionsSource.update(undefined), [remoteConditionsSource]);
224
- /**
225
- * Overrides are a DEVICE capability — a rule runs inside the app's own
226
- * `fetch`/`XMLHttpRequest`, which the dashboard doesn't have.
227
- *
228
- * That doesn't mean the dashboard can't AUTHOR them: in `inline` mode the
229
- * rule store runs as a mirror of the connected device (see
230
- * `overrideRulesStore.enableRemoteMode`), so the screens below are the same
231
- * ones the phone renders and every edit is forwarded. The one thing the
232
- * dashboard never does is apply a rule to its own traffic —
233
- * `disableEngine()` guarantees that.
234
- */
235
- const overridesAvailable = true;
236
- /**
237
- * A rule prefilled from a request the user was looking at, handed to the
238
- * Overrides screen when it mounts. Lives here rather than in that screen
239
- * because the request that seeds it is on a DIFFERENT screen — this is the
240
- * one place both are in scope.
241
- */
242
- const [pendingOverrideDraft, setPendingOverrideDraft] = (0, _react.useState)(null);
243
- const [activeTab, setActiveTab] = (0, _react.useState)("filters");
244
- const [searchText, setSearchText] = (0, _react.useState)("");
245
- const [isSearchActive, setIsSearchActive] = (0, _react.useState)(false);
246
- // True while the header's clear ✕ is being pressed. With a mouse, pressing
247
- // the ✕ blurs the input FIRST, and the blur handler below closes search —
248
- // which unmounts the ✕ before its own press can fire, so the query was
249
- // never cleared (desktop). Press-in lands before the blur, so the blur
250
- // handler can tell this dismissal apart from a click elsewhere.
251
- const clearPressRef = (0, _react.useRef)(false);
252
- // The Saved screen's search box lives HERE, not in that screen, because the
253
- // detail footer steps through the same list the user was just looking at —
254
- // and the Saved screen is unmounted while a detail is open.
255
- const [savedSearch, setSavedSearch] = (0, _react.useState)("");
256
- const searchInputRef = (0, _react.useRef)(null);
257
- // Ignored domains/URL patterns live in a shared, persisted singleton store
258
- // (@buoy-gg/shared-ui) so the Network tool and the Events tool stay in sync.
259
- const {
260
- patterns: ignoredPatterns,
261
- values: ignoredPatternValues,
262
- add: addIgnoredPattern,
263
- remove: removeIgnoredPattern,
264
- toggle: toggleIgnoredPattern,
265
- toggleMode: toggleIgnoredPatternMode
266
- } = (0, _sharedUi.useIgnoredPatterns)();
267
- const [copySettings, setCopySettings] = (0, _react.useState)(_NetworkCopySettingsView.DEFAULT_COPY_SETTINGS);
268
- const hasLoadedCopySettings = (0, _react.useRef)(false);
269
- const [showUpgradeModal, setShowUpgradeModal] = (0, _react.useState)(false);
270
- // Which ceiling the user hit — the upgrade sheet has to argue for the thing
271
- // they were actually trying to do, not for exporting.
272
- const [upgradeReason, setUpgradeReason] = (0, _react.useState)("export");
273
- const showUpgrade = reason => {
274
- setUpgradeReason(reason);
275
- setShowUpgradeModal(true);
276
- };
277
-
278
- // Auto-close upgrade modal when user becomes Pro
279
- (0, _react.useEffect)(() => {
280
- if (showUpgradeModal && isPro) {
281
- setShowUpgradeModal(false);
282
- }
283
- }, [showUpgradeModal, isPro]);
284
-
285
- // Load persisted copy settings on mount
286
- (0, _react.useEffect)(() => {
287
- if (!visible || hasLoadedCopySettings.current) return;
288
- const loadCopySettings = async () => {
289
- try {
290
- const stored = await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.network.copyOptions());
291
- if (stored) {
292
- const settings = JSON.parse(stored);
293
- setCopySettings(settings);
294
- }
295
- } catch (_error) {
296
- // Silently fail - use defaults
297
- } finally {
298
- hasLoadedCopySettings.current = true;
299
- }
300
- };
301
- loadCopySettings();
302
- }, [visible]);
303
-
304
- // Save copy settings when they change
305
- (0, _react.useEffect)(() => {
306
- if (!hasLoadedCopySettings.current) return; // Don't save on initial load
307
-
308
- const saveCopySettings = async () => {
309
- try {
310
- await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.network.copyOptions(), JSON.stringify(copySettings));
311
- } catch (_error) {
312
- // Silently fail - settings will remain in memory
313
- }
314
- };
315
- saveCopySettings();
316
- }, [copySettings]);
317
-
318
- // Simple handlers - no useCallback needed per rule2
319
- const handleBack = () => {
320
- _networkSelectionStore.networkSelectionStore.clear();
321
- };
322
-
323
- // Stable identity: this is passed down to the memoized list rows.
324
- const handleEventPress = (0, _react.useCallback)(event => {
325
- _networkSelectionStore.networkSelectionStore.select(event.id);
326
- }, []);
327
-
328
- /**
329
- * "Custom…" in a request's Override section. Stable identity because the
330
- * detail view is memoized on its props and an unstable callback would defeat
331
- * the bail-out that keeps prev/next stepping cheap.
332
- */
333
- const handleOverridePress = (0, _react.useCallback)((draft, ruleId) => {
334
- setPendingOverrideDraft(ruleId ? {
335
- ...draft,
336
- id: ruleId
337
- } : draft);
338
- setShowOverridesView(true);
339
- // Leave the detail view, or its header would sit on top of the editor.
340
- _networkSelectionStore.networkSelectionStore.clear();
341
- }, []);
342
-
343
- // Stable identity: the Overrides screen adopts the draft in an effect keyed
344
- // on both, so an unstable callback would re-run it every render.
345
- const handlePendingOverrideConsumed = (0, _react.useCallback)(() => setPendingOverrideDraft(null), []);
346
-
347
- // Non-null while the Overrides screen has its rule editor open — the editor
348
- // is that screen's own state, so the header asks it first before popping the
349
- // whole screen. See the prop's comment on NetworkOverridesScreen.
350
- const overridesBackRef = (0, _react.useRef)(null);
351
- const handleSearch = text => {
352
- setSearchText(text);
353
- setFilter(prev => ({
354
- ...prev,
355
- searchText: text
356
- }));
357
- };
358
- const toggleStatusFilter = status => {
359
- setFilter(prev => ({
360
- ...prev,
361
- status: prev.status === status ? undefined : status
362
- }));
363
- };
364
-
365
- // JsModal owns the mode; the only thing this modal needs it for is the
366
- // detail footer's bottom inset — a bottom sheet sits on the home indicator,
367
- // a floating window does not (same call StorageModalWithTabs makes).
368
- const [modalMode, setModalMode] = (0, _react.useState)("bottomSheet");
369
- const handleModeChange = mode => {
370
- setModalMode(mode);
371
- };
372
- (0, _react.useEffect)(() => {
373
- if (isSearchActive) {
374
- requestAnimationFrame(() => {
375
- searchInputRef.current?.focus();
376
- });
377
- }
378
- }, [isSearchActive]);
379
-
380
- // Compact header with actions (like Sentry/Storage modals)
381
- const renderHeaderContent = () => {
382
- // Filter view header with tabs — the night segmented control (the same
383
- // one the dial settings header uses).
384
- if (showFilterView) {
385
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader, {
386
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation, {
387
- onBack: () => setShowFilterView(false)
388
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Content, {
389
- title: "",
390
- noMargin: true,
391
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.NightSegmented, {
392
- size: "sm",
393
- tabs: [{
394
- key: "filters",
395
- label: "Filters"
396
- }, {
397
- key: "copy",
398
- label: "Copy"
399
- }],
400
- activeKey: activeTab,
401
- onChange: tab => setActiveTab(tab)
402
- })
403
- })]
404
- });
405
- }
406
-
407
- // Event detail view header
408
- if (hasSelection) {
409
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader, {
410
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation, {
411
- onBack: handleBack
412
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Content, {
413
- title: "Request Details",
414
- centered: true
415
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader.Actions, {
416
- children: [overridesAvailable ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkOverrideHeaderButton.NetworkOverrideHeaderButton, {
417
- onOpen: handleOverridePress
418
- }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkHeaderLive.NetworkDetailPinActions, {
419
- isPro: isPro,
420
- onUpgradePress: () => showUpgrade("saved")
421
- })]
422
- })]
423
- });
424
- }
425
-
426
- // Overrides manager header.
427
- if (showOverridesView && overridesAvailable) {
428
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader, {
429
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation, {
430
- onBack: () => {
431
- if (overridesBackRef.current?.()) return;
432
- setShowOverridesView(false);
433
- setPendingOverrideDraft(null);
434
- }
435
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Content, {
436
- title: "Response Overrides",
437
- centered: true
438
- })]
439
- });
440
- }
441
-
442
- // Saved (favorites) header. Checked AFTER the detail branch so opening a
443
- // saved request still gets the detail header — and its pin/save toggles.
444
- if (showSavedView) {
445
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader, {
446
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation, {
447
- onBack: () => setShowSavedView(false)
448
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Content, {
449
- title: "Saved Requests",
450
- centered: true
451
- })]
452
- });
453
- }
454
-
455
- // Main list view header with search and filters. The live pieces
456
- // (count chips, copy, trash) are self-subscribing leaves — this
457
- // header function itself only re-runs on user interaction.
458
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader, {
459
- children: [onBack && /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation, {
460
- onBack: onBack
461
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Content, {
462
- title: "",
463
- children: isSearchActive ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Search, {
464
- value: searchText,
465
- onChangeText: handleSearch,
466
- onCancel: () => {
467
- handleSearch("");
468
- setIsSearchActive(false);
469
- },
470
- onDismiss: () => setIsSearchActive(false),
471
- dismissOnBlur: true,
472
- clearOnlyWhenText: true,
473
- placeholder: "Search URL, method, operation, error...",
474
- accessibilityLabel: "Search network requests",
475
- iconSize: 14,
476
- testID: "buoy-network-search-input",
477
- clearTestID: "buoy-network-search-clear",
478
- inputProps: {
479
- "sentry-label": "ignore network search header"
480
- }
481
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkHeaderLive.NetworkHeaderBadges, {
482
- activeStatus: filter.status,
483
- onToggleStatus: toggleStatusFilter,
484
- ignoredPatterns: ignoredPatterns,
485
- paused: paused
486
- })
487
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader.Actions, {
488
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
489
- "sentry-label": "ignore open search",
490
- testID: "buoy-network-search-open",
491
- accessibilityLabel: "Open search",
492
- accessibilityRole: "button",
493
- onPress: () => setIsSearchActive(true),
494
- style: styles.headerActionButton,
495
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Search, {
496
- size: 14,
497
- color: _sharedUi.night.color.textSecondary
498
- })
499
- }), overridesAvailable ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkOverridesButton.NetworkOverridesButton, {
500
- onPress: () => setShowOverridesView(true)
501
- }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.PowerToggleButton, {
502
- isEnabled: !paused,
503
- onToggle: () => setPaused(prev => !prev),
504
- accessibilityLabel: "Pause network list",
505
- testID: "buoy-network-power"
506
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkHeaderLive.NetworkClearButton, {
507
- paused: paused
508
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkHeaderMenu.NetworkHeaderMenuButton, {
509
- onPress: () => setShowHeaderMenu(prev => !prev),
510
- isOpen: showHeaderMenu,
511
- hasIndicator: hasActiveFilter
512
- })]
513
- })]
514
- });
515
- };
516
-
517
- // Surfaced on the ⋯ so moving Filters into the menu doesn't hide the one
518
- // thing that button was communicating.
519
- const hasActiveFilter = !!(filter.status || filter.method || filter.contentType);
520
- const persistenceKey = enableSharedModalDimensions ? _sharedUi.devToolsStorageKeys.modal.root() : _sharedUi.devToolsStorageKeys.network.modal();
521
- if (!visible) return null;
522
-
523
- // The LIST screen owns its scrolling (FlatList virtualization requires
524
- // it — inside JsModal's ScrollView wrapper every row mounts, which at
525
- // the 500-event cap measured 17 JS FPS / 133% CPU / 1.4GB; see
526
- // NetworkListScreen). The Saved screen is a FlatList too, so it takes the
527
- // same deal. The DETAIL screen owns it as well, so its prev/next footer
528
- // stays pinned instead of scrolling away with the body. Filter/copy still
529
- // use the wrapper.
530
- const bodyOwnsScroll = hasSelection || !showFilterView;
531
- const body = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
532
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
533
- style: styles.container,
534
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(NetworkDetailScreen, {
535
- visible: hasSelection,
536
- paused: paused,
537
- ignoredPatternValues: ignoredPatternValues,
538
- onTogglePattern: toggleIgnoredPattern,
539
- isPro: isPro,
540
- filter: filter,
541
- ignoredPatterns: ignoredPatterns
542
- // `showSavedView` is what Back returns to, so it is also which list
543
- // the user came from — and therefore which one to step through.
544
- ,
545
- fromSaved: showSavedView,
546
- savedSearch: savedSearch
547
- // Inline (desktop panel) has no home indicator to clear.
548
- ,
549
- applySafeAreaInset: !inline && modalMode === "bottomSheet"
550
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(NetworkFilterScreen, {
551
- visible: showFilterView && activeTab === "filters" && !hasSelection,
552
- paused: paused,
553
- isPro: isPro,
554
- filter: filter,
555
- onFilterChange: setFilter,
556
- ignoredPatterns: ignoredPatterns,
557
- onRemovePattern: removeIgnoredPattern,
558
- onAddPattern: addIgnoredPattern,
559
- onTogglePatternMode: toggleIgnoredPatternMode
560
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(NetworkCopyScreen, {
561
- visible: showFilterView && activeTab === "copy" && !hasSelection,
562
- paused: paused,
563
- isPro: isPro,
564
- filter: filter,
565
- ignoredPatterns: ignoredPatterns,
566
- settings: copySettings,
567
- onSettingsChange: setCopySettings
568
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkOverridesScreen.NetworkOverridesScreen, {
569
- visible: overridesAvailable && showOverridesView && !hasSelection && !showFilterView,
570
- isPro: isPro,
571
- onUpgradePress: () => showUpgrade("overrides"),
572
- pendingDraft: pendingOverrideDraft,
573
- onPendingConsumed: handlePendingOverrideConsumed,
574
- backHandlerRef: overridesBackRef
575
- // Inline (desktop panel) has no home indicator to clear.
576
- ,
577
- applySafeAreaInset: !inline && modalMode === "bottomSheet"
578
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkSavedScreen.NetworkSavedScreen, {
579
- visible: showSavedView && !hasSelection && !showFilterView &&
580
- // Overrides wins in the header branch too — the two must agree, or
581
- // one screen renders under the other's header.
582
- !(showOverridesView && overridesAvailable),
583
- isPro: isPro,
584
- copySettings: copySettings,
585
- search: savedSearch,
586
- onSearchChange: setSavedSearch,
587
- onEventPress: handleEventPress,
588
- onUpgradePress: () => showUpgrade("saved")
589
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkListScreen.NetworkListScreen, {
590
- visible: !hasSelection && !showFilterView && !showSavedView && !(showOverridesView && overridesAvailable),
591
- paused: paused,
592
- filter: filter,
593
- ignoredPatterns: ignoredPatterns,
594
- isPro: isPro,
595
- searchText: searchText,
596
- onEventPress: handleEventPress,
597
- onUpgradePress: () => showUpgrade("export")
598
- })]
599
- }), showHeaderMenu ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_NetworkHeaderMenu.NetworkHeaderMenu, {
600
- onClose: () => setShowHeaderMenu(false),
601
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkHeaderMenu.NetworkHeaderMenuItem, {
602
- icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Wifi, {
603
- size: 14,
604
- color: _sharedUi.night.color.textSecondary
605
- }),
606
- label: "Network throttling",
607
- testID: "buoy-network-menu-throttling",
608
- onPress: () => {
609
- setShowHeaderMenu(false);
610
- (0, _NetworkFloatingTool.openNetworkFloatingTool)(remoteConditions ? remoteConditionsSource : undefined);
611
- if (!inline) setMinimizeRequest(value => value + 1);
612
- }
613
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkHeaderMenu.NetworkHeaderMenuItem, {
614
- icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Filter, {
615
- size: 14,
616
- color: hasActiveFilter ? _sharedUi.night.color.accent : _sharedUi.night.color.textSecondary
617
- }),
618
- label: "Filters",
619
- detail: hasActiveFilter ? "Active" : undefined,
620
- onPress: () => {
621
- setShowHeaderMenu(false);
622
- setActiveTab("filters");
623
- setShowFilterView(true);
624
- }
625
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkHeaderMenu.NetworkHeaderMenuItem, {
626
- icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Bookmark, {
627
- size: 14,
628
- color: _sharedUi.night.color.textSecondary
629
- }),
630
- label: "Saved requests",
631
- onPress: () => {
632
- setShowHeaderMenu(false);
633
- setShowSavedView(true);
634
- }
635
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
636
- style: styles.menuCopyRow,
637
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkHeaderLive.NetworkHeaderCopyButton, {
638
- isPro: isPro,
639
- filter: filter,
640
- ignoredPatterns: ignoredPatterns,
641
- copySettings: copySettings,
642
- paused: paused,
643
- onUpgradePress: () => {
644
- setShowHeaderMenu(false);
645
- showUpgrade("export");
646
- },
647
- label: "Copy requests"
648
- })
649
- })]
650
- }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.UpgradeModal, {
651
- visible: showUpgradeModal,
652
- onClose: () => setShowUpgradeModal(false),
653
- featureName: upgradeReason === "saved" ? "Saved Requests" : upgradeReason === "overrides" ? "Response Overrides" : "Network Export",
654
- description: upgradeReason === "saved" ? "Keep the requests that matter. Saved requests survive Clear, app restarts, and the 500-request history cap." : upgradeReason === "overrides" ? "Force any endpoint to fail, stall or return something else — no backend changes, no code changes. Free keeps one active rule." : "Export network requests to share with your team, debug APIs, or feed into AI tools.",
655
- benefits: upgradeReason === "overrides" ? [`Run ${_types.MAX_RULES} rules at once (free keeps ${_types.FREE_TIER_RULE_LIMIT})`, "Force a 500, a 401 or an empty list in one tap", "Simulate offline, timeouts and slow connections", "Rules survive an app reload, so you can test the boot path"] : upgradeReason === "saved" ? [`Save up to ${_networkSavedStore.MAX_SAVED} requests (free keeps ${_networkSavedStore.FREE_TIER_SAVED_LIMIT})`, "Failed requests stay put through a Clear", "Snapshots survive an app restart", "Export saved requests to teammates or AI assistants"] : ["Export to JSON, Markdown, or plain text", "Customizable copy presets (URLs only, LLM-ready, full data)", "Share request details with teammates", "Feed network data directly to AI assistants"]
656
- })]
657
- });
658
-
659
- // The ONLY thing that differs between the phone and the desktop dashboard is
660
- // which shell the header and body go in. Everything above this line is shared.
661
- if (inline) {
662
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
663
- style: styles.inlineRoot,
664
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
665
- style: styles.inlineHeader,
666
- ..._sharedUi.windowDragProps,
667
- children: renderHeaderContent()
668
- }), body]
669
- });
670
- }
671
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.JsModal, {
672
- visible: visible,
673
- onClose: onClose,
674
- onMinimize: onMinimize,
675
- minimizeRequest: minimizeRequest,
676
- persistenceKey: persistenceKey,
677
- variant: "night",
678
- header: {
679
- showToggleButton: true,
680
- customContent: renderHeaderContent()
681
- },
682
- onModeChange: handleModeChange,
683
- enablePersistence: true,
684
- initialMode: "bottomSheet",
685
- enableGlitchEffects: true,
686
- disableScrollWrapper: bodyOwnsScroll
687
- // Night hoists the ToolBackground to the sheet root (field runs through
688
- // the header). The desktop INLINE panel never goes through JsModal — its
689
- // host (the workbench) hoists one shared field instead, so the body
690
- // mounts none of its own in either shell.
691
- ,
692
- styles: {},
693
- children: body
694
- });
695
- }
696
- const styles = _reactNative.StyleSheet.create({
697
- container: {
698
- flex: 1,
699
- // Transparent so the HOST's hoisted star field shows through — the night
700
- // JsModal's sheet-root field in the modal, the desktop workbench's shared
701
- // row field in the inline panel.
702
- backgroundColor: "transparent"
703
- },
704
- /** Detail = scrolling body + pinned stepper footer. `minHeight: 0` so the
705
- * body's ScrollView scrolls instead of stretching the column. */
706
- detailRoot: {
707
- flex: 1,
708
- minHeight: 0
709
- },
710
- /** Holds the footer down when the selected ID resolves to no event. */
711
- detailBodyFallback: {
712
- flex: 1
713
- },
714
- /** Inline shell — fills the host panel; `minHeight: 0` so the list's own
715
- * FlatList can scroll instead of stretching the column. Transparent so the
716
- * desktop workbench's hoisted sky (one field spanning sidebar + panel)
717
- * shows through — the shell paints its own base beneath that field. */
718
- inlineRoot: {
719
- flex: 1,
720
- minHeight: 0,
721
- backgroundColor: "transparent"
722
- },
723
- inlineHeader: {
724
- paddingHorizontal: 12,
725
- paddingVertical: 8,
726
- borderBottomWidth: 1,
727
- borderBottomColor: _sharedUi.macOSColors.border.default,
728
- // Clear, like Bench — the host's hoisted sky shows through the header.
729
- backgroundColor: "transparent"
730
- },
731
- // Night chrome — the header is glass over the star field, so the search
732
- // field and action chips sit on the Everlights dark-glass fill.
733
- menuCopyRow: {
734
- paddingHorizontal: 6
735
- },
736
- headerActionButton: {
737
- width: 32,
738
- height: 32,
739
- borderRadius: 8,
740
- backgroundColor: _sharedUi.night.color.buttonSurface,
741
- borderWidth: 1,
742
- borderColor: _sharedUi.night.color.border,
743
- alignItems: "center",
744
- justifyContent: "center"
745
- },
746
- activeFilterButton: {
747
- backgroundColor: _sharedUi.night.color.accentSoft,
748
- borderColor: _sharedUi.night.color.accentBorderStrong
749
- }
750
- });
751
-
752
- /**
753
- * High-level modal surface that wraps the network monitoring experience with shared timing
754
- * context. Automatically injects the `TickProvider` so timestamps refresh while the modal is open.
755
- */
756
- function NetworkModal(props) {
757
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_useTickEveryMinute.TickProvider, {
758
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(NetworkModalInner, {
759
- ...props
760
- })
761
- });
762
- }
763
- /**
764
- * The same network tool as `NetworkModal`, rendered INLINE — header bar, then
765
- * body — for hosts that place tools in a panel rather than a modal. Buoy Desktop
766
- * is the only one today.
767
- *
768
- * This exists so there is exactly ONE network tool. The desktop dashboard used
769
- * to ship its own 1,258-line copy of the modal's internals, which is how the two
770
- * surfaces drifted apart in the first place; anything added here now shows up on
771
- * both without a second edit.
772
- */
773
- function NetworkToolView(props = {}) {
774
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_useTickEveryMinute.TickProvider, {
775
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(NetworkModalInner, {
776
- ...props,
777
- inline: true,
778
- visible: true
779
- // Inline has no chrome to drive: there is no close button, no minimize
780
- // and no outer back — the host panel owns all of that.
781
- ,
782
- onClose: noop
783
- })
784
- });
785
- }
786
- const noop = () => {};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.NetworkModal=NetworkModal;exports.NetworkToolView=NetworkToolView;var _NetworkFloatingTool=require("../conditions/NetworkFloatingTool");var _react=require("react");var _reactNative=require("react-native");var _sharedUi=require("@buoy-gg/shared-ui");var _NetworkFilterViewV=require("./NetworkFilterViewV3");var _useTickEveryMinute=require("../hooks/useTickEveryMinute");var _NetworkEventDetailView=require("./NetworkEventDetailView");var _NetworkCopySettingsView=require("./NetworkCopySettingsView");var _NetworkHeaderLive=require("./NetworkHeaderLive");var _NetworkListScreen=require("./NetworkListScreen");var _NetworkSavedScreen=require("./NetworkSavedScreen");var _NetworkOverridesScreen=require("./NetworkOverridesScreen");var _NetworkOverridesButton=require("./NetworkOverridesButton");var _NetworkOverrideHeaderButton=require("./NetworkOverrideHeaderButton");var _NetworkHeaderMenu=require("./NetworkHeaderMenu");var _NetworkDetailStepper=require("./NetworkDetailStepper");var _useNetworkEventList=require("../hooks/useNetworkEventList");var _useLiveNetworkEvent=require("../hooks/useLiveNetworkEvent");var _useNetworkSelection=require("../hooks/useNetworkSelection");var _networkSelectionStore=require("../utils/networkSelectionStore");var _networkSavedStore=require("../utils/networkSavedStore");var _types=require("../overrides/types");var _jsxRuntime=require("react/jsx-runtime");function NetworkDetailScreen({visible:t,paused:i,ignoredPatternValues:l,onTogglePattern:d,isPro:S,filter:n,ignoredPatterns:c,fromSaved:u,savedSearch:g,applySafeAreaInset:s}){const x=(0,_useNetworkSelection.useSelectedNetworkEventId)();const M=(0,_useNetworkSelection.useNetworkBodyEventId)();const h=x!=null&&x===M;const r=(0,_useLiveNetworkEvent.useLiveNetworkEvent)(x,{paused:i||!t});(0,_react.useEffect)(()=>{if(t&&r&&h){_networkSelectionStore.networkSelectionStore.reportRendered(r.id)}},[t,r,h]);if(!t)return null;return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.detailRoot,children:[r?(0,_jsxRuntime.jsx)(_NetworkEventDetailView.NetworkEventDetailView,{event:r,ignoredPatterns:l,onTogglePattern:d,showBodies:h}):(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.detailBodyFallback}),(0,_jsxRuntime.jsx)(_NetworkDetailStepper.NetworkDetailStepper,{paused:i,filter:n,ignoredPatterns:c,isPro:S,fromSaved:u,savedSearch:g,applySafeAreaInset:s})]})}function NetworkFilterScreen({visible:t,paused:i,isPro:l,filter:d,onFilterChange:S,ignoredPatterns:n,onRemovePattern:c,onAddPattern:u,onTogglePatternMode:g}){const{events:s}=(0,_useNetworkEventList.useNetworkEventList)({filter:d,ignoredPatterns:n,paused:i,visible:t,isPro:l});if(!t)return null;return(0,_jsxRuntime.jsx)(_NetworkFilterViewV.NetworkFilterViewV3,{events:s,filter:d,onFilterChange:S,ignoredPatterns:n,onRemovePattern:c,onAddPattern:u,onTogglePatternMode:g})}function NetworkCopyScreen({visible:t,paused:i,isPro:l,filter:d,ignoredPatterns:S,settings:n,onSettingsChange:c}){const{events:u}=(0,_useNetworkEventList.useNetworkEventList)({filter:d,ignoredPatterns:S,paused:i,visible:t,isPro:l});if(!t)return null;return(0,_jsxRuntime.jsx)(_NetworkCopySettingsView.NetworkCopySettingsView,{settings:n,onSettingsChange:c,events:u})}function NetworkModalInner({visible:t,onClose:i,onBack:l,onMinimize:d,enableSharedModalDimensions:S=false,inline:n=false,paused:c,onPausedChange:u,remoteConditions:g}){const{isPro:s}=(0,_sharedUi.useFeatureGate)();const[x,M]=(0,_react.useState)(false);const h=c!=null&&u!=null;const r=h?c:x;const Y=e=>{const o=typeof e==="function"?e(r):e;if(h)u(o);else M(o)};const[a,C]=(0,_react.useState)({});const v=(0,_useNetworkSelection.useHasNetworkSelection)();const[w,V]=(0,_react.useState)(false);const[j,B]=(0,_react.useState)(false);const[m,H]=(0,_react.useState)(false);const[A,p]=(0,_react.useState)(false);const[Q,Z]=(0,_react.useState)(0);const[N]=(0,_react.useState)(_NetworkFloatingTool.createRemoteConditionsSource);(0,_react.useEffect)(()=>{N.update(g)},[N,g]);(0,_react.useEffect)(()=>()=>N.update(void 0),[N]);const k=true;const[ee,R]=(0,_react.useState)(null);const[E,L]=(0,_react.useState)("filters");const[D,te]=(0,_react.useState)("");const[q,T]=(0,_react.useState)(false);const fe=(0,_react.useRef)(false);const[U,re]=(0,_react.useState)("");const oe=(0,_react.useRef)(null);const{patterns:f,values:se,add:ne,remove:ae,toggle:ie,toggleMode:le}=(0,_sharedUi.useIgnoredPatterns)();const[P,z]=(0,_react.useState)(_NetworkCopySettingsView.DEFAULT_COPY_SETTINGS);const I=(0,_react.useRef)(false);const[_,O]=(0,_react.useState)(false);const[y,de]=(0,_react.useState)("export");const b=e=>{de(e);O(true)};(0,_react.useEffect)(()=>{if(_&&s){O(false)}},[_,s]);(0,_react.useEffect)(()=>{if(!t||I.current)return;const e=async()=>{try{const o=await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.network.copyOptions());if(o){const ke=JSON.parse(o);z(ke)}}catch(o){}finally{I.current=true}};e()},[t]);(0,_react.useEffect)(()=>{if(!I.current)return;const e=async()=>{try{await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.network.copyOptions(),JSON.stringify(P))}catch(o){}};e()},[P]);const ce=()=>{_networkSelectionStore.networkSelectionStore.clear()};const K=(0,_react.useCallback)(e=>{_networkSelectionStore.networkSelectionStore.select(e.id)},[]);const ue=(0,_react.useCallback)((e,o)=>{R(o?{...e,id:o}:e);H(true);_networkSelectionStore.networkSelectionStore.clear()},[]);const ve=(0,_react.useCallback)(()=>R(null),[]);const W=(0,_react.useRef)(null);const J=e=>{te(e);C(o=>({...o,searchText:e}))};const Se=e=>{C(o=>({...o,status:o.status===e?void 0:e}))};const[$,ge]=(0,_react.useState)("bottomSheet");const we=e=>{ge(e)};(0,_react.useEffect)(()=>{if(q){requestAnimationFrame(()=>{oe.current?.focus()})}},[q]);const G=()=>{if(w){return(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:()=>V(false)}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:"",noMargin:true,children:(0,_jsxRuntime.jsx)(_sharedUi.NightSegmented,{size:"sm",tabs:[{key:"filters",label:"Filters"},{key:"copy",label:"Copy"}],activeKey:E,onChange:e=>L(e)})})]})}if(v){return(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:ce}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:"Request Details",centered:true}),(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader.Actions,{children:[k?(0,_jsxRuntime.jsx)(_NetworkOverrideHeaderButton.NetworkOverrideHeaderButton,{onOpen:ue}):null,(0,_jsxRuntime.jsx)(_NetworkHeaderLive.NetworkDetailPinActions,{isPro:s,onUpgradePress:()=>b("saved")})]})]})}if(m&&k){return(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:()=>{if(W.current?.())return;H(false);R(null)}}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:"Response Overrides",centered:true})]})}if(j){return(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:()=>B(false)}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:"Saved Requests",centered:true})]})}return(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[l&&(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:l}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:"",children:q?(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Search,{value:D,onChangeText:J,onCancel:()=>{J("");T(false)},onDismiss:()=>T(false),dismissOnBlur:true,clearOnlyWhenText:true,placeholder:"Search URL, method, operation, error...",accessibilityLabel:"Search network requests",iconSize:14,testID:"buoy-network-search-input",clearTestID:"buoy-network-search-clear",inputProps:{"sentry-label":"ignore network search header"}}):(0,_jsxRuntime.jsx)(_NetworkHeaderLive.NetworkHeaderBadges,{activeStatus:a.status,onToggleStatus:Se,ignoredPatterns:f,paused:r})}),(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader.Actions,{children:[(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{"sentry-label":"ignore open search",testID:"buoy-network-search-open",accessibilityLabel:"Open search",accessibilityRole:"button",onPress:()=>T(true),style:styles.headerActionButton,children:(0,_jsxRuntime.jsx)(_sharedUi.Search,{size:14,color:_sharedUi.night.color.textSecondary})}),k?(0,_jsxRuntime.jsx)(_NetworkOverridesButton.NetworkOverridesButton,{onPress:()=>H(true)}):null,(0,_jsxRuntime.jsx)(_sharedUi.PowerToggleButton,{isEnabled:!r,onToggle:()=>Y(e=>!e),accessibilityLabel:r?"Resume network capture":"Pause network capture",testID:"buoy-network-power"}),(0,_jsxRuntime.jsx)(_NetworkHeaderLive.NetworkClearButton,{paused:r}),(0,_jsxRuntime.jsx)(_NetworkHeaderMenu.NetworkHeaderMenuButton,{onPress:()=>p(e=>!e),isOpen:A,hasIndicator:F})]})]})};const F=!!(a.status||a.method||a.contentType);const he=S?_sharedUi.devToolsStorageKeys.modal.root():_sharedUi.devToolsStorageKeys.network.modal();if(!t)return null;const pe=v||!w;const X=(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.container,children:[(0,_jsxRuntime.jsx)(NetworkDetailScreen,{visible:v,paused:r,ignoredPatternValues:se,onTogglePattern:ie,isPro:s,filter:a,ignoredPatterns:f,fromSaved:j,savedSearch:U,applySafeAreaInset:!n&&$==="bottomSheet"}),(0,_jsxRuntime.jsx)(NetworkFilterScreen,{visible:w&&E==="filters"&&!v,paused:r,isPro:s,filter:a,onFilterChange:C,ignoredPatterns:f,onRemovePattern:ae,onAddPattern:ne,onTogglePatternMode:le}),(0,_jsxRuntime.jsx)(NetworkCopyScreen,{visible:w&&E==="copy"&&!v,paused:r,isPro:s,filter:a,ignoredPatterns:f,settings:P,onSettingsChange:z}),(0,_jsxRuntime.jsx)(_NetworkOverridesScreen.NetworkOverridesScreen,{visible:k&&m&&!v&&!w,isPro:s,onUpgradePress:()=>b("overrides"),pendingDraft:ee,onPendingConsumed:ve,backHandlerRef:W,applySafeAreaInset:!n&&$==="bottomSheet"}),(0,_jsxRuntime.jsx)(_NetworkSavedScreen.NetworkSavedScreen,{visible:j&&!v&&!w&&!(m&&k),isPro:s,copySettings:P,search:U,onSearchChange:re,onEventPress:K,onUpgradePress:()=>b("saved")}),(0,_jsxRuntime.jsx)(_NetworkListScreen.NetworkListScreen,{visible:!v&&!w&&!j&&!(m&&k),paused:r,filter:a,ignoredPatterns:f,isPro:s,searchText:D,onEventPress:K,onUpgradePress:()=>b("export")})]}),A?(0,_jsxRuntime.jsxs)(_NetworkHeaderMenu.NetworkHeaderMenu,{onClose:()=>p(false),children:[(0,_jsxRuntime.jsx)(_NetworkHeaderMenu.NetworkHeaderMenuItem,{icon:(0,_jsxRuntime.jsx)(_sharedUi.Wifi,{size:14,color:_sharedUi.night.color.textSecondary}),label:"Network throttling",testID:"buoy-network-menu-throttling",onPress:()=>{p(false);(0,_NetworkFloatingTool.openNetworkFloatingTool)(g?N:void 0);if(!n)Z(e=>e+1)}}),(0,_jsxRuntime.jsx)(_NetworkHeaderMenu.NetworkHeaderMenuItem,{icon:(0,_jsxRuntime.jsx)(_sharedUi.Filter,{size:14,color:F?_sharedUi.night.color.accent:_sharedUi.night.color.textSecondary}),label:"Filters",detail:F?"Active":void 0,onPress:()=>{p(false);L("filters");V(true)}}),(0,_jsxRuntime.jsx)(_NetworkHeaderMenu.NetworkHeaderMenuItem,{icon:(0,_jsxRuntime.jsx)(_sharedUi.Bookmark,{size:14,color:_sharedUi.night.color.textSecondary}),label:"Saved requests",onPress:()=>{p(false);B(true)}}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.menuCopyRow,children:(0,_jsxRuntime.jsx)(_NetworkHeaderLive.NetworkHeaderCopyButton,{isPro:s,filter:a,ignoredPatterns:f,copySettings:P,paused:r,onUpgradePress:()=>{p(false);b("export")},label:"Copy requests"})})]}):null,(0,_jsxRuntime.jsx)(_sharedUi.UpgradeModal,{visible:_,onClose:()=>O(false),featureName:y==="saved"?"Saved Requests":y==="overrides"?"Response Overrides":"Network Export",description:y==="saved"?"Keep the requests that matter. Saved requests survive Clear, app restarts, and the 500-request history cap.":y==="overrides"?"Force any endpoint to fail, stall or return something else \u2014 no backend changes, no code changes. Free keeps one active rule.":"Export network requests to share with your team, debug APIs, or feed into AI tools.",benefits:y==="overrides"?[`Run ${_types.MAX_RULES} rules at once (free keeps ${_types.FREE_TIER_RULE_LIMIT})`,"Force a 500, a 401 or an empty list in one tap","Simulate offline, timeouts and slow connections","Rules survive an app reload, so you can test the boot path"]:y==="saved"?[`Save up to ${_networkSavedStore.MAX_SAVED} requests (free keeps ${_networkSavedStore.FREE_TIER_SAVED_LIMIT})`,"Failed requests stay put through a Clear","Snapshots survive an app restart","Export saved requests to teammates or AI assistants"]:["Export to JSON, Markdown, or plain text","Customizable copy presets (URLs only, LLM-ready, full data)","Share request details with teammates","Feed network data directly to AI assistants"]})]});if(n){return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.inlineRoot,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.inlineHeader,..._sharedUi.windowDragProps,children:G()}),X]})}return(0,_jsxRuntime.jsx)(_sharedUi.JsModal,{visible:t,onClose:i,onMinimize:d,minimizeRequest:Q,persistenceKey:he,variant:"night",header:{showToggleButton:true,customContent:G()},onModeChange:we,enablePersistence:true,initialMode:"bottomSheet",enableGlitchEffects:true,disableScrollWrapper:pe,styles:{},children:X})}const styles=_reactNative.StyleSheet.create({container:{flex:1,backgroundColor:"transparent"},detailRoot:{flex:1,minHeight:0},detailBodyFallback:{flex:1},inlineRoot:{flex:1,minHeight:0,backgroundColor:"transparent"},inlineHeader:{paddingHorizontal:12,paddingVertical:8,borderBottomWidth:1,borderBottomColor:_sharedUi.macOSColors.border.default,backgroundColor:"transparent"},menuCopyRow:{paddingHorizontal:6},headerActionButton:{width:32,height:32,borderRadius:8,backgroundColor:_sharedUi.night.color.buttonSurface,borderWidth:1,borderColor:_sharedUi.night.color.border,alignItems:"center",justifyContent:"center"},activeFilterButton:{backgroundColor:_sharedUi.night.color.accentSoft,borderColor:_sharedUi.night.color.accentBorderStrong}});function NetworkModal(t){return(0,_jsxRuntime.jsx)(_useTickEveryMinute.TickProvider,{children:(0,_jsxRuntime.jsx)(NetworkModalInner,{...t})})}function NetworkToolView(t={}){return(0,_jsxRuntime.jsx)(_useTickEveryMinute.TickProvider,{children:(0,_jsxRuntime.jsx)(NetworkModalInner,{...t,inline:true,visible:true,onClose:noop})})}const noop=()=>{};