-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathuseMutation.ts
More file actions
89 lines (83 loc) · 2.52 KB
/
Copy pathuseMutation.ts
File metadata and controls
89 lines (83 loc) · 2.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
'use client';
import type {
OperationSchema,
ServiceOperationMutationKey,
ServiceOperationUseMutation,
} from '@openapi-qraft/tanstack-query-react-types';
import type { DefaultError, UseMutationResult } from '@tanstack/react-query';
import type { CreateAPIQueryClientOptions } from '../qraftAPIClient.js';
import { useMutation as useMutationBase } from '@tanstack/react-query';
import { composeMutationKey } from '../lib/composeMutationKey.js';
import { requestFnResponseRejecter } from '../lib/requestFnResponseRejecter.js';
import { requestFnResponseResolver } from '../lib/requestFnResponseResolver.js';
export const useMutation: <
TData = unknown,
TError = DefaultError,
TVariables = void,
TContext = unknown,
>(
qraftOptions: CreateAPIQueryClientOptions,
schema: OperationSchema,
args: Parameters<
ServiceOperationUseMutation<
OperationSchema,
object | undefined,
TVariables,
TData,
DefaultError
>['useMutation']
>
) => UseMutationResult<TData, TError, TVariables, TContext> = (
qraftOptions,
schema,
args
) => {
const [parameters, options] = args;
if (
parameters &&
typeof parameters === 'object' &&
options &&
'mutationKey' in options
)
throw new Error(
`'useMutation': parameters and 'options.mutationKey' cannot be used together`
);
const mutationKey =
options && 'mutationKey' in options
? (options.mutationKey as ServiceOperationMutationKey<
typeof schema,
unknown
>)
: composeMutationKey(schema, parameters);
return useMutationBase(
{
...options,
mutationKey,
mutationFn:
options?.mutationFn ??
(parameters
? function (bodyPayload) {
return qraftOptions
.requestFn(schema, {
parameters,
baseUrl: qraftOptions.baseUrl,
body: bodyPayload as never,
})
.then(requestFnResponseResolver, requestFnResponseRejecter);
}
: function (parametersAndBodyPayload) {
const { body, ...parameters } = parametersAndBodyPayload as {
body: unknown;
};
return qraftOptions
.requestFn(schema, {
parameters,
baseUrl: qraftOptions.baseUrl,
body,
} as never)
.then(requestFnResponseResolver, requestFnResponseRejecter);
}),
},
qraftOptions.queryClient
) as never;
};