33import type {
44 OperationSchema ,
55 ServiceOperationMutationKey ,
6- ServiceOperationUseMutation ,
6+ ServiceOperationUseMutationOptions ,
77} from '@openapi-qraft/tanstack-query-react-types' ;
88import type { DefaultError , UseMutationResult } from '@tanstack/react-query' ;
99import type { CreateAPIQueryClientOptions } from '../qraftAPIClient.js' ;
1010import { useMutation as useMutationBase } from '@tanstack/react-query' ;
11+ import { useMemo } from 'react' ;
1112import { composeMutationKey } from '../lib/composeMutationKey.js' ;
1213import { requestFnResponseRejecter } from '../lib/requestFnResponseRejecter.js' ;
1314import { requestFnResponseResolver } from '../lib/requestFnResponseResolver.js' ;
@@ -20,68 +21,91 @@ export const useMutation: <
2021> (
2122 qraftOptions : CreateAPIQueryClientOptions ,
2223 schema : OperationSchema ,
23- args : Parameters <
24- ServiceOperationUseMutation <
25- OperationSchema ,
26- object | undefined ,
27- TVariables ,
28- TData ,
29- DefaultError
30- > [ 'useMutation' ]
31- >
24+ args : [
25+ parameters ?: unknown ,
26+ options ?: ServiceOperationUseMutationOptions < any , any , any , any , any > ,
27+ ]
3228) => UseMutationResult < TData , TError , TVariables , TContext > = (
3329 qraftOptions ,
3430 schema ,
3531 args
3632) => {
3733 const [ parameters , options ] = args ;
3834
39- if (
40- parameters &&
41- typeof parameters === 'object' &&
42- options &&
43- 'mutationKey' in options
44- )
45- throw new Error (
46- `'useMutation': parameters and 'options.mutationKey' cannot be used together`
47- ) ;
48-
49- const mutationKey =
35+ const optionsMutationKey =
5036 options && 'mutationKey' in options
5137 ? ( options . mutationKey as ServiceOperationMutationKey <
5238 typeof schema ,
5339 unknown
5440 > )
55- : composeMutationKey ( schema , parameters ) ;
41+ : undefined ;
42+
43+ if ( parameters && typeof parameters === 'object' && optionsMutationKey )
44+ throw new Error (
45+ `'useMutation': parameters and 'options.mutationKey' cannot be used together`
46+ ) ;
47+
48+ const mutationKey = useMemo (
49+ ( ) => optionsMutationKey ?? composeMutationKey ( schema , parameters ) ,
50+ [ optionsMutationKey , schema , parameters ]
51+ ) ;
5652
5753 return useMutationBase (
5854 {
5955 ...options ,
6056 mutationKey,
61- mutationFn :
62- options ?. mutationFn ??
63- ( parameters
64- ? function ( bodyPayload ) {
65- return qraftOptions
66- . requestFn ( schema , {
67- parameters,
68- baseUrl : qraftOptions . baseUrl ,
69- body : bodyPayload as never ,
70- } )
71- . then ( requestFnResponseResolver , requestFnResponseRejecter ) ;
72- }
73- : function ( parametersAndBodyPayload ) {
74- const { body, ...parameters } = parametersAndBodyPayload ?? { } ;
75-
76- return qraftOptions
77- . requestFn ( schema , {
78- parameters,
79- baseUrl : qraftOptions . baseUrl ,
80- body,
81- } as never )
82- . then ( requestFnResponseResolver , requestFnResponseRejecter ) ;
83- } ) ,
57+ mutationFn : useMemo (
58+ ( ) =>
59+ options ?. mutationFn ??
60+ qraftMutationFn . bind (
61+ null ,
62+ qraftOptions . requestFn ,
63+ qraftOptions . baseUrl ,
64+ schema ,
65+ parameters
66+ ) ,
67+ [
68+ options ?. mutationFn ,
69+ qraftOptions . requestFn ,
70+ qraftOptions . baseUrl ,
71+ schema ,
72+ parameters ,
73+ ]
74+ ) ,
8475 } ,
8576 qraftOptions . queryClient
8677 ) as never ;
8778} ;
79+
80+ function qraftMutationFn (
81+ requestFn : CreateAPIQueryClientOptions [ 'requestFn' ] ,
82+ baseUrl : CreateAPIQueryClientOptions [ 'baseUrl' ] ,
83+ schema : OperationSchema ,
84+ parameters : unknown ,
85+ mutationVariables :
86+ | {
87+ body : unknown ;
88+ }
89+ | undefined
90+ ) {
91+ if ( parameters ) {
92+ return requestFn ( schema , {
93+ parameters,
94+ baseUrl,
95+ body : mutationVariables as never ,
96+ } ) . then ( requestFnResponseResolver , requestFnResponseRejecter ) ;
97+ }
98+
99+ const mutationParameters =
100+ typeof mutationVariables === 'object' && mutationVariables !== null
101+ ? { ...mutationVariables }
102+ : undefined ;
103+ const body = mutationParameters ?. body ;
104+ delete mutationParameters ?. body ;
105+
106+ return requestFn ( schema , {
107+ parameters : mutationParameters ,
108+ baseUrl,
109+ body,
110+ } as never ) . then ( requestFnResponseResolver , requestFnResponseRejecter ) ;
111+ }
0 commit comments