Skip to content

Commit 4e0d4b4

Browse files
author
devgioele
authored
Merge pull request #19 from aboutbits/reference-stable-hooks
Make all return values reference stable
2 parents c31c989 + 9d83f34 commit 4e0d4b4

4 files changed

Lines changed: 103 additions & 37 deletions

File tree

src/engine/pagination.ts

Lines changed: 49 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useCallback, useMemo } from 'react'
12
import { queryValueToIntOrUndefined } from '../utils'
23
import {
34
Query,
@@ -56,14 +57,21 @@ export const useAbstractQueryAndPagination = <
5657
defaultPagination?: Partial<PaginationQuery>,
5758
options?: Partial<AbstractQueryOptions>,
5859
) => {
59-
const mergedDefaultPagination = {
60-
...DEFAULT_PAGINATION,
61-
...defaultPagination,
62-
}
63-
const mergedDefaultQueryAndPagination = {
64-
...defaultQuery,
65-
...mergedDefaultPagination,
66-
}
60+
const mergedDefaultPagination = useMemo(
61+
() => ({
62+
...DEFAULT_PAGINATION,
63+
...defaultPagination,
64+
}),
65+
[defaultPagination],
66+
)
67+
68+
const mergedDefaultQueryAndPagination = useMemo(
69+
() => ({
70+
...defaultQuery,
71+
...mergedDefaultPagination,
72+
}),
73+
[defaultQuery, mergedDefaultPagination],
74+
)
6775

6876
const { query, setQuery } = useAbstractQuery(
6977
router,
@@ -83,12 +91,8 @@ export const useAbstractQueryAndPagination = <
8391
options,
8492
)
8593

86-
return {
87-
query,
88-
setQuery: (
89-
query: Partial<TQuery>,
90-
options?: Partial<ChangeQueryOptions>,
91-
) => {
94+
const setQueryWithoutPagination = useCallback(
95+
(query: Partial<TQuery>, options?: Partial<ChangeQueryOptions>) => {
9296
const mergedOptions = { ...DEFAULT_CHANGE_QUERY_OPTIONS, ...options }
9397
setQuery({
9498
...query,
@@ -97,7 +101,11 @@ export const useAbstractQueryAndPagination = <
97101
: undefined,
98102
})
99103
},
100-
resetQuery: (options?: Partial<ChangeQueryOptions>) => {
104+
[setQuery, mergedDefaultPagination.page],
105+
)
106+
107+
const resetQuery = useCallback(
108+
(options?: Partial<ChangeQueryOptions>) => {
101109
const mergedOptions = { ...DEFAULT_CHANGE_QUERY_OPTIONS, ...options }
102110
setQuery({
103111
...defaultQuery,
@@ -106,18 +114,37 @@ export const useAbstractQueryAndPagination = <
106114
: undefined,
107115
})
108116
},
109-
page: pagination.page,
110-
size: pagination.size,
111-
setPage: (page: PaginationQuery['page']) => {
117+
[defaultQuery, mergedDefaultPagination.page, setQuery],
118+
)
119+
120+
const setPage = useCallback(
121+
(page: PaginationQuery['page']) => {
112122
setPagination({ page })
113123
},
114-
setSize: (size: PaginationQuery['size']) => {
124+
[setPagination],
125+
)
126+
127+
const setSize = useCallback(
128+
(size: PaginationQuery['size']) => {
115129
setPagination({ size })
116130
},
131+
[setPagination],
132+
)
133+
134+
const resetQueryAndPagination = useCallback(() => {
135+
setQuery(mergedDefaultQueryAndPagination)
136+
}, [setQuery, mergedDefaultQueryAndPagination])
137+
138+
return {
139+
query,
140+
setQuery: setQueryWithoutPagination,
141+
resetQuery,
142+
page: pagination.page,
143+
size: pagination.size,
144+
setPage,
145+
setSize,
117146
setPagination,
118147
resetPagination,
119-
resetQueryAndPagination: () => {
120-
setQuery(mergedDefaultQueryAndPagination)
121-
},
148+
resetQueryAndPagination,
122149
}
123150
}

src/routers/inMemory.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useState } from 'react'
1+
import { useCallback, useMemo, useState } from 'react'
22
import {
33
AbstractQuery,
44
AbstractQueryOptions,
@@ -13,11 +13,15 @@ import {
1313
const useInMemoryRouter = (): Router => {
1414
const [inMemoryQuery, setInMemoryQuery] = useState<Query>({})
1515

16-
return {
17-
getQuery: (defaultQuery) => {
16+
const getQuery = useCallback(
17+
(defaultQuery: Query) => {
1818
return { ...defaultQuery, ...inMemoryQuery }
1919
},
20-
setQuery: (query) => {
20+
[inMemoryQuery],
21+
)
22+
23+
const setQuery = useCallback(
24+
(query: Partial<Query>) => {
2125
const sanitizedQuery: Query = {}
2226
for (const [key, value] of Object.entries(query)) {
2327
if (value !== undefined) {
@@ -26,7 +30,16 @@ const useInMemoryRouter = (): Router => {
2630
}
2731
setInMemoryQuery({ ...inMemoryQuery, ...sanitizedQuery })
2832
},
29-
}
33+
[inMemoryQuery],
34+
)
35+
36+
return useMemo(
37+
() => ({
38+
getQuery,
39+
setQuery,
40+
}),
41+
[getQuery, setQuery],
42+
)
3043
}
3144

3245
export const useQuery = <

src/routers/nextRouter.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useRouter } from 'next/router'
2-
import { useMemo } from 'react'
2+
import { useCallback, useMemo } from 'react'
33
import {
44
Query,
55
ParseQuery,
@@ -28,8 +28,8 @@ const useNextRouter = (
2828
[options],
2929
)
3030

31-
return {
32-
getQuery: (defaultQuery) => {
31+
const getQuery = useCallback(
32+
(defaultQuery: Query) => {
3333
const query: Query = {}
3434
for (const [key, value] of Object.entries(nextRouter.query)) {
3535
if (value !== undefined) {
@@ -38,7 +38,11 @@ const useNextRouter = (
3838
}
3939
return { ...defaultQuery, ...query }
4040
},
41-
setQuery: (query, defaultQuery) => {
41+
[nextRouter.query],
42+
)
43+
44+
const setQuery = useCallback(
45+
(query: Partial<Query>, defaultQuery: Query) => {
4246
const newQuery = { ...nextRouter.query, ...query }
4347
const newQueryWithoutDefaults = Object.fromEntries(
4448
Object.entries(newQuery).filter(
@@ -55,7 +59,16 @@ const useNextRouter = (
5559
})
5660
}
5761
},
58-
}
62+
[nextRouter, mergedOptions],
63+
)
64+
65+
return useMemo(
66+
() => ({
67+
getQuery,
68+
setQuery,
69+
}),
70+
[getQuery, setQuery],
71+
)
5972
}
6073

6174
export const useQuery = <

src/routers/reactRouter.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useLocation, useNavigate } from 'react-router-dom'
2-
import { useMemo } from 'react'
2+
import { useCallback, useMemo } from 'react'
33
import {
44
Query,
55
AbstractQuery,
@@ -27,8 +27,8 @@ const useReactRouter = (
2727
[options],
2828
)
2929

30-
return {
31-
getQuery: (defaultQuery) => {
30+
const getQuery = useCallback(
31+
(defaultQuery: Query) => {
3232
const query: Query = {}
3333
for (const [key, value] of new URLSearchParams(search).entries()) {
3434
const decodedValues = value
@@ -41,7 +41,11 @@ const useReactRouter = (
4141
}
4242
return { ...defaultQuery, ...query }
4343
},
44-
setQuery: (query, defaultQuery) => {
44+
[search],
45+
)
46+
47+
const setQuery = useCallback(
48+
(query: Partial<Query>, defaultQuery: Query) => {
4549
const urlSearchParams = new URLSearchParams(search)
4650
for (const [key, value] of Object.entries(query)) {
4751
if (value === defaultQuery[key]) {
@@ -64,7 +68,16 @@ const useReactRouter = (
6468
{ replace: mergedOptions.setQueryMethod === 'replace' },
6569
)
6670
},
67-
}
71+
[mergedOptions.setQueryMethod, navigate, pathname, search],
72+
)
73+
74+
return useMemo(
75+
() => ({
76+
getQuery,
77+
setQuery,
78+
}),
79+
[getQuery, setQuery],
80+
)
6881
}
6982

7083
export const useQuery = <

0 commit comments

Comments
 (0)