@@ -2,18 +2,21 @@ import {
22 MutationFilters ,
33 MutationFunction ,
44 MutationKey ,
5+ MutationState ,
56 QueryClient ,
67 UseMutationOptions ,
78 useIsMutating ,
89 useMutation ,
10+ useMutationState ,
911 useQueryClient ,
1012} from '@tanstack/react-query' ;
13+ import { useStableCallback } from '../hooks/useStableCallback' ;
1114import { mergeTagOptions } from '../tags/mergeTagOptions' ;
1215import { QueryInvalidatesMetadata } from '../tags/types' ;
1316import { QueryBuilder } from './QueryBuilder' ;
1417import { BuilderMergeVarsFn , BuilderQueryFn , SetDataType , SetErrorType } from './types' ;
1518import { AppendVarsType , BuilderTypeTemplate } from './types' ;
16- import { mergeMutationOptions , mergeVars } from './utils' ;
19+ import { areKeysEqual , mergeMutationOptions , mergeVars } from './utils' ;
1720
1821function getRandomKey ( ) {
1922 return Math . random ( ) . toString ( 36 ) . substring ( 7 ) ;
@@ -58,9 +61,8 @@ export class MutationBuilderFrozen<T extends BuilderTypeTemplate> {
5861 } ;
5962 } ;
6063
61- getMutationKey : ( vars : T [ 'vars' ] ) => MutationKey = ( vars ) => {
62- const mergedVars = this . mergeVars ( [ this . config . vars , vars ] ) ;
63- return [ this . mutationKeyPrefix , mergedVars ] ;
64+ getMutationKey : ( ) => MutationKey = ( ) => {
65+ return [ this . mutationKeyPrefix ] ;
6466 } ;
6567
6668 getMutationOptions : (
@@ -69,6 +71,7 @@ export class MutationBuilderFrozen<T extends BuilderTypeTemplate> {
6971 ) => UseMutationOptions < T [ 'data' ] , T [ 'error' ] , T [ 'vars' ] > = ( queryClient , opts ) => {
7072 return mergeMutationOptions ( [
7173 {
74+ mutationKey : this . getMutationKey ( ) ,
7275 mutationFn : this . getMutationFn ( queryClient , opts ?. meta ) ,
7376 meta : {
7477 invalidates : this . config . invalidates ,
@@ -81,6 +84,22 @@ export class MutationBuilderFrozen<T extends BuilderTypeTemplate> {
8184 ] ) ;
8285 } ;
8386
87+ getMutationFilters : (
88+ vars ?: T [ 'vars' ] ,
89+ filters ?: MutationFilters < T [ 'data' ] , T [ 'error' ] , T [ 'vars' ] > ,
90+ ) => MutationFilters < T [ 'data' ] , T [ 'error' ] , T [ 'vars' ] > = ( vars , filters ) => {
91+ return {
92+ mutationKey : this . getMutationKey ( ) ,
93+ ...filters ,
94+ predicate : ( m ) => {
95+ if ( filters ?. predicate && ! filters . predicate ( m ) ) return false ;
96+ if ( vars == null ) return true ;
97+ if ( ! m . state . variables ) return false ;
98+ return areKeysEqual ( [ m . state . variables ] , [ vars ] ) ;
99+ } ,
100+ } ;
101+ } ;
102+
84103 useMutation : (
85104 opts ?: MutationBuilderConfig < T > [ 'options' ] ,
86105 ) => ReturnType < typeof useMutation < T [ 'data' ] , T [ 'error' ] , T [ 'vars' ] > > = ( opts ) => {
@@ -92,7 +111,27 @@ export class MutationBuilderFrozen<T extends BuilderTypeTemplate> {
92111 vars ,
93112 filters ,
94113 ) => {
95- return useIsMutating ( { mutationKey : this . getMutationKey ( vars ) , ...filters } , this . config . queryClient ) ;
114+ return useIsMutating ( this . getMutationFilters ( vars , filters ) , this . config . queryClient ) ;
115+ } ;
116+
117+ useAllMutations : ( filters ?: MutationFilters < T [ 'data' ] , T [ 'error' ] , T [ 'vars' ] > ) => MutationStateHelper < T > = (
118+ filters ,
119+ ) => {
120+ const list = useMutationState ( { filters : this . getMutationFilters ( undefined , filters ) } , this . config . queryClient ) ;
121+
122+ const getMutation : MutationStateHelper < T > [ 'getMutation' ] = useStableCallback (
123+ ( vars , predicate ?: ( mutation : MutationState < T [ 'data' ] , T [ 'error' ] , T [ 'vars' ] > ) => boolean ) =>
124+ list . findLast ( ( m ) => areKeysEqual ( [ m . variables ] , [ vars ] ) && ( ! predicate || predicate ( m ) ) ) ,
125+ ) ;
126+
127+ return { list, getMutation } ;
128+ } ;
129+
130+ useMutationState : (
131+ vars : T [ 'vars' ] ,
132+ filters ?: MutationFilters < T [ 'data' ] , T [ 'error' ] , T [ 'vars' ] > ,
133+ ) => MutationState < T [ 'data' ] , T [ 'error' ] , T [ 'vars' ] > | undefined = ( vars , filters ) => {
134+ return useMutationState ( { filters : this . getMutationFilters ( vars , filters ) } , this . config . queryClient ) [ 0 ] ;
96135 } ;
97136
98137 private _client ?: MutationBuilderClient < T > ;
@@ -101,14 +140,16 @@ export class MutationBuilderFrozen<T extends BuilderTypeTemplate> {
101140 }
102141}
103142
104- class MutationBuilderClient <
105- T extends BuilderTypeTemplate ,
106- TFilters = MutationFilters < T [ 'data' ] , T [ 'error' ] , T [ 'vars' ] > ,
107- > {
143+ export type MutationStateHelper < T extends BuilderTypeTemplate > = {
144+ list : MutationState < T [ 'data' ] , T [ 'error' ] , T [ 'vars' ] > [ ] ;
145+ getMutation ( vars : T [ 'vars' ] ) : MutationState < T [ 'data' ] , T [ 'error' ] , T [ 'vars' ] > | undefined ;
146+ } ;
147+
148+ class MutationBuilderClient < T extends BuilderTypeTemplate > {
108149 constructor ( private builder : MutationBuilderFrozen < T > ) { }
109150
110- readonly isMutating = ( vars : T [ 'vars' ] , filters ?: TFilters ) =>
111- this . builder . config . queryClient ?. isMutating ( { mutationKey : this . builder . getMutationKey ( vars ) , ... filters } ) ;
151+ readonly isMutating = ( vars : T [ 'vars' ] , filters ?: MutationFilters < T [ 'data' ] , T [ 'error' ] , T [ 'vars' ] > ) =>
152+ this . builder . config . queryClient ?. isMutating ( this . builder . getMutationFilters ( vars , filters ) ) ;
112153}
113154
114155export class MutationBuilder < T extends BuilderTypeTemplate = BuilderTypeTemplate > extends MutationBuilderFrozen < T > {
0 commit comments