@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.
- package/README.md +11 -79
- package/lib/commonjs/index.js +1 -325
- package/lib/commonjs/index.web.js +1 -420
- package/lib/commonjs/network/components/DataViewer.web.js +1 -879
- package/lib/commonjs/network/components/NetworkCopyScreen.web.js +1 -48
- package/lib/commonjs/network/components/NetworkCopySettingsView.js +27 -755
- package/lib/commonjs/network/components/NetworkCopySettingsView.web.js +14 -1242
- package/lib/commonjs/network/components/NetworkDetailScreen.web.js +1 -101
- package/lib/commonjs/network/components/NetworkDetailStepper.js +1 -108
- package/lib/commonjs/network/components/NetworkDetailStepper.web.js +1 -298
- package/lib/commonjs/network/components/NetworkEventDetailView.js +15 -1130
- package/lib/commonjs/network/components/NetworkEventDetailView.web.js +15 -1484
- package/lib/commonjs/network/components/NetworkEventItemCompact.js +2 -401
- package/lib/commonjs/network/components/NetworkEventItemCompact.web.js +2 -820
- package/lib/commonjs/network/components/NetworkFilterScreen.web.js +1 -55
- package/lib/commonjs/network/components/NetworkFilterViewV3.js +1 -442
- package/lib/commonjs/network/components/NetworkFilterViewV3.web.js +1 -1310
- package/lib/commonjs/network/components/NetworkHeaderLive.js +1 -375
- package/lib/commonjs/network/components/NetworkHeaderLive.web.js +1 -623
- package/lib/commonjs/network/components/NetworkHeaderMenu.js +1 -190
- package/lib/commonjs/network/components/NetworkListScreen.js +1 -404
- package/lib/commonjs/network/components/NetworkListScreen.web.js +1 -625
- package/lib/commonjs/network/components/NetworkModal.js +1 -786
- package/lib/commonjs/network/components/NetworkNumberPrompt.js +1 -178
- package/lib/commonjs/network/components/NetworkNumberPrompt.web.js +1 -232
- package/lib/commonjs/network/components/NetworkOverrideEditor.js +1 -814
- package/lib/commonjs/network/components/NetworkOverrideEditor.web.js +1 -942
- package/lib/commonjs/network/components/NetworkOverrideHeaderButton.js +1 -107
- package/lib/commonjs/network/components/NetworkOverrideHeaderButton.web.js +1 -133
- package/lib/commonjs/network/components/NetworkOverridesButton.js +1 -90
- package/lib/commonjs/network/components/NetworkOverridesButton.web.js +1 -143
- package/lib/commonjs/network/components/NetworkOverridesScreen.js +1 -543
- package/lib/commonjs/network/components/NetworkOverridesScreen.web.js +1 -830
- package/lib/commonjs/network/components/NetworkSavedScreen.js +1 -226
- package/lib/commonjs/network/components/NetworkSavedScreen.web.js +1 -463
- package/lib/commonjs/network/components/NetworkUpgradeBanner.js +1 -76
- package/lib/commonjs/network/components/response-editor/Explorer.js +1 -973
- package/lib/commonjs/network/components/response-editor/Explorer.web.js +1 -1136
- package/lib/commonjs/network/components/response-editor/deleteNestedDataByPath.js +1 -56
- package/lib/commonjs/network/components/response-editor/editorContext.js +1 -33
- package/lib/commonjs/network/components/response-editor/updateNestedDataByPath.js +1 -61
- package/lib/commonjs/network/conditions/NetworkConditionsControl.js +1 -235
- package/lib/commonjs/network/conditions/NetworkConditionsControl.test.js +1 -136
- package/lib/commonjs/network/conditions/NetworkConditionsIcon.js +1 -33
- package/lib/commonjs/network/conditions/NetworkFloatingTool.js +1 -310
- package/lib/commonjs/network/conditions/NetworkFloatingTool.test.js +1 -219
- package/lib/commonjs/network/conditions/store.js +1 -75
- package/lib/commonjs/network/conditions/wait.js +1 -43
- package/lib/commonjs/network/conditions/xhr.js +1 -110
- package/lib/commonjs/network/hooks/useLiveNetworkEvent.js +1 -62
- package/lib/commonjs/network/hooks/useNetworkBadgeCounts.js +1 -83
- package/lib/commonjs/network/hooks/useNetworkEventList.js +1 -108
- package/lib/commonjs/network/hooks/useNetworkEvents.js +1 -318
- package/lib/commonjs/network/hooks/useNetworkHasMatches.js +1 -56
- package/lib/commonjs/network/hooks/useNetworkSaved.js +1 -38
- package/lib/commonjs/network/hooks/useNetworkSelection.js +1 -53
- package/lib/commonjs/network/hooks/useOverrideRules.js +1 -36
- package/lib/commonjs/network/hooks/useTickEveryMinute.js +1 -21
- package/lib/commonjs/network/overrides/applyToFetch.js +1 -80
- package/lib/commonjs/network/overrides/applyToXhr.js +2 -453
- package/lib/commonjs/network/overrides/engine.js +1 -93
- package/lib/commonjs/network/overrides/matchRule.js +1 -81
- package/lib/commonjs/network/overrides/overriddenRows.js +1 -0
- package/lib/commonjs/network/overrides/overrideRulesStore.js +1 -550
- package/lib/commonjs/network/overrides/presets.js +1 -70
- package/lib/commonjs/network/overrides/resolveOverride.js +1 -158
- package/lib/commonjs/network/overrides/types.js +1 -90
- package/lib/commonjs/network/sync/networkBodyResolver.js +1 -39
- package/lib/commonjs/network/sync/networkSyncAdapter.js +1 -882
- package/lib/commonjs/network/sync/overrideHonesty.release.test.js +1 -36
- package/lib/commonjs/network/types/index.js +1 -5
- package/lib/commonjs/network/utils/extractOperationName.js +1 -80
- package/lib/commonjs/network/utils/filterNetworkEvents.js +1 -96
- package/lib/commonjs/network/utils/formatGraphQLVariables.js +1 -219
- package/lib/commonjs/network/utils/formatting.js +1 -30
- package/lib/commonjs/network/utils/generateCurl.js +2 -71
- package/lib/commonjs/network/utils/generateNetworkCopyText.js +37 -166
- package/lib/commonjs/network/utils/httpCompletion.js +1 -37
- package/lib/commonjs/network/utils/networkEventStore.js +1 -393
- package/lib/commonjs/network/utils/networkListener.js +4 -1259
- package/lib/commonjs/network/utils/networkSavedStore.js +3 -577
- package/lib/commonjs/network/utils/networkSelectionStore.js +1 -193
- package/lib/commonjs/network/utils/realNow.js +1 -0
- package/lib/commonjs/network/utils/requestId.js +1 -0
- package/lib/commonjs/network/utils/resolveRequestUrl.js +1 -0
- package/lib/commonjs/network/utils/selectSavedEvents.js +1 -39
- package/lib/commonjs/network/utils/startNetworkCapture.js +1 -0
- package/lib/commonjs/network/utils/withPinnedFirst.js +1 -32
- package/lib/commonjs/preset.js +1 -102
- package/lib/module/index.js +1 -103
- package/lib/module/index.web.js +1 -82
- package/lib/module/network/components/DataViewer.web.js +1 -875
- package/lib/module/network/components/NetworkCopyScreen.web.js +1 -44
- package/lib/module/network/components/NetworkCopySettingsView.js +27 -750
- package/lib/module/network/components/NetworkCopySettingsView.web.js +14 -1237
- package/lib/module/network/components/NetworkDetailScreen.web.js +1 -97
- package/lib/module/network/components/NetworkDetailStepper.js +1 -104
- package/lib/module/network/components/NetworkDetailStepper.web.js +1 -296
- package/lib/module/network/components/NetworkEventDetailView.js +15 -1129
- package/lib/module/network/components/NetworkEventDetailView.web.js +15 -1482
- package/lib/module/network/components/NetworkEventItemCompact.js +2 -398
- package/lib/module/network/components/NetworkEventItemCompact.web.js +2 -818
- package/lib/module/network/components/NetworkFilterScreen.web.js +1 -51
- package/lib/module/network/components/NetworkFilterViewV3.js +1 -438
- package/lib/module/network/components/NetworkFilterViewV3.web.js +1 -1306
- package/lib/module/network/components/NetworkHeaderLive.js +1 -366
- package/lib/module/network/components/NetworkHeaderLive.web.js +1 -617
- package/lib/module/network/components/NetworkHeaderMenu.js +1 -184
- package/lib/module/network/components/NetworkListScreen.js +1 -400
- package/lib/module/network/components/NetworkListScreen.web.js +1 -623
- package/lib/module/network/components/NetworkModal.js +1 -781
- package/lib/module/network/components/NetworkNumberPrompt.js +1 -174
- package/lib/module/network/components/NetworkNumberPrompt.web.js +1 -230
- package/lib/module/network/components/NetworkOverrideEditor.js +1 -811
- package/lib/module/network/components/NetworkOverrideEditor.web.js +1 -939
- package/lib/module/network/components/NetworkOverrideHeaderButton.js +1 -104
- package/lib/module/network/components/NetworkOverrideHeaderButton.web.js +1 -131
- package/lib/module/network/components/NetworkOverridesButton.js +1 -87
- package/lib/module/network/components/NetworkOverridesButton.web.js +1 -141
- package/lib/module/network/components/NetworkOverridesScreen.js +1 -539
- package/lib/module/network/components/NetworkOverridesScreen.web.js +1 -826
- package/lib/module/network/components/NetworkSavedScreen.js +1 -222
- package/lib/module/network/components/NetworkSavedScreen.web.js +1 -461
- package/lib/module/network/components/NetworkUpgradeBanner.js +1 -72
- package/lib/module/network/components/response-editor/Explorer.js +1 -972
- package/lib/module/network/components/response-editor/Explorer.web.js +1 -1133
- package/lib/module/network/components/response-editor/deleteNestedDataByPath.js +1 -51
- package/lib/module/network/components/response-editor/editorContext.js +1 -29
- package/lib/module/network/components/response-editor/updateNestedDataByPath.js +1 -56
- package/lib/module/network/conditions/NetworkConditionsControl.js +1 -231
- package/lib/module/network/conditions/NetworkConditionsControl.test.js +1 -135
- package/lib/module/network/conditions/NetworkConditionsIcon.js +1 -29
- package/lib/module/network/conditions/NetworkFloatingTool.js +1 -304
- package/lib/module/network/conditions/NetworkFloatingTool.test.js +1 -218
- package/lib/module/network/conditions/store.js +1 -65
- package/lib/module/network/conditions/wait.js +1 -38
- package/lib/module/network/conditions/xhr.js +1 -106
- package/lib/module/network/hooks/useLiveNetworkEvent.js +1 -58
- package/lib/module/network/hooks/useNetworkBadgeCounts.js +1 -79
- package/lib/module/network/hooks/useNetworkEventList.js +1 -104
- package/lib/module/network/hooks/useNetworkEvents.js +1 -314
- package/lib/module/network/hooks/useNetworkHasMatches.js +1 -52
- package/lib/module/network/hooks/useNetworkSaved.js +1 -34
- package/lib/module/network/hooks/useNetworkSelection.js +1 -46
- package/lib/module/network/hooks/useOverrideRules.js +1 -32
- package/lib/module/network/hooks/useTickEveryMinute.js +1 -11
- package/lib/module/network/overrides/applyToFetch.js +1 -72
- package/lib/module/network/overrides/applyToXhr.js +2 -446
- package/lib/module/network/overrides/engine.js +1 -85
- package/lib/module/network/overrides/matchRule.js +1 -75
- package/lib/module/network/overrides/overriddenRows.js +1 -0
- package/lib/module/network/overrides/overrideRulesStore.js +1 -547
- package/lib/module/network/overrides/presets.js +1 -65
- package/lib/module/network/overrides/resolveOverride.js +1 -152
- package/lib/module/network/overrides/types.js +1 -86
- package/lib/module/network/sync/networkBodyResolver.js +1 -34
- package/lib/module/network/sync/networkSyncAdapter.js +1 -880
- package/lib/module/network/sync/overrideHonesty.release.test.js +1 -35
- package/lib/module/network/types/index.js +1 -3
- package/lib/module/network/utils/extractOperationName.js +1 -76
- package/lib/module/network/utils/filterNetworkEvents.js +1 -92
- package/lib/module/network/utils/formatGraphQLVariables.js +1 -213
- package/lib/module/network/utils/formatting.js +1 -9
- package/lib/module/network/utils/generateCurl.js +2 -67
- package/lib/module/network/utils/generateNetworkCopyText.js +37 -162
- package/lib/module/network/utils/httpCompletion.js +1 -32
- package/lib/module/network/utils/networkEventStore.js +1 -391
- package/lib/module/network/utils/networkListener.js +4 -1249
- package/lib/module/network/utils/networkSavedStore.js +3 -572
- package/lib/module/network/utils/networkSelectionStore.js +1 -188
- package/lib/module/network/utils/realNow.js +1 -0
- package/lib/module/network/utils/requestId.js +1 -0
- package/lib/module/network/utils/resolveRequestUrl.js +1 -0
- package/lib/module/network/utils/selectSavedEvents.js +1 -35
- package/lib/module/network/utils/startNetworkCapture.js +1 -0
- package/lib/module/network/utils/withPinnedFirst.js +1 -28
- package/lib/module/preset.js +1 -100
- package/lib/typescript/index.d.ts +1 -0
- package/lib/typescript/network/overrides/applyToXhr.d.ts +1 -0
- package/lib/typescript/network/overrides/engine.d.ts +1 -1
- package/lib/typescript/network/overrides/matchRule.d.ts +1 -1
- package/lib/typescript/network/overrides/overriddenRows.d.ts +16 -0
- package/lib/typescript/network/overrides/resolveOverride.d.ts +2 -2
- package/lib/typescript/network/overrides/types.d.ts +9 -0
- package/lib/typescript/network/utils/networkListener.d.ts +14 -4
- package/lib/typescript/network/utils/networkSavedStore.d.ts +4 -4
- package/lib/typescript/network/utils/realNow.d.ts +18 -0
- package/lib/typescript/network/utils/requestId.d.ts +2 -0
- package/lib/typescript/network/utils/resolveRequestUrl.d.ts +3 -0
- package/lib/typescript/network/utils/startNetworkCapture.d.ts +6 -0
- package/lib/web/index.mjs +145 -0
- package/package.json +32 -10
- package/lib/typescript/index.d.ts.map +0 -1
- package/lib/typescript/index.web.d.ts.map +0 -1
- package/lib/typescript/network/components/DataViewer.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkCopyScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkCopySettingsView.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkCopySettingsView.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkDetailScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkDetailStepper.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkDetailStepper.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkEventDetailView.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkEventDetailView.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkEventItemCompact.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkEventItemCompact.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkFilterScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkFilterViewV3.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkFilterViewV3.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkHeaderLive.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkHeaderLive.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkHeaderMenu.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkListScreen.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkListScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkModal.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkNumberPrompt.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkNumberPrompt.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverrideEditor.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverrideEditor.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverrideHeaderButton.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverrideHeaderButton.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverridesButton.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverridesButton.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverridesScreen.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverridesScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkSavedScreen.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkSavedScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkUpgradeBanner.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/Explorer.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/Explorer.web.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/deleteNestedDataByPath.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/editorContext.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/updateNestedDataByPath.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkConditionsControl.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkConditionsControl.test.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkConditionsIcon.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkFloatingTool.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkFloatingTool.test.d.ts.map +0 -1
- package/lib/typescript/network/conditions/store.d.ts.map +0 -1
- package/lib/typescript/network/conditions/wait.d.ts.map +0 -1
- package/lib/typescript/network/conditions/xhr.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useLiveNetworkEvent.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkBadgeCounts.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkEventList.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkEvents.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkHasMatches.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkSaved.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkSelection.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useOverrideRules.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useTickEveryMinute.d.ts.map +0 -1
- package/lib/typescript/network/overrides/applyToFetch.d.ts.map +0 -1
- package/lib/typescript/network/overrides/applyToXhr.d.ts.map +0 -1
- package/lib/typescript/network/overrides/engine.d.ts.map +0 -1
- package/lib/typescript/network/overrides/matchRule.d.ts.map +0 -1
- package/lib/typescript/network/overrides/overrideRulesStore.d.ts.map +0 -1
- package/lib/typescript/network/overrides/presets.d.ts.map +0 -1
- package/lib/typescript/network/overrides/resolveOverride.d.ts.map +0 -1
- package/lib/typescript/network/overrides/types.d.ts.map +0 -1
- package/lib/typescript/network/sync/networkBodyResolver.d.ts.map +0 -1
- package/lib/typescript/network/sync/networkSyncAdapter.d.ts.map +0 -1
- package/lib/typescript/network/sync/overrideHonesty.release.test.d.ts.map +0 -1
- package/lib/typescript/network/types/index.d.ts.map +0 -1
- package/lib/typescript/network/utils/extractOperationName.d.ts.map +0 -1
- package/lib/typescript/network/utils/filterNetworkEvents.d.ts.map +0 -1
- package/lib/typescript/network/utils/formatGraphQLVariables.d.ts.map +0 -1
- package/lib/typescript/network/utils/formatting.d.ts.map +0 -1
- package/lib/typescript/network/utils/generateCurl.d.ts.map +0 -1
- package/lib/typescript/network/utils/generateNetworkCopyText.d.ts.map +0 -1
- package/lib/typescript/network/utils/httpCompletion.d.ts.map +0 -1
- package/lib/typescript/network/utils/networkEventStore.d.ts.map +0 -1
- package/lib/typescript/network/utils/networkListener.d.ts.map +0 -1
- package/lib/typescript/network/utils/networkSavedStore.d.ts.map +0 -1
- package/lib/typescript/network/utils/networkSelectionStore.d.ts.map +0 -1
- package/lib/typescript/network/utils/selectSavedEvents.d.ts.map +0 -1
- package/lib/typescript/network/utils/withPinnedFirst.d.ts.map +0 -1
- 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=()=>{};
|