Skip to content

Commit 131f0ce

Browse files
committed
chore(react-client): add shared prepareRequestFnParameters() for query* methods
1 parent e896c68 commit 131f0ce

3 files changed

Lines changed: 86 additions & 72 deletions

File tree

packages/react-client/src/lib/callQueryClientFetchMethod.ts

Lines changed: 8 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import type { CreateAPIQueryClientOptions } from '../qraftAPIClient.js';
33
import type { OperationSchema, RequestFn } from './requestFn.js';
44
import { composeInfiniteQueryKey } from './composeInfiniteQueryKey.js';
55
import { composeQueryKey } from './composeQueryKey.js';
6+
import { prepareRequestFnParameters } from './prepareRequestFnParameters.js';
67
import { requestFnResponseRejecter } from './requestFnResponseRejecter.js';
78
import { requestFnResponseResolver } from './requestFnResponseResolver.js';
8-
import { shelfMerge } from './shelfMerge.js';
99

1010
/**
1111
* Calls a query client fetch method with parameters and options,
@@ -50,43 +50,16 @@ export function callQueryClientMethodWithQueryKey<
5050
(requestFn
5151
? // @ts-expect-error - Too complex union to type
5252
function ({ queryKey: [, queryParams], signal, meta, pageParam }) {
53-
const { body, ...parameters } = queryParams as {
54-
body: BodyInit;
55-
} & typeof queryParams;
53+
const { parameters, body } = prepareRequestFnParameters(
54+
queryParams,
55+
pageParam,
56+
infinite
57+
);
5658

5759
return requestFn(schema, {
58-
parameters: infinite
59-
? (shelfMerge(
60-
2,
61-
parameters,
62-
(function omitBodyFromParameters() {
63-
if (
64-
pageParam &&
65-
typeof pageParam === 'object' &&
66-
'body' in pageParam
67-
) {
68-
const { body: _body, ...pageParameters } = pageParam;
69-
return pageParameters;
70-
}
71-
72-
return pageParam;
73-
})()
74-
) as never)
75-
: parameters,
60+
parameters: parameters as never,
7661
baseUrl,
77-
body: infinite
78-
? (function shelfMergeBody() {
79-
if (
80-
pageParam &&
81-
typeof pageParam === 'object' &&
82-
'body' in pageParam
83-
) {
84-
return shelfMerge(1, body, pageParam.body) as BodyInit;
85-
}
86-
87-
return body;
88-
})()
89-
: body,
62+
body,
9063
signal,
9164
meta,
9265
}).then(requestFnResponseResolver, requestFnResponseRejecter);
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { shelfMerge } from './shelfMerge.js';
2+
3+
/**
4+
* Prepares parameters and body for requestFn calls, handling infinite query logic
5+
* @param queryParams - The query parameters that may contain body
6+
* @param pageParam - The page parameter for infinite queries
7+
* @param infinite - Whether this is for an infinite query
8+
* @returns Object with prepared parameters and body
9+
*/
10+
export function prepareRequestFnParameters<TQueryParams>(
11+
queryParams: TQueryParams,
12+
pageParam: unknown,
13+
infinite: boolean
14+
): {
15+
parameters: TQueryParams extends { body: any }
16+
? Omit<TQueryParams, 'body'>
17+
: TQueryParams;
18+
body: BodyInit | undefined;
19+
} {
20+
const { body, ...parameters } = queryParams as {
21+
body?: BodyInit;
22+
} & TQueryParams;
23+
24+
if (!infinite) {
25+
return {
26+
parameters: parameters as never,
27+
body: body as never,
28+
};
29+
}
30+
31+
// Handle infinite query parameters
32+
const processedParameters = shelfMerge(
33+
2,
34+
parameters,
35+
omitBodyFromPageParam(pageParam)
36+
) as never;
37+
38+
const processedBody = mergeBodyWithPageParam(body, pageParam) as never;
39+
40+
return {
41+
parameters: processedParameters,
42+
body: processedBody,
43+
};
44+
}
45+
46+
/**
47+
* Remove body from pageParam if it exists
48+
*/
49+
function omitBodyFromPageParam(pageParam: unknown) {
50+
if (pageParam && typeof pageParam === 'object' && 'body' in pageParam) {
51+
const { body: _body, ...pageParameters } = pageParam;
52+
return pageParameters;
53+
}
54+
55+
return pageParam;
56+
}
57+
58+
/**
59+
* Merge body with pageParam.body if pageParam contains body
60+
*/
61+
function mergeBodyWithPageParam(
62+
body: BodyInit | undefined,
63+
pageParam: unknown
64+
): BodyInit | undefined {
65+
if (pageParam && typeof pageParam === 'object' && 'body' in pageParam) {
66+
return shelfMerge(1, body, pageParam.body) as BodyInit;
67+
}
68+
69+
return body;
70+
}

packages/react-client/src/lib/useComposeUseQueryOptions.ts

Lines changed: 8 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import type { CreateAPIQueryClientOptions } from '../qraftAPIClient.js';
66
import type { OperationSchema } from './requestFn.js';
77
import { composeInfiniteQueryKey } from './composeInfiniteQueryKey.js';
88
import { composeQueryKey } from './composeQueryKey.js';
9+
import { prepareRequestFnParameters } from './prepareRequestFnParameters.js';
910
import { requestFnResponseRejecter } from './requestFnResponseRejecter.js';
1011
import { requestFnResponseResolver } from './requestFnResponseResolver.js';
11-
import { shelfMerge } from './shelfMerge.js';
1212

1313
/**
1414
* Composes the options for useQuery, useInfiniteQuery, useSuspenseQuery, and useSuspenseQueries.
@@ -25,46 +25,17 @@ export function useComposeUseQueryOptions(
2525
const queryFn =
2626
options?.queryFn ??
2727
function ({ queryKey: [, queryParams], signal, meta, pageParam }) {
28-
const { body, ...parameters } = queryParams as {
29-
body: BodyInit;
30-
parameters: Record<string, unknown>;
31-
};
28+
const { parameters, body } = prepareRequestFnParameters(
29+
queryParams,
30+
pageParam,
31+
infinite
32+
);
3233

3334
return qraftOptions
3435
.requestFn(schema, {
35-
// @ts-expect-error - Too complex to type
36-
parameters: infinite
37-
? (shelfMerge(
38-
2,
39-
parameters,
40-
(function omitBodyFromParameters() {
41-
if (
42-
pageParam &&
43-
typeof pageParam === 'object' &&
44-
'body' in pageParam
45-
) {
46-
const { body: _body, ...pageParameters } = pageParam;
47-
return pageParameters;
48-
}
49-
50-
return pageParam;
51-
})()
52-
) as never)
53-
: parameters,
36+
parameters: parameters as never,
5437
baseUrl: qraftOptions.baseUrl,
55-
body: infinite
56-
? (function shelfMergeBody() {
57-
if (
58-
pageParam &&
59-
typeof pageParam === 'object' &&
60-
'body' in pageParam
61-
) {
62-
return shelfMerge(1, body, pageParam.body) as BodyInit;
63-
}
64-
65-
return body;
66-
})()
67-
: body,
38+
body,
6839
signal,
6940
meta,
7041
})

0 commit comments

Comments
 (0)