Skip to content

Commit e4c603b

Browse files
committed
feature: add support for cancelQueries method
1 parent e912c76 commit e4c603b

File tree

6 files changed

+262
-94
lines changed

6 files changed

+262
-94
lines changed

packages/cli/src/lib/ts-factory/getClientFactory.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,4 +186,5 @@ const serviceCallbacks = [
186186
'useQueries',
187187
'useSuspenseQueries',
188188
'invalidateQueries',
189+
'cancelQueries',
189190
] as const;

packages/react-client/src/ServiceOperation.ts

Lines changed: 70 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import {
1+
import type {
2+
CancelOptions,
23
DefaultError,
34
FetchStatus,
45
InfiniteData,
@@ -14,7 +15,7 @@ import {
1415
SetDataOptions,
1516
Updater,
1617
} from '@tanstack/query-core';
17-
import {
18+
import type {
1819
DefinedInitialDataInfiniteOptions,
1920
DefinedInitialDataOptions,
2021
DefinedUseInfiniteQueryResult,
@@ -63,7 +64,8 @@ export interface ServiceOperationQuery<
6364
ServiceOperationGetInfiniteQueryData<TSchema, TData, TParams>,
6465
ServiceOperationSetQueryData<TSchema, TData, TParams>,
6566
ServiceOperationSetInfiniteQueryData<TSchema, TData, TParams>,
66-
ServiceOperationInvalidateQueries<TSchema, TData, TParams, TError> {
67+
ServiceOperationInvalidateQueries<TSchema, TData, TParams, TError>,
68+
ServiceOperationCancelQueries<TSchema, TData, TParams, TError> {
6769
schema: TSchema;
6870
types: {
6971
parameters: TParams;
@@ -144,7 +146,7 @@ interface ServiceOperationUseQueries<
144146

145147
type QueryTypeFilter = 'all' | 'active' | 'inactive';
146148

147-
interface InvalidateQueryFiltersBase<
149+
interface QueryFiltersBase<
148150
TSchema extends { url: string; method: string },
149151
TData,
150152
TParams = {},
@@ -178,56 +180,65 @@ interface InvalidateQueryFiltersBase<
178180
* Include queries matching their fetchStatus
179181
*/
180182
fetchStatus?: FetchStatus;
181-
182-
refetchType?: QueryTypeFilter | 'none';
183183
}
184184

185-
interface InvalidateQueryFiltersByQueryKey<
185+
interface QueryFiltersByQueryKey<
186186
TSchema extends { url: string; method: string },
187187
TData,
188188
TParams = {},
189189
TError = DefaultError,
190-
> extends InvalidateQueryFiltersBase<TSchema, TData, TParams, TError> {
190+
> extends QueryFiltersBase<TSchema, TData, TParams, TError> {
191191
/**
192192
* Include queries matching this query key
193193
*/
194194
queryKey?: ServiceOperationQueryKey<TSchema, TParams>;
195195
}
196196

197-
interface InvalidateQueryFiltersByParameters<
197+
interface QueryFiltersByParameters<
198198
TSchema extends { url: string; method: string },
199199
TData,
200200
TParams = {},
201201
TError = DefaultError,
202-
> extends InvalidateQueryFiltersBase<TSchema, TData, TParams, TError> {
202+
> extends QueryFiltersBase<TSchema, TData, TParams, TError> {
203203
/**
204204
* Include queries matching parameters
205205
*/
206206
parameters?: TParams;
207207
}
208208

209+
type InvalidateQueryFilters<
210+
TSchema extends { url: string; method: string },
211+
TData,
212+
TParams = {},
213+
TError = DefaultError,
214+
> = (
215+
| QueryFiltersByParameters<TSchema, TData, TParams, TError>
216+
| QueryFiltersByQueryKey<TSchema, TData, TParams, TError>
217+
) & {
218+
refetchType?: QueryTypeFilter | 'none';
219+
};
220+
209221
interface ServiceOperationInvalidateQueries<
210222
TSchema extends { url: string; method: string },
211223
TData,
212224
TParams = {},
213225
TError = DefaultError,
214226
> {
215227
invalidateQueries(
216-
filters:
217-
| InvalidateQueryFiltersByParameters<TSchema, TData, TParams, TError>
218-
| InvalidateQueryFiltersByQueryKey<TSchema, TData, TParams, TError>,
228+
filters: InvalidateQueryFilters<TSchema, TData, TParams, TError>,
219229
options: InvalidateOptions,
220230
queryClient: QueryClient
221231
): Promise<void>;
222232
invalidateQueries(
223-
filters:
224-
| InvalidateQueryFiltersByParameters<TSchema, TData, TParams, TError>
225-
| InvalidateQueryFiltersByQueryKey<TSchema, TData, TParams, TError>,
233+
filters: InvalidateQueryFilters<TSchema, TData, TParams, TError>,
226234
queryClient: QueryClient
227235
): Promise<void>;
228236
invalidateQueries(queryClient: QueryClient): Promise<void>;
229237
}
230238

239+
/**
240+
* @internal
241+
*/
231242
export interface ServiceOperationInvalidateQueriesCallback<
232243
TSchema extends { url: string; method: string },
233244
TData,
@@ -236,14 +247,55 @@ export interface ServiceOperationInvalidateQueriesCallback<
236247
> extends ServiceOperationInvalidateQueries<TSchema, TData, TParams, TError> {
237248
invalidateQueries(
238249
filters:
239-
| InvalidateQueryFiltersByParameters<TSchema, TData, TParams, TError>
240-
| InvalidateQueryFiltersByQueryKey<TSchema, TData, TParams, TError>
250+
| QueryFiltersByParameters<TSchema, TData, TParams, TError>
251+
| QueryFiltersByQueryKey<TSchema, TData, TParams, TError>
241252
| QueryClient,
242253
options?: InvalidateOptions | QueryClient,
243254
queryClient?: QueryClient
244255
): Promise<void>;
245256
}
246257

258+
interface ServiceOperationCancelQueries<
259+
TSchema extends { url: string; method: string },
260+
TData,
261+
TParams = {},
262+
TError = DefaultError,
263+
> {
264+
cancelQueries(
265+
filters:
266+
| QueryFiltersByParameters<TSchema, TData, TParams, TError>
267+
| QueryFiltersByQueryKey<TSchema, TData, TParams, TError>,
268+
options: CancelOptions,
269+
queryClient: QueryClient
270+
): Promise<void>;
271+
cancelQueries(
272+
filters:
273+
| QueryFiltersByParameters<TSchema, TData, TParams, TError>
274+
| QueryFiltersByQueryKey<TSchema, TData, TParams, TError>,
275+
queryClient: QueryClient
276+
): Promise<void>;
277+
cancelQueries(queryClient: QueryClient): Promise<void>;
278+
}
279+
280+
/**
281+
* @internal
282+
*/
283+
export interface ServiceOperationCancelQueriesCallback<
284+
TSchema extends { url: string; method: string },
285+
TData,
286+
TParams = {},
287+
TError = DefaultError,
288+
> extends ServiceOperationCancelQueries<TSchema, TData, TParams, TError> {
289+
cancelQueries(
290+
filters:
291+
| QueryFiltersByParameters<TSchema, TData, TParams, TError>
292+
| QueryFiltersByQueryKey<TSchema, TData, TParams, TError>
293+
| QueryClient,
294+
options?: CancelOptions | QueryClient,
295+
queryClient?: QueryClient
296+
): Promise<void>;
297+
}
298+
247299
interface ServiceOperationUseSuspenseQueries<
248300
TSchema extends { url: string; method: string },
249301
TData,
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { callQueryClientMethodWithQueryFilters } from '../lib/callQueryClientMethodWithQueryFilters.js';
2+
import type { QraftClientOptions } from '../qraftAPIClient.js';
3+
import type { RequestClientSchema } from '../RequestClient.js';
4+
import { ServiceOperationCancelQueriesCallback } from '../ServiceOperation.js';
5+
6+
export function cancelQueries<TData>(
7+
qraftOptions: QraftClientOptions | undefined,
8+
schema: RequestClientSchema,
9+
args: Parameters<
10+
ServiceOperationCancelQueriesCallback<
11+
RequestClientSchema,
12+
unknown,
13+
TData
14+
>['cancelQueries']
15+
>
16+
): Promise<void> {
17+
return callQueryClientMethodWithQueryFilters(
18+
'cancelQueries',
19+
schema,
20+
args as never
21+
) as never;
22+
}
Lines changed: 1 addition & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
import type { QueryClient } from '@tanstack/query-core';
2-
3-
import { composeQueryKey } from '../lib/composeQueryKey.js';
1+
import { callQueryClientMethodWithQueryFilters } from '../lib/callQueryClientMethodWithQueryFilters.js';
42
import type { QraftClientOptions } from '../qraftAPIClient.js';
53
import type { RequestClientSchema } from '../RequestClient.js';
64
import type { ServiceOperationInvalidateQueriesCallback } from '../ServiceOperation.js';
@@ -22,76 +20,3 @@ export function invalidateQueries<TData>(
2220
args as never
2321
) as never;
2422
}
25-
26-
type QueryFiltersMethod<QFMethod extends keyof typeof QueryClient.prototype> =
27-
QFMethod;
28-
29-
type QueryFilterMethods =
30-
| QueryFiltersMethod<'isFetching'>
31-
| QueryFiltersMethod<'getQueriesData'>
32-
| QueryFiltersMethod<'setQueriesData'>
33-
| QueryFiltersMethod<'removeQueries'>
34-
| QueryFiltersMethod<'resetQueries'>
35-
| QueryFiltersMethod<'cancelQueries'>
36-
| QueryFiltersMethod<'invalidateQueries'>
37-
| QueryFiltersMethod<'refetchQueries'>;
38-
39-
function callQueryClientMethodWithQueryFilters<
40-
QFMethod extends QueryFilterMethods,
41-
>(
42-
queryFilterMethod: QFMethod,
43-
schema: RequestClientSchema,
44-
args: [QueryClient, ...Parameters<(typeof QueryClient.prototype)[QFMethod]>]
45-
) {
46-
const queryClient = (
47-
args.length === 1
48-
? args[0]
49-
: args.length === 2
50-
? args[1]
51-
: args.length === 3
52-
? args[2]
53-
: undefined
54-
) as QueryClient | undefined;
55-
56-
const filters = args.length === 1 ? undefined : args[0];
57-
const options = args.length === 3 ? args[1] : undefined;
58-
59-
if (!queryClient) throw new Error('queryClient is required');
60-
if (!queryClient[queryFilterMethod])
61-
throw new Error(
62-
`queryClient is invalid, ${queryFilterMethod} method does not exist`
63-
);
64-
65-
if (!filters) {
66-
return queryClient[queryFilterMethod](
67-
{
68-
queryKey: composeQueryKey(schema, undefined),
69-
},
70-
options as never
71-
);
72-
}
73-
74-
if ('queryKey' in filters) {
75-
return queryClient[queryFilterMethod](filters as never, options as never);
76-
}
77-
78-
if ('parameters' in filters) {
79-
const { parameters, ...filtersRest } = filters;
80-
81-
return queryClient[queryFilterMethod](
82-
{
83-
...filtersRest,
84-
queryKey: composeQueryKey(schema, parameters),
85-
} as never,
86-
options as never
87-
);
88-
}
89-
90-
return queryClient[queryFilterMethod](
91-
{
92-
...filters,
93-
queryKey: composeQueryKey(schema, undefined),
94-
} as never,
95-
options as never
96-
);
97-
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import type { QueryClient } from '@tanstack/query-core';
2+
3+
import type { RequestClientSchema } from '../RequestClient.js';
4+
import { composeQueryKey } from './composeQueryKey.js';
5+
6+
/**
7+
* Calls a query client method with query filters and options,
8+
* and automatically composes the `QueryKey` based on the schema and parameters.
9+
*/
10+
export function callQueryClientMethodWithQueryFilters<
11+
QFMethod extends QueryFilterMethods,
12+
>(
13+
queryFilterMethod: QFMethod,
14+
schema: RequestClientSchema,
15+
args: [QueryClient, ...Parameters<(typeof QueryClient.prototype)[QFMethod]>]
16+
): ReturnType<(typeof QueryClient.prototype)[QFMethod]> {
17+
const queryClient = (
18+
args.length === 1
19+
? args[0]
20+
: args.length === 2
21+
? args[1]
22+
: args.length === 3
23+
? args[2]
24+
: undefined
25+
) as QueryClient | undefined;
26+
27+
const filters = args.length === 1 ? undefined : args[0];
28+
const options = args.length === 3 ? args[1] : undefined;
29+
30+
if (!queryClient) throw new Error('queryClient is required');
31+
if (!queryClient[queryFilterMethod])
32+
throw new Error(
33+
`queryClient is invalid, ${queryFilterMethod} method does not exist`
34+
);
35+
36+
if (!filters) {
37+
return queryClient[queryFilterMethod](
38+
{
39+
queryKey: composeQueryKey(schema, undefined),
40+
},
41+
options as never
42+
) as never;
43+
}
44+
45+
if ('queryKey' in filters) {
46+
return queryClient[queryFilterMethod](
47+
filters as never,
48+
options as never
49+
) as never;
50+
}
51+
52+
if ('parameters' in filters) {
53+
const { parameters, ...filtersRest } = filters;
54+
55+
return queryClient[queryFilterMethod](
56+
{
57+
...filtersRest,
58+
queryKey: composeQueryKey(schema, parameters),
59+
} as never,
60+
options as never
61+
) as never;
62+
}
63+
64+
return queryClient[queryFilterMethod](
65+
{
66+
...filters,
67+
queryKey: composeQueryKey(schema, undefined),
68+
} as never,
69+
options as never
70+
) as never;
71+
}
72+
73+
type QueryFiltersMethod<QFMethod extends keyof typeof QueryClient.prototype> =
74+
QFMethod;
75+
76+
type QueryFilterMethods =
77+
| QueryFiltersMethod<'isFetching'>
78+
| QueryFiltersMethod<'getQueriesData'>
79+
| QueryFiltersMethod<'setQueriesData'>
80+
| QueryFiltersMethod<'removeQueries'>
81+
| QueryFiltersMethod<'resetQueries'>
82+
| QueryFiltersMethod<'cancelQueries'>
83+
| QueryFiltersMethod<'invalidateQueries'>
84+
| QueryFiltersMethod<'refetchQueries'>;

0 commit comments

Comments
 (0)