@tanstack/react-query-devtools 5.0.0-alpha.5 → 5.0.0-alpha.51

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 (115) hide show
  1. package/build/lib/__tests__/devtools.test.d.ts +1 -1
  2. package/build/lib/__tests__/devtools.test.d.ts.map +1 -0
  3. package/build/lib/__tests__/utils.d.ts +2 -1
  4. package/build/lib/__tests__/utils.d.ts.map +1 -0
  5. package/build/lib/devtools.cjs +61 -0
  6. package/build/lib/devtools.cjs.map +1 -0
  7. package/build/lib/devtools.d.ts +11 -75
  8. package/build/lib/devtools.d.ts.map +1 -0
  9. package/build/lib/devtools.js +53 -789
  10. package/build/lib/devtools.js.map +1 -1
  11. package/build/lib/index.cjs +18 -0
  12. package/build/lib/index.cjs.map +1 -0
  13. package/build/lib/index.d.ts +1 -1
  14. package/build/lib/index.d.ts.map +1 -0
  15. package/build/lib/index.js +11 -9
  16. package/build/lib/index.js.map +1 -1
  17. package/build/lib/index.prod.cjs +69 -0
  18. package/build/lib/index.prod.cjs.map +1 -0
  19. package/build/lib/{index.prod.d.ts → index.prod.d.ts/index.d.ts} +1 -1
  20. package/build/lib/index.prod.js +58 -1444
  21. package/build/lib/index.prod.js.map +1 -1
  22. package/package.json +24 -26
  23. package/src/__tests__/devtools.test.tsx +1 -861
  24. package/src/devtools.tsx +61 -1164
  25. package/src/index.ts +6 -6
  26. package/build/lib/Explorer.d.ts +0 -50
  27. package/build/lib/Explorer.esm.js +0 -253
  28. package/build/lib/Explorer.esm.js.map +0 -1
  29. package/build/lib/Explorer.js +0 -287
  30. package/build/lib/Explorer.js.map +0 -1
  31. package/build/lib/Explorer.mjs +0 -253
  32. package/build/lib/Explorer.mjs.map +0 -1
  33. package/build/lib/Logo.d.ts +0 -1
  34. package/build/lib/Logo.esm.js +0 -32
  35. package/build/lib/Logo.esm.js.map +0 -1
  36. package/build/lib/Logo.js +0 -55
  37. package/build/lib/Logo.js.map +0 -1
  38. package/build/lib/Logo.mjs +0 -32
  39. package/build/lib/Logo.mjs.map +0 -1
  40. package/build/lib/__tests__/Explorer.test.d.ts +0 -1
  41. package/build/lib/_virtual/_rollupPluginBabelHelpers.esm.js +0 -17
  42. package/build/lib/_virtual/_rollupPluginBabelHelpers.esm.js.map +0 -1
  43. package/build/lib/_virtual/_rollupPluginBabelHelpers.js +0 -19
  44. package/build/lib/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
  45. package/build/lib/_virtual/_rollupPluginBabelHelpers.mjs +0 -17
  46. package/build/lib/_virtual/_rollupPluginBabelHelpers.mjs.map +0 -1
  47. package/build/lib/devtools.esm.js +0 -773
  48. package/build/lib/devtools.esm.js.map +0 -1
  49. package/build/lib/devtools.mjs +0 -773
  50. package/build/lib/devtools.mjs.map +0 -1
  51. package/build/lib/index.esm.js +0 -11
  52. package/build/lib/index.esm.js.map +0 -1
  53. package/build/lib/index.mjs +0 -11
  54. package/build/lib/index.mjs.map +0 -1
  55. package/build/lib/index.prod.esm.js +0 -1431
  56. package/build/lib/index.prod.esm.js.map +0 -1
  57. package/build/lib/index.prod.mjs +0 -1431
  58. package/build/lib/index.prod.mjs.map +0 -1
  59. package/build/lib/noop.d.ts +0 -2
  60. package/build/lib/screenreader.d.ts +0 -3
  61. package/build/lib/screenreader.esm.js +0 -17
  62. package/build/lib/screenreader.esm.js.map +0 -1
  63. package/build/lib/screenreader.js +0 -40
  64. package/build/lib/screenreader.js.map +0 -1
  65. package/build/lib/screenreader.mjs +0 -17
  66. package/build/lib/screenreader.mjs.map +0 -1
  67. package/build/lib/styledComponents.d.ts +0 -9
  68. package/build/lib/styledComponents.esm.js +0 -93
  69. package/build/lib/styledComponents.esm.js.map +0 -1
  70. package/build/lib/styledComponents.js +0 -102
  71. package/build/lib/styledComponents.js.map +0 -1
  72. package/build/lib/styledComponents.mjs +0 -93
  73. package/build/lib/styledComponents.mjs.map +0 -1
  74. package/build/lib/theme.d.ts +0 -36
  75. package/build/lib/theme.esm.js +0 -32
  76. package/build/lib/theme.esm.js.map +0 -1
  77. package/build/lib/theme.js +0 -55
  78. package/build/lib/theme.js.map +0 -1
  79. package/build/lib/theme.mjs +0 -32
  80. package/build/lib/theme.mjs.map +0 -1
  81. package/build/lib/useLocalStorage.d.ts +0 -1
  82. package/build/lib/useLocalStorage.esm.js +0 -40
  83. package/build/lib/useLocalStorage.esm.js.map +0 -1
  84. package/build/lib/useLocalStorage.js +0 -63
  85. package/build/lib/useLocalStorage.js.map +0 -1
  86. package/build/lib/useLocalStorage.mjs +0 -40
  87. package/build/lib/useLocalStorage.mjs.map +0 -1
  88. package/build/lib/useMediaQuery.d.ts +0 -1
  89. package/build/lib/useMediaQuery.esm.js +0 -36
  90. package/build/lib/useMediaQuery.esm.js.map +0 -1
  91. package/build/lib/useMediaQuery.js +0 -59
  92. package/build/lib/useMediaQuery.js.map +0 -1
  93. package/build/lib/useMediaQuery.mjs +0 -36
  94. package/build/lib/useMediaQuery.mjs.map +0 -1
  95. package/build/lib/utils.d.ts +0 -79
  96. package/build/lib/utils.esm.js +0 -184
  97. package/build/lib/utils.esm.js.map +0 -1
  98. package/build/lib/utils.js +0 -218
  99. package/build/lib/utils.js.map +0 -1
  100. package/build/lib/utils.mjs +0 -184
  101. package/build/lib/utils.mjs.map +0 -1
  102. package/build/umd/index.development.js +0 -3099
  103. package/build/umd/index.development.js.map +0 -1
  104. package/build/umd/index.production.js +0 -2
  105. package/build/umd/index.production.js.map +0 -1
  106. package/src/Explorer.tsx +0 -385
  107. package/src/Logo.tsx +0 -32
  108. package/src/__tests__/Explorer.test.tsx +0 -150
  109. package/src/noop.ts +0 -7
  110. package/src/screenreader.tsx +0 -16
  111. package/src/styledComponents.ts +0 -108
  112. package/src/theme.tsx +0 -33
  113. package/src/useLocalStorage.ts +0 -52
  114. package/src/useMediaQuery.ts +0 -34
  115. package/src/utils.ts +0 -319
@@ -1,773 +0,0 @@
1
- import { extends as _extends } from './_virtual/_rollupPluginBabelHelpers.mjs';
2
- import * as React from 'react';
3
- import { useQueryClient, onlineManager, notifyManager } from '@tanstack/react-query';
4
- import { rankItem } from '@tanstack/match-sorter-utils';
5
- import useLocalStorage from './useLocalStorage.mjs';
6
- import { defaultPanelSize, useIsMounted, getSidedProp, getSidePanelStyle, sortFns, getResizeHandleStyle, displayValue, getQueryStatusColor, getQueryStatusLabel, isVerticalSide, minPanelSize } from './utils.mjs';
7
- import { Panel, Select, Input, Button, ActiveQueryPanel, Code, QueryKeys, QueryKey } from './styledComponents.mjs';
8
- import ScreenReader from './screenreader.mjs';
9
- import { defaultTheme, ThemeProvider } from './theme.mjs';
10
- import Explorer from './Explorer.mjs';
11
- import Logo from './Logo.mjs';
12
-
13
- function ReactQueryDevtools({
14
- initialIsOpen,
15
- panelProps = {},
16
- closeButtonProps = {},
17
- toggleButtonProps = {},
18
- position = 'bottom-left',
19
- containerElement: Container = 'aside',
20
- queryClient,
21
- styleNonce,
22
- panelPosition: initialPanelPosition = 'bottom'
23
- }) {
24
- const rootRef = React.useRef(null);
25
- const panelRef = React.useRef(null);
26
- const [isOpen, setIsOpen] = useLocalStorage('reactQueryDevtoolsOpen', initialIsOpen);
27
- const [devtoolsHeight, setDevtoolsHeight] = useLocalStorage('reactQueryDevtoolsHeight', defaultPanelSize);
28
- const [devtoolsWidth, setDevtoolsWidth] = useLocalStorage('reactQueryDevtoolsWidth', defaultPanelSize);
29
- const [panelPosition = 'bottom', setPanelPosition] = useLocalStorage('reactQueryDevtoolsPanelPosition', initialPanelPosition);
30
- const [isResolvedOpen, setIsResolvedOpen] = React.useState(false);
31
- const [isResizing, setIsResizing] = React.useState(false);
32
- const isMounted = useIsMounted();
33
- const handleDragStart = (panelElement, startEvent) => {
34
- if (!panelElement) return;
35
- if (startEvent.button !== 0) return; // Only allow left click for drag
36
- const isVertical = isVerticalSide(panelPosition);
37
- setIsResizing(true);
38
- const {
39
- height,
40
- width
41
- } = panelElement.getBoundingClientRect();
42
- const startX = startEvent.clientX;
43
- const startY = startEvent.clientY;
44
- let newSize = 0;
45
- const run = moveEvent => {
46
- // prevent mouse selecting stuff with mouse drag
47
- moveEvent.preventDefault();
48
-
49
- // calculate the correct size based on mouse position and current panel position
50
- // hint: it is different formula for the opposite sides
51
- if (isVertical) {
52
- newSize = width + (panelPosition === 'right' ? startX - moveEvent.clientX : moveEvent.clientX - startX);
53
- setDevtoolsWidth(newSize);
54
- } else {
55
- newSize = height + (panelPosition === 'bottom' ? startY - moveEvent.clientY : moveEvent.clientY - startY);
56
- setDevtoolsHeight(newSize);
57
- }
58
- if (newSize < minPanelSize) {
59
- setIsOpen(false);
60
- } else {
61
- setIsOpen(true);
62
- }
63
- };
64
- const unsub = () => {
65
- if (isResizing) {
66
- setIsResizing(false);
67
- }
68
- document.removeEventListener('mousemove', run, false);
69
- document.removeEventListener('mouseUp', unsub, false);
70
- };
71
- document.addEventListener('mousemove', run, false);
72
- document.addEventListener('mouseup', unsub, false);
73
- };
74
- React.useEffect(() => {
75
- setIsResolvedOpen(isOpen ?? false);
76
- }, [isOpen, isResolvedOpen, setIsResolvedOpen]);
77
-
78
- // Toggle panel visibility before/after transition (depending on direction).
79
- // Prevents focusing in a closed panel.
80
- React.useEffect(() => {
81
- const ref = panelRef.current;
82
- if (ref) {
83
- const handlePanelTransitionStart = () => {
84
- if (isResolvedOpen) {
85
- ref.style.visibility = 'visible';
86
- }
87
- };
88
- const handlePanelTransitionEnd = () => {
89
- if (!isResolvedOpen) {
90
- ref.style.visibility = 'hidden';
91
- }
92
- };
93
- ref.addEventListener('transitionstart', handlePanelTransitionStart);
94
- ref.addEventListener('transitionend', handlePanelTransitionEnd);
95
- return () => {
96
- ref.removeEventListener('transitionstart', handlePanelTransitionStart);
97
- ref.removeEventListener('transitionend', handlePanelTransitionEnd);
98
- };
99
- }
100
- return;
101
- }, [isResolvedOpen]);
102
- React.useEffect(() => {
103
- if (isResolvedOpen && rootRef.current?.parentElement) {
104
- const {
105
- parentElement
106
- } = rootRef.current;
107
- const styleProp = getSidedProp('padding', panelPosition);
108
- const isVertical = isVerticalSide(panelPosition);
109
- const previousPaddings = (({
110
- padding,
111
- paddingTop,
112
- paddingBottom,
113
- paddingLeft,
114
- paddingRight
115
- }) => ({
116
- padding,
117
- paddingTop,
118
- paddingBottom,
119
- paddingLeft,
120
- paddingRight
121
- }))(parentElement.style);
122
- const run = () => {
123
- // reset the padding
124
- parentElement.style.padding = '0px';
125
- parentElement.style.paddingTop = '0px';
126
- parentElement.style.paddingBottom = '0px';
127
- parentElement.style.paddingLeft = '0px';
128
- parentElement.style.paddingRight = '0px';
129
- // set the new padding based on the new panel position
130
-
131
- parentElement.style[styleProp] = `${isVertical ? devtoolsWidth : devtoolsHeight}px`;
132
- };
133
- run();
134
- if (typeof window !== 'undefined') {
135
- window.addEventListener('resize', run);
136
- return () => {
137
- window.removeEventListener('resize', run);
138
- Object.entries(previousPaddings).forEach(([property, previousValue]) => {
139
- parentElement.style[property] = previousValue;
140
- });
141
- };
142
- }
143
- }
144
- return;
145
- }, [isResolvedOpen, panelPosition, devtoolsHeight, devtoolsWidth]);
146
- const {
147
- style: panelStyle = {},
148
- ...otherPanelProps
149
- } = panelProps;
150
- const {
151
- style: toggleButtonStyle = {},
152
- onClick: onToggleClick,
153
- ...otherToggleButtonProps
154
- } = toggleButtonProps;
155
-
156
- // get computed style based on panel position
157
- const style = getSidePanelStyle({
158
- position: panelPosition,
159
- devtoolsTheme: defaultTheme,
160
- isOpen: isResolvedOpen,
161
- height: devtoolsHeight,
162
- width: devtoolsWidth,
163
- isResizing,
164
- panelStyle
165
- });
166
-
167
- // Do not render on the server
168
- if (!isMounted()) return null;
169
- return /*#__PURE__*/React.createElement(Container, {
170
- ref: rootRef,
171
- className: "ReactQueryDevtools",
172
- "aria-label": "React Query Devtools"
173
- }, /*#__PURE__*/React.createElement(ThemeProvider, {
174
- theme: defaultTheme
175
- }, /*#__PURE__*/React.createElement(ReactQueryDevtoolsPanel, _extends({
176
- ref: panelRef,
177
- queryClient: queryClient,
178
- styleNonce: styleNonce,
179
- position: panelPosition,
180
- onPositionChange: setPanelPosition,
181
- showCloseButton: true,
182
- closeButtonProps: closeButtonProps
183
- }, otherPanelProps, {
184
- style: style,
185
- isOpen: isResolvedOpen,
186
- setIsOpen: setIsOpen,
187
- onDragStart: e => handleDragStart(panelRef.current, e)
188
- }))), !isResolvedOpen ? /*#__PURE__*/React.createElement("button", _extends({
189
- type: "button"
190
- }, otherToggleButtonProps, {
191
- "aria-label": "Open React Query Devtools",
192
- "aria-controls": "ReactQueryDevtoolsPanel",
193
- "aria-haspopup": "true",
194
- "aria-expanded": "false",
195
- onClick: e => {
196
- setIsOpen(true);
197
- onToggleClick?.(e);
198
- },
199
- style: {
200
- background: 'none',
201
- border: 0,
202
- padding: 0,
203
- position: 'fixed',
204
- zIndex: 99999,
205
- display: 'inline-flex',
206
- fontSize: '1.5em',
207
- margin: '.5em',
208
- cursor: 'pointer',
209
- width: 'fit-content',
210
- ...(position === 'top-right' ? {
211
- top: '0',
212
- right: '0'
213
- } : position === 'top-left' ? {
214
- top: '0',
215
- left: '0'
216
- } : position === 'bottom-right' ? {
217
- bottom: '0',
218
- right: '0'
219
- } : {
220
- bottom: '0',
221
- left: '0'
222
- }),
223
- ...toggleButtonStyle
224
- }
225
- }), /*#__PURE__*/React.createElement(Logo, {
226
- "aria-hidden": true
227
- }), /*#__PURE__*/React.createElement(ScreenReader, {
228
- text: "Open React Query Devtools"
229
- })) : null);
230
- }
231
- const useSubscribeToQueryCache = (queryCache, getSnapshot, skip = false) => {
232
- return React.useSyncExternalStore(React.useCallback(onStoreChange => {
233
- if (!skip) return queryCache.subscribe(notifyManager.batchCalls(onStoreChange));
234
- return () => {
235
- return;
236
- };
237
- }, [queryCache, skip]), getSnapshot, getSnapshot);
238
- };
239
- const ReactQueryDevtoolsPanel = /*#__PURE__*/React.forwardRef(function ReactQueryDevtoolsPanel(props, ref) {
240
- const {
241
- isOpen = true,
242
- styleNonce,
243
- setIsOpen,
244
- queryClient,
245
- onDragStart,
246
- onPositionChange,
247
- showCloseButton,
248
- position,
249
- closeButtonProps = {},
250
- ...panelProps
251
- } = props;
252
- const {
253
- onClick: onCloseClick,
254
- ...otherCloseButtonProps
255
- } = closeButtonProps;
256
- const client = useQueryClient(queryClient);
257
- const queryCache = client.getQueryCache();
258
- const [sort, setSort] = useLocalStorage('reactQueryDevtoolsSortFn', Object.keys(sortFns)[0]);
259
- const [filter, setFilter] = useLocalStorage('reactQueryDevtoolsFilter', '');
260
- const [baseSort, setBaseSort] = useLocalStorage('reactQueryDevtoolsBaseSort', 1);
261
- const sortFn = React.useMemo(() => sortFns[sort], [sort]);
262
- const queriesCount = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().length, !isOpen);
263
- const [activeQueryHash, setActiveQueryHash] = useLocalStorage('reactQueryDevtoolsActiveQueryHash', '');
264
- const queries = React.useMemo(() => {
265
- const unsortedQueries = queryCache.getAll();
266
- if (queriesCount === 0) {
267
- return [];
268
- }
269
- const filtered = filter ? unsortedQueries.filter(item => rankItem(item.queryHash, filter).passed) : [...unsortedQueries];
270
- const sorted = sortFn ? filtered.sort((a, b) => sortFn(a, b) * baseSort) : filtered;
271
- return sorted;
272
- }, [baseSort, sortFn, filter, queriesCount, queryCache]);
273
- const [isMockOffline, setMockOffline] = React.useState(false);
274
- return /*#__PURE__*/React.createElement(ThemeProvider, {
275
- theme: defaultTheme
276
- }, /*#__PURE__*/React.createElement(Panel, _extends({
277
- ref: ref,
278
- className: "ReactQueryDevtoolsPanel",
279
- "aria-label": "React Query Devtools Panel",
280
- id: "ReactQueryDevtoolsPanel"
281
- }, panelProps, {
282
- style: {
283
- height: defaultPanelSize,
284
- position: 'relative',
285
- ...panelProps.style
286
- }
287
- }), /*#__PURE__*/React.createElement("style", {
288
- nonce: styleNonce,
289
- dangerouslySetInnerHTML: {
290
- __html: `
291
- .ReactQueryDevtoolsPanel * {
292
- scrollbar-color: ${defaultTheme.backgroundAlt} ${defaultTheme.gray};
293
- }
294
-
295
- .ReactQueryDevtoolsPanel *::-webkit-scrollbar, .ReactQueryDevtoolsPanel scrollbar {
296
- width: 1em;
297
- height: 1em;
298
- }
299
-
300
- .ReactQueryDevtoolsPanel *::-webkit-scrollbar-track, .ReactQueryDevtoolsPanel scrollbar-track {
301
- background: ${defaultTheme.backgroundAlt};
302
- }
303
-
304
- .ReactQueryDevtoolsPanel *::-webkit-scrollbar-thumb, .ReactQueryDevtoolsPanel scrollbar-thumb {
305
- background: ${defaultTheme.gray};
306
- border-radius: .5em;
307
- border: 3px solid ${defaultTheme.backgroundAlt};
308
- }
309
- `
310
- }
311
- }), /*#__PURE__*/React.createElement("div", {
312
- style: getResizeHandleStyle(position),
313
- onMouseDown: onDragStart
314
- }), isOpen && /*#__PURE__*/React.createElement("div", {
315
- style: {
316
- flex: '1 1 500px',
317
- minHeight: '40%',
318
- maxHeight: '100%',
319
- overflow: 'auto',
320
- borderRight: `1px solid ${defaultTheme.grayAlt}`,
321
- display: 'flex',
322
- flexDirection: 'column'
323
- }
324
- }, /*#__PURE__*/React.createElement("div", {
325
- style: {
326
- padding: '.5em',
327
- background: defaultTheme.backgroundAlt,
328
- display: 'flex',
329
- justifyContent: 'space-between',
330
- alignItems: 'center'
331
- }
332
- }, /*#__PURE__*/React.createElement("button", {
333
- type: "button",
334
- "aria-label": "Close React Query Devtools",
335
- "aria-controls": "ReactQueryDevtoolsPanel",
336
- "aria-haspopup": "true",
337
- "aria-expanded": "true",
338
- onClick: () => setIsOpen(false),
339
- style: {
340
- display: 'inline-flex',
341
- background: 'none',
342
- border: 0,
343
- padding: 0,
344
- marginRight: '.5em',
345
- cursor: 'pointer'
346
- }
347
- }, /*#__PURE__*/React.createElement(Logo, {
348
- "aria-hidden": true
349
- }), /*#__PURE__*/React.createElement(ScreenReader, {
350
- text: "Close React Query Devtools"
351
- })), /*#__PURE__*/React.createElement("div", {
352
- style: {
353
- display: 'flex',
354
- flexDirection: 'column'
355
- }
356
- }, /*#__PURE__*/React.createElement("div", {
357
- style: {
358
- display: 'flex',
359
- justifyContent: 'space-between',
360
- alignItems: 'center',
361
- marginBottom: '.5em'
362
- }
363
- }, /*#__PURE__*/React.createElement(QueryStatusCount, {
364
- queryCache: queryCache
365
- }), position && onPositionChange ? /*#__PURE__*/React.createElement(Select, {
366
- "aria-label": "Panel position",
367
- value: position,
368
- style: {
369
- marginInlineStart: '.5em'
370
- },
371
- onChange: e => onPositionChange(e.target.value)
372
- }, /*#__PURE__*/React.createElement("option", {
373
- value: "left"
374
- }, "Left"), /*#__PURE__*/React.createElement("option", {
375
- value: "right"
376
- }, "Right"), /*#__PURE__*/React.createElement("option", {
377
- value: "top"
378
- }, "Top"), /*#__PURE__*/React.createElement("option", {
379
- value: "bottom"
380
- }, "Bottom")) : null), /*#__PURE__*/React.createElement("div", {
381
- style: {
382
- display: 'flex',
383
- alignItems: 'center'
384
- }
385
- }, /*#__PURE__*/React.createElement(Input, {
386
- placeholder: "Filter",
387
- "aria-label": "Filter by queryhash",
388
- value: filter ?? '',
389
- onChange: e => setFilter(e.target.value),
390
- onKeyDown: e => {
391
- if (e.key === 'Escape') setFilter('');
392
- },
393
- style: {
394
- flex: '1',
395
- marginRight: '.5em',
396
- width: '100%'
397
- }
398
- }), /*#__PURE__*/React.createElement(Select, {
399
- "aria-label": "Sort queries",
400
- value: sort,
401
- onChange: e => setSort(e.target.value),
402
- style: {
403
- flex: '1',
404
- minWidth: 75,
405
- marginRight: '.5em'
406
- }
407
- }, Object.keys(sortFns).map(key => /*#__PURE__*/React.createElement("option", {
408
- key: key,
409
- value: key
410
- }, "Sort by ", key))), /*#__PURE__*/React.createElement(Button, {
411
- type: "button",
412
- onClick: () => setBaseSort(old => old * -1),
413
- style: {
414
- padding: '.3em .4em',
415
- marginRight: '.5em'
416
- }
417
- }, baseSort === 1 ? '⬆ Asc' : '⬇ Desc'), /*#__PURE__*/React.createElement(Button, {
418
- type: "button",
419
- onClick: () => {
420
- if (isMockOffline) {
421
- onlineManager.setOnline(undefined);
422
- setMockOffline(false);
423
- window.dispatchEvent(new Event('online'));
424
- } else {
425
- onlineManager.setOnline(false);
426
- setMockOffline(true);
427
- }
428
- },
429
- "aria-label": isMockOffline ? 'Restore offline mock' : 'Mock offline behavior',
430
- title: isMockOffline ? 'Restore offline mock' : 'Mock offline behavior',
431
- style: {
432
- padding: '0',
433
- height: '2em'
434
- }
435
- }, /*#__PURE__*/React.createElement("svg", {
436
- xmlns: "http://www.w3.org/2000/svg",
437
- width: "2em",
438
- height: "2em",
439
- viewBox: "0 0 24 24",
440
- stroke: isMockOffline ? defaultTheme.danger : 'currentColor',
441
- fill: "none"
442
- }, isMockOffline ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", {
443
- stroke: "none",
444
- d: "M0 0h24v24H0z",
445
- fill: "none"
446
- }), /*#__PURE__*/React.createElement("line", {
447
- x1: "12",
448
- y1: "18",
449
- x2: "12.01",
450
- y2: "18"
451
- }), /*#__PURE__*/React.createElement("path", {
452
- d: "M9.172 15.172a4 4 0 0 1 5.656 0"
453
- }), /*#__PURE__*/React.createElement("path", {
454
- d: "M6.343 12.343a7.963 7.963 0 0 1 3.864 -2.14m4.163 .155a7.965 7.965 0 0 1 3.287 2"
455
- }), /*#__PURE__*/React.createElement("path", {
456
- d: "M3.515 9.515a12 12 0 0 1 3.544 -2.455m3.101 -.92a12 12 0 0 1 10.325 3.374"
457
- }), /*#__PURE__*/React.createElement("line", {
458
- x1: "3",
459
- y1: "3",
460
- x2: "21",
461
- y2: "21"
462
- })) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", {
463
- stroke: "none",
464
- d: "M0 0h24v24H0z",
465
- fill: "none"
466
- }), /*#__PURE__*/React.createElement("line", {
467
- x1: "12",
468
- y1: "18",
469
- x2: "12.01",
470
- y2: "18"
471
- }), /*#__PURE__*/React.createElement("path", {
472
- d: "M9.172 15.172a4 4 0 0 1 5.656 0"
473
- }), /*#__PURE__*/React.createElement("path", {
474
- d: "M6.343 12.343a8 8 0 0 1 11.314 0"
475
- }), /*#__PURE__*/React.createElement("path", {
476
- d: "M3.515 9.515c4.686 -4.687 12.284 -4.687 17 0"
477
- }))), /*#__PURE__*/React.createElement(ScreenReader, {
478
- text: isMockOffline ? 'Restore offline mock' : 'Mock offline behavior'
479
- }))))), /*#__PURE__*/React.createElement("div", {
480
- style: {
481
- overflowY: 'auto',
482
- flex: '1'
483
- }
484
- }, queries.map(query => {
485
- return /*#__PURE__*/React.createElement(QueryRow, {
486
- queryKey: query.queryKey,
487
- activeQueryHash: activeQueryHash,
488
- setActiveQueryHash: setActiveQueryHash,
489
- key: query.queryHash,
490
- queryCache: queryCache
491
- });
492
- }))), activeQueryHash && isOpen ? /*#__PURE__*/React.createElement(ActiveQuery, {
493
- activeQueryHash: activeQueryHash,
494
- queryCache: queryCache,
495
- queryClient: client
496
- }) : null, showCloseButton ? /*#__PURE__*/React.createElement(Button, _extends({
497
- type: "button",
498
- "aria-controls": "ReactQueryDevtoolsPanel",
499
- "aria-haspopup": "true",
500
- "aria-expanded": "true"
501
- }, otherCloseButtonProps, {
502
- style: {
503
- position: 'absolute',
504
- zIndex: 99999,
505
- margin: '.5em',
506
- bottom: 0,
507
- left: 0,
508
- ...otherCloseButtonProps.style
509
- },
510
- onClick: e => {
511
- setIsOpen(false);
512
- onCloseClick?.(e);
513
- }
514
- }), "Close") : null));
515
- });
516
- const ActiveQuery = ({
517
- queryCache,
518
- activeQueryHash,
519
- queryClient
520
- }) => {
521
- const activeQuery = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().find(query => query.queryHash === activeQueryHash));
522
- const activeQueryState = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().find(query => query.queryHash === activeQueryHash)?.state);
523
- const isStale = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().find(query => query.queryHash === activeQueryHash)?.isStale()) ?? false;
524
- const observerCount = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().find(query => query.queryHash === activeQueryHash)?.getObserversCount()) ?? 0;
525
- const handleRefetch = () => {
526
- const promise = activeQuery?.fetch();
527
- promise?.catch(noop);
528
- };
529
- if (!activeQuery || !activeQueryState) {
530
- return null;
531
- }
532
- return /*#__PURE__*/React.createElement(ActiveQueryPanel, null, /*#__PURE__*/React.createElement("div", {
533
- style: {
534
- padding: '.5em',
535
- background: defaultTheme.backgroundAlt,
536
- position: 'sticky',
537
- top: 0,
538
- zIndex: 1
539
- }
540
- }, "Query Details"), /*#__PURE__*/React.createElement("div", {
541
- style: {
542
- padding: '.5em'
543
- }
544
- }, /*#__PURE__*/React.createElement("div", {
545
- style: {
546
- marginBottom: '.5em',
547
- display: 'flex',
548
- alignItems: 'flex-start',
549
- justifyContent: 'space-between'
550
- }
551
- }, /*#__PURE__*/React.createElement(Code, {
552
- style: {
553
- lineHeight: '1.8em'
554
- }
555
- }, /*#__PURE__*/React.createElement("pre", {
556
- style: {
557
- margin: 0,
558
- padding: 0,
559
- overflow: 'auto'
560
- }
561
- }, displayValue(activeQuery.queryKey, true))), /*#__PURE__*/React.createElement("span", {
562
- style: {
563
- padding: '0.3em .6em',
564
- borderRadius: '0.4em',
565
- fontWeight: 'bold',
566
- textShadow: '0 2px 10px black',
567
- background: getQueryStatusColor({
568
- queryState: activeQueryState,
569
- isStale: isStale,
570
- observerCount: observerCount,
571
- theme: defaultTheme
572
- }),
573
- flexShrink: 0
574
- }
575
- }, getQueryStatusLabel(activeQuery))), /*#__PURE__*/React.createElement("div", {
576
- style: {
577
- marginBottom: '.5em',
578
- display: 'flex',
579
- alignItems: 'center',
580
- justifyContent: 'space-between'
581
- }
582
- }, "Observers: ", /*#__PURE__*/React.createElement(Code, null, observerCount)), /*#__PURE__*/React.createElement("div", {
583
- style: {
584
- display: 'flex',
585
- alignItems: 'center',
586
- justifyContent: 'space-between'
587
- }
588
- }, "Last Updated:", ' ', /*#__PURE__*/React.createElement(Code, null, new Date(activeQueryState.dataUpdatedAt).toLocaleTimeString()))), /*#__PURE__*/React.createElement("div", {
589
- style: {
590
- background: defaultTheme.backgroundAlt,
591
- padding: '.5em',
592
- position: 'sticky',
593
- top: 0,
594
- zIndex: 1
595
- }
596
- }, "Actions"), /*#__PURE__*/React.createElement("div", {
597
- style: {
598
- padding: '0.5em'
599
- }
600
- }, /*#__PURE__*/React.createElement(Button, {
601
- type: "button",
602
- onClick: handleRefetch,
603
- disabled: activeQueryState.fetchStatus === 'fetching',
604
- style: {
605
- background: defaultTheme.active
606
- }
607
- }, "Refetch"), ' ', /*#__PURE__*/React.createElement(Button, {
608
- type: "button",
609
- onClick: () => queryClient.invalidateQueries(activeQuery),
610
- style: {
611
- background: defaultTheme.warning,
612
- color: defaultTheme.inputTextColor
613
- }
614
- }, "Invalidate"), ' ', /*#__PURE__*/React.createElement(Button, {
615
- type: "button",
616
- onClick: () => queryClient.resetQueries(activeQuery),
617
- style: {
618
- background: defaultTheme.gray
619
- }
620
- }, "Reset"), ' ', /*#__PURE__*/React.createElement(Button, {
621
- type: "button",
622
- onClick: () => queryClient.removeQueries(activeQuery),
623
- style: {
624
- background: defaultTheme.danger
625
- }
626
- }, "Remove")), /*#__PURE__*/React.createElement("div", {
627
- style: {
628
- background: defaultTheme.backgroundAlt,
629
- padding: '.5em',
630
- position: 'sticky',
631
- top: 0,
632
- zIndex: 1
633
- }
634
- }, "Data Explorer"), /*#__PURE__*/React.createElement("div", {
635
- style: {
636
- padding: '.5em'
637
- }
638
- }, /*#__PURE__*/React.createElement(Explorer, {
639
- label: "Data",
640
- value: activeQueryState.data,
641
- defaultExpanded: {},
642
- copyable: true
643
- })), /*#__PURE__*/React.createElement("div", {
644
- style: {
645
- background: defaultTheme.backgroundAlt,
646
- padding: '.5em',
647
- position: 'sticky',
648
- top: 0,
649
- zIndex: 1
650
- }
651
- }, "Query Explorer"), /*#__PURE__*/React.createElement("div", {
652
- style: {
653
- padding: '.5em'
654
- }
655
- }, /*#__PURE__*/React.createElement(Explorer, {
656
- label: "Query",
657
- value: activeQuery,
658
- defaultExpanded: {
659
- queryKey: true
660
- }
661
- })));
662
- };
663
- const QueryStatusCount = ({
664
- queryCache
665
- }) => {
666
- const hasFresh = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().filter(q => getQueryStatusLabel(q) === 'fresh').length);
667
- const hasFetching = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().filter(q => getQueryStatusLabel(q) === 'fetching').length);
668
- const hasPaused = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().filter(q => getQueryStatusLabel(q) === 'paused').length);
669
- const hasStale = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().filter(q => getQueryStatusLabel(q) === 'stale').length);
670
- const hasInactive = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().filter(q => getQueryStatusLabel(q) === 'inactive').length);
671
- return /*#__PURE__*/React.createElement(QueryKeys, null, /*#__PURE__*/React.createElement(QueryKey, {
672
- style: {
673
- background: defaultTheme.success,
674
- opacity: hasFresh ? 1 : 0.3
675
- }
676
- }, "fresh ", /*#__PURE__*/React.createElement(Code, null, "(", hasFresh, ")")), ' ', /*#__PURE__*/React.createElement(QueryKey, {
677
- style: {
678
- background: defaultTheme.active,
679
- opacity: hasFetching ? 1 : 0.3
680
- }
681
- }, "fetching ", /*#__PURE__*/React.createElement(Code, null, "(", hasFetching, ")")), ' ', /*#__PURE__*/React.createElement(QueryKey, {
682
- style: {
683
- background: defaultTheme.paused,
684
- opacity: hasPaused ? 1 : 0.3
685
- }
686
- }, "paused ", /*#__PURE__*/React.createElement(Code, null, "(", hasPaused, ")")), ' ', /*#__PURE__*/React.createElement(QueryKey, {
687
- style: {
688
- background: defaultTheme.warning,
689
- color: 'black',
690
- textShadow: '0',
691
- opacity: hasStale ? 1 : 0.3
692
- }
693
- }, "stale ", /*#__PURE__*/React.createElement(Code, null, "(", hasStale, ")")), ' ', /*#__PURE__*/React.createElement(QueryKey, {
694
- style: {
695
- background: defaultTheme.gray,
696
- opacity: hasInactive ? 1 : 0.3
697
- }
698
- }, "inactive ", /*#__PURE__*/React.createElement(Code, null, "(", hasInactive, ")")));
699
- };
700
- const QueryRow = /*#__PURE__*/React.memo(({
701
- queryKey,
702
- setActiveQueryHash,
703
- activeQueryHash,
704
- queryCache
705
- }) => {
706
- const queryHash = useSubscribeToQueryCache(queryCache, () => queryCache.find({
707
- queryKey
708
- })?.queryHash) ?? '';
709
- const queryState = useSubscribeToQueryCache(queryCache, () => queryCache.find({
710
- queryKey
711
- })?.state);
712
- const isStale = useSubscribeToQueryCache(queryCache, () => queryCache.find({
713
- queryKey
714
- })?.isStale()) ?? false;
715
- const isDisabled = useSubscribeToQueryCache(queryCache, () => queryCache.find({
716
- queryKey
717
- })?.isDisabled()) ?? false;
718
- const observerCount = useSubscribeToQueryCache(queryCache, () => queryCache.find({
719
- queryKey
720
- })?.getObserversCount()) ?? 0;
721
- if (!queryState) {
722
- return null;
723
- }
724
- return /*#__PURE__*/React.createElement("div", {
725
- role: "button",
726
- "aria-label": `Open query details for ${queryHash}`,
727
- onClick: () => setActiveQueryHash(activeQueryHash === queryHash ? '' : queryHash),
728
- style: {
729
- display: 'flex',
730
- borderBottom: `solid 1px ${defaultTheme.grayAlt}`,
731
- cursor: 'pointer',
732
- background: queryHash === activeQueryHash ? 'rgba(255,255,255,.1)' : undefined
733
- }
734
- }, /*#__PURE__*/React.createElement("div", {
735
- style: {
736
- flex: '0 0 auto',
737
- width: '2em',
738
- height: '2em',
739
- background: getQueryStatusColor({
740
- queryState,
741
- isStale,
742
- observerCount,
743
- theme: defaultTheme
744
- }),
745
- display: 'flex',
746
- alignItems: 'center',
747
- justifyContent: 'center',
748
- fontWeight: 'bold',
749
- textShadow: isStale ? '0' : '0 0 10px black',
750
- color: isStale ? 'black' : 'white'
751
- }
752
- }, observerCount), isDisabled ? /*#__PURE__*/React.createElement("div", {
753
- style: {
754
- flex: '0 0 auto',
755
- height: '2em',
756
- background: defaultTheme.gray,
757
- display: 'flex',
758
- alignItems: 'center',
759
- fontWeight: 'bold',
760
- padding: '0 0.5em'
761
- }
762
- }, "disabled") : null, /*#__PURE__*/React.createElement(Code, {
763
- style: {
764
- padding: '.5em'
765
- }
766
- }, `${queryHash}`));
767
- });
768
-
769
- // eslint-disable-next-line @typescript-eslint/no-empty-function
770
- function noop() {}
771
-
772
- export { ReactQueryDevtools, ReactQueryDevtoolsPanel };
773
- //# sourceMappingURL=devtools.mjs.map