diff --git a/packages/react-query-devtools/src/__tests__/devtools.test.tsx b/packages/react-query-devtools/src/__tests__/devtools.test.tsx index 3a0d502cc2..d02b4a14c3 100644 --- a/packages/react-query-devtools/src/__tests__/devtools.test.tsx +++ b/packages/react-query-devtools/src/__tests__/devtools.test.tsx @@ -3,6 +3,7 @@ import { fireEvent, screen, waitFor, act } from '@testing-library/react' import { ErrorBoundary } from 'react-error-boundary' import '@testing-library/jest-dom' import { useQuery, QueryClient } from '@tanstack/react-query' +import { sortFns } from '../devtools' import { getByTextContent, renderWithClient, @@ -552,6 +553,104 @@ describe('ReactQueryDevtools', () => { expect(queries[2]?.textContent).toEqual(query3Hash) }) + it('should initialize filtering and sorting values with defaults when they are not stored in localstorage', () => { + localStorage.removeItem('reactQueryDevtoolsSortDesc') + localStorage.removeItem('reactQueryDevtoolsSortFn') + localStorage.removeItem('reactQueryDevtoolsFilter') + + const { queryClient } = createQueryClient() + + function Page() { + const { data = 'default' } = useQuery(['check'], async () => { + await sleep(10) + return 'test' + }) + + return ( +
+

{data}

+
+ ) + } + + renderWithClient(queryClient, , { + initialIsOpen: true, + }) + + const filterInput: HTMLInputElement = + screen.getByLabelText(/Filter by queryhash/i) + expect(filterInput.value).toEqual('') + + const sortCombobox: HTMLSelectElement = + screen.getByLabelText(/Sort queries/i) + expect(sortCombobox.value).toEqual(Object.keys(sortFns)[0]) + + expect(screen.getByRole('button', { name: /Asc/i })).toBeInTheDocument() + + const detailsPanel = screen.queryByText(/Query Details/i) + expect(detailsPanel).not.toBeInTheDocument() + }) + + it('should initialize sorting values with ones stored in localstorage', async () => { + localStorage.setItem('reactQueryDevtoolsSortDesc', 'true') + localStorage.setItem( + 'reactQueryDevtoolsSortFn', + JSON.stringify(Object.keys(sortFns)[1]), + ) + + const { queryClient } = createQueryClient() + + function Page() { + const { data = 'default' } = useQuery(['check'], async () => { + await sleep(10) + return 'test' + }) + + return ( +
+

{data}

+
+ ) + } + + renderWithClient(queryClient, , { + initialIsOpen: true, + }) + + const sortCombobox: HTMLSelectElement = + screen.getByLabelText(/Sort queries/i) + expect(sortCombobox.value).toEqual(Object.keys(sortFns)[1]) + + expect(screen.getByRole('button', { name: /Desc/i })).toBeInTheDocument() + }) + + it('should initialize filter value with one stored in localstorage', () => { + localStorage.setItem('reactQueryDevtoolsFilter', JSON.stringify('posts')) + + const { queryClient } = createQueryClient() + + function Page() { + const { data = 'default' } = useQuery(['check'], async () => { + await sleep(10) + return 'test' + }) + + return ( +
+

{data}

+
+ ) + } + + renderWithClient(queryClient, , { + initialIsOpen: true, + }) + + const filterInput: HTMLInputElement = + screen.getByLabelText(/Filter by queryhash/i) + expect(filterInput.value).toEqual('posts') + }) + it('style should have a nonce', async () => { const { queryClient } = createQueryClient() diff --git a/packages/react-query-devtools/src/devtools.tsx b/packages/react-query-devtools/src/devtools.tsx index 1590c7a87b..623b5c2d89 100644 --- a/packages/react-query-devtools/src/devtools.tsx +++ b/packages/react-query-devtools/src/devtools.tsx @@ -384,7 +384,7 @@ const getStatusRank = (q: Query) => ? 2 : 1 -const sortFns: Record number> = { +export const sortFns: Record number> = { 'Status > Last Updated': (a, b) => getStatusRank(a) === getStatusRank(b) ? (sortFns['Last Updated']?.(a, b) as number) @@ -441,12 +441,6 @@ export const ReactQueryDevtoolsPanel = React.forwardRef< const sortFn = React.useMemo(() => sortFns[sort as string], [sort]) - React[isServer ? 'useEffect' : 'useLayoutEffect'](() => { - if (!sortFn) { - setSort(Object.keys(sortFns)[0] as string) - } - }, [setSort, sortFn]) - const queriesCount = useSubscribeToQueryCache( queryCache, () => queryCache.getAll().length,