@buoy-gg/network 7.0.22 → 7.0.24
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/lib/commonjs/network/components/NetworkDetailStepper.js +2 -1
- package/lib/commonjs/network/components/NetworkDetailStepper.web.js +3 -1
- package/lib/commonjs/network/components/NetworkEventItemCompact.js +5 -0
- package/lib/commonjs/network/components/NetworkHeaderLive.js +1 -1
- package/lib/commonjs/network/components/NetworkHeaderLive.web.js +2 -1
- package/lib/commonjs/network/components/NetworkListScreen.js +1 -1
- package/lib/commonjs/network/components/NetworkModal.js +7 -2
- package/lib/commonjs/network/components/NetworkOverridesScreen.js +12 -5
- package/lib/commonjs/network/components/NetworkSavedScreen.js +6 -3
- package/lib/commonjs/network/components/NetworkSavedScreen.web.js +7 -3
- package/lib/commonjs/network/hooks/useNetworkEventList.js +6 -4
- package/lib/commonjs/network/hooks/useNetworkEvents.js +20 -13
- package/lib/commonjs/network/overrides/types.js +7 -2
- package/lib/commonjs/network/utils/networkSavedStore.js +6 -2
- package/lib/commonjs/network/utils/selectSavedEvents.js +11 -6
- package/lib/module/network/components/NetworkDetailStepper.js +3 -2
- package/lib/module/network/components/NetworkDetailStepper.web.js +3 -1
- package/lib/module/network/components/NetworkEventItemCompact.js +5 -0
- package/lib/module/network/components/NetworkHeaderLive.js +3 -3
- package/lib/module/network/components/NetworkHeaderLive.web.js +3 -2
- package/lib/module/network/components/NetworkListScreen.js +2 -2
- package/lib/module/network/components/NetworkModal.js +8 -3
- package/lib/module/network/components/NetworkOverridesScreen.js +13 -6
- package/lib/module/network/components/NetworkSavedScreen.js +8 -5
- package/lib/module/network/components/NetworkSavedScreen.web.js +8 -4
- package/lib/module/network/hooks/useNetworkEventList.js +6 -4
- package/lib/module/network/hooks/useNetworkEvents.js +20 -13
- package/lib/module/network/overrides/types.js +8 -2
- package/lib/module/network/utils/networkSavedStore.js +7 -2
- package/lib/module/network/utils/selectSavedEvents.js +12 -7
- package/lib/typescript/network/components/NetworkDetailStepper.d.ts.map +1 -1
- package/lib/typescript/network/components/NetworkDetailStepper.web.d.ts.map +1 -1
- package/lib/typescript/network/components/NetworkHeaderLive.d.ts.map +1 -1
- package/lib/typescript/network/components/NetworkHeaderLive.web.d.ts.map +1 -1
- package/lib/typescript/network/components/NetworkListScreen.d.ts.map +1 -1
- package/lib/typescript/network/components/NetworkModal.d.ts.map +1 -1
- package/lib/typescript/network/components/NetworkOverridesScreen.d.ts.map +1 -1
- package/lib/typescript/network/components/NetworkSavedScreen.d.ts.map +1 -1
- package/lib/typescript/network/components/NetworkSavedScreen.web.d.ts.map +1 -1
- package/lib/typescript/network/hooks/useNetworkEventList.d.ts.map +1 -1
- package/lib/typescript/network/hooks/useNetworkEvents.d.ts +10 -4
- package/lib/typescript/network/hooks/useNetworkEvents.d.ts.map +1 -1
- package/lib/typescript/network/overrides/types.d.ts +6 -2
- package/lib/typescript/network/overrides/types.d.ts.map +1 -1
- package/lib/typescript/network/utils/networkSavedStore.d.ts +6 -2
- package/lib/typescript/network/utils/networkSavedStore.d.ts.map +1 -1
- package/lib/typescript/network/utils/selectSavedEvents.d.ts +7 -1
- package/lib/typescript/network/utils/selectSavedEvents.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -64,9 +64,10 @@ const NetworkDetailStepper = exports.NetworkDetailStepper = /*#__PURE__*/(0, _re
|
|
|
64
64
|
pinnedLiveIds,
|
|
65
65
|
savedRecords
|
|
66
66
|
} = (0, _useNetworkSaved.useNetworkSaved)();
|
|
67
|
+
const savedLimit = (0, _sharedUi.useLimit)("network.saved");
|
|
67
68
|
const ordered = (0, _react.useMemo)(() => {
|
|
68
69
|
if (fromSaved) {
|
|
69
|
-
return (0, _selectSavedEvents.selectSavedEvents)(savedRecords,
|
|
70
|
+
return (0, _selectSavedEvents.selectSavedEvents)(savedRecords, savedLimit, savedSearch).events;
|
|
70
71
|
}
|
|
71
72
|
// Same split the list screen does — pins render above the FlatList, so
|
|
72
73
|
// they come first here too.
|
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.NetworkDetailStepper = void 0;
|
|
7
7
|
var _react = require("react");
|
|
8
|
+
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
8
9
|
var _useNetworkEventList = require("../hooks/useNetworkEventList");
|
|
9
10
|
var _useNetworkSaved = require("../hooks/useNetworkSaved");
|
|
10
11
|
var _useNetworkSelection = require("../hooks/useNetworkSelection");
|
|
@@ -256,9 +257,10 @@ const NetworkDetailStepper = exports.NetworkDetailStepper = /*#__PURE__*/(0, _re
|
|
|
256
257
|
pinnedLiveIds,
|
|
257
258
|
savedRecords
|
|
258
259
|
} = (0, _useNetworkSaved.useNetworkSaved)();
|
|
260
|
+
const savedLimit = (0, _sharedUi.useLimit)("network.saved");
|
|
259
261
|
const ordered = (0, _react.useMemo)(() => {
|
|
260
262
|
if (fromSaved) {
|
|
261
|
-
return (0, _selectSavedEvents.selectSavedEvents)(savedRecords,
|
|
263
|
+
return (0, _selectSavedEvents.selectSavedEvents)(savedRecords, savedLimit, savedSearch).events;
|
|
262
264
|
}
|
|
263
265
|
// Same split the list screen does — pins render above the list, so they
|
|
264
266
|
// come first here too.
|
|
@@ -277,6 +277,11 @@ const styles = _reactNative.StyleSheet.create({
|
|
|
277
277
|
container: {
|
|
278
278
|
flexDirection: "row",
|
|
279
279
|
alignItems: "center",
|
|
280
|
+
// Translucent instead of DevToolsCard's opaque fill, so the tool background
|
|
281
|
+
// (see ToolBackground) reads THROUGH the list rather than only around it.
|
|
282
|
+
// Over the plain-black "off" preset this is visually identical to the
|
|
283
|
+
// opaque card it replaces.
|
|
284
|
+
backgroundColor: "rgba(26,26,26,0.62)",
|
|
280
285
|
borderLeftWidth: 3,
|
|
281
286
|
borderLeftColor: "transparent",
|
|
282
287
|
// One hairline per row — the same value DevToolsCard's border uses.
|
|
@@ -165,7 +165,7 @@ function NetworkDetailPinActions({
|
|
|
165
165
|
pinned,
|
|
166
166
|
saved
|
|
167
167
|
} = (0, _networkSavedStore.flagsForEventId)(state, eventId);
|
|
168
|
-
const savedLimit =
|
|
168
|
+
const savedLimit = (0, _sharedUi.useLimit)("network.saved");
|
|
169
169
|
const atPinCap = !pinned && state.pinnedEvents.length >= _networkSavedStore.MAX_PINNED;
|
|
170
170
|
const atSavedCap = !saved && state.savedRecords.length >= savedLimit;
|
|
171
171
|
const resolveEvent = () => {
|
|
@@ -9,6 +9,7 @@ exports.NetworkHeaderBadges = NetworkHeaderBadges;
|
|
|
9
9
|
exports.NetworkHeaderCopyButton = NetworkHeaderCopyButton;
|
|
10
10
|
exports.NetworkSavedButton = NetworkSavedButton;
|
|
11
11
|
var _react = require("react");
|
|
12
|
+
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
12
13
|
var _networkEventStore = require("../utils/networkEventStore");
|
|
13
14
|
var _networkSavedStore = require("../utils/networkSavedStore");
|
|
14
15
|
var _useNetworkSaved = require("../hooks/useNetworkSaved");
|
|
@@ -350,7 +351,7 @@ function NetworkDetailPinActions({
|
|
|
350
351
|
pinned,
|
|
351
352
|
saved
|
|
352
353
|
} = (0, _networkSavedStore.flagsForEventId)(state, eventId);
|
|
353
|
-
const savedLimit =
|
|
354
|
+
const savedLimit = (0, _sharedUi.useLimit)("network.saved");
|
|
354
355
|
const atPinCap = !pinned && state.pinnedEvents.length >= _networkSavedStore.MAX_PINNED;
|
|
355
356
|
const atSavedCap = !saved && state.savedRecords.length >= savedLimit;
|
|
356
357
|
const resolveEvent = () => {
|
|
@@ -237,7 +237,7 @@ function NetworkListScreen({
|
|
|
237
237
|
};
|
|
238
238
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
239
239
|
style: styles.root,
|
|
240
|
-
children: [!isEnabled ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
240
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.BackgroundSwitcher, {}), !isEnabled ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
241
241
|
style: styles.disabledBanner,
|
|
242
242
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Power, {
|
|
243
243
|
size: 14,
|
|
@@ -525,7 +525,7 @@ function NetworkModalInner({
|
|
|
525
525
|
const body = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
526
526
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
527
527
|
style: styles.container,
|
|
528
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(NetworkDetailScreen, {
|
|
528
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ToolBackground, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(NetworkDetailScreen, {
|
|
529
529
|
visible: hasSelection,
|
|
530
530
|
paused: paused,
|
|
531
531
|
ignoredPatternValues: ignoredPatternValues,
|
|
@@ -631,7 +631,12 @@ function NetworkModalInner({
|
|
|
631
631
|
})]
|
|
632
632
|
}) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.UpgradeModal, {
|
|
633
633
|
visible: showUpgradeModal,
|
|
634
|
-
onClose: () => setShowUpgradeModal(false)
|
|
634
|
+
onClose: () => setShowUpgradeModal(false)
|
|
635
|
+
// "saved" is a count limit a free key can raise; "overrides" is one it
|
|
636
|
+
// can't (1 on both tiers) and "export" is Pro-only — freeKeyRaises
|
|
637
|
+
// sorts those out, so the mapping here can stay literal.
|
|
638
|
+
,
|
|
639
|
+
limitKey: upgradeReason === "saved" ? "network.saved" : upgradeReason === "overrides" ? "network.overrideRules" : undefined,
|
|
635
640
|
featureName: upgradeReason === "saved" ? "Saved Requests" : upgradeReason === "overrides" ? "Response Overrides" : "Network Export",
|
|
636
641
|
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.",
|
|
637
642
|
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"]
|
|
@@ -10,6 +10,7 @@ var _sharedUi = require("@buoy-gg/shared-ui");
|
|
|
10
10
|
var _useOverrideRules = require("../hooks/useOverrideRules");
|
|
11
11
|
var _NetworkOverrideEditor = require("./NetworkOverrideEditor");
|
|
12
12
|
var _overrideRulesStore = require("../overrides/overrideRulesStore");
|
|
13
|
+
var _types = require("../overrides/types");
|
|
13
14
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
14
15
|
/**
|
|
15
16
|
* The rule manager: what's armed, and how to stop all of it.
|
|
@@ -172,6 +173,9 @@ function OverridesBody({
|
|
|
172
173
|
backHandlerRef,
|
|
173
174
|
applySafeAreaInset
|
|
174
175
|
}) {
|
|
176
|
+
// `isPro` stays a prop so callers can force the unlimited view.
|
|
177
|
+
const tierRuleLimit = (0, _sharedUi.useLimit)("network.overrideRules");
|
|
178
|
+
const ruleLimit = isPro ? _types.MAX_RULES : tierRuleLimit;
|
|
175
179
|
const {
|
|
176
180
|
enabled,
|
|
177
181
|
autoPaused,
|
|
@@ -274,8 +278,11 @@ function OverridesBody({
|
|
|
274
278
|
* instead of letting you feel its shape. "One override at a time" is a shape
|
|
275
279
|
* a developer understands.
|
|
276
280
|
*/
|
|
277
|
-
const
|
|
278
|
-
|
|
281
|
+
const enforceRuleLimit = keepId => {
|
|
282
|
+
// Only trims when the tier is actually over its cap, so Pro (whose limit
|
|
283
|
+
// is the hard MAX_RULES ceiling) is never touched.
|
|
284
|
+
const active = rules.filter(rule => rule.enabled && !isRuleSpent(rule));
|
|
285
|
+
if (active.length <= ruleLimit) return;
|
|
279
286
|
rules.filter(rule => rule.enabled && !isRuleSpent(rule) && rule.id !== keepId).forEach(rule => setRuleEnabled(rule.id, false));
|
|
280
287
|
};
|
|
281
288
|
const handleSave = () => {
|
|
@@ -293,7 +300,7 @@ function OverridesBody({
|
|
|
293
300
|
...draft,
|
|
294
301
|
id: editing.id
|
|
295
302
|
});
|
|
296
|
-
|
|
303
|
+
enforceRuleLimit(saved?.id ?? editing.id);
|
|
297
304
|
// Arm the master switch. Deliberately creating a rule and having it sit
|
|
298
305
|
// inert because overrides happen to be paused is the silent-failure this
|
|
299
306
|
// feature can least afford — the preset path already does this, and the
|
|
@@ -372,9 +379,9 @@ function OverridesBody({
|
|
|
372
379
|
spent: isRuleSpent(rule),
|
|
373
380
|
onEdit: () => openRule(rule),
|
|
374
381
|
onDelete: () => removeRule(rule.id)
|
|
375
|
-
}, rule.id)),
|
|
382
|
+
}, rule.id)), ruleLimit < _types.MAX_RULES ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
376
383
|
style: styles.footNote,
|
|
377
|
-
children:
|
|
384
|
+
children: `Your plan: ${ruleLimit} override at a time. Pro: up to ${_types.MAX_RULES}.`
|
|
378
385
|
}) : null]
|
|
379
386
|
})]
|
|
380
387
|
});
|
|
@@ -62,6 +62,9 @@ function NetworkSavedScreen({
|
|
|
62
62
|
toggleSave,
|
|
63
63
|
clearSaved
|
|
64
64
|
} = (0, _useNetworkSaved.useNetworkSaved)();
|
|
65
|
+
// Declared with the other hooks: the `!visible` early return below would
|
|
66
|
+
// otherwise make this conditional.
|
|
67
|
+
const savedLimit = (0, _sharedUi.useLimit)("network.saved");
|
|
65
68
|
const [searchState, setSearchState] = (0, _react.useState)("");
|
|
66
69
|
const controlled = searchProp != null && onSearchChange != null;
|
|
67
70
|
const search = controlled ? searchProp : searchState;
|
|
@@ -72,7 +75,7 @@ function NetworkSavedScreen({
|
|
|
72
75
|
const {
|
|
73
76
|
events: filtered,
|
|
74
77
|
lockedCount
|
|
75
|
-
} = (0, _selectSavedEvents.selectSavedEvents)(savedRecords,
|
|
78
|
+
} = (0, _selectSavedEvents.selectSavedEvents)(savedRecords, savedLimit, search);
|
|
76
79
|
const handleLongPress = event => {
|
|
77
80
|
toggleSave(event);
|
|
78
81
|
};
|
|
@@ -89,7 +92,7 @@ function NetworkSavedScreen({
|
|
|
89
92
|
if (lockedCount === 0) return null;
|
|
90
93
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkUpgradeBanner.NetworkUpgradeBanner, {
|
|
91
94
|
title: `${lockedCount} saved ${lockedCount === 1 ? "request" : "requests"} locked`,
|
|
92
|
-
subtitle: `
|
|
95
|
+
subtitle: `Your plan keeps ${savedLimit}. Upgrade to Pro to unlock the rest.`,
|
|
93
96
|
onPress: onUpgradePress
|
|
94
97
|
});
|
|
95
98
|
};
|
|
@@ -102,7 +105,7 @@ function NetworkSavedScreen({
|
|
|
102
105
|
color: _sharedUi.macOSColors.semantic.debug
|
|
103
106
|
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
|
|
104
107
|
style: styles.toolbarTitle,
|
|
105
|
-
children: ["SAVED \xB7 ", savedRecords.length,
|
|
108
|
+
children: ["SAVED \xB7 ", savedRecords.length, savedLimit >= _networkSavedStore.MAX_SAVED ? "" : `/${savedLimit}`]
|
|
106
109
|
}), isPro ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.CopyButton
|
|
107
110
|
// Lazy value, resolved at press time — no string is built per
|
|
108
111
|
// render, and it always reflects the current list.
|
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.NetworkSavedScreen = NetworkSavedScreen;
|
|
7
7
|
var _react = require("react");
|
|
8
|
+
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
8
9
|
var _NetworkEventItemCompact = require("./NetworkEventItemCompact.web");
|
|
9
10
|
var _DataViewer = require("./DataViewer.web");
|
|
10
11
|
var _generateNetworkCopyText = require("../utils/generateNetworkCopyText");
|
|
@@ -207,6 +208,9 @@ function NetworkSavedScreen({
|
|
|
207
208
|
toggleSave,
|
|
208
209
|
clearSaved
|
|
209
210
|
} = (0, _useNetworkSaved.useNetworkSaved)();
|
|
211
|
+
// Declared with the other hooks: the `!visible` early return below would
|
|
212
|
+
// otherwise make this conditional.
|
|
213
|
+
const savedLimit = (0, _sharedUi.useLimit)("network.saved");
|
|
210
214
|
const [searchState, setSearchState] = (0, _react.useState)("");
|
|
211
215
|
const controlled = searchProp != null && onSearchChange != null;
|
|
212
216
|
const search = controlled ? searchProp : searchState;
|
|
@@ -217,7 +221,7 @@ function NetworkSavedScreen({
|
|
|
217
221
|
const {
|
|
218
222
|
events: filtered,
|
|
219
223
|
lockedCount
|
|
220
|
-
} = (0, _selectSavedEvents.selectSavedEvents)(savedRecords,
|
|
224
|
+
} = (0, _selectSavedEvents.selectSavedEvents)(savedRecords, savedLimit, search);
|
|
221
225
|
const handleLongPress = event => {
|
|
222
226
|
toggleSave(event);
|
|
223
227
|
};
|
|
@@ -225,7 +229,7 @@ function NetworkSavedScreen({
|
|
|
225
229
|
if (lockedCount === 0) return null;
|
|
226
230
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(NetworkUpgradeBannerWeb, {
|
|
227
231
|
title: `${lockedCount} saved ${lockedCount === 1 ? "request" : "requests"} locked`,
|
|
228
|
-
subtitle: `
|
|
232
|
+
subtitle: `Your plan keeps ${savedLimit}. Upgrade to Pro to unlock the rest.`,
|
|
229
233
|
onPress: onUpgradePress
|
|
230
234
|
});
|
|
231
235
|
};
|
|
@@ -238,7 +242,7 @@ function NetworkSavedScreen({
|
|
|
238
242
|
color: macOSColors.semantic.debug
|
|
239
243
|
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
|
|
240
244
|
style: styles.toolbarTitle,
|
|
241
|
-
children: ["SAVED \xB7 ", savedRecords.length,
|
|
245
|
+
children: ["SAVED \xB7 ", savedRecords.length, savedLimit >= _networkSavedStore.MAX_SAVED ? "" : `/${savedLimit}`]
|
|
242
246
|
}), isPro ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_DataViewer.CopyButton
|
|
243
247
|
// Lazy value, resolved at press time — no string is built per
|
|
244
248
|
// render, and it always reflects the current list.
|
|
@@ -5,9 +5,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.useNetworkEventList = useNetworkEventList;
|
|
7
7
|
var _react = require("react");
|
|
8
|
+
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
8
9
|
var _networkEventStore = require("../utils/networkEventStore");
|
|
9
10
|
var _filterNetworkEvents = require("../utils/filterNetworkEvents");
|
|
10
|
-
var _useNetworkEvents = require("./useNetworkEvents");
|
|
11
11
|
/**
|
|
12
12
|
* Narrow store subscription for components that render the network event
|
|
13
13
|
* LIST (or need the filtered list). Decomposed from `useNetworkEvents`
|
|
@@ -34,6 +34,9 @@ function useNetworkEventList(options) {
|
|
|
34
34
|
visible = true,
|
|
35
35
|
isPro
|
|
36
36
|
} = options;
|
|
37
|
+
const tierLimit = (0, _sharedUi.useLimit)("network.requests");
|
|
38
|
+
// `isPro` stays an option so callers can force the unlimited view.
|
|
39
|
+
const requestLimit = isPro ? Infinity : tierLimit;
|
|
37
40
|
const [events, setEvents] = (0, _react.useState)(() => _networkEventStore.networkEventStore.getEvents());
|
|
38
41
|
(0, _react.useEffect)(() => {
|
|
39
42
|
// Hidden: neither subscribe nor sync — a hidden screen re-rendering for
|
|
@@ -82,13 +85,12 @@ function useNetworkEventList(options) {
|
|
|
82
85
|
// Free tier: events beyond the limit in the ORIGINAL order are locked,
|
|
83
86
|
// so locked events stay locked even when searching (ported verbatim).
|
|
84
87
|
const lockedEventIds = (0, _react.useMemo)(() => {
|
|
85
|
-
if (isPro) return new Set();
|
|
86
88
|
const lockedIds = new Set();
|
|
87
|
-
events.slice(
|
|
89
|
+
events.slice(requestLimit).forEach(event => {
|
|
88
90
|
lockedIds.add(event.id);
|
|
89
91
|
});
|
|
90
92
|
return lockedIds;
|
|
91
|
-
}, [events,
|
|
93
|
+
}, [events, requestLimit]);
|
|
92
94
|
const visibleEvents = (0, _react.useMemo)(() => {
|
|
93
95
|
if (lockedEventIds.size === 0) return filteredEvents;
|
|
94
96
|
return filteredEvents.filter(event => !lockedEventIds.has(event.id));
|
|
@@ -7,6 +7,7 @@ exports.FREE_TIER_REQUEST_LIMIT = void 0;
|
|
|
7
7
|
exports.useNetworkEvents = useNetworkEvents;
|
|
8
8
|
var _react = require("react");
|
|
9
9
|
var _networkEventStore = require("../utils/networkEventStore");
|
|
10
|
+
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
10
11
|
var _formatGraphQLVariables = require("../utils/formatGraphQLVariables");
|
|
11
12
|
/**
|
|
12
13
|
* Hook for accessing network events and controls
|
|
@@ -15,8 +16,12 @@ var _formatGraphQLVariables = require("../utils/formatGraphQLVariables");
|
|
|
15
16
|
* starts when this hook mounts and stops when all subscribers unmount.
|
|
16
17
|
*/
|
|
17
18
|
|
|
18
|
-
/**
|
|
19
|
-
|
|
19
|
+
/**
|
|
20
|
+
* @deprecated Read the live limit with `useLimit("network.requests")` — this
|
|
21
|
+
* only reports the FREE tier's value and is blind to the anonymous tier. Kept
|
|
22
|
+
* because it is part of the package's public exports.
|
|
23
|
+
*/
|
|
24
|
+
const FREE_TIER_REQUEST_LIMIT = exports.FREE_TIER_REQUEST_LIMIT = _sharedUi.TIER_LIMITS["network.requests"].free;
|
|
20
25
|
|
|
21
26
|
/**
|
|
22
27
|
* Custom hook for accessing network events and controls
|
|
@@ -55,12 +60,17 @@ const FREE_TIER_REQUEST_LIMIT = exports.FREE_TIER_REQUEST_LIMIT = 25;
|
|
|
55
60
|
* @performance Optimizes string operations and array processing for large datasets
|
|
56
61
|
* @performance Includes Set-based lookups for O(1) filter matching
|
|
57
62
|
*
|
|
58
|
-
* @param options.isPro -
|
|
63
|
+
* @param options.isPro - Force the unlimited view. Defaults to false, in
|
|
64
|
+
* which case the current tier's limit from `useLimit("network.requests")`
|
|
65
|
+
* applies.
|
|
59
66
|
*/
|
|
60
67
|
function useNetworkEvents(options = {}) {
|
|
61
68
|
const {
|
|
62
69
|
isPro = false
|
|
63
70
|
} = options;
|
|
71
|
+
const tierLimit = (0, _sharedUi.useLimit)("network.requests");
|
|
72
|
+
// `isPro` stays an option so callers can force the unlimited view.
|
|
73
|
+
const requestLimit = isPro ? Infinity : tierLimit;
|
|
64
74
|
const [events, setEvents] = (0, _react.useState)([]);
|
|
65
75
|
const [filter, setFilter] = (0, _react.useState)({});
|
|
66
76
|
const [isCapturing, setIsCapturing] = (0, _react.useState)(true);
|
|
@@ -189,19 +199,16 @@ function useNetworkEvents(options = {}) {
|
|
|
189
199
|
return filtered;
|
|
190
200
|
}, [events, filter, searchLower, methodSet, contentTypeSet]);
|
|
191
201
|
|
|
192
|
-
//
|
|
193
|
-
//
|
|
202
|
+
// Events beyond the tier limit are "locked". Keyed off the ORIGINAL event
|
|
203
|
+
// order, not the filtered results, so locked events stay locked when
|
|
204
|
+
// searching. slice(Infinity) is empty, so Pro locks nothing.
|
|
194
205
|
const lockedEventIds = (0, _react.useMemo)(() => {
|
|
195
|
-
if (isPro) {
|
|
196
|
-
return new Set();
|
|
197
|
-
}
|
|
198
|
-
// Events beyond the limit in the ORIGINAL events array are locked
|
|
199
206
|
const lockedIds = new Set();
|
|
200
|
-
events.slice(
|
|
207
|
+
events.slice(requestLimit).forEach(event => {
|
|
201
208
|
lockedIds.add(event.id);
|
|
202
209
|
});
|
|
203
210
|
return lockedIds;
|
|
204
|
-
}, [events,
|
|
211
|
+
}, [events, requestLimit]);
|
|
205
212
|
|
|
206
213
|
// Check if there are locked events in the current filtered results
|
|
207
214
|
const lockedEventsInFilter = (0, _react.useMemo)(() => {
|
|
@@ -303,8 +310,8 @@ function useNetworkEvents(options = {}) {
|
|
|
303
310
|
lockedEventCount,
|
|
304
311
|
/** Check if a specific event is locked (by ID) */
|
|
305
312
|
isEventLocked,
|
|
306
|
-
/**
|
|
307
|
-
requestLimit
|
|
313
|
+
/** The live request limit for this tier (Infinity when unlimited). */
|
|
314
|
+
requestLimit,
|
|
308
315
|
/** Get subscriber counts for debugging */
|
|
309
316
|
getSubscriberCounts: () => _networkEventStore.networkEventStore.getSubscriberCounts()
|
|
310
317
|
};
|
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.STATUS_MIN = exports.STATUS_MAX = exports.MAX_RULES = exports.FREE_TIER_RULE_LIMIT = void 0;
|
|
7
7
|
exports.markForOutcome = markForOutcome;
|
|
8
|
+
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
8
9
|
/**
|
|
9
10
|
* Network response overrides — the rule model.
|
|
10
11
|
*
|
|
@@ -60,8 +61,12 @@ const STATUS_MAX = exports.STATUS_MAX = 599;
|
|
|
60
61
|
/** Bounds the persisted list so a runaway UI can't fill storage. */
|
|
61
62
|
const MAX_RULES = exports.MAX_RULES = 50;
|
|
62
63
|
|
|
63
|
-
/**
|
|
64
|
-
|
|
64
|
+
/**
|
|
65
|
+
* @deprecated Read the live limit with `useLimit("network.overrideRules")` —
|
|
66
|
+
* this only reports the FREE tier's value. Kept because it is part of the
|
|
67
|
+
* package's public exports.
|
|
68
|
+
*/
|
|
69
|
+
const FREE_TIER_RULE_LIMIT = exports.FREE_TIER_RULE_LIMIT = _sharedUi.TIER_LIMITS["network.overrideRules"].free;
|
|
65
70
|
|
|
66
71
|
/**
|
|
67
72
|
* Stamped onto the `NetworkEvent` a rule affected, so the list can badge the
|
|
@@ -42,8 +42,12 @@ const SESSION_ID = exports.SESSION_ID = `${Date.now().toString(36)}_${Math.rando
|
|
|
42
42
|
const MAX_PINNED = exports.MAX_PINNED = 25;
|
|
43
43
|
/** Upper bound on the persisted favorites list (oldest unpinned evicted). */
|
|
44
44
|
const MAX_SAVED = exports.MAX_SAVED = 50;
|
|
45
|
-
/**
|
|
46
|
-
|
|
45
|
+
/**
|
|
46
|
+
* @deprecated Read the live limit with `useLimit("network.saved")` — this only
|
|
47
|
+
* reports the FREE tier's value and is blind to the anonymous tier. Kept
|
|
48
|
+
* because it is part of the package's public exports.
|
|
49
|
+
*/
|
|
50
|
+
const FREE_TIER_SAVED_LIMIT = exports.FREE_TIER_SAVED_LIMIT = _sharedUi.TIER_LIMITS["network.saved"].free;
|
|
47
51
|
/** Per-body cap on a snapshot. */
|
|
48
52
|
const BODY_LIMIT = 16 * 1024;
|
|
49
53
|
/**
|
|
@@ -16,14 +16,19 @@ var _networkSavedStore = require("./networkSavedStore");
|
|
|
16
16
|
* exists to prevent for the live list.
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
-
function selectSavedEvents(savedRecords,
|
|
19
|
+
function selectSavedEvents(savedRecords,
|
|
20
|
+
/**
|
|
21
|
+
* How many saves this tier may see — `useLimit("network.saved")`. Takes a
|
|
22
|
+
* number rather than `isPro` because there are now three tiers, and a
|
|
23
|
+
* boolean cannot express the anonymous one.
|
|
24
|
+
*/
|
|
25
|
+
limit, search) {
|
|
20
26
|
/**
|
|
21
|
-
* A downgrade (or a limit change) can leave a
|
|
22
|
-
*
|
|
23
|
-
*
|
|
27
|
+
* A downgrade (or a limit change) can leave a user holding more saves than
|
|
28
|
+
* their tier allows. Rather than deleting their data, the overflow is
|
|
29
|
+
* LOCKED — oldest first, so the newest saves stay reachable.
|
|
24
30
|
*/
|
|
25
|
-
const
|
|
26
|
-
const unlocked = savedRecords.slice(0, limit);
|
|
31
|
+
const unlocked = savedRecords.slice(0, Math.min(limit, _networkSavedStore.MAX_SAVED));
|
|
27
32
|
const events = unlocked.map(record => record.event);
|
|
28
33
|
return {
|
|
29
34
|
events: search ? (0, _filterNetworkEvents.filterNetworkEvents)(events, {
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
29
|
import { memo, useEffect, useMemo } from "react";
|
|
30
|
-
import { EventStepperFooter } from "@buoy-gg/shared-ui";
|
|
30
|
+
import { EventStepperFooter, useLimit } from "@buoy-gg/shared-ui";
|
|
31
31
|
import { useNetworkEventList } from "../hooks/useNetworkEventList";
|
|
32
32
|
import { useNetworkSaved } from "../hooks/useNetworkSaved";
|
|
33
33
|
import { useNetworkCursor } from "../hooks/useNetworkSelection";
|
|
@@ -60,9 +60,10 @@ export const NetworkDetailStepper = /*#__PURE__*/memo(function NetworkDetailStep
|
|
|
60
60
|
pinnedLiveIds,
|
|
61
61
|
savedRecords
|
|
62
62
|
} = useNetworkSaved();
|
|
63
|
+
const savedLimit = useLimit("network.saved");
|
|
63
64
|
const ordered = useMemo(() => {
|
|
64
65
|
if (fromSaved) {
|
|
65
|
-
return selectSavedEvents(savedRecords,
|
|
66
|
+
return selectSavedEvents(savedRecords, savedLimit, savedSearch).events;
|
|
66
67
|
}
|
|
67
68
|
// Same split the list screen does — pins render above the FlatList, so
|
|
68
69
|
// they come first here too.
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
27
|
import { memo, useEffect, useMemo } from "react";
|
|
28
|
+
import { useLimit } from "@buoy-gg/shared-ui";
|
|
28
29
|
import { useNetworkEventList } from "../hooks/useNetworkEventList";
|
|
29
30
|
import { useNetworkSaved } from "../hooks/useNetworkSaved";
|
|
30
31
|
import { useNetworkCursor } from "../hooks/useNetworkSelection";
|
|
@@ -254,9 +255,10 @@ export const NetworkDetailStepper = /*#__PURE__*/memo(function NetworkDetailStep
|
|
|
254
255
|
pinnedLiveIds,
|
|
255
256
|
savedRecords
|
|
256
257
|
} = useNetworkSaved();
|
|
258
|
+
const savedLimit = useLimit("network.saved");
|
|
257
259
|
const ordered = useMemo(() => {
|
|
258
260
|
if (fromSaved) {
|
|
259
|
-
return selectSavedEvents(savedRecords,
|
|
261
|
+
return selectSavedEvents(savedRecords, savedLimit, savedSearch).events;
|
|
260
262
|
}
|
|
261
263
|
// Same split the list screen does — pins render above the list, so they
|
|
262
264
|
// come first here too.
|
|
@@ -274,6 +274,11 @@ const styles = StyleSheet.create({
|
|
|
274
274
|
container: {
|
|
275
275
|
flexDirection: "row",
|
|
276
276
|
alignItems: "center",
|
|
277
|
+
// Translucent instead of DevToolsCard's opaque fill, so the tool background
|
|
278
|
+
// (see ToolBackground) reads THROUGH the list rather than only around it.
|
|
279
|
+
// Over the plain-black "off" preset this is visually identical to the
|
|
280
|
+
// opaque card it replaces.
|
|
281
|
+
backgroundColor: "rgba(26,26,26,0.62)",
|
|
277
282
|
borderLeftWidth: 3,
|
|
278
283
|
borderLeftColor: "transparent",
|
|
279
284
|
// One hairline per row — the same value DevToolsCard's border uses.
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
21
|
import { StyleSheet, Text, TouchableOpacity, View } from "react-native";
|
|
22
|
-
import { Bookmark, CheckCircle, XCircle, Clock, Copy, Pin, Trash2, CopyButton, macOSColors } from "@buoy-gg/shared-ui";
|
|
22
|
+
import { Bookmark, CheckCircle, XCircle, Clock, Copy, Pin, Trash2, CopyButton, macOSColors, useLimit } from "@buoy-gg/shared-ui";
|
|
23
23
|
import { networkEventStore } from "../utils/networkEventStore";
|
|
24
|
-
import { flagsForEventId, networkSavedStore,
|
|
24
|
+
import { flagsForEventId, networkSavedStore, MAX_PINNED, MAX_SAVED } from "../utils/networkSavedStore";
|
|
25
25
|
import { useNetworkSaved } from "../hooks/useNetworkSaved";
|
|
26
26
|
import { useSelectedNetworkEventId } from "../hooks/useNetworkSelection";
|
|
27
27
|
import { useNetworkBadgeCounts } from "../hooks/useNetworkBadgeCounts";
|
|
@@ -157,7 +157,7 @@ export function NetworkDetailPinActions({
|
|
|
157
157
|
pinned,
|
|
158
158
|
saved
|
|
159
159
|
} = flagsForEventId(state, eventId);
|
|
160
|
-
const savedLimit =
|
|
160
|
+
const savedLimit = useLimit("network.saved");
|
|
161
161
|
const atPinCap = !pinned && state.pinnedEvents.length >= MAX_PINNED;
|
|
162
162
|
const atSavedCap = !saved && state.savedRecords.length >= savedLimit;
|
|
163
163
|
const resolveEvent = () => {
|
|
@@ -44,8 +44,9 @@
|
|
|
44
44
|
*/
|
|
45
45
|
|
|
46
46
|
import { useEffect, useRef, useState } from "react";
|
|
47
|
+
import { useLimit } from "@buoy-gg/shared-ui";
|
|
47
48
|
import { networkEventStore } from "../utils/networkEventStore";
|
|
48
|
-
import { flagsForEventId, networkSavedStore,
|
|
49
|
+
import { flagsForEventId, networkSavedStore, MAX_PINNED, MAX_SAVED } from "../utils/networkSavedStore";
|
|
49
50
|
import { useNetworkSaved } from "../hooks/useNetworkSaved";
|
|
50
51
|
import { useSelectedNetworkEventId } from "../hooks/useNetworkSelection";
|
|
51
52
|
import { useNetworkBadgeCounts } from "../hooks/useNetworkBadgeCounts";
|
|
@@ -344,7 +345,7 @@ export function NetworkDetailPinActions({
|
|
|
344
345
|
pinned,
|
|
345
346
|
saved
|
|
346
347
|
} = flagsForEventId(state, eventId);
|
|
347
|
-
const savedLimit =
|
|
348
|
+
const savedLimit = useLimit("network.saved");
|
|
348
349
|
const atPinCap = !pinned && state.pinnedEvents.length >= MAX_PINNED;
|
|
349
350
|
const atSavedCap = !saved && state.savedRecords.length >= savedLimit;
|
|
350
351
|
const resolveEvent = () => {
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
import { useCallback } from "react";
|
|
16
16
|
import { FlatList, StyleSheet, Text, TouchableOpacity, View } from "react-native";
|
|
17
|
-
import { FlaskConical, Globe, Pin, Power, macOSColors } from "@buoy-gg/shared-ui";
|
|
17
|
+
import { FlaskConical, Globe, Pin, Power, macOSColors, BackgroundSwitcher } from "@buoy-gg/shared-ui";
|
|
18
18
|
import { NetworkEventItemCompact } from "./NetworkEventItemCompact";
|
|
19
19
|
import { NetworkUpgradeBanner } from "./NetworkUpgradeBanner";
|
|
20
20
|
import { useNetworkEventList } from "../hooks/useNetworkEventList";
|
|
@@ -233,7 +233,7 @@ export function NetworkListScreen({
|
|
|
233
233
|
};
|
|
234
234
|
return /*#__PURE__*/_jsxs(View, {
|
|
235
235
|
style: styles.root,
|
|
236
|
-
children: [!isEnabled ? /*#__PURE__*/_jsxs(View, {
|
|
236
|
+
children: [/*#__PURE__*/_jsx(BackgroundSwitcher, {}), !isEnabled ? /*#__PURE__*/_jsxs(View, {
|
|
237
237
|
style: styles.disabledBanner,
|
|
238
238
|
children: [/*#__PURE__*/_jsx(Power, {
|
|
239
239
|
size: 14,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useState, useRef, useEffect, useCallback } from "react";
|
|
4
4
|
import { View, StyleSheet, TouchableOpacity, TextInput } from "react-native";
|
|
5
|
-
import { Search, Filter, Bookmark, X, JsModal, ModalHeader, devToolsStorageKeys, macOSColors, persistentStorage, TabSelector, useFeatureGate, UpgradeModal, PowerToggleButton, useIgnoredPatterns } from "@buoy-gg/shared-ui";
|
|
5
|
+
import { Search, Filter, Bookmark, X, JsModal, ModalHeader, devToolsStorageKeys, macOSColors, persistentStorage, TabSelector, useFeatureGate, UpgradeModal, PowerToggleButton, useIgnoredPatterns, ToolBackground } from "@buoy-gg/shared-ui";
|
|
6
6
|
import { NetworkFilterViewV3 } from "./NetworkFilterViewV3";
|
|
7
7
|
import { TickProvider } from "../hooks/useTickEveryMinute";
|
|
8
8
|
import { NetworkEventDetailView } from "./NetworkEventDetailView";
|
|
@@ -520,7 +520,7 @@ function NetworkModalInner({
|
|
|
520
520
|
const body = /*#__PURE__*/_jsxs(_Fragment, {
|
|
521
521
|
children: [/*#__PURE__*/_jsxs(View, {
|
|
522
522
|
style: styles.container,
|
|
523
|
-
children: [/*#__PURE__*/_jsx(NetworkDetailScreen, {
|
|
523
|
+
children: [/*#__PURE__*/_jsx(ToolBackground, {}), /*#__PURE__*/_jsx(NetworkDetailScreen, {
|
|
524
524
|
visible: hasSelection,
|
|
525
525
|
paused: paused,
|
|
526
526
|
ignoredPatternValues: ignoredPatternValues,
|
|
@@ -626,7 +626,12 @@ function NetworkModalInner({
|
|
|
626
626
|
})]
|
|
627
627
|
}) : null, /*#__PURE__*/_jsx(UpgradeModal, {
|
|
628
628
|
visible: showUpgradeModal,
|
|
629
|
-
onClose: () => setShowUpgradeModal(false)
|
|
629
|
+
onClose: () => setShowUpgradeModal(false)
|
|
630
|
+
// "saved" is a count limit a free key can raise; "overrides" is one it
|
|
631
|
+
// can't (1 on both tiers) and "export" is Pro-only — freeKeyRaises
|
|
632
|
+
// sorts those out, so the mapping here can stay literal.
|
|
633
|
+
,
|
|
634
|
+
limitKey: upgradeReason === "saved" ? "network.saved" : upgradeReason === "overrides" ? "network.overrideRules" : undefined,
|
|
630
635
|
featureName: upgradeReason === "saved" ? "Saved Requests" : upgradeReason === "overrides" ? "Response Overrides" : "Network Export",
|
|
631
636
|
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.",
|
|
632
637
|
benefits: upgradeReason === "overrides" ? [`Run ${MAX_OVERRIDE_RULES} rules at once (free keeps ${FREE_TIER_OVERRIDE_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 ${MAX_SAVED} requests (free keeps ${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"]
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
import { useCallback, useEffect, useState } from "react";
|
|
4
4
|
import { ScrollView, StyleSheet, Text, TouchableOpacity, View } from "react-native";
|
|
5
|
-
import { AlertCircle, AlertTriangle, DevToolsCard, EmptyState, FlaskConical, MethodBadge, Plus, Trash2, macOSColors } from "@buoy-gg/shared-ui";
|
|
5
|
+
import { AlertCircle, AlertTriangle, DevToolsCard, EmptyState, FlaskConical, MethodBadge, Plus, Trash2, macOSColors, useLimit } from "@buoy-gg/shared-ui";
|
|
6
6
|
import { useOverrideRules } from "../hooks/useOverrideRules";
|
|
7
7
|
import { NetworkOverrideEditor } from "./NetworkOverrideEditor";
|
|
8
8
|
import { overrideRulesStore } from "../overrides/overrideRulesStore";
|
|
9
|
+
import { MAX_RULES } from "../overrides/types";
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* The rule manager: what's armed, and how to stop all of it.
|
|
@@ -168,6 +169,9 @@ function OverridesBody({
|
|
|
168
169
|
backHandlerRef,
|
|
169
170
|
applySafeAreaInset
|
|
170
171
|
}) {
|
|
172
|
+
// `isPro` stays a prop so callers can force the unlimited view.
|
|
173
|
+
const tierRuleLimit = useLimit("network.overrideRules");
|
|
174
|
+
const ruleLimit = isPro ? MAX_RULES : tierRuleLimit;
|
|
171
175
|
const {
|
|
172
176
|
enabled,
|
|
173
177
|
autoPaused,
|
|
@@ -270,8 +274,11 @@ function OverridesBody({
|
|
|
270
274
|
* instead of letting you feel its shape. "One override at a time" is a shape
|
|
271
275
|
* a developer understands.
|
|
272
276
|
*/
|
|
273
|
-
const
|
|
274
|
-
|
|
277
|
+
const enforceRuleLimit = keepId => {
|
|
278
|
+
// Only trims when the tier is actually over its cap, so Pro (whose limit
|
|
279
|
+
// is the hard MAX_RULES ceiling) is never touched.
|
|
280
|
+
const active = rules.filter(rule => rule.enabled && !isRuleSpent(rule));
|
|
281
|
+
if (active.length <= ruleLimit) return;
|
|
275
282
|
rules.filter(rule => rule.enabled && !isRuleSpent(rule) && rule.id !== keepId).forEach(rule => setRuleEnabled(rule.id, false));
|
|
276
283
|
};
|
|
277
284
|
const handleSave = () => {
|
|
@@ -289,7 +296,7 @@ function OverridesBody({
|
|
|
289
296
|
...draft,
|
|
290
297
|
id: editing.id
|
|
291
298
|
});
|
|
292
|
-
|
|
299
|
+
enforceRuleLimit(saved?.id ?? editing.id);
|
|
293
300
|
// Arm the master switch. Deliberately creating a rule and having it sit
|
|
294
301
|
// inert because overrides happen to be paused is the silent-failure this
|
|
295
302
|
// feature can least afford — the preset path already does this, and the
|
|
@@ -368,9 +375,9 @@ function OverridesBody({
|
|
|
368
375
|
spent: isRuleSpent(rule),
|
|
369
376
|
onEdit: () => openRule(rule),
|
|
370
377
|
onDelete: () => removeRule(rule.id)
|
|
371
|
-
}, rule.id)),
|
|
378
|
+
}, rule.id)), ruleLimit < MAX_RULES ? /*#__PURE__*/_jsx(Text, {
|
|
372
379
|
style: styles.footNote,
|
|
373
|
-
children:
|
|
380
|
+
children: `Your plan: ${ruleLimit} override at a time. Pro: up to ${MAX_RULES}.`
|
|
374
381
|
}) : null]
|
|
375
382
|
})]
|
|
376
383
|
});
|
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
|
|
20
20
|
import { useState } from "react";
|
|
21
21
|
import { FlatList, StyleSheet, Text, TextInput, View, TouchableOpacity } from "react-native";
|
|
22
|
-
import { Bookmark, CopyButton, Search, macOSColors } from "@buoy-gg/shared-ui";
|
|
22
|
+
import { Bookmark, CopyButton, Search, macOSColors, useLimit } from "@buoy-gg/shared-ui";
|
|
23
23
|
import { NetworkEventItemCompact } from "./NetworkEventItemCompact";
|
|
24
24
|
import { NetworkUpgradeBanner } from "./NetworkUpgradeBanner";
|
|
25
25
|
import { generateNetworkCopyText } from "../utils/generateNetworkCopyText";
|
|
26
26
|
import { selectSavedEvents } from "../utils/selectSavedEvents";
|
|
27
27
|
import { useNetworkSaved } from "../hooks/useNetworkSaved";
|
|
28
|
-
import {
|
|
28
|
+
import { MAX_SAVED } from "../utils/networkSavedStore";
|
|
29
29
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
30
30
|
const keyExtractor = item => item.id;
|
|
31
31
|
function EmptyState() {
|
|
@@ -58,6 +58,9 @@ export function NetworkSavedScreen({
|
|
|
58
58
|
toggleSave,
|
|
59
59
|
clearSaved
|
|
60
60
|
} = useNetworkSaved();
|
|
61
|
+
// Declared with the other hooks: the `!visible` early return below would
|
|
62
|
+
// otherwise make this conditional.
|
|
63
|
+
const savedLimit = useLimit("network.saved");
|
|
61
64
|
const [searchState, setSearchState] = useState("");
|
|
62
65
|
const controlled = searchProp != null && onSearchChange != null;
|
|
63
66
|
const search = controlled ? searchProp : searchState;
|
|
@@ -68,7 +71,7 @@ export function NetworkSavedScreen({
|
|
|
68
71
|
const {
|
|
69
72
|
events: filtered,
|
|
70
73
|
lockedCount
|
|
71
|
-
} = selectSavedEvents(savedRecords,
|
|
74
|
+
} = selectSavedEvents(savedRecords, savedLimit, search);
|
|
72
75
|
const handleLongPress = event => {
|
|
73
76
|
toggleSave(event);
|
|
74
77
|
};
|
|
@@ -85,7 +88,7 @@ export function NetworkSavedScreen({
|
|
|
85
88
|
if (lockedCount === 0) return null;
|
|
86
89
|
return /*#__PURE__*/_jsx(NetworkUpgradeBanner, {
|
|
87
90
|
title: `${lockedCount} saved ${lockedCount === 1 ? "request" : "requests"} locked`,
|
|
88
|
-
subtitle: `
|
|
91
|
+
subtitle: `Your plan keeps ${savedLimit}. Upgrade to Pro to unlock the rest.`,
|
|
89
92
|
onPress: onUpgradePress
|
|
90
93
|
});
|
|
91
94
|
};
|
|
@@ -98,7 +101,7 @@ export function NetworkSavedScreen({
|
|
|
98
101
|
color: macOSColors.semantic.debug
|
|
99
102
|
}), /*#__PURE__*/_jsxs(Text, {
|
|
100
103
|
style: styles.toolbarTitle,
|
|
101
|
-
children: ["SAVED \xB7 ", savedRecords.length,
|
|
104
|
+
children: ["SAVED \xB7 ", savedRecords.length, savedLimit >= MAX_SAVED ? "" : `/${savedLimit}`]
|
|
102
105
|
}), isPro ? /*#__PURE__*/_jsx(CopyButton
|
|
103
106
|
// Lazy value, resolved at press time — no string is built per
|
|
104
107
|
// render, and it always reflects the current list.
|
|
@@ -46,12 +46,13 @@
|
|
|
46
46
|
*/
|
|
47
47
|
|
|
48
48
|
import { useState } from "react";
|
|
49
|
+
import { useLimit } from "@buoy-gg/shared-ui";
|
|
49
50
|
import { NetworkEventItemCompact } from "./NetworkEventItemCompact.web";
|
|
50
51
|
import { CopyButton } from "./DataViewer.web";
|
|
51
52
|
import { generateNetworkCopyText } from "../utils/generateNetworkCopyText";
|
|
52
53
|
import { selectSavedEvents } from "../utils/selectSavedEvents";
|
|
53
54
|
import { useNetworkSaved } from "../hooks/useNetworkSaved";
|
|
54
|
-
import {
|
|
55
|
+
import { MAX_SAVED } from "../utils/networkSavedStore";
|
|
55
56
|
|
|
56
57
|
// =============================
|
|
57
58
|
// Native palettes (provenance)
|
|
@@ -205,6 +206,9 @@ export function NetworkSavedScreen({
|
|
|
205
206
|
toggleSave,
|
|
206
207
|
clearSaved
|
|
207
208
|
} = useNetworkSaved();
|
|
209
|
+
// Declared with the other hooks: the `!visible` early return below would
|
|
210
|
+
// otherwise make this conditional.
|
|
211
|
+
const savedLimit = useLimit("network.saved");
|
|
208
212
|
const [searchState, setSearchState] = useState("");
|
|
209
213
|
const controlled = searchProp != null && onSearchChange != null;
|
|
210
214
|
const search = controlled ? searchProp : searchState;
|
|
@@ -215,7 +219,7 @@ export function NetworkSavedScreen({
|
|
|
215
219
|
const {
|
|
216
220
|
events: filtered,
|
|
217
221
|
lockedCount
|
|
218
|
-
} = selectSavedEvents(savedRecords,
|
|
222
|
+
} = selectSavedEvents(savedRecords, savedLimit, search);
|
|
219
223
|
const handleLongPress = event => {
|
|
220
224
|
toggleSave(event);
|
|
221
225
|
};
|
|
@@ -223,7 +227,7 @@ export function NetworkSavedScreen({
|
|
|
223
227
|
if (lockedCount === 0) return null;
|
|
224
228
|
return /*#__PURE__*/_jsx(NetworkUpgradeBannerWeb, {
|
|
225
229
|
title: `${lockedCount} saved ${lockedCount === 1 ? "request" : "requests"} locked`,
|
|
226
|
-
subtitle: `
|
|
230
|
+
subtitle: `Your plan keeps ${savedLimit}. Upgrade to Pro to unlock the rest.`,
|
|
227
231
|
onPress: onUpgradePress
|
|
228
232
|
});
|
|
229
233
|
};
|
|
@@ -236,7 +240,7 @@ export function NetworkSavedScreen({
|
|
|
236
240
|
color: macOSColors.semantic.debug
|
|
237
241
|
}), /*#__PURE__*/_jsxs("span", {
|
|
238
242
|
style: styles.toolbarTitle,
|
|
239
|
-
children: ["SAVED \xB7 ", savedRecords.length,
|
|
243
|
+
children: ["SAVED \xB7 ", savedRecords.length, savedLimit >= MAX_SAVED ? "" : `/${savedLimit}`]
|
|
240
244
|
}), isPro ? /*#__PURE__*/_jsx(CopyButton
|
|
241
245
|
// Lazy value, resolved at press time — no string is built per
|
|
242
246
|
// render, and it always reflects the current list.
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
21
|
import { useEffect, useMemo, useState } from "react";
|
|
22
|
+
import { useLimit } from "@buoy-gg/shared-ui";
|
|
22
23
|
import { networkEventStore } from "../utils/networkEventStore";
|
|
23
24
|
import { applyIgnoredPatterns, filterNetworkEvents } from "../utils/filterNetworkEvents";
|
|
24
|
-
import { FREE_TIER_REQUEST_LIMIT } from "./useNetworkEvents";
|
|
25
25
|
export function useNetworkEventList(options) {
|
|
26
26
|
const {
|
|
27
27
|
filter,
|
|
@@ -30,6 +30,9 @@ export function useNetworkEventList(options) {
|
|
|
30
30
|
visible = true,
|
|
31
31
|
isPro
|
|
32
32
|
} = options;
|
|
33
|
+
const tierLimit = useLimit("network.requests");
|
|
34
|
+
// `isPro` stays an option so callers can force the unlimited view.
|
|
35
|
+
const requestLimit = isPro ? Infinity : tierLimit;
|
|
33
36
|
const [events, setEvents] = useState(() => networkEventStore.getEvents());
|
|
34
37
|
useEffect(() => {
|
|
35
38
|
// Hidden: neither subscribe nor sync — a hidden screen re-rendering for
|
|
@@ -78,13 +81,12 @@ export function useNetworkEventList(options) {
|
|
|
78
81
|
// Free tier: events beyond the limit in the ORIGINAL order are locked,
|
|
79
82
|
// so locked events stay locked even when searching (ported verbatim).
|
|
80
83
|
const lockedEventIds = useMemo(() => {
|
|
81
|
-
if (isPro) return new Set();
|
|
82
84
|
const lockedIds = new Set();
|
|
83
|
-
events.slice(
|
|
85
|
+
events.slice(requestLimit).forEach(event => {
|
|
84
86
|
lockedIds.add(event.id);
|
|
85
87
|
});
|
|
86
88
|
return lockedIds;
|
|
87
|
-
}, [events,
|
|
89
|
+
}, [events, requestLimit]);
|
|
88
90
|
const visibleEvents = useMemo(() => {
|
|
89
91
|
if (lockedEventIds.size === 0) return filteredEvents;
|
|
90
92
|
return filteredEvents.filter(event => !lockedEventIds.has(event.id));
|
|
@@ -9,10 +9,15 @@
|
|
|
9
9
|
|
|
10
10
|
import { useState, useEffect, useCallback, useMemo, useRef } from "react";
|
|
11
11
|
import { networkEventStore } from "../utils/networkEventStore";
|
|
12
|
+
import { useLimit, TIER_LIMITS } from "@buoy-gg/shared-ui";
|
|
12
13
|
import { searchGraphQLVariables } from "../utils/formatGraphQLVariables";
|
|
13
14
|
|
|
14
|
-
/**
|
|
15
|
-
|
|
15
|
+
/**
|
|
16
|
+
* @deprecated Read the live limit with `useLimit("network.requests")` — this
|
|
17
|
+
* only reports the FREE tier's value and is blind to the anonymous tier. Kept
|
|
18
|
+
* because it is part of the package's public exports.
|
|
19
|
+
*/
|
|
20
|
+
export const FREE_TIER_REQUEST_LIMIT = TIER_LIMITS["network.requests"].free;
|
|
16
21
|
|
|
17
22
|
/**
|
|
18
23
|
* Custom hook for accessing network events and controls
|
|
@@ -51,12 +56,17 @@ export const FREE_TIER_REQUEST_LIMIT = 25;
|
|
|
51
56
|
* @performance Optimizes string operations and array processing for large datasets
|
|
52
57
|
* @performance Includes Set-based lookups for O(1) filter matching
|
|
53
58
|
*
|
|
54
|
-
* @param options.isPro -
|
|
59
|
+
* @param options.isPro - Force the unlimited view. Defaults to false, in
|
|
60
|
+
* which case the current tier's limit from `useLimit("network.requests")`
|
|
61
|
+
* applies.
|
|
55
62
|
*/
|
|
56
63
|
export function useNetworkEvents(options = {}) {
|
|
57
64
|
const {
|
|
58
65
|
isPro = false
|
|
59
66
|
} = options;
|
|
67
|
+
const tierLimit = useLimit("network.requests");
|
|
68
|
+
// `isPro` stays an option so callers can force the unlimited view.
|
|
69
|
+
const requestLimit = isPro ? Infinity : tierLimit;
|
|
60
70
|
const [events, setEvents] = useState([]);
|
|
61
71
|
const [filter, setFilter] = useState({});
|
|
62
72
|
const [isCapturing, setIsCapturing] = useState(true);
|
|
@@ -185,19 +195,16 @@ export function useNetworkEvents(options = {}) {
|
|
|
185
195
|
return filtered;
|
|
186
196
|
}, [events, filter, searchLower, methodSet, contentTypeSet]);
|
|
187
197
|
|
|
188
|
-
//
|
|
189
|
-
//
|
|
198
|
+
// Events beyond the tier limit are "locked". Keyed off the ORIGINAL event
|
|
199
|
+
// order, not the filtered results, so locked events stay locked when
|
|
200
|
+
// searching. slice(Infinity) is empty, so Pro locks nothing.
|
|
190
201
|
const lockedEventIds = useMemo(() => {
|
|
191
|
-
if (isPro) {
|
|
192
|
-
return new Set();
|
|
193
|
-
}
|
|
194
|
-
// Events beyond the limit in the ORIGINAL events array are locked
|
|
195
202
|
const lockedIds = new Set();
|
|
196
|
-
events.slice(
|
|
203
|
+
events.slice(requestLimit).forEach(event => {
|
|
197
204
|
lockedIds.add(event.id);
|
|
198
205
|
});
|
|
199
206
|
return lockedIds;
|
|
200
|
-
}, [events,
|
|
207
|
+
}, [events, requestLimit]);
|
|
201
208
|
|
|
202
209
|
// Check if there are locked events in the current filtered results
|
|
203
210
|
const lockedEventsInFilter = useMemo(() => {
|
|
@@ -299,8 +306,8 @@ export function useNetworkEvents(options = {}) {
|
|
|
299
306
|
lockedEventCount,
|
|
300
307
|
/** Check if a specific event is locked (by ID) */
|
|
301
308
|
isEventLocked,
|
|
302
|
-
/**
|
|
303
|
-
requestLimit
|
|
309
|
+
/** The live request limit for this tier (Infinity when unlimited). */
|
|
310
|
+
requestLimit,
|
|
304
311
|
/** Get subscriber counts for debugging */
|
|
305
312
|
getSubscriberCounts: () => networkEventStore.getSubscriberCounts()
|
|
306
313
|
};
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import { TIER_LIMITS } from "@buoy-gg/shared-ui";
|
|
4
|
+
|
|
3
5
|
/**
|
|
4
6
|
* Network response overrides — the rule model.
|
|
5
7
|
*
|
|
@@ -55,8 +57,12 @@ export const STATUS_MAX = 599;
|
|
|
55
57
|
/** Bounds the persisted list so a runaway UI can't fill storage. */
|
|
56
58
|
export const MAX_RULES = 50;
|
|
57
59
|
|
|
58
|
-
/**
|
|
59
|
-
|
|
60
|
+
/**
|
|
61
|
+
* @deprecated Read the live limit with `useLimit("network.overrideRules")` —
|
|
62
|
+
* this only reports the FREE tier's value. Kept because it is part of the
|
|
63
|
+
* package's public exports.
|
|
64
|
+
*/
|
|
65
|
+
export const FREE_TIER_RULE_LIMIT = TIER_LIMITS["network.overrideRules"].free;
|
|
60
66
|
|
|
61
67
|
/**
|
|
62
68
|
* Stamped onto the `NetworkEvent` a rule affected, so the list can badge the
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
*/
|
|
30
30
|
|
|
31
31
|
import { devToolsStorageKeys, persistentStorage } from "@buoy-gg/shared-ui";
|
|
32
|
+
import { TIER_LIMITS } from "@buoy-gg/shared-ui";
|
|
32
33
|
/** Identifies THIS runtime. Records from other sessions can't trust `liveId`. */
|
|
33
34
|
export const SESSION_ID = `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
|
|
34
35
|
|
|
@@ -36,8 +37,12 @@ export const SESSION_ID = `${Date.now().toString(36)}_${Math.random().toString(3
|
|
|
36
37
|
export const MAX_PINNED = 25;
|
|
37
38
|
/** Upper bound on the persisted favorites list (oldest unpinned evicted). */
|
|
38
39
|
export const MAX_SAVED = 50;
|
|
39
|
-
/**
|
|
40
|
-
|
|
40
|
+
/**
|
|
41
|
+
* @deprecated Read the live limit with `useLimit("network.saved")` — this only
|
|
42
|
+
* reports the FREE tier's value and is blind to the anonymous tier. Kept
|
|
43
|
+
* because it is part of the package's public exports.
|
|
44
|
+
*/
|
|
45
|
+
export const FREE_TIER_SAVED_LIMIT = TIER_LIMITS["network.saved"].free;
|
|
41
46
|
/** Per-body cap on a snapshot. */
|
|
42
47
|
const BODY_LIMIT = 16 * 1024;
|
|
43
48
|
/**
|
|
@@ -11,15 +11,20 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import { filterNetworkEvents } from "./filterNetworkEvents";
|
|
14
|
-
import {
|
|
15
|
-
export function selectSavedEvents(savedRecords,
|
|
14
|
+
import { MAX_SAVED } from "./networkSavedStore";
|
|
15
|
+
export function selectSavedEvents(savedRecords,
|
|
16
|
+
/**
|
|
17
|
+
* How many saves this tier may see — `useLimit("network.saved")`. Takes a
|
|
18
|
+
* number rather than `isPro` because there are now three tiers, and a
|
|
19
|
+
* boolean cannot express the anonymous one.
|
|
20
|
+
*/
|
|
21
|
+
limit, search) {
|
|
16
22
|
/**
|
|
17
|
-
* A downgrade (or a limit change) can leave a
|
|
18
|
-
*
|
|
19
|
-
*
|
|
23
|
+
* A downgrade (or a limit change) can leave a user holding more saves than
|
|
24
|
+
* their tier allows. Rather than deleting their data, the overflow is
|
|
25
|
+
* LOCKED — oldest first, so the newest saves stay reachable.
|
|
20
26
|
*/
|
|
21
|
-
const
|
|
22
|
-
const unlocked = savedRecords.slice(0, limit);
|
|
27
|
+
const unlocked = savedRecords.slice(0, Math.min(limit, MAX_SAVED));
|
|
23
28
|
const events = unlocked.map(record => record.event);
|
|
24
29
|
return {
|
|
25
30
|
events: search ? filterNetworkEvents(events, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetworkDetailStepper.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkDetailStepper.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"NetworkDetailStepper.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkDetailStepper.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAAgC,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,UAAU,CAAC;AAW5D,UAAU,yBAAyB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;IACtB,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,KAAK,EAAE,OAAO,CAAC;IACf,wEAAwE;IACxE,SAAS,EAAE,OAAO,CAAC;IACnB,8EAA8E;IAC9E,WAAW,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAMD,eAAO,MAAM,oBAAoB,iEAkE/B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetworkDetailStepper.web.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkDetailStepper.web.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"NetworkDetailStepper.web.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkDetailStepper.web.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,UAAU,CAAC;AA4O5D,UAAU,yBAAyB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;IACtB,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,KAAK,EAAE,OAAO,CAAC;IACf,wEAAwE;IACxE,SAAS,EAAE,OAAO,CAAC;IACnB,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAMD,eAAO,MAAM,oBAAoB,iEAgE/B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetworkHeaderLive.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkHeaderLive.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAUL,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"NetworkHeaderLive.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkHeaderLive.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAUL,KAAK,cAAc,EAEpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAqB9D,KAAK,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAEpD,UAAU,wBAAwB;IAChC,YAAY,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtC,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC/C,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,EAClC,YAAY,EACZ,cAAc,EACd,eAAe,EACf,MAAM,GACP,EAAE,wBAAwB,+BA4D1B;AAED,UAAU,uBAAuB;IAC/B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;iDAEiD;AACjD,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,EAAE,uBAAuB,+BAqBrE;AAED,UAAU,uBAAuB;IAC/B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,OAAO,EAAE,EAAE,uBAAuB,+BAwBtE;AAED,UAAU,4BAA4B;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,KAAK,EACL,cAAc,GACf,EAAE,4BAA4B,+BAuF9B;AAED,UAAU,4BAA4B;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;IACtB,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,KAAK,EACL,MAAM,EACN,eAAe,EACf,YAAY,EACZ,MAAM,EACN,cAAc,EACd,KAAK,GACN,EAAE,4BAA4B,+BAsD9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetworkHeaderLive.web.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkHeaderLive.web.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AASH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"NetworkHeaderLive.web.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkHeaderLive.web.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AASH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAe9C,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,kCAAkC,CAAC;AAwH1C,KAAK,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAEpD,UAAU,wBAAwB;IAChC,YAAY,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtC,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC/C,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,EAClC,YAAY,EACZ,cAAc,EACd,eAAe,EACf,MAAM,GACP,EAAE,wBAAwB,+BA+D1B;AAED,UAAU,uBAAuB;IAC/B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;iDAEiD;AACjD,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,EAAE,uBAAuB,+BAoBrE;AAED,UAAU,uBAAuB;IAC/B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,OAAO,EAAE,EAAE,uBAAuB,+BAwBtE;AAED,UAAU,4BAA4B;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,KAAK,EACL,cAAc,GACf,EAAE,4BAA4B,+BAqF9B;AAED,UAAU,4BAA4B;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;IACtB,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,KAAK,EACL,MAAM,EACN,eAAe,EACf,YAAY,EACZ,MAAM,EACN,cAAc,EACd,KAAK,GACN,EAAE,4BAA4B,+BAmG9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetworkListScreen.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkListScreen.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,
|
|
1
|
+
{"version":3,"file":"NetworkListScreen.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkListScreen.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AA0J5D,UAAU,sBAAsB;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;IACtB,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,YAAY,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC5C,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,wBAAgB,iBAAiB,CAAC,EAChC,OAAO,EACP,MAAM,EACN,MAAM,EACN,eAAe,EACf,KAAK,EACL,UAAU,EACV,YAAY,EACZ,cAAc,GACf,EAAE,sBAAsB,sCA6JxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetworkModal.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkModal.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"NetworkModal.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkModal.tsx"],"names":[],"mappings":"AAsEA,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,IAAI,CAAC;IACvC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C;AAy2BD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,+BAMpD;AAED,MAAM,WAAW,oBAAoB;IACnC,+EAA+E;IAC/E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,KAAK,GAAE,oBAAyB,+BAa/D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetworkOverridesScreen.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkOverridesScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,gBAAgB,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"NetworkOverridesScreen.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkOverridesScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAgBhF,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,iCAAiC,CAAC;AAsJzC,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,iBAAiB,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAC5D,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,gBAAgB,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1D,wDAAwD;IACxD,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,sCAGxE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetworkSavedScreen.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkSavedScreen.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"NetworkSavedScreen.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkSavedScreen.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAYH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAqB9D,UAAU,uBAAuB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,YAAY,CAAC;IAC3B;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,wEAAwE;IACxE,YAAY,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC5C,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,wBAAgB,kBAAkB,CAAC,EACjC,OAAO,EACP,KAAK,EACL,YAAY,EACZ,MAAM,EAAE,UAAU,EAClB,cAAc,EACd,YAAY,EACZ,cAAc,GACf,EAAE,uBAAuB,sCA8HzB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetworkSavedScreen.web.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkSavedScreen.web.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;
|
|
1
|
+
{"version":3,"file":"NetworkSavedScreen.web.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkSavedScreen.web.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG7C,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,kCAAkC,CAAC;AAmI1C,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,YAAY,CAAC;IAC3B;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,wEAAwE;IACxE,YAAY,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC5C,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,wBAAgB,kBAAkB,CAAC,EACjC,OAAO,EACP,KAAK,EACL,YAAY,EACZ,MAAM,EAAE,UAAU,EAClB,cAAc,EACd,YAAY,EACZ,cAAc,GACf,EAAE,uBAAuB,sCA2HzB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNetworkEventList.d.ts","sourceRoot":"","sources":["../../../../src/network/hooks/useNetworkEventList.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"useNetworkEventList.d.ts","sourceRoot":"","sources":["../../../../src/network/hooks/useNetworkEventList.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAM5D,MAAM,WAAW,sBAAsB;IACrC,6DAA6D;IAC7D,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,iEAAiE;IACjE,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,MAAM,EAAE,aAAa,CAAC;IACtB,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,MAAM,EAAE,OAAO,CAAC;IAChB;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,sBAAsB,CAoFzB"}
|
|
@@ -5,8 +5,12 @@
|
|
|
5
5
|
* starts when this hook mounts and stops when all subscribers unmount.
|
|
6
6
|
*/
|
|
7
7
|
import type { NetworkEvent, NetworkStats, NetworkFilter } from "../types";
|
|
8
|
-
/**
|
|
9
|
-
|
|
8
|
+
/**
|
|
9
|
+
* @deprecated Read the live limit with `useLimit("network.requests")` — this
|
|
10
|
+
* only reports the FREE tier's value and is blind to the anonymous tier. Kept
|
|
11
|
+
* because it is part of the package's public exports.
|
|
12
|
+
*/
|
|
13
|
+
export declare const FREE_TIER_REQUEST_LIMIT: number;
|
|
10
14
|
/**
|
|
11
15
|
* Custom hook for accessing network events and controls
|
|
12
16
|
*
|
|
@@ -44,7 +48,9 @@ export declare const FREE_TIER_REQUEST_LIMIT = 25;
|
|
|
44
48
|
* @performance Optimizes string operations and array processing for large datasets
|
|
45
49
|
* @performance Includes Set-based lookups for O(1) filter matching
|
|
46
50
|
*
|
|
47
|
-
* @param options.isPro -
|
|
51
|
+
* @param options.isPro - Force the unlimited view. Defaults to false, in
|
|
52
|
+
* which case the current tier's limit from `useLimit("network.requests")`
|
|
53
|
+
* applies.
|
|
48
54
|
*/
|
|
49
55
|
export declare function useNetworkEvents(options?: {
|
|
50
56
|
isPro?: boolean;
|
|
@@ -71,7 +77,7 @@ export declare function useNetworkEvents(options?: {
|
|
|
71
77
|
lockedEventCount: number;
|
|
72
78
|
/** Check if a specific event is locked (by ID) */
|
|
73
79
|
isEventLocked: (eventId: string) => boolean;
|
|
74
|
-
/**
|
|
80
|
+
/** The live request limit for this tier (Infinity when unlimited). */
|
|
75
81
|
requestLimit: number;
|
|
76
82
|
/** Get subscriber counts for debugging */
|
|
77
83
|
getSubscriberCounts: () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNetworkEvents.d.ts","sourceRoot":"","sources":["../../../../src/network/hooks/useNetworkEvents.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"useNetworkEvents.d.ts","sourceRoot":"","sources":["../../../../src/network/hooks/useNetworkEvents.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAG1E;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,QAAuC,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO;IAqQ9D,yEAAyE;;IAEzE,8CAA8C;;;;;;IAM9C,mEAAmE;;IAEnE,kFAAkF;;IAElF,iDAAiD;;;;IAIjD,6DAA6D;;IAE7D,qDAAqD;;IAErD,kDAAkD;6BA7FR,MAAM;IA+FhD,sEAAsE;;IAEtE,0CAA0C;;;;;;EAG7C"}
|
|
@@ -50,8 +50,12 @@ export declare const STATUS_MIN = 200;
|
|
|
50
50
|
export declare const STATUS_MAX = 599;
|
|
51
51
|
/** Bounds the persisted list so a runaway UI can't fill storage. */
|
|
52
52
|
export declare const MAX_RULES = 50;
|
|
53
|
-
/**
|
|
54
|
-
|
|
53
|
+
/**
|
|
54
|
+
* @deprecated Read the live limit with `useLimit("network.overrideRules")` —
|
|
55
|
+
* this only reports the FREE tier's value. Kept because it is part of the
|
|
56
|
+
* package's public exports.
|
|
57
|
+
*/
|
|
58
|
+
export declare const FREE_TIER_RULE_LIMIT: number;
|
|
55
59
|
export interface OverrideRule {
|
|
56
60
|
id: string;
|
|
57
61
|
enabled: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/network/overrides/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/network/overrides/types.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,CAAC;AAErD;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,MAAM,CAAC;AAC9B,eAAO,MAAM,UAAU,MAAM,CAAC;AAE9B,oEAAoE;AACpE,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,QAA4C,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,gBAAgB,CAAC;IACvB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;;;;;;;;OAaG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,MAAM,eAAe,GACvB;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,gBAAgB,CAAC;CAC5B,GACD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,0CAA0C;AAC1C,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,mBAAmB,CAO5E"}
|
|
@@ -32,8 +32,12 @@ export declare const SESSION_ID: string;
|
|
|
32
32
|
export declare const MAX_PINNED = 25;
|
|
33
33
|
/** Upper bound on the persisted favorites list (oldest unpinned evicted). */
|
|
34
34
|
export declare const MAX_SAVED = 50;
|
|
35
|
-
/**
|
|
36
|
-
|
|
35
|
+
/**
|
|
36
|
+
* @deprecated Read the live limit with `useLimit("network.saved")` — this only
|
|
37
|
+
* reports the FREE tier's value and is blind to the anonymous tier. Kept
|
|
38
|
+
* because it is part of the package's public exports.
|
|
39
|
+
*/
|
|
40
|
+
export declare const FREE_TIER_SAVED_LIMIT: number;
|
|
37
41
|
export interface SavedNetworkRecord {
|
|
38
42
|
/** Stable across app launches — unlike `event.id`. */
|
|
39
43
|
key: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"networkSavedStore.d.ts","sourceRoot":"","sources":["../../../../src/network/utils/networkSavedStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;
|
|
1
|
+
{"version":3,"file":"networkSavedStore.d.ts","sourceRoot":"","sources":["../../../../src/network/utils/networkSavedStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,iFAAiF;AACjF,eAAO,MAAM,UAAU,QAEP,CAAC;AAEjB,iFAAiF;AACjF,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,6EAA6E;AAC7E,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAoC,CAAC;AAWvE,MAAM,WAAW,kBAAkB;IACjC,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAC;IACZ,sEAAsE;IACtE,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,iFAAiF;IACjF,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,mEAAmE;IACnE,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,sEAAsE;IACtE,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,uDAAuD;IACvD,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC3B;AAED,qEAAqE;AACrE,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,eAAe,CAAA;CAAE,CAAC;AAwBrE;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACtD,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACpD,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAYD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,MAAM,GAAG,IAAI,GACrB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CASrC;AAyID,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAC;AAE3B,cAAM,iBAAiB;IACrB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IACjD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAA8B;IACjD,2EAA2E;IAC3E,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAK;IACvB;;;OAGG;IACH,OAAO,CAAC,cAAc,CAAqB;IAC3C,0EAA0E;IAC1E,OAAO,CAAC,KAAK,CAAkC;IAC/C,6DAA6D;IAC7D,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,eAAe,CAAK;IAE5B,QAAQ,IAAI,iBAAiB;IAQ7B;;;;OAIG;IACH,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAIlD,iBAAiB,IAAI,IAAI;IAIzB;;;;OAIG;IACH,cAAc,CAAC,OAAO,EAAE,kBAAkB,EAAE,EAAE,KAAK,UAAQ,GAAG,IAAI;IAWlE;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAItB,UAAU,IAAI,kBAAkB,EAAE;IAIlC,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI;IAQzC;;;OAGG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAO7C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIjC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIhC;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAiBvC,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,iBAAiB;IAIjD,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,iBAAiB;IAIlD,kDAAkD;IAClD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMzB,iEAAiE;IACjE,UAAU,IAAI,IAAI;IAUlB,uDAAuD;IACvD,WAAW,IAAI,IAAI;IAUnB,OAAO,CAAC,OAAO;IAuDf;;;OAGG;IACH,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,UAAU;IAQlB,uEAAuE;IACvE,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,YAAY;IA2BpB,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,MAAM;IAUd,6EAA6E;IAC7E,OAAO,CAAC,OAAO;IA0Bf,OAAO,CAAC,IAAI;CAGb;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
|
|
@@ -15,5 +15,11 @@ export interface SavedEventSelection {
|
|
|
15
15
|
/** Saves past the tier ceiling — rendered as the upgrade banner, not rows. */
|
|
16
16
|
lockedCount: number;
|
|
17
17
|
}
|
|
18
|
-
export declare function selectSavedEvents(savedRecords: readonly SavedNetworkRecord[],
|
|
18
|
+
export declare function selectSavedEvents(savedRecords: readonly SavedNetworkRecord[],
|
|
19
|
+
/**
|
|
20
|
+
* How many saves this tier may see — `useLimit("network.saved")`. Takes a
|
|
21
|
+
* number rather than `isPro` because there are now three tiers, and a
|
|
22
|
+
* boolean cannot express the anonymous one.
|
|
23
|
+
*/
|
|
24
|
+
limit: number, search: string): SavedEventSelection;
|
|
19
25
|
//# sourceMappingURL=selectSavedEvents.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectSavedEvents.d.ts","sourceRoot":"","sources":["../../../../src/network/utils/selectSavedEvents.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,
|
|
1
|
+
{"version":3,"file":"selectSavedEvents.d.ts","sourceRoot":"","sources":["../../../../src/network/utils/selectSavedEvents.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,EAAa,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,8EAA8E;IAC9E,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,SAAS,kBAAkB,EAAE;AAC3C;;;;GAIG;AACH,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,mBAAmB,CAYrB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@buoy-gg/network",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.24",
|
|
4
4
|
"description": "In-app network inspector for React Native — requests, responses, timing & errors live, with GraphQL operation parsing. Part of Buoy devtools.",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
],
|
|
27
27
|
"sideEffects": false,
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@buoy-gg/shared-ui": "^7.0.
|
|
29
|
+
"@buoy-gg/shared-ui": "^7.0.24"
|
|
30
30
|
},
|
|
31
31
|
"peerDependencies": {
|
|
32
32
|
"react": "*",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
"bugs": {
|
|
71
71
|
"url": "https://github.com/LovesWorking/react-native-buoy/issues"
|
|
72
72
|
},
|
|
73
|
-
"homepage": "https://buoy.gg/tools/network",
|
|
73
|
+
"homepage": "https://buoy.gg/buoy/latest/docs/tools/network",
|
|
74
74
|
"publishConfig": {
|
|
75
75
|
"access": "public",
|
|
76
76
|
"tag": "latest"
|