Skip to content

Commit 066da0e

Browse files
authored
Fix memoizing of return values (#25)
1 parent 0011036 commit 066da0e

4 files changed

Lines changed: 55 additions & 32 deletions

File tree

src/engine/pagination.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export const useAbstractQueryAndPagination = <
5252
TDefaultQuery extends Partial<TQuery>,
5353
>(
5454
router: Router,
55-
parseQuery: ParseQuery<TQuery>,
55+
parseQuery: ParseQuery<TQuery> = () => ({}),
5656
defaultQuery: TDefaultQuery = {} as TDefaultQuery,
5757
defaultPagination?: Partial<PaginationQuery>,
5858
options?: Partial<AbstractQueryOptions>,

src/routers/inMemory.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,14 @@ export const usePagination = (
7777
defaultPagination?: Partial<PaginationQuery>,
7878
options?: Partial<AbstractQueryOptions>,
7979
) => {
80+
const router = useInMemoryRouter()
8081
const { page, size, setPage, setSize, setPagination, resetPagination } =
81-
useQueryAndPagination(() => ({}), {}, defaultPagination, options)
82+
useAbstractQueryAndPagination(
83+
router,
84+
undefined,
85+
undefined,
86+
defaultPagination,
87+
options,
88+
)
8289
return { page, size, setPage, setSize, setPagination, resetPagination }
8390
}

src/routers/nextRouter.ts

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useRouter } from 'next/router'
2-
import { useCallback, useMemo } from 'react'
2+
import { useCallback, useMemo, useRef } from 'react'
33
import {
44
Query,
55
ParseQuery,
@@ -23,43 +23,52 @@ const useNextRouter = (
2323
): Router => {
2424
const nextRouter = useRouter()
2525

26+
// Make sure Next router has a stable reference to use in callbacks
27+
const routerRef = useRef(nextRouter)
28+
routerRef.current = nextRouter
29+
2630
const mergedOptions = useMemo(
2731
() => ({ ...DEFAULT_NEXT_ROUTER_OPTIONS, ...options }),
2832
[options],
2933
)
3034

31-
const getQuery = useCallback(
32-
(defaultQuery: Query) => {
33-
const query: Query = {}
34-
for (const [key, value] of Object.entries(nextRouter.query)) {
35-
if (value !== undefined) {
36-
query[key] = value
37-
}
35+
const getQuery = useCallback((defaultQuery: Query) => {
36+
const query: Query = {}
37+
for (const [key, value] of Object.entries(routerRef.current.query)) {
38+
if (value !== undefined) {
39+
query[key] = value
3840
}
39-
return { ...defaultQuery, ...query }
40-
},
41-
[nextRouter.query],
42-
)
41+
}
42+
return { ...defaultQuery, ...query }
43+
}, [])
4344

4445
const setQuery = useCallback(
4546
(query: Partial<Query>, defaultQuery: Query) => {
46-
const newQuery = { ...nextRouter.query, ...query }
47+
const newQuery = { ...routerRef.current.query, ...query }
4748
const newQueryWithoutDefaults = Object.fromEntries(
4849
Object.entries(newQuery).filter(
4950
([key, value]) => value !== defaultQuery[key],
5051
),
5152
)
5253
if (mergedOptions.setQueryMethod === 'push') {
53-
void nextRouter.push({ query: newQueryWithoutDefaults }, undefined, {
54-
shallow: true,
55-
})
54+
void routerRef.current.push(
55+
{ query: newQueryWithoutDefaults },
56+
undefined,
57+
{
58+
shallow: true,
59+
},
60+
)
5661
} else {
57-
void nextRouter.replace({ query: newQueryWithoutDefaults }, undefined, {
58-
shallow: true,
59-
})
62+
void routerRef.current.replace(
63+
{ query: newQueryWithoutDefaults },
64+
undefined,
65+
{
66+
shallow: true,
67+
},
68+
)
6069
}
6170
},
62-
[nextRouter, mergedOptions],
71+
[mergedOptions],
6372
)
6473

6574
return useMemo(
@@ -106,14 +115,14 @@ export const usePagination = (
106115
defaultPagination?: Partial<PaginationQuery>,
107116
options?: Partial<AbstractQueryOptions & RouterWithHistoryOptions>,
108117
) => {
118+
const router = useNextRouter(options)
109119
const { page, size, setPage, setSize, setPagination, resetPagination } =
110-
useQueryAndPagination(() => ({}), {}, defaultPagination, options)
111-
return {
112-
page,
113-
size,
114-
setPage,
115-
setSize,
116-
setPagination,
117-
resetPagination,
118-
}
120+
useAbstractQueryAndPagination(
121+
router,
122+
undefined,
123+
undefined,
124+
defaultPagination,
125+
options,
126+
)
127+
return { page, size, setPage, setSize, setPagination, resetPagination }
119128
}

src/routers/reactRouter.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,14 @@ export const usePagination = (
119119
defaultPagination?: Partial<PaginationQuery>,
120120
options?: Partial<AbstractQueryOptions & RouterWithHistoryOptions>,
121121
) => {
122+
const router = useReactRouter(options)
122123
const { page, size, setPage, setSize, setPagination, resetPagination } =
123-
useQueryAndPagination(() => ({}), {}, defaultPagination, options)
124+
useAbstractQueryAndPagination(
125+
router,
126+
undefined,
127+
undefined,
128+
defaultPagination,
129+
options,
130+
)
124131
return { page, size, setPage, setSize, setPagination, resetPagination }
125132
}

0 commit comments

Comments
 (0)