@buoy-gg/redux 2.1.12 → 2.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/lib/commonjs/index.js +1 -179
  2. package/lib/commonjs/preset.js +1 -98
  3. package/lib/commonjs/redux/components/ReduxActionButton.js +1 -129
  4. package/lib/commonjs/redux/components/ReduxActionDetailContent.js +1 -380
  5. package/lib/commonjs/redux/components/ReduxActionDetailView.js +1 -401
  6. package/lib/commonjs/redux/components/ReduxActionInfoView.js +1 -838
  7. package/lib/commonjs/redux/components/ReduxActionItem.js +1 -366
  8. package/lib/commonjs/redux/components/ReduxDetailViewToggle.js +1 -134
  9. package/lib/commonjs/redux/components/ReduxIcon.js +1 -18
  10. package/lib/commonjs/redux/components/ReduxModal.js +1 -530
  11. package/lib/commonjs/redux/components/index.js +1 -52
  12. package/lib/commonjs/redux/hooks/index.js +1 -25
  13. package/lib/commonjs/redux/hooks/useAutoInstrumentRedux.js +1 -197
  14. package/lib/commonjs/redux/hooks/useReduxActions.js +1 -75
  15. package/lib/commonjs/redux/index.js +1 -49
  16. package/lib/commonjs/redux/utils/autoInstrument.js +1 -270
  17. package/lib/commonjs/redux/utils/buoyReduxMiddleware.js +1 -166
  18. package/lib/commonjs/redux/utils/createReduxHistoryAdapter.js +1 -146
  19. package/lib/commonjs/redux/utils/index.js +1 -111
  20. package/lib/commonjs/redux/utils/reduxActionStore.js +1 -358
  21. package/lib/module/index.js +1 -87
  22. package/lib/module/preset.js +1 -94
  23. package/lib/module/redux/components/ReduxActionButton.js +1 -126
  24. package/lib/module/redux/components/ReduxActionDetailContent.js +1 -376
  25. package/lib/module/redux/components/ReduxActionDetailView.js +1 -397
  26. package/lib/module/redux/components/ReduxActionInfoView.js +1 -833
  27. package/lib/module/redux/components/ReduxActionItem.js +1 -362
  28. package/lib/module/redux/components/ReduxDetailViewToggle.js +1 -129
  29. package/lib/module/redux/components/ReduxIcon.js +1 -8
  30. package/lib/module/redux/components/ReduxModal.js +1 -525
  31. package/lib/module/redux/components/index.js +1 -7
  32. package/lib/module/redux/hooks/index.js +1 -4
  33. package/lib/module/redux/hooks/useAutoInstrumentRedux.js +1 -193
  34. package/lib/module/redux/hooks/useReduxActions.js +1 -71
  35. package/lib/module/redux/index.js +1 -13
  36. package/lib/module/redux/utils/autoInstrument.js +1 -260
  37. package/lib/module/redux/utils/buoyReduxMiddleware.js +1 -157
  38. package/lib/module/redux/utils/createReduxHistoryAdapter.js +1 -142
  39. package/lib/module/redux/utils/index.js +1 -8
  40. package/lib/module/redux/utils/reduxActionStore.js +1 -354
  41. package/package.json +4 -4
  42. package/lib/typescript/index.d.ts.map +0 -1
  43. package/lib/typescript/preset.d.ts.map +0 -1
  44. package/lib/typescript/redux/components/ReduxActionButton.d.ts.map +0 -1
  45. package/lib/typescript/redux/components/ReduxActionDetailContent.d.ts.map +0 -1
  46. package/lib/typescript/redux/components/ReduxActionDetailView.d.ts.map +0 -1
  47. package/lib/typescript/redux/components/ReduxActionInfoView.d.ts.map +0 -1
  48. package/lib/typescript/redux/components/ReduxActionItem.d.ts.map +0 -1
  49. package/lib/typescript/redux/components/ReduxDetailViewToggle.d.ts.map +0 -1
  50. package/lib/typescript/redux/components/ReduxIcon.d.ts.map +0 -1
  51. package/lib/typescript/redux/components/ReduxModal.d.ts.map +0 -1
  52. package/lib/typescript/redux/components/index.d.ts.map +0 -1
  53. package/lib/typescript/redux/hooks/index.d.ts.map +0 -1
  54. package/lib/typescript/redux/hooks/useAutoInstrumentRedux.d.ts.map +0 -1
  55. package/lib/typescript/redux/hooks/useReduxActions.d.ts.map +0 -1
  56. package/lib/typescript/redux/index.d.ts.map +0 -1
  57. package/lib/typescript/redux/types/index.d.ts.map +0 -1
  58. package/lib/typescript/redux/utils/autoInstrument.d.ts.map +0 -1
  59. package/lib/typescript/redux/utils/buoyReduxMiddleware.d.ts.map +0 -1
  60. package/lib/typescript/redux/utils/createReduxHistoryAdapter.d.ts.map +0 -1
  61. package/lib/typescript/redux/utils/index.d.ts.map +0 -1
  62. package/lib/typescript/redux/utils/reduxActionStore.d.ts.map +0 -1
@@ -1,530 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.FREE_TIER_ACTION_LIMIT = void 0;
7
- exports.ReduxModal = ReduxModal;
8
- var _react = require("react");
9
- var _reactNative = require("react-native");
10
- var _sharedUi = require("@buoy-gg/shared-ui");
11
- var _license = require("@buoy-gg/license");
12
- var _useReduxActions = require("../hooks/useReduxActions");
13
- var _useAutoInstrumentRedux = require("../hooks/useAutoInstrumentRedux");
14
- var _ReduxActionItem = require("./ReduxActionItem");
15
- var _ReduxActionDetailContent = require("./ReduxActionDetailContent");
16
- var _jsxRuntime = require("react/jsx-runtime");
17
- /**
18
- * Main Redux DevTools modal
19
- *
20
- * This component auto-instruments the Redux store when it mounts,
21
- * providing zero-config action capture for the DevTools.
22
- */
23
-
24
- /** Free tier limit for action history */
25
- const FREE_TIER_ACTION_LIMIT = exports.FREE_TIER_ACTION_LIMIT = 25;
26
- function EmptyState({
27
- isEnabled
28
- }) {
29
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
30
- style: styles.emptyState,
31
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Zap, {
32
- size: 32,
33
- color: _sharedUi.macOSColors.text.muted
34
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
35
- style: styles.emptyTitle,
36
- children: "No Redux actions"
37
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
38
- style: styles.emptyText,
39
- children: isEnabled ? "Actions will appear here as they are dispatched" : "Enable capture to start recording actions"
40
- })]
41
- });
42
- }
43
- function ReduxModal({
44
- visible,
45
- onClose,
46
- onBack,
47
- onMinimize,
48
- enableSharedModalDimensions = false
49
- }) {
50
- const isPro = (0, _license.useIsPro)();
51
- const [showProModal, setShowProModal] = (0, _react.useState)(false);
52
-
53
- // Auto-instrument the Redux store (zero-config)
54
- const {
55
- isInstrumented,
56
- isLoading: isInstrumentLoading,
57
- error: instrumentError,
58
- isReactReduxAvailable
59
- } = (0, _useAutoInstrumentRedux.useAutoInstrumentRedux)();
60
- const {
61
- filteredActions,
62
- filter,
63
- setFilter,
64
- stats,
65
- clearActions,
66
- isEnabled,
67
- toggleCapture
68
- } = (0, _useReduxActions.useReduxActions)();
69
-
70
- // For free users, limit visible actions to FREE_TIER_ACTION_LIMIT
71
- const visibleActions = (0, _react.useMemo)(() => {
72
- if (isPro) return filteredActions;
73
- return filteredActions.slice(0, FREE_TIER_ACTION_LIMIT);
74
- }, [filteredActions, isPro]);
75
-
76
- // Calculate how many actions are locked
77
- const lockedActionCount = (0, _react.useMemo)(() => {
78
- if (isPro) return 0;
79
- return Math.max(0, filteredActions.length - FREE_TIER_ACTION_LIMIT);
80
- }, [filteredActions.length, isPro]);
81
- const hasLockedActions = lockedActionCount > 0;
82
-
83
- // Selection state - track index for navigation
84
- const [selectedActionIndex, setSelectedActionIndex] = (0, _react.useState)(null);
85
- const actionsRef = (0, _react.useRef)([]);
86
-
87
- // Keep actions ref in sync (using visible actions for navigation)
88
- actionsRef.current = visibleActions;
89
-
90
- // Get selected action from index
91
- const selectedAction = selectedActionIndex !== null ? visibleActions[selectedActionIndex] : null;
92
- const [searchText, setSearchText] = (0, _react.useState)("");
93
- const [isSearchActive, setIsSearchActive] = (0, _react.useState)(false);
94
- const searchInputRef = (0, _react.useRef)(null);
95
- const flatListRef = (0, _react.useRef)(null);
96
- const handleModeChange = (0, _react.useCallback)(_mode => {
97
- // Mode changes handled by JsModal
98
- }, []);
99
- const handleSearch = text => {
100
- setSearchText(text);
101
- setFilter(prev => ({
102
- ...prev,
103
- searchText: text
104
- }));
105
- };
106
- const handleActionPress = (0, _react.useCallback)(action => {
107
- const index = actionsRef.current.findIndex(a => a.id === action.id);
108
- setSelectedActionIndex(index >= 0 ? index : 0);
109
- }, []);
110
- const handleUpgradePress = (0, _react.useCallback)(() => {
111
- setShowProModal(true);
112
- }, []);
113
- const handleBack = (0, _react.useCallback)(() => {
114
- setSelectedActionIndex(null);
115
- }, []);
116
- const handleIndexChange = (0, _react.useCallback)(newIndex => {
117
- setSelectedActionIndex(newIndex);
118
- }, []);
119
- const handleCopyAll = async () => {
120
- if (!isPro) {
121
- setShowProModal(true);
122
- return;
123
- }
124
- const actionsData = filteredActions.map(action => ({
125
- id: action.id,
126
- type: action.type,
127
- ...(action.payload !== undefined && {
128
- payload: action.payload
129
- }),
130
- timestamp: action.timestamp,
131
- prevState: action.prevState,
132
- nextState: action.nextState,
133
- hasStateChange: action.hasStateChange
134
- }));
135
- await (0, _sharedUi.copyToClipboard)(actionsData);
136
- };
137
-
138
- // FlatList optimization
139
- const keyExtractor = (0, _react.useCallback)(item => item.id, []);
140
- const renderItem = (0, _react.useCallback)(({
141
- item
142
- }) => {
143
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ReduxActionItem.ReduxActionItem, {
144
- action: item,
145
- onPress: handleActionPress
146
- });
147
- }, [handleActionPress]);
148
- const renderHeaderContent = () => {
149
- // Detail view header - show action type
150
- if (selectedAction) {
151
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader, {
152
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation, {
153
- onBack: handleBack
154
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Content, {
155
- title: selectedAction.type,
156
- centered: true
157
- })]
158
- });
159
- }
160
-
161
- // Main list view header
162
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader, {
163
- children: [onBack && /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation, {
164
- onBack: onBack
165
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Content, {
166
- title: "",
167
- children: isSearchActive ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
168
- style: styles.headerSearchContainer,
169
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Search, {
170
- size: 14,
171
- color: _sharedUi.macOSColors.text.secondary
172
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
173
- ref: searchInputRef,
174
- style: styles.headerSearchInput,
175
- placeholder: "Search action types...",
176
- placeholderTextColor: _sharedUi.macOSColors.text.muted,
177
- value: searchText,
178
- onChangeText: handleSearch,
179
- onSubmitEditing: () => setIsSearchActive(false),
180
- onBlur: () => setIsSearchActive(false),
181
- autoCapitalize: "none",
182
- autoCorrect: false,
183
- returnKeyType: "search"
184
- }), searchText.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
185
- onPress: () => {
186
- handleSearch("");
187
- setIsSearchActive(false);
188
- },
189
- style: styles.headerSearchClear,
190
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.X, {
191
- size: 14,
192
- color: _sharedUi.macOSColors.text.secondary
193
- })
194
- })]
195
- }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
196
- style: styles.headerChipRow,
197
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
198
- style: [styles.headerChip, !filter.onlyWithChanges && styles.headerChipActive],
199
- onPress: () => setFilter(prev => ({
200
- ...prev,
201
- onlyWithChanges: false
202
- })),
203
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
204
- style: styles.headerChipLabel,
205
- children: "ALL"
206
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
207
- style: [styles.headerChipValue, {
208
- color: _sharedUi.macOSColors.text.primary
209
- }],
210
- children: stats.totalActions
211
- })]
212
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
213
- style: [styles.headerChip, filter.onlyWithChanges && styles.headerChipActive],
214
- onPress: () => setFilter(prev => ({
215
- ...prev,
216
- onlyWithChanges: true
217
- })),
218
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Zap, {
219
- size: 12,
220
- color: _sharedUi.macOSColors.semantic.warning
221
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
222
- style: [styles.headerChipValue, {
223
- color: _sharedUi.macOSColors.semantic.warning
224
- }],
225
- children: stats.actionsWithChanges
226
- })]
227
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
228
- style: styles.headerChip,
229
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.CheckCircle, {
230
- size: 12,
231
- color: _sharedUi.macOSColors.semantic.success
232
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
233
- style: [styles.headerChipValue, {
234
- color: _sharedUi.macOSColors.semantic.success
235
- }],
236
- children: stats.uniqueActionTypes
237
- })]
238
- })]
239
- })
240
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader.Actions, {
241
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
242
- onPress: () => setIsSearchActive(true),
243
- style: styles.headerActionButton,
244
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Search, {
245
- size: 14,
246
- color: _sharedUi.macOSColors.text.secondary
247
- })
248
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
249
- onPress: handleCopyAll,
250
- style: [styles.headerActionButton, filteredActions.length === 0 && styles.headerActionButtonDisabled],
251
- disabled: filteredActions.length === 0,
252
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Copy, {
253
- size: 14,
254
- color: filteredActions.length > 0 ? _sharedUi.macOSColors.text.secondary : _sharedUi.macOSColors.text.disabled
255
- })
256
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.PowerToggleButton, {
257
- isEnabled: isEnabled,
258
- onToggle: toggleCapture,
259
- accessibilityLabel: "Toggle Redux action capture"
260
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
261
- onPress: clearActions,
262
- style: [styles.headerActionButton, filteredActions.length === 0 && styles.headerActionButtonDisabled],
263
- disabled: filteredActions.length === 0,
264
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Trash2, {
265
- size: 14,
266
- color: filteredActions.length > 0 ? _sharedUi.macOSColors.text.muted : _sharedUi.macOSColors.text.disabled
267
- })
268
- })]
269
- })]
270
- });
271
- };
272
- const persistenceKey = enableSharedModalDimensions ? _sharedUi.devToolsStorageKeys.modal.root() : "buoy-redux-modal";
273
- if (!visible) return null;
274
-
275
- // Footer for detail view navigation
276
- const footerNode = selectedAction && selectedActionIndex !== null ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_ReduxActionDetailContent.ReduxActionDetailFooter, {
277
- action: selectedAction,
278
- actions: visibleActions,
279
- selectedIndex: selectedActionIndex,
280
- onIndexChange: handleIndexChange
281
- }) : null;
282
- const footerHeight = selectedAction && visibleActions.length > 1 ? 68 : 0;
283
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.TickProvider, {
284
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.JsModal, {
285
- visible: visible,
286
- onClose: onClose,
287
- onMinimize: onMinimize,
288
- persistenceKey: persistenceKey,
289
- header: {
290
- showToggleButton: true,
291
- customContent: renderHeaderContent()
292
- },
293
- onModeChange: handleModeChange,
294
- enablePersistence: true,
295
- initialMode: "bottomSheet",
296
- enableGlitchEffects: true,
297
- styles: {},
298
- footer: footerNode,
299
- footerHeight: footerHeight,
300
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
301
- style: styles.container,
302
- children: selectedAction && selectedActionIndex !== null ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_ReduxActionDetailContent.ReduxActionDetailContent, {
303
- action: selectedAction,
304
- actions: visibleActions,
305
- selectedIndex: selectedActionIndex,
306
- onIndexChange: handleIndexChange,
307
- disableInternalFooter: true
308
- }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
309
- children: [instrumentError && !isInstrumented && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
310
- style: styles.errorBanner,
311
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.AlertTriangle, {
312
- size: 14,
313
- color: _sharedUi.macOSColors.semantic.error
314
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
315
- style: styles.errorText,
316
- children: isReactReduxAvailable ? "Not inside a Redux Provider. Wrap your app with <Provider store={store}>." : "react-redux not installed. Run: npm install react-redux"
317
- })]
318
- }), !isEnabled && isInstrumented && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
319
- style: styles.disabledBanner,
320
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Power, {
321
- size: 14,
322
- color: _sharedUi.macOSColors.semantic.warning
323
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
324
- style: styles.disabledText,
325
- children: "Action capture is disabled"
326
- })]
327
- }), hasLockedActions && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
328
- style: styles.lockedBanner,
329
- onPress: handleUpgradePress,
330
- activeOpacity: 0.8,
331
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Lock, {
332
- size: 14,
333
- color: _sharedUi.buoyColors.primary
334
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
335
- style: styles.lockedText,
336
- children: [lockedActionCount, " older ", lockedActionCount === 1 ? "action" : "actions", " locked"]
337
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
338
- style: styles.upgradeBadge,
339
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
340
- style: styles.upgradeBadgeText,
341
- children: "UPGRADE"
342
- })
343
- })]
344
- }), visibleActions.length > 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.FlatList, {
345
- ref: flatListRef,
346
- data: visibleActions,
347
- renderItem: renderItem,
348
- keyExtractor: keyExtractor,
349
- contentContainerStyle: styles.listContent,
350
- showsVerticalScrollIndicator: true,
351
- removeClippedSubviews: true,
352
- initialNumToRender: 15,
353
- maxToRenderPerBatch: 10,
354
- windowSize: 10,
355
- scrollEnabled: false
356
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(EmptyState, {
357
- isEnabled: isEnabled
358
- })]
359
- })
360
- })
361
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ProUpgradeModal, {
362
- visible: showProModal,
363
- onClose: () => setShowProModal(false),
364
- featureName: "Full Action History"
365
- })]
366
- });
367
- }
368
- const styles = _reactNative.StyleSheet.create({
369
- container: {
370
- flex: 1,
371
- backgroundColor: _sharedUi.macOSColors.background.base
372
- },
373
- headerSearchContainer: {
374
- flexDirection: "row",
375
- alignItems: "center",
376
- backgroundColor: _sharedUi.macOSColors.background.input,
377
- borderRadius: 10,
378
- borderWidth: 1,
379
- borderColor: _sharedUi.macOSColors.border.default,
380
- paddingHorizontal: 12,
381
- paddingVertical: 5
382
- },
383
- headerSearchInput: {
384
- flex: 1,
385
- color: _sharedUi.macOSColors.text.primary,
386
- fontSize: 13,
387
- marginLeft: 6,
388
- paddingVertical: 2
389
- },
390
- headerSearchClear: {
391
- marginLeft: 6,
392
- padding: 4
393
- },
394
- headerChipRow: {
395
- flexDirection: "row",
396
- alignItems: "center",
397
- gap: 8
398
- },
399
- headerChip: {
400
- flexDirection: "row",
401
- alignItems: "center",
402
- gap: 4,
403
- backgroundColor: _sharedUi.macOSColors.background.hover,
404
- paddingHorizontal: 10,
405
- paddingVertical: 5,
406
- borderRadius: 12,
407
- borderWidth: 1,
408
- borderColor: _sharedUi.macOSColors.border.default
409
- },
410
- headerChipActive: {
411
- backgroundColor: _sharedUi.macOSColors.semantic.infoBackground,
412
- borderColor: _sharedUi.macOSColors.semantic.info + "50"
413
- },
414
- headerChipLabel: {
415
- fontSize: 10,
416
- fontWeight: "700",
417
- color: _sharedUi.macOSColors.text.muted
418
- },
419
- headerChipValue: {
420
- fontSize: 12,
421
- fontWeight: "600",
422
- fontFamily: "monospace"
423
- },
424
- headerActionButton: {
425
- width: 32,
426
- height: 32,
427
- borderRadius: 8,
428
- backgroundColor: _sharedUi.macOSColors.background.hover,
429
- borderWidth: 1,
430
- borderColor: _sharedUi.macOSColors.border.default,
431
- alignItems: "center",
432
- justifyContent: "center"
433
- },
434
- headerActionButtonDisabled: {
435
- opacity: 0.55
436
- },
437
- startButton: {
438
- backgroundColor: _sharedUi.macOSColors.semantic.successBackground,
439
- borderColor: _sharedUi.macOSColors.semantic.success + "40"
440
- },
441
- stopButton: {
442
- backgroundColor: _sharedUi.macOSColors.semantic.errorBackground,
443
- borderColor: _sharedUi.macOSColors.semantic.error + "40"
444
- },
445
- errorBanner: {
446
- flexDirection: "row",
447
- alignItems: "center",
448
- gap: 8,
449
- padding: 10,
450
- marginHorizontal: 12,
451
- marginTop: 8,
452
- backgroundColor: _sharedUi.macOSColors.semantic.errorBackground,
453
- borderRadius: 8,
454
- borderWidth: 1,
455
- borderColor: _sharedUi.macOSColors.semantic.error + "20"
456
- },
457
- errorText: {
458
- color: _sharedUi.macOSColors.semantic.error,
459
- fontSize: 11,
460
- flex: 1
461
- },
462
- disabledBanner: {
463
- flexDirection: "row",
464
- alignItems: "center",
465
- gap: 8,
466
- padding: 10,
467
- marginHorizontal: 12,
468
- marginTop: 8,
469
- backgroundColor: _sharedUi.macOSColors.semantic.warningBackground,
470
- borderRadius: 8,
471
- borderWidth: 1,
472
- borderColor: _sharedUi.macOSColors.semantic.warning + "20"
473
- },
474
- disabledText: {
475
- color: _sharedUi.macOSColors.semantic.warning,
476
- fontSize: 11,
477
- flex: 1
478
- },
479
- listContent: {
480
- paddingTop: 8,
481
- paddingBottom: 20
482
- },
483
- emptyState: {
484
- alignItems: "center",
485
- paddingVertical: 40
486
- },
487
- emptyTitle: {
488
- color: _sharedUi.macOSColors.text.primary,
489
- fontSize: 14,
490
- fontWeight: "600",
491
- marginTop: 12,
492
- marginBottom: 6
493
- },
494
- emptyText: {
495
- color: _sharedUi.macOSColors.text.muted,
496
- fontSize: 12,
497
- textAlign: "center"
498
- },
499
- // Locked actions banner styles
500
- lockedBanner: {
501
- flexDirection: "row",
502
- alignItems: "center",
503
- gap: 8,
504
- padding: 10,
505
- marginHorizontal: 12,
506
- marginTop: 8,
507
- backgroundColor: _sharedUi.buoyColors.primary + "15",
508
- borderRadius: 8,
509
- borderWidth: 1,
510
- borderColor: _sharedUi.buoyColors.primary + "33"
511
- },
512
- lockedText: {
513
- color: _sharedUi.buoyColors.primary,
514
- fontSize: 11,
515
- fontWeight: "500",
516
- flex: 1
517
- },
518
- upgradeBadge: {
519
- backgroundColor: _sharedUi.buoyColors.primary,
520
- paddingHorizontal: 8,
521
- paddingVertical: 3,
522
- borderRadius: 4
523
- },
524
- upgradeBadgeText: {
525
- color: "#fff",
526
- fontSize: 9,
527
- fontWeight: "700",
528
- letterSpacing: 0.5
529
- }
530
- });
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.FREE_TIER_ACTION_LIMIT=void 0,exports.ReduxModal=ReduxModal;var _react=require("react"),_reactNative=require("react-native"),_sharedUi=require("@buoy-gg/shared-ui"),_license=require("@buoy-gg/license"),_useReduxActions=require("../hooks/useReduxActions"),_useAutoInstrumentRedux=require("../hooks/useAutoInstrumentRedux"),_ReduxActionItem=require("./ReduxActionItem"),_ReduxActionDetailContent=require("./ReduxActionDetailContent"),_jsxRuntime=require("react/jsx-runtime");const FREE_TIER_ACTION_LIMIT=exports.FREE_TIER_ACTION_LIMIT=25;function EmptyState({isEnabled:e}){return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.emptyState,children:[(0,_jsxRuntime.jsx)(_sharedUi.Zap,{size:32,color:_sharedUi.macOSColors.text.muted}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.emptyTitle,children:"No Redux actions"}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.emptyText,children:e?"Actions will appear here as they are dispatched":"Enable capture to start recording actions"})]})}function ReduxModal({visible:e,onClose:t,onBack:r,onMinimize:a,enableSharedModalDimensions:s=!1}){const i=(0,_license.useIsPro)(),[o,n]=(0,_react.useState)(!1),{isInstrumented:l,isLoading:d,error:c,isReactReduxAvailable:u}=(0,_useAutoInstrumentRedux.useAutoInstrumentRedux)(),{filteredActions:h,filter:x,setFilter:_,stats:m,clearActions:C,isEnabled:g,toggleCapture:y}=(0,_useReduxActions.useReduxActions)(),p=(0,_react.useMemo)(()=>i?h:h.slice(0,FREE_TIER_ACTION_LIMIT),[h,i]),j=(0,_react.useMemo)(()=>i?0:Math.max(0,h.length-FREE_TIER_ACTION_LIMIT),[h.length,i]),R=j>0,[b,S]=(0,_react.useState)(null),U=(0,_react.useRef)([]);U.current=p;const T=null!==b?p[b]:null,[v,f]=(0,_react.useState)(""),[O,I]=(0,_react.useState)(!1),A=(0,_react.useRef)(null),k=(0,_react.useRef)(null),N=(0,_react.useCallback)(e=>{},[]),w=e=>{f(e),_(t=>({...t,searchText:e}))},B=(0,_react.useCallback)(e=>{const t=U.current.findIndex(t=>t.id===e.id);S(t>=0?t:0)},[]),z=(0,_react.useCallback)(()=>{n(!0)},[]),E=(0,_react.useCallback)(()=>{S(null)},[]),M=(0,_react.useCallback)(e=>{S(e)},[]),P=(0,_react.useCallback)(e=>e.id,[]),V=(0,_react.useCallback)(({item:e})=>(0,_jsxRuntime.jsx)(_ReduxActionItem.ReduxActionItem,{action:e,onPress:B}),[B]),D=s?_sharedUi.devToolsStorageKeys.modal.root():"buoy-redux-modal";if(!e)return null;const W=T&&null!==b?(0,_jsxRuntime.jsx)(_ReduxActionDetailContent.ReduxActionDetailFooter,{action:T,actions:p,selectedIndex:b,onIndexChange:M}):null,H=T&&p.length>1?68:0;return(0,_jsxRuntime.jsxs)(_sharedUi.TickProvider,{children:[(0,_jsxRuntime.jsx)(_sharedUi.JsModal,{visible:e,onClose:t,onMinimize:a,persistenceKey:D,header:{showToggleButton:!0,customContent:T?(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:E}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:T.type,centered:!0})]}):(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[r&&(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:r}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:"",children:O?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.headerSearchContainer,children:[(0,_jsxRuntime.jsx)(_sharedUi.Search,{size:14,color:_sharedUi.macOSColors.text.secondary}),(0,_jsxRuntime.jsx)(_reactNative.TextInput,{ref:A,style:styles.headerSearchInput,placeholder:"Search action types...",placeholderTextColor:_sharedUi.macOSColors.text.muted,value:v,onChangeText:w,onSubmitEditing:()=>I(!1),onBlur:()=>I(!1),autoCapitalize:"none",autoCorrect:!1,returnKeyType:"search"}),v.length>0&&(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:()=>{w(""),I(!1)},style:styles.headerSearchClear,children:(0,_jsxRuntime.jsx)(_sharedUi.X,{size:14,color:_sharedUi.macOSColors.text.secondary})})]}):(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.headerChipRow,children:[(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{style:[styles.headerChip,!x.onlyWithChanges&&styles.headerChipActive],onPress:()=>_(e=>({...e,onlyWithChanges:!1})),children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.headerChipLabel,children:"ALL"}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.headerChipValue,{color:_sharedUi.macOSColors.text.primary}],children:m.totalActions})]}),(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{style:[styles.headerChip,x.onlyWithChanges&&styles.headerChipActive],onPress:()=>_(e=>({...e,onlyWithChanges:!0})),children:[(0,_jsxRuntime.jsx)(_sharedUi.Zap,{size:12,color:_sharedUi.macOSColors.semantic.warning}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.headerChipValue,{color:_sharedUi.macOSColors.semantic.warning}],children:m.actionsWithChanges})]}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.headerChip,children:[(0,_jsxRuntime.jsx)(_sharedUi.CheckCircle,{size:12,color:_sharedUi.macOSColors.semantic.success}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.headerChipValue,{color:_sharedUi.macOSColors.semantic.success}],children:m.uniqueActionTypes})]})]})}),(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader.Actions,{children:[(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:()=>I(!0),style:styles.headerActionButton,children:(0,_jsxRuntime.jsx)(_sharedUi.Search,{size:14,color:_sharedUi.macOSColors.text.secondary})}),(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:async()=>{if(!i)return void n(!0);const e=h.map(e=>({id:e.id,type:e.type,...void 0!==e.payload&&{payload:e.payload},timestamp:e.timestamp,prevState:e.prevState,nextState:e.nextState,hasStateChange:e.hasStateChange}));await(0,_sharedUi.copyToClipboard)(e)},style:[styles.headerActionButton,0===h.length&&styles.headerActionButtonDisabled],disabled:0===h.length,children:(0,_jsxRuntime.jsx)(_sharedUi.Copy,{size:14,color:h.length>0?_sharedUi.macOSColors.text.secondary:_sharedUi.macOSColors.text.disabled})}),(0,_jsxRuntime.jsx)(_sharedUi.PowerToggleButton,{isEnabled:g,onToggle:y,accessibilityLabel:"Toggle Redux action capture"}),(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:C,style:[styles.headerActionButton,0===h.length&&styles.headerActionButtonDisabled],disabled:0===h.length,children:(0,_jsxRuntime.jsx)(_sharedUi.Trash2,{size:14,color:h.length>0?_sharedUi.macOSColors.text.muted:_sharedUi.macOSColors.text.disabled})})]})]})},onModeChange:N,enablePersistence:!0,initialMode:"bottomSheet",enableGlitchEffects:!0,styles:{},footer:W,footerHeight:H,children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.container,children:T&&null!==b?(0,_jsxRuntime.jsx)(_ReduxActionDetailContent.ReduxActionDetailContent,{action:T,actions:p,selectedIndex:b,onIndexChange:M,disableInternalFooter:!0}):(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[c&&!l&&(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.errorBanner,children:[(0,_jsxRuntime.jsx)(_sharedUi.AlertTriangle,{size:14,color:_sharedUi.macOSColors.semantic.error}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.errorText,children:u?"Not inside a Redux Provider. Wrap your app with <Provider store={store}>.":"react-redux not installed. Run: npm install react-redux"})]}),!g&&l&&(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.disabledBanner,children:[(0,_jsxRuntime.jsx)(_sharedUi.Power,{size:14,color:_sharedUi.macOSColors.semantic.warning}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.disabledText,children:"Action capture is disabled"})]}),R&&(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{style:styles.lockedBanner,onPress:z,activeOpacity:.8,children:[(0,_jsxRuntime.jsx)(_sharedUi.Lock,{size:14,color:_sharedUi.buoyColors.primary}),(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.lockedText,children:[j," older ",1===j?"action":"actions"," locked"]}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.upgradeBadge,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.upgradeBadgeText,children:"UPGRADE"})})]}),p.length>0?(0,_jsxRuntime.jsx)(_reactNative.FlatList,{ref:k,data:p,renderItem:V,keyExtractor:P,contentContainerStyle:styles.listContent,showsVerticalScrollIndicator:!0,removeClippedSubviews:!0,initialNumToRender:15,maxToRenderPerBatch:10,windowSize:10,scrollEnabled:!1}):(0,_jsxRuntime.jsx)(EmptyState,{isEnabled:g})]})})}),(0,_jsxRuntime.jsx)(_sharedUi.ProUpgradeModal,{visible:o,onClose:()=>n(!1),featureName:"Full Action History"})]})}const styles=_reactNative.StyleSheet.create({container:{flex:1,backgroundColor:_sharedUi.macOSColors.background.base},headerSearchContainer:{flexDirection:"row",alignItems:"center",backgroundColor:_sharedUi.macOSColors.background.input,borderRadius:10,borderWidth:1,borderColor:_sharedUi.macOSColors.border.default,paddingHorizontal:12,paddingVertical:5},headerSearchInput:{flex:1,color:_sharedUi.macOSColors.text.primary,fontSize:13,marginLeft:6,paddingVertical:2},headerSearchClear:{marginLeft:6,padding:4},headerChipRow:{flexDirection:"row",alignItems:"center",gap:8},headerChip:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:_sharedUi.macOSColors.background.hover,paddingHorizontal:10,paddingVertical:5,borderRadius:12,borderWidth:1,borderColor:_sharedUi.macOSColors.border.default},headerChipActive:{backgroundColor:_sharedUi.macOSColors.semantic.infoBackground,borderColor:_sharedUi.macOSColors.semantic.info+"50"},headerChipLabel:{fontSize:10,fontWeight:"700",color:_sharedUi.macOSColors.text.muted},headerChipValue:{fontSize:12,fontWeight:"600",fontFamily:"monospace"},headerActionButton:{width:32,height:32,borderRadius:8,backgroundColor:_sharedUi.macOSColors.background.hover,borderWidth:1,borderColor:_sharedUi.macOSColors.border.default,alignItems:"center",justifyContent:"center"},headerActionButtonDisabled:{opacity:.55},startButton:{backgroundColor:_sharedUi.macOSColors.semantic.successBackground,borderColor:_sharedUi.macOSColors.semantic.success+"40"},stopButton:{backgroundColor:_sharedUi.macOSColors.semantic.errorBackground,borderColor:_sharedUi.macOSColors.semantic.error+"40"},errorBanner:{flexDirection:"row",alignItems:"center",gap:8,padding:10,marginHorizontal:12,marginTop:8,backgroundColor:_sharedUi.macOSColors.semantic.errorBackground,borderRadius:8,borderWidth:1,borderColor:_sharedUi.macOSColors.semantic.error+"20"},errorText:{color:_sharedUi.macOSColors.semantic.error,fontSize:11,flex:1},disabledBanner:{flexDirection:"row",alignItems:"center",gap:8,padding:10,marginHorizontal:12,marginTop:8,backgroundColor:_sharedUi.macOSColors.semantic.warningBackground,borderRadius:8,borderWidth:1,borderColor:_sharedUi.macOSColors.semantic.warning+"20"},disabledText:{color:_sharedUi.macOSColors.semantic.warning,fontSize:11,flex:1},listContent:{paddingTop:8,paddingBottom:20},emptyState:{alignItems:"center",paddingVertical:40},emptyTitle:{color:_sharedUi.macOSColors.text.primary,fontSize:14,fontWeight:"600",marginTop:12,marginBottom:6},emptyText:{color:_sharedUi.macOSColors.text.muted,fontSize:12,textAlign:"center"},lockedBanner:{flexDirection:"row",alignItems:"center",gap:8,padding:10,marginHorizontal:12,marginTop:8,backgroundColor:_sharedUi.buoyColors.primary+"15",borderRadius:8,borderWidth:1,borderColor:_sharedUi.buoyColors.primary+"33"},lockedText:{color:_sharedUi.buoyColors.primary,fontSize:11,fontWeight:"500",flex:1},upgradeBadge:{backgroundColor:_sharedUi.buoyColors.primary,paddingHorizontal:8,paddingVertical:3,borderRadius:4},upgradeBadgeText:{color:"#fff",fontSize:9,fontWeight:"700",letterSpacing:.5}});
@@ -1,52 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "FREE_TIER_ACTION_LIMIT", {
7
- enumerable: true,
8
- get: function () {
9
- return _ReduxModal.FREE_TIER_ACTION_LIMIT;
10
- }
11
- });
12
- Object.defineProperty(exports, "ReduxActionDetailContent", {
13
- enumerable: true,
14
- get: function () {
15
- return _ReduxActionDetailContent.ReduxActionDetailContent;
16
- }
17
- });
18
- Object.defineProperty(exports, "ReduxActionDetailFooter", {
19
- enumerable: true,
20
- get: function () {
21
- return _ReduxActionDetailContent.ReduxActionDetailFooter;
22
- }
23
- });
24
- Object.defineProperty(exports, "ReduxActionDetailView", {
25
- enumerable: true,
26
- get: function () {
27
- return _ReduxActionDetailView.ReduxActionDetailView;
28
- }
29
- });
30
- Object.defineProperty(exports, "ReduxActionItem", {
31
- enumerable: true,
32
- get: function () {
33
- return _ReduxActionItem.ReduxActionItem;
34
- }
35
- });
36
- Object.defineProperty(exports, "ReduxIcon", {
37
- enumerable: true,
38
- get: function () {
39
- return _ReduxIcon.ReduxIcon;
40
- }
41
- });
42
- Object.defineProperty(exports, "ReduxModal", {
43
- enumerable: true,
44
- get: function () {
45
- return _ReduxModal.ReduxModal;
46
- }
47
- });
48
- var _ReduxModal = require("./ReduxModal");
49
- var _ReduxActionItem = require("./ReduxActionItem");
50
- var _ReduxActionDetailView = require("./ReduxActionDetailView");
51
- var _ReduxActionDetailContent = require("./ReduxActionDetailContent");
52
- var _ReduxIcon = require("./ReduxIcon");
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"FREE_TIER_ACTION_LIMIT",{enumerable:!0,get:function(){return _ReduxModal.FREE_TIER_ACTION_LIMIT}}),Object.defineProperty(exports,"ReduxActionDetailContent",{enumerable:!0,get:function(){return _ReduxActionDetailContent.ReduxActionDetailContent}}),Object.defineProperty(exports,"ReduxActionDetailFooter",{enumerable:!0,get:function(){return _ReduxActionDetailContent.ReduxActionDetailFooter}}),Object.defineProperty(exports,"ReduxActionDetailView",{enumerable:!0,get:function(){return _ReduxActionDetailView.ReduxActionDetailView}}),Object.defineProperty(exports,"ReduxActionItem",{enumerable:!0,get:function(){return _ReduxActionItem.ReduxActionItem}}),Object.defineProperty(exports,"ReduxIcon",{enumerable:!0,get:function(){return _ReduxIcon.ReduxIcon}}),Object.defineProperty(exports,"ReduxModal",{enumerable:!0,get:function(){return _ReduxModal.ReduxModal}});var _ReduxModal=require("./ReduxModal"),_ReduxActionItem=require("./ReduxActionItem"),_ReduxActionDetailView=require("./ReduxActionDetailView"),_ReduxActionDetailContent=require("./ReduxActionDetailContent"),_ReduxIcon=require("./ReduxIcon");
@@ -1,25 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "useAutoInstrumentRedux", {
7
- enumerable: true,
8
- get: function () {
9
- return _useAutoInstrumentRedux.useAutoInstrumentRedux;
10
- }
11
- });
12
- Object.defineProperty(exports, "useReduxActions", {
13
- enumerable: true,
14
- get: function () {
15
- return _useReduxActions.useReduxActions;
16
- }
17
- });
18
- Object.defineProperty(exports, "useReduxAvailability", {
19
- enumerable: true,
20
- get: function () {
21
- return _useAutoInstrumentRedux.useReduxAvailability;
22
- }
23
- });
24
- var _useReduxActions = require("./useReduxActions");
25
- var _useAutoInstrumentRedux = require("./useAutoInstrumentRedux");
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"useAutoInstrumentRedux",{enumerable:!0,get:function(){return _useAutoInstrumentRedux.useAutoInstrumentRedux}}),Object.defineProperty(exports,"useReduxActions",{enumerable:!0,get:function(){return _useReduxActions.useReduxActions}}),Object.defineProperty(exports,"useReduxAvailability",{enumerable:!0,get:function(){return _useAutoInstrumentRedux.useReduxAvailability}});var _useReduxActions=require("./useReduxActions"),_useAutoInstrumentRedux=require("./useAutoInstrumentRedux");