@tanstack/react-query-devtools 5.0.0-alpha.4 → 5.0.0-alpha.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) 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.d.ts +11 -75
  6. package/build/lib/devtools.d.ts.map +1 -0
  7. package/build/lib/devtools.esm.js +52 -766
  8. package/build/lib/devtools.esm.js.map +1 -1
  9. package/build/lib/devtools.js +49 -783
  10. package/build/lib/devtools.js.map +1 -1
  11. package/build/lib/devtools.mjs +52 -766
  12. package/build/lib/devtools.mjs.map +1 -1
  13. package/build/lib/index.d.ts +1 -1
  14. package/build/lib/index.d.ts.map +1 -0
  15. package/build/lib/index.esm.js +10 -5
  16. package/build/lib/index.esm.js.map +1 -1
  17. package/build/lib/index.js +8 -4
  18. package/build/lib/index.js.map +1 -1
  19. package/build/lib/index.mjs +10 -5
  20. package/build/lib/index.mjs.map +1 -1
  21. package/build/lib/{index.prod.d.ts → index.prod.d.ts/build/lib/index.d.ts} +1 -1
  22. package/build/lib/index.prod.esm.js +7892 -1302
  23. package/build/lib/index.prod.esm.js.map +1 -1
  24. package/build/lib/index.prod.js +7959 -1389
  25. package/build/lib/index.prod.js.map +1 -1
  26. package/build/lib/index.prod.mjs +7892 -1302
  27. package/build/lib/index.prod.mjs.map +1 -1
  28. package/build/umd/index.development.js +7016 -2089
  29. package/build/umd/index.development.js.map +1 -1
  30. package/build/umd/index.production.js +1 -1
  31. package/build/umd/index.production.js.map +1 -1
  32. package/package.json +10 -9
  33. package/src/__tests__/devtools.test.tsx +1 -860
  34. package/src/devtools.tsx +61 -1164
  35. package/src/index.ts +6 -6
  36. package/build/lib/Explorer.d.ts +0 -50
  37. package/build/lib/Explorer.esm.js +0 -253
  38. package/build/lib/Explorer.esm.js.map +0 -1
  39. package/build/lib/Explorer.js +0 -287
  40. package/build/lib/Explorer.js.map +0 -1
  41. package/build/lib/Explorer.mjs +0 -253
  42. package/build/lib/Explorer.mjs.map +0 -1
  43. package/build/lib/Logo.d.ts +0 -1
  44. package/build/lib/Logo.esm.js +0 -32
  45. package/build/lib/Logo.esm.js.map +0 -1
  46. package/build/lib/Logo.js +0 -55
  47. package/build/lib/Logo.js.map +0 -1
  48. package/build/lib/Logo.mjs +0 -32
  49. package/build/lib/Logo.mjs.map +0 -1
  50. package/build/lib/__tests__/Explorer.test.d.ts +0 -1
  51. package/build/lib/_virtual/_rollupPluginBabelHelpers.esm.js +0 -17
  52. package/build/lib/_virtual/_rollupPluginBabelHelpers.esm.js.map +0 -1
  53. package/build/lib/_virtual/_rollupPluginBabelHelpers.js +0 -19
  54. package/build/lib/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
  55. package/build/lib/_virtual/_rollupPluginBabelHelpers.mjs +0 -17
  56. package/build/lib/_virtual/_rollupPluginBabelHelpers.mjs.map +0 -1
  57. package/build/lib/noop.d.ts +0 -2
  58. package/build/lib/screenreader.d.ts +0 -3
  59. package/build/lib/screenreader.esm.js +0 -17
  60. package/build/lib/screenreader.esm.js.map +0 -1
  61. package/build/lib/screenreader.js +0 -40
  62. package/build/lib/screenreader.js.map +0 -1
  63. package/build/lib/screenreader.mjs +0 -17
  64. package/build/lib/screenreader.mjs.map +0 -1
  65. package/build/lib/styledComponents.d.ts +0 -9
  66. package/build/lib/styledComponents.esm.js +0 -93
  67. package/build/lib/styledComponents.esm.js.map +0 -1
  68. package/build/lib/styledComponents.js +0 -102
  69. package/build/lib/styledComponents.js.map +0 -1
  70. package/build/lib/styledComponents.mjs +0 -93
  71. package/build/lib/styledComponents.mjs.map +0 -1
  72. package/build/lib/theme.d.ts +0 -36
  73. package/build/lib/theme.esm.js +0 -32
  74. package/build/lib/theme.esm.js.map +0 -1
  75. package/build/lib/theme.js +0 -55
  76. package/build/lib/theme.js.map +0 -1
  77. package/build/lib/theme.mjs +0 -32
  78. package/build/lib/theme.mjs.map +0 -1
  79. package/build/lib/useLocalStorage.d.ts +0 -1
  80. package/build/lib/useLocalStorage.esm.js +0 -40
  81. package/build/lib/useLocalStorage.esm.js.map +0 -1
  82. package/build/lib/useLocalStorage.js +0 -63
  83. package/build/lib/useLocalStorage.js.map +0 -1
  84. package/build/lib/useLocalStorage.mjs +0 -40
  85. package/build/lib/useLocalStorage.mjs.map +0 -1
  86. package/build/lib/useMediaQuery.d.ts +0 -1
  87. package/build/lib/useMediaQuery.esm.js +0 -36
  88. package/build/lib/useMediaQuery.esm.js.map +0 -1
  89. package/build/lib/useMediaQuery.js +0 -59
  90. package/build/lib/useMediaQuery.js.map +0 -1
  91. package/build/lib/useMediaQuery.mjs +0 -36
  92. package/build/lib/useMediaQuery.mjs.map +0 -1
  93. package/build/lib/utils.d.ts +0 -79
  94. package/build/lib/utils.esm.js +0 -184
  95. package/build/lib/utils.esm.js.map +0 -1
  96. package/build/lib/utils.js +0 -218
  97. package/build/lib/utils.js.map +0 -1
  98. package/build/lib/utils.mjs +0 -184
  99. package/build/lib/utils.mjs.map +0 -1
  100. package/src/Explorer.tsx +0 -385
  101. package/src/Logo.tsx +0 -32
  102. package/src/__tests__/Explorer.test.tsx +0 -149
  103. package/src/noop.ts +0 -7
  104. package/src/screenreader.tsx +0 -16
  105. package/src/styledComponents.ts +0 -108
  106. package/src/theme.tsx +0 -33
  107. package/src/useLocalStorage.ts +0 -52
  108. package/src/useMediaQuery.ts +0 -34
  109. package/src/utils.ts +0 -319
@@ -1,773 +1,59 @@
1
- import { extends as _extends } from './_virtual/_rollupPluginBabelHelpers.esm.js';
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.esm.js';
6
- import { defaultPanelSize, useIsMounted, getSidedProp, getSidePanelStyle, sortFns, getResizeHandleStyle, displayValue, getQueryStatusColor, getQueryStatusLabel, isVerticalSide, minPanelSize } from './utils.esm.js';
7
- import { Panel, Select, Input, Button, ActiveQueryPanel, Code, QueryKeys, QueryKey } from './styledComponents.esm.js';
8
- import ScreenReader from './screenreader.esm.js';
9
- import { defaultTheme, ThemeProvider } from './theme.esm.js';
10
- import Explorer from './Explorer.esm.js';
11
- import Logo from './Logo.esm.js';
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;
1
+ 'use client';
2
+ import React, { useRef, useState, useEffect } from 'react';
3
+ import { useQueryClient, onlineManager } from '@tanstack/react-query';
4
+ import { TanstackQueryDevtools } from '@tanstack/query-devtools';
5
+
6
+ function ReactQueryDevtools(props) {
7
+ const queryClient = useQueryClient();
8
+ const client = props.client || queryClient;
9
+ const ref = useRef(null);
150
10
  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,
11
+ buttonPosition,
248
12
  position,
249
- closeButtonProps = {},
250
- ...panelProps
13
+ initialIsOpen,
14
+ errorTypes
251
15
  } = 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
16
+ const [devtools] = useState(new TanstackQueryDevtools({
17
+ client: client,
18
+ queryFlavor: 'React Query',
19
+ version: '5',
20
+ onlineManager,
21
+ buttonPosition,
22
+ position,
23
+ initialIsOpen,
24
+ errorTypes
25
+ }));
26
+ useEffect(() => {
27
+ devtools.setClient(client);
28
+ }, [client, devtools]);
29
+ useEffect(() => {
30
+ if (buttonPosition) {
31
+ devtools.setButtonPosition(buttonPosition);
32
+ }
33
+ }, [buttonPosition, devtools]);
34
+ useEffect(() => {
35
+ if (position) {
36
+ devtools.setPosition(position);
37
+ }
38
+ }, [position, devtools]);
39
+ useEffect(() => {
40
+ devtools.setInitialIsOpen(initialIsOpen || false);
41
+ }, [initialIsOpen, devtools]);
42
+ useEffect(() => {
43
+ devtools.setErrorTypes(errorTypes || []);
44
+ }, [errorTypes, devtools]);
45
+ useEffect(() => {
46
+ if (ref.current) {
47
+ devtools.mount(ref.current);
697
48
  }
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
- }
49
+ return () => {
50
+ devtools.unmount();
51
+ };
52
+ }, [devtools]);
724
53
  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() {}
54
+ ref: ref
55
+ });
56
+ }
771
57
 
772
- export { ReactQueryDevtools, ReactQueryDevtoolsPanel };
58
+ export { ReactQueryDevtools };
773
59
  //# sourceMappingURL=devtools.esm.js.map