Skip to content

Commit a35767e

Browse files
author
devgioele
committed
do not save next router query in a state and pass isReady
1 parent 52d78f0 commit a35767e

2 files changed

Lines changed: 32 additions & 19 deletions

File tree

src/engine/query.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ export type Router = {
3434
setQuery: (query: Partial<Query>, defaultQuery: Query) => void
3535
}
3636

37+
export type RouterSSR = Router & {
38+
isReady: boolean
39+
}
40+
3741
export const useQuery = <T extends Query>(router: Router, defaultQuery: T) => {
3842
const resetQuery = useCallback(() => {
3943
router.setQuery(defaultQuery, defaultQuery)

src/routers/nextRouter.ts

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { useRouter } from 'next/router'
2-
import { useEffect, useMemo, useState } from 'react'
2+
import { useMemo } from 'react'
33
import {
44
Query,
55
ParseQuery,
66
useAbstractQuery,
7-
Router,
87
AbstractQuery,
98
AbstractQueryOptions,
9+
RouterSSR,
1010
} from '../engine/query'
1111
import {
1212
PaginationQuery,
@@ -20,35 +20,26 @@ const DEFAULT_NEXT_ROUTER_OPTIONS: RouterWithHistoryOptions = {
2020

2121
const useNextRouter = (
2222
options: undefined | Partial<RouterWithHistoryOptions>,
23-
): Router => {
23+
): RouterSSR => {
2424
const nextRouter = useRouter()
25-
const [nextRouterQuery, setNextRouterQuery] = useState<
26-
typeof nextRouter.query
27-
>(nextRouter.isReady ? nextRouter.query : {})
2825

2926
const mergedOptions = useMemo(
3027
() => ({ ...DEFAULT_NEXT_ROUTER_OPTIONS, ...options }),
3128
[options],
3229
)
3330

34-
useEffect(() => {
35-
if (nextRouter.isReady) {
36-
setNextRouterQuery(nextRouter.query)
37-
}
38-
}, [nextRouter.isReady, nextRouter.query])
39-
4031
return {
4132
getQuery: (defaultQuery) => {
4233
const query: Query = {}
43-
for (const [key, value] of Object.entries(nextRouterQuery)) {
34+
for (const [key, value] of Object.entries(nextRouter.query)) {
4435
if (value !== undefined) {
4536
query[key] = value
4637
}
4738
}
4839
return { ...defaultQuery, ...query }
4940
},
5041
setQuery: (query, defaultQuery) => {
51-
const newQuery = { ...nextRouterQuery, ...query }
42+
const newQuery = { ...nextRouter.query, ...query }
5243
const newQueryWithoutDefaults = Object.fromEntries(
5344
Object.entries(newQuery).filter(
5445
([key, value]) => value !== defaultQuery[key],
@@ -64,6 +55,7 @@ const useNextRouter = (
6455
})
6556
}
6657
},
58+
isReady: nextRouter.isReady,
6759
}
6860
}
6961

@@ -73,7 +65,8 @@ export const useQuery = <TQuery extends AbstractQuery>(
7365
options?: Partial<AbstractQueryOptions & RouterWithHistoryOptions>,
7466
) => {
7567
const router = useNextRouter(options)
76-
return useAbstractQuery(router, parseQuery, defaultQuery, options)
68+
const result = useAbstractQuery(router, parseQuery, defaultQuery, options)
69+
return { ...result, isReady: router.isReady }
7770
}
7871

7972
export const useQueryAndPagination = <TQuery extends AbstractQuery>(
@@ -83,20 +76,36 @@ export const useQueryAndPagination = <TQuery extends AbstractQuery>(
8376
options?: Partial<AbstractQueryOptions & RouterWithHistoryOptions>,
8477
) => {
8578
const router = useNextRouter(options)
86-
return useAbstractQueryAndPagination(
79+
const result = useAbstractQueryAndPagination(
8780
router,
8881
parseQuery,
8982
defaultQuery,
9083
defaultPagination,
9184
options,
9285
)
86+
return { ...result, isReady: router.isReady }
9387
}
9488

9589
export const usePagination = (
9690
defaultPagination?: Partial<PaginationQuery>,
9791
options?: Partial<AbstractQueryOptions & RouterWithHistoryOptions>,
9892
) => {
99-
const { page, size, setPage, setSize, setPagination, resetPagination } =
100-
useQueryAndPagination(() => ({}), {}, defaultPagination, options)
101-
return { page, size, setPage, setSize, setPagination, resetPagination }
93+
const {
94+
page,
95+
size,
96+
setPage,
97+
setSize,
98+
setPagination,
99+
resetPagination,
100+
isReady,
101+
} = useQueryAndPagination(() => ({}), {}, defaultPagination, options)
102+
return {
103+
page,
104+
size,
105+
setPage,
106+
setSize,
107+
setPagination,
108+
resetPagination,
109+
isReady,
110+
}
102111
}

0 commit comments

Comments
 (0)