Skip to content

Commit 7c4501b

Browse files
committed
fix(devtools): Better panel resizing, scrollbars and styles
1 parent 6eea150 commit 7c4501b

File tree

1 file changed

+102
-57
lines changed

1 file changed

+102
-57
lines changed

src/devtools/devtools.tsx

Lines changed: 102 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,39 @@ export function ReactQueryDevtools({
103103
initialIsOpen
104104
)
105105
const [isResolvedOpen, setIsResolvedOpen] = useSafeState(false)
106+
const [isResizing, setIsResizing] = useSafeState(false)
107+
108+
const handleDragStart = (panelElement, startEvent) => {
109+
if (startEvent.button !== 0) return // Only allow left click for drag
110+
111+
setIsResizing(true)
112+
113+
const dragInfo = {
114+
originalHeight: panelElement.getBoundingClientRect().height,
115+
pageY: startEvent.pageY,
116+
}
117+
118+
const run = moveEvent => {
119+
const delta = dragInfo.pageY - moveEvent.pageY
120+
const newHeight = dragInfo.originalHeight + delta
121+
122+
if (newHeight < 70) {
123+
setIsOpen(false)
124+
} else {
125+
setIsOpen(true)
126+
panelElement.style.height = `${newHeight}px`
127+
}
128+
}
129+
130+
const unsub = () => {
131+
setIsResizing(false)
132+
document.removeEventListener('mousemove', run)
133+
document.removeEventListener('mouseUp', unsub)
134+
}
135+
136+
document.addEventListener('mousemove', run)
137+
document.addEventListener('mouseup', unsub)
138+
}
106139

107140
React.useEffect(() => {
108141
setIsResolvedOpen(isOpen)
@@ -114,6 +147,7 @@ export function ReactQueryDevtools({
114147

115148
const run = () => {
116149
const containerHeight = panelRef.current?.getBoundingClientRect().height
150+
console.log(containerHeight)
117151
rootRef.current.parentElement.style.paddingBottom = `${containerHeight}px`
118152
}
119153

@@ -144,25 +178,43 @@ export function ReactQueryDevtools({
144178

145179
return (
146180
<Container ref={rootRef} className="ReactQueryDevtools">
147-
{isResolvedOpen ? (
148-
<ThemeProvider theme={theme}>
149-
<ReactQueryDevtoolsPanel
150-
ref={panelRef}
151-
{...otherPanelProps}
152-
style={{
153-
position: 'fixed',
154-
bottom: '0',
155-
right: '0',
156-
zIndex: '99999',
157-
width: '100%',
158-
height: '500px',
159-
maxHeight: '90%',
160-
boxShadow: '0 0 20px rgba(0,0,0,.3)',
161-
borderTop: `1px solid ${theme.gray}`,
162-
...panelStyle,
163-
}}
164-
setIsOpen={setIsOpen}
165-
/>
181+
<ThemeProvider theme={theme}>
182+
<ReactQueryDevtoolsPanel
183+
ref={panelRef}
184+
{...otherPanelProps}
185+
style={{
186+
position: 'fixed',
187+
bottom: '0',
188+
right: '0',
189+
zIndex: '99999',
190+
width: '100%',
191+
height: '500px',
192+
maxHeight: '90%',
193+
boxShadow: '0 0 20px rgba(0,0,0,.3)',
194+
borderTop: `1px solid ${theme.gray}`,
195+
transformOrigin: 'top',
196+
...panelStyle,
197+
...(isResizing
198+
? {
199+
transition: `none`,
200+
}
201+
: { transition: `all .2s ease` }),
202+
...(isResolvedOpen
203+
? {
204+
opacity: 1,
205+
pointerEvents: 'all',
206+
transform: `translateY(0) scale(1)`,
207+
}
208+
: {
209+
opacity: 0,
210+
pointerEvents: 'none',
211+
transform: `translateY(15px) scale(1.02)`,
212+
}),
213+
}}
214+
setIsOpen={setIsOpen}
215+
handleDragStart={e => handleDragStart(panelRef.current, e)}
216+
/>
217+
{isResolvedOpen ? (
166218
<Button
167219
{...otherCloseButtonProps}
168220
onClick={() => {
@@ -194,8 +246,9 @@ export function ReactQueryDevtools({
194246
>
195247
Close
196248
</Button>
197-
</ThemeProvider>
198-
) : (
249+
) : null}
250+
</ThemeProvider>
251+
{!isResolvedOpen ? (
199252
<button
200253
{...otherToggleButtonProps}
201254
aria-label="Open React Query Devtools"
@@ -240,7 +293,7 @@ export function ReactQueryDevtools({
240293
>
241294
<Logo aria-hidden />
242295
</button>
243-
)}
296+
) : null}
244297
</Container>
245298
)
246299
}
@@ -264,7 +317,7 @@ export const ReactQueryDevtoolsPanel = React.forwardRef(
264317
props: DevtoolsPanelOptions,
265318
ref
266319
): React.ReactElement {
267-
const { setIsOpen, ...panelProps } = props
320+
const { setIsOpen, handleDragStart, ...panelProps } = props
268321

269322
const queryClient = useQueryClient()
270323
const queryCache = queryClient.getQueryCache()
@@ -281,8 +334,6 @@ export const ReactQueryDevtoolsPanel = React.forwardRef(
281334
false
282335
)
283336

284-
const [isDragging, setIsDragging] = useSafeState(false)
285-
286337
const sortFn = React.useMemo(() => sortFns[sort], [sort])
287338

288339
React[isServer ? 'useEffect' : 'useLayoutEffect'](() => {
@@ -291,36 +342,6 @@ export const ReactQueryDevtoolsPanel = React.forwardRef(
291342
}
292343
}, [setSort, sortFn])
293344

294-
React[isServer ? 'useEffect' : 'useLayoutEffect'](() => {
295-
if (isDragging) {
296-
const run = e => {
297-
const containerHeight = window.innerHeight - e.pageY
298-
299-
if (containerHeight < 70) {
300-
setIsOpen(false)
301-
} else {
302-
ref.current.style.height = `${containerHeight}px`
303-
}
304-
}
305-
document.addEventListener('mousemove', run)
306-
document.addEventListener('mouseup', handleDragEnd)
307-
308-
return () => {
309-
document.removeEventListener('mousemove', run)
310-
document.removeEventListener('mouseup', handleDragEnd)
311-
}
312-
}
313-
}, [isDragging])
314-
315-
const handleDragStart = e => {
316-
if (e.button !== 0) return // Only allow left click for drag
317-
setIsDragging(true)
318-
}
319-
320-
const handleDragEnd = e => {
321-
setIsDragging(false)
322-
}
323-
324345
const [unsortedQueries, setUnsortedQueries] = useSafeState(
325346
Object.values(queryCache.findAll())
326347
)
@@ -366,6 +387,30 @@ export const ReactQueryDevtoolsPanel = React.forwardRef(
366387
return (
367388
<ThemeProvider theme={theme}>
368389
<Panel ref={ref} className="ReactQueryDevtoolsPanel" {...panelProps}>
390+
<style
391+
dangerouslySetInnerHTML={{
392+
__html: `
393+
.ReactQueryDevtoolsPanel * {
394+
scrollbar-color: ${theme.backgroundAlt} ${theme.gray};
395+
}
396+
397+
.ReactQueryDevtoolsPanel *::-webkit-scrollbar, .ReactQueryDevtoolsPanel scrollbar {
398+
width: 1rem;
399+
height: 1rem;
400+
}
401+
402+
.ReactQueryDevtoolsPanel *::-webkit-scrollbar-track, .ReactQueryDevtoolsPanel scrollbar-track {
403+
background: ${theme.backgroundAlt};
404+
}
405+
406+
.ReactQueryDevtoolsPanel *::-webkit-scrollbar-thumb, .ReactQueryDevtoolsPanel scrollbar-thumb {
407+
background: ${theme.gray};
408+
border-radius: .5rem;
409+
border: 3px solid ${theme.backgroundAlt};
410+
}
411+
`,
412+
}}
413+
/>
369414
<div
370415
style={{
371416
position: 'absolute',
@@ -378,7 +423,6 @@ export const ReactQueryDevtoolsPanel = React.forwardRef(
378423
zIndex: 100000,
379424
}}
380425
onMouseDown={handleDragStart}
381-
onMouseUp={handleDragEnd}
382426
></div>
383427
<div
384428
style={{
@@ -497,7 +541,8 @@ export const ReactQueryDevtoolsPanel = React.forwardRef(
497541
</div>
498542
<div
499543
style={{
500-
overflow: 'auto scroll',
544+
overflowY: 'auto',
545+
flex: '1',
501546
}}
502547
>
503548
{queries.map((query, i) => (

0 commit comments

Comments
 (0)