11import { useRouter } from 'next/router'
2- import { useCallback , useMemo } from 'react'
2+ import { useCallback , useMemo , useRef } from 'react'
33import {
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}
0 commit comments