7
7
MutationObserverResult ,
8
8
notifyManager ,
9
9
} from '@tanstack/query-core' ;
10
- import { firstValueFrom , isObservable , Observable , shareReplay } from 'rxjs' ;
10
+ import { isObservable , Observable , shareReplay } from 'rxjs' ;
11
11
import { toSignal } from '@angular/core/rxjs-interop' ;
12
+ import { toPromise } from './utils' ;
12
13
13
14
type CreateMutationOptions <
14
15
TData = unknown ,
@@ -40,9 +41,7 @@ type MutationResult<
40
41
result$ : Observable <
41
42
MutationObserverResult < TData , TError , TVariables , TContext >
42
43
> ;
43
- toSignal : ( ) => Signal <
44
- MutationObserverResult < TData , TError , TVariables , TContext >
45
- > ;
44
+ result : Signal < MutationObserverResult < TData , TError , TVariables , TContext > > ;
46
45
} ;
47
46
48
47
@Injectable ( { providedIn : 'root' } )
@@ -65,10 +64,12 @@ class Mutation {
65
64
> ( this . instance , {
66
65
...options ,
67
66
mutationFn : ( variables : TVariables ) : Promise < TData > => {
68
- const result : Promise < TData > | Observable < TData > =
67
+ const source : Promise < TData > | Observable < TData > =
69
68
options . mutationFn ( variables ) ;
70
- if ( isObservable ( result ) ) return firstValueFrom ( result ) ;
71
- return result ;
69
+
70
+ if ( isObservable ( source ) ) return toPromise ( { source } ) ;
71
+
72
+ return source ;
72
73
} ,
73
74
} ) ;
74
75
@@ -94,17 +95,26 @@ class Mutation {
94
95
) ;
95
96
96
97
const mutate = ( variables : TVariables ) => {
97
- mutationObserver . mutate ( variables ) . catch ( ( ) => { } ) ;
98
+ mutationObserver . mutate ( variables ) . catch ( ( ) => {
99
+ // noop
100
+ } ) ;
98
101
} ;
99
102
100
103
return {
101
104
mutate,
102
- mutateAsync : mutationObserver . mutate . bind ( mutationObserver ) ,
103
105
reset : mutationObserver . reset . bind ( mutationObserver ) ,
104
106
setOptions : mutationObserver . setOptions . bind ( mutationObserver ) ,
105
107
result$,
106
- toSignal : ( ) => toSignal ( result$ , { requireSync : true } ) ,
107
- } ;
108
+ __cached__ : undefined ,
109
+ // @experimental signal support
110
+ get result ( ) {
111
+ if ( ! this . __cached__ ) {
112
+ this . __cached__ = toSignal ( this . result$ ) ;
113
+ }
114
+
115
+ return this . __cached__ ;
116
+ } ,
117
+ } as any ;
108
118
}
109
119
}
110
120
0 commit comments