Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 49 additions & 22 deletions src/engine/pagination.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { useCallback, useMemo } from 'react'
import { queryValueToIntOrUndefined } from '../utils'
import {
Query,
Expand Down Expand Up @@ -56,14 +57,21 @@ export const useAbstractQueryAndPagination = <
defaultPagination?: Partial<PaginationQuery>,
options?: Partial<AbstractQueryOptions>,
) => {
const mergedDefaultPagination = {
...DEFAULT_PAGINATION,
...defaultPagination,
}
const mergedDefaultQueryAndPagination = {
...defaultQuery,
...mergedDefaultPagination,
}
const mergedDefaultPagination = useMemo(
() => ({
...DEFAULT_PAGINATION,
...defaultPagination,
}),
[defaultPagination],
)

const mergedDefaultQueryAndPagination = useMemo(
() => ({
...defaultQuery,
...mergedDefaultPagination,
}),
[defaultQuery, mergedDefaultPagination],
)

const { query, setQuery } = useAbstractQuery(
router,
Expand All @@ -83,12 +91,8 @@ export const useAbstractQueryAndPagination = <
options,
)

return {
query,
setQuery: (
query: Partial<TQuery>,
options?: Partial<ChangeQueryOptions>,
) => {
const setQueryWithoutPagination = useCallback(
(query: Partial<TQuery>, options?: Partial<ChangeQueryOptions>) => {
const mergedOptions = { ...DEFAULT_CHANGE_QUERY_OPTIONS, ...options }
setQuery({
...query,
Expand All @@ -97,7 +101,11 @@ export const useAbstractQueryAndPagination = <
: undefined,
})
},
resetQuery: (options?: Partial<ChangeQueryOptions>) => {
[setQuery, mergedDefaultPagination.page],
)

const resetQuery = useCallback(
(options?: Partial<ChangeQueryOptions>) => {
const mergedOptions = { ...DEFAULT_CHANGE_QUERY_OPTIONS, ...options }
setQuery({
...defaultQuery,
Expand All @@ -106,18 +114,37 @@ export const useAbstractQueryAndPagination = <
: undefined,
})
},
page: pagination.page,
size: pagination.size,
setPage: (page: PaginationQuery['page']) => {
[defaultQuery, mergedDefaultPagination.page, setQuery],
)

const setPage = useCallback(
(page: PaginationQuery['page']) => {
setPagination({ page })
},
setSize: (size: PaginationQuery['size']) => {
[setPagination],
)

const setSize = useCallback(
(size: PaginationQuery['size']) => {
setPagination({ size })
},
[setPagination],
)

const resetQueryAndPagination = useCallback(() => {
setQuery(mergedDefaultQueryAndPagination)
}, [setQuery, mergedDefaultQueryAndPagination])

return {
query,
setQuery: setQueryWithoutPagination,
resetQuery,
page: pagination.page,
size: pagination.size,
setPage,
setSize,
setPagination,
resetPagination,
resetQueryAndPagination: () => {
setQuery(mergedDefaultQueryAndPagination)
},
resetQueryAndPagination,
}
}
23 changes: 18 additions & 5 deletions src/routers/inMemory.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useState } from 'react'
import { useCallback, useMemo, useState } from 'react'
import {
AbstractQuery,
AbstractQueryOptions,
Expand All @@ -13,11 +13,15 @@ import {
const useInMemoryRouter = (): Router => {
const [inMemoryQuery, setInMemoryQuery] = useState<Query>({})

return {
getQuery: (defaultQuery) => {
const getQuery = useCallback(
(defaultQuery: Query) => {
return { ...defaultQuery, ...inMemoryQuery }
},
setQuery: (query) => {
[inMemoryQuery],
)

const setQuery = useCallback(
(query: Partial<Query>) => {
const sanitizedQuery: Query = {}
for (const [key, value] of Object.entries(query)) {
if (value !== undefined) {
Expand All @@ -26,7 +30,16 @@ const useInMemoryRouter = (): Router => {
}
setInMemoryQuery({ ...inMemoryQuery, ...sanitizedQuery })
},
}
[inMemoryQuery],
)

return useMemo(
() => ({
getQuery,
setQuery,
}),
[getQuery, setQuery],
)
}

export const useQuery = <
Expand Down
23 changes: 18 additions & 5 deletions src/routers/nextRouter.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useRouter } from 'next/router'
import { useMemo } from 'react'
import { useCallback, useMemo } from 'react'
import {
Query,
ParseQuery,
Expand Down Expand Up @@ -28,8 +28,8 @@ const useNextRouter = (
[options],
)

return {
getQuery: (defaultQuery) => {
const getQuery = useCallback(
(defaultQuery: Query) => {
const query: Query = {}
for (const [key, value] of Object.entries(nextRouter.query)) {
if (value !== undefined) {
Expand All @@ -38,7 +38,11 @@ const useNextRouter = (
}
return { ...defaultQuery, ...query }
},
setQuery: (query, defaultQuery) => {
[nextRouter.query],
)

const setQuery = useCallback(
(query: Partial<Query>, defaultQuery: Query) => {
const newQuery = { ...nextRouter.query, ...query }
const newQueryWithoutDefaults = Object.fromEntries(
Object.entries(newQuery).filter(
Expand All @@ -55,7 +59,16 @@ const useNextRouter = (
})
}
},
}
[nextRouter, mergedOptions],
)

return useMemo(
() => ({
getQuery,
setQuery,
}),
[getQuery, setQuery],
)
}

export const useQuery = <
Expand Down
23 changes: 18 additions & 5 deletions src/routers/reactRouter.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useLocation, useNavigate } from 'react-router-dom'
import { useMemo } from 'react'
import { useCallback, useMemo } from 'react'
import {
Query,
AbstractQuery,
Expand Down Expand Up @@ -27,8 +27,8 @@ const useReactRouter = (
[options],
)

return {
getQuery: (defaultQuery) => {
const getQuery = useCallback(
(defaultQuery: Query) => {
const query: Query = {}
for (const [key, value] of new URLSearchParams(search).entries()) {
const decodedValues = value
Expand All @@ -41,7 +41,11 @@ const useReactRouter = (
}
return { ...defaultQuery, ...query }
},
setQuery: (query, defaultQuery) => {
[search],
)

const setQuery = useCallback(
(query: Partial<Query>, defaultQuery: Query) => {
const urlSearchParams = new URLSearchParams(search)
for (const [key, value] of Object.entries(query)) {
if (value === defaultQuery[key]) {
Expand All @@ -64,7 +68,16 @@ const useReactRouter = (
{ replace: mergedOptions.setQueryMethod === 'replace' },
)
},
}
[mergedOptions.setQueryMethod, navigate, pathname, search],
)

return useMemo(
() => ({
getQuery,
setQuery,
}),
[getQuery, setQuery],
)
}

export const useQuery = <
Expand Down