Skip to content

feat: add usePaginatedQuery hook #10803

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 64 commits into from
Nov 30, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
b4211f3
wip: commit current progress on usePaginatedQuery
Parkreiner Nov 13, 2023
173e823
chore: add cacheTime to users query
Parkreiner Nov 13, 2023
d715d73
chore: update cache logic for UsersPage usersQuery
Parkreiner Nov 13, 2023
8a199b7
wip: commit progress on Pagination
Parkreiner Nov 13, 2023
98ae96d
chore: add function overloads to prepareQuery
Parkreiner Nov 13, 2023
37ea50b
wip: commit progress on usePaginatedQuery
Parkreiner Nov 14, 2023
2c1e9e3
docs: add clarifying comment about implementation
Parkreiner Nov 14, 2023
b3a9ab4
chore: remove optional prefetch property from query options
Parkreiner Nov 15, 2023
39a2ced
chore: redefine queryKey
Parkreiner Nov 15, 2023
4dcfd29
refactor: consolidate how queryKey/queryFn are called
Parkreiner Nov 15, 2023
86f8437
refactor: clean up pagination code more
Parkreiner Nov 15, 2023
f612d8f
fix: remove redundant properties
Parkreiner Nov 15, 2023
5878326
refactor: clean up code
Parkreiner Nov 15, 2023
5cc1c2d
wip: commit progress on usePaginatedQuery
Parkreiner Nov 15, 2023
0138f21
wip: commit current pagination progress
Parkreiner Nov 15, 2023
a38fd30
docs: clean up comments for clarity
Parkreiner Nov 17, 2023
22d6c24
wip: get type signatures compatible (breaks runtime logic slightly)
Parkreiner Nov 20, 2023
e717da1
refactor: clean up type definitions
Parkreiner Nov 20, 2023
7624d94
chore: add support for custom onInvalidPage functions
Parkreiner Nov 20, 2023
2623131
refactor: clean up type definitions more for clarity reasons
Parkreiner Nov 20, 2023
29242e9
chore: delete Pagination component (separate PR)
Parkreiner Nov 20, 2023
5a9aa2d
chore: remove cacheTime fixes (to be resolved in future PR)
Parkreiner Nov 20, 2023
3d67304
docs: add clarifying/intellisense comments for DX
Parkreiner Nov 20, 2023
d977060
refactor: link users queries to same queryKey implementation
Parkreiner Nov 20, 2023
9224624
docs: remove misleading comment
Parkreiner Nov 20, 2023
540c779
docs: more comments
Parkreiner Nov 20, 2023
4b42b6f
chore: update onInvalidPage params for more flexibility
Parkreiner Nov 20, 2023
5bc43c9
fix: remove explicit any
Parkreiner Nov 20, 2023
bd146a1
refactor: clean up type definitions
Parkreiner Nov 20, 2023
983b83f
refactor: rename query params for consistency
Parkreiner Nov 20, 2023
a43e294
refactor: clean up input validation for page changes
Parkreiner Nov 20, 2023
db03f3e
refactor/fix: update hook to be aware of async data
Parkreiner Nov 21, 2023
1b825f1
chore: add contravariance to dictionary
Parkreiner Nov 21, 2023
9631a27
refactor: increase type-safety of usePaginatedQuery
Parkreiner Nov 21, 2023
4ea0cba
docs: more comments
Parkreiner Nov 21, 2023
3f63ec7
chore: move usePaginatedQuery file
Parkreiner Nov 21, 2023
614e4ff
fix: add back cacheTime
Parkreiner Nov 21, 2023
b0c8d48
Merge branch 'main' into mes/pagination-2
Parkreiner Nov 21, 2023
e994532
chore: swap in usePaginatedQuery for users table
Parkreiner Nov 21, 2023
9502044
chore: add goToFirstPage to usePaginatedQuery
Parkreiner Nov 21, 2023
8dbbfd3
fix: make page redirects work properly
Parkreiner Nov 21, 2023
88d0a5f
refactor: clean up clamp logic
Parkreiner Nov 21, 2023
132f5b1
chore: swap in usePaginatedQuery for Audits table
Parkreiner Nov 21, 2023
33bf4e8
refactor: move dependencies around
Parkreiner Nov 21, 2023
218da68
fix: remove deprecated properties from hook
Parkreiner Nov 21, 2023
54f01f1
refactor: clean up code more
Parkreiner Nov 21, 2023
ede2abc
docs: add todo comment
Parkreiner Nov 21, 2023
9ecab16
chore: update testing fixtures
Parkreiner Nov 21, 2023
0c81d1c
wip: commit current progress for tests
Parkreiner Nov 21, 2023
3aa714c
fix: update useEffectEvent to sync via layout effects
Parkreiner Nov 21, 2023
2893630
wip: commit more progress on tests
Parkreiner Nov 21, 2023
ef900d4
wip: stub out all expected test cases
Parkreiner Nov 21, 2023
23dc583
wip: more test progress
Parkreiner Nov 22, 2023
24361d1
wip: more test progress
Parkreiner Nov 22, 2023
755f8c0
wip: commit more test progress
Parkreiner Nov 22, 2023
8bff0d3
wip: AHHHHHHHH
Parkreiner Nov 22, 2023
1fae773
chore: finish two more test cases
Parkreiner Nov 22, 2023
be82728
wip: add in all tests (still need to investigate prefetching
Parkreiner Nov 22, 2023
848fa0f
refactor: clean up code slightly
Parkreiner Nov 22, 2023
c89e8e3
fix: remove math bugs when calculating pages
Parkreiner Nov 22, 2023
3624a6d
fix: wrap up all testing and clean up cases
Parkreiner Nov 22, 2023
13e2f30
docs: update comments for clarity
Parkreiner Nov 22, 2023
8f83673
fix: update error-handling for invalid page handling
Parkreiner Nov 24, 2023
5fb0643
fix: apply suggestions
Parkreiner Nov 30, 2023
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
Prev Previous commit
Next Next commit
refactor: consolidate how queryKey/queryFn are called
  • Loading branch information
Parkreiner committed Nov 15, 2023
commit 4dcfd29e1b824396882f94785dcb10c3c5035cff
13 changes: 13 additions & 0 deletions site/src/api/queries/users.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,19 @@ import {
} from "api/typesGenerated";
import { getAuthorizationKey } from "./authCheck";
import { getMetadataAsJSON } from "utils/metadata";
import { UsePaginatedQueryOptions } from "components/PaginationWidget/usePaginatedQuery";

export function usersKey(req: UsersRequest) {
return ["users", req] as const;
}

export function paginatedUsers(req: UsersRequest) {
return {
queryKey: (pagination) => usersKey(pagination),
queryFn: () => API.getUsers(req),
cacheTime: 5 * 60 * 1000,
} as const satisfies UsePaginatedQueryOptions<GetUsersResponse>;
}

export const users = (req: UsersRequest): UseQueryOptions<GetUsersResponse> => {
return {
Expand Down
36 changes: 19 additions & 17 deletions site/src/components/PaginationWidget/usePaginatedQuery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { clamp } from "lodash";

import {
type QueryFunction,
type QueryFunctionContext,
type QueryKey,
type UseQueryOptions,
useQueryClient,
Expand Down Expand Up @@ -73,34 +74,35 @@ export function usePaginatedQuery<
>(options: UsePaginatedQueryOptions<TQueryFnData, TError, TData, TQueryKey>) {
const { queryKey, queryFn, ...otherOptions } = options;
const [searchParams, setSearchParams] = useSearchParams();
const currentPage = parsePage(searchParams);

const currentPage = parsePage(searchParams);
const pageSize = DEFAULT_RECORDS_PER_PAGE;
const pageOffset = (currentPage - 1) * pageSize;

const queryOptionsFromPage = (pageNumber: number) => {
return {
queryFn: (queryCxt: QueryFunctionContext<TQueryKey>) => {
return queryFn({ ...queryCxt, pageParam: pageNumber });
},
queryKey: queryKey({
pageNumber: currentPage,
pageSize,
pageOffset,
}),
} as const;
};

// Not using infinite query right now because that requires a fair bit of list
// virtualization as the lists get bigger (especially for the audit logs)
const query = useQuery({
...queryOptionsFromPage(currentPage),
...otherOptions,
queryFn: (queryCxt) => queryFn({ ...queryCxt, pageParam: currentPage }),
queryKey: queryKey({
pageNumber: currentPage,
pageSize,
pageOffset,
}),
keepPreviousData: true,
});

const queryClient = useQueryClient();
const prefetchPage = useEffectEvent((newPage: number) => {
void queryClient.prefetchQuery({
queryFn: (queryCxt) => queryFn({ ...queryCxt, pageParam: newPage }),
queryKey: queryKey({
pageNumber: newPage,
pageSize,
pageOffset,
}),
});
return queryClient.prefetchQuery(queryOptionsFromPage(newPage));
});

const totalRecords = query.data?.count ?? 0;
Expand All @@ -113,13 +115,13 @@ export function usePaginatedQuery<
// immediately ready on each render
useEffect(() => {
if (hasNextPage) {
prefetchPage(currentPage + 1);
void prefetchPage(currentPage + 1);
}
}, [prefetchPage, currentPage, hasNextPage]);

useEffect(() => {
if (hasPreviousPage) {
prefetchPage(currentPage - 1);
void prefetchPage(currentPage - 1);
}
}, [prefetchPage, currentPage, hasPreviousPage]);

Expand Down