Skip to content

Commit 454875f

Browse files
committed
fix(UseMutationResult): MutationState type should be more specific, to allow narrowing to match useQuery
fix(UseMutationResult): unify result type between core and react fix(UseMutationResult): revert back mutateAsync to core/types
1 parent 1427b1e commit 454875f

File tree

4 files changed

+88
-37
lines changed

4 files changed

+88
-37
lines changed

src/core/mutationObserver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ export class MutationObserver<
137137
isIdle: state.status === 'idle',
138138
mutate: this.mutate,
139139
reset: this.reset,
140-
}
140+
} as MutationObserverResult<TData, TError, TVariables, TContext>
141141
}
142142

143143
private notify(options: NotifyOptions) {

src/core/types.ts

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,7 @@ export type MutateFunction<
564564
options?: MutateOptions<TData, TError, TVariables, TContext>
565565
) => Promise<TData>
566566

567-
export interface MutationObserverResult<
567+
export interface MutationObserverBaseResult<
568568
TData = unknown,
569569
TError = unknown,
570570
TVariables = void,
@@ -578,6 +578,77 @@ export interface MutationObserverResult<
578578
reset: () => void
579579
}
580580

581+
export interface MutationObserverIdleResult<
582+
TData = unknown,
583+
TError = unknown,
584+
TVariables = void,
585+
TContext = unknown
586+
> extends MutationObserverBaseResult<TData, TError, TVariables, TContext> {
587+
data: undefined
588+
error: null
589+
isError: false
590+
isIdle: true
591+
isLoading: false
592+
isSuccess: false
593+
status: 'idle'
594+
}
595+
596+
export interface MutationObserverLoadingResult<
597+
TData = unknown,
598+
TError = unknown,
599+
TVariables = void,
600+
TContext = unknown
601+
> extends MutationObserverBaseResult<TData, TError, TVariables, TContext> {
602+
data: undefined
603+
error: null
604+
isError: false
605+
isIdle: false
606+
isLoading: true
607+
isSuccess: false
608+
status: 'loading'
609+
}
610+
611+
export interface MutationObserverErrorResult<
612+
TData = unknown,
613+
TError = unknown,
614+
TVariables = void,
615+
TContext = unknown
616+
> extends MutationObserverBaseResult<TData, TError, TVariables, TContext> {
617+
data: undefined
618+
error: TError
619+
isError: true
620+
isIdle: false
621+
isLoading: false
622+
isSuccess: false
623+
status: 'error'
624+
}
625+
626+
export interface MutationObserverSuccessResult<
627+
TData = unknown,
628+
TError = unknown,
629+
TVariables = void,
630+
TContext = unknown
631+
> extends MutationObserverBaseResult<TData, TError, TVariables, TContext> {
632+
data: TData
633+
error: null
634+
isError: false
635+
isIdle: false
636+
isLoading: false
637+
isSuccess: true
638+
status: 'success'
639+
}
640+
641+
export type MutationObserverResult<
642+
TData = unknown,
643+
TError = unknown,
644+
TVariables = void,
645+
TContext = unknown
646+
> =
647+
| MutationObserverIdleResult<TData, TError, TVariables, TContext>
648+
| MutationObserverLoadingResult<TData, TError, TVariables, TContext>
649+
| MutationObserverErrorResult<TData, TError, TVariables, TContext>
650+
| MutationObserverSuccessResult<TData, TError, TVariables, TContext>
651+
581652
export interface DefaultOptions<TError = unknown> {
582653
queries?: QueryObserverOptions<unknown, TError>
583654
mutations?: MutationObserverOptions<unknown, TError, unknown, unknown>

src/react/types.ts

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ import { RetryValue, RetryDelayValue } from '../core/retryer'
22
import {
33
InfiniteQueryObserverOptions,
44
InfiniteQueryObserverResult,
5-
MutateOptions,
6-
MutationStatus,
5+
MutationObserverResult,
76
MutationKey,
87
QueryObserverOptions,
98
QueryObserverResult,
109
QueryKey,
1110
MutationFunction,
11+
MutateOptions,
1212
} from '../core/types'
1313

1414
export interface UseBaseQueryOptions<
@@ -99,16 +99,6 @@ export interface UseMutationOptions<
9999
useErrorBoundary?: boolean
100100
}
101101

102-
export type UseMutateFunction<
103-
TData = unknown,
104-
TError = unknown,
105-
TVariables = void,
106-
TContext = unknown
107-
> = (
108-
variables: TVariables,
109-
options?: MutateOptions<TData, TError, TVariables, TContext>
110-
) => void
111-
112102
export type UseMutateAsyncFunction<
113103
TData = unknown,
114104
TError = unknown,
@@ -119,24 +109,18 @@ export type UseMutateAsyncFunction<
119109
options?: MutateOptions<TData, TError, TVariables, TContext>
120110
) => Promise<TData>
121111

122-
export interface UseMutationResult<
112+
export type UseBaseMutationResult<
123113
TData = unknown,
124114
TError = unknown,
125115
TVariables = unknown,
126116
TContext = unknown
127-
> {
128-
context: TContext | undefined
129-
data: TData | undefined
130-
error: TError | null
131-
failureCount: number
132-
isError: boolean
133-
isIdle: boolean
134-
isLoading: boolean
135-
isPaused: boolean
136-
isSuccess: boolean
137-
mutate: UseMutateFunction<TData, TError, TVariables, TContext>
117+
> = MutationObserverResult<TData, TError, TVariables, TContext> & {
138118
mutateAsync: UseMutateAsyncFunction<TData, TError, TVariables, TContext>
139-
reset: () => void
140-
status: MutationStatus
141-
variables: TVariables | undefined
142119
}
120+
121+
export type UseMutationResult<
122+
TData = unknown,
123+
TError = unknown,
124+
TVariables = unknown,
125+
TContext = unknown
126+
> = UseBaseMutationResult<TData, TError, TVariables, TContext>

src/react/useMutation.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,8 @@ import { notifyManager } from '../core/notifyManager'
44
import { noop, parseMutationArgs } from '../core/utils'
55
import { MutationObserver } from '../core/mutationObserver'
66
import { useQueryClient } from './QueryClientProvider'
7-
import {
8-
UseMutateFunction,
9-
UseMutationOptions,
10-
UseMutationResult,
11-
} from './types'
12-
import { MutationFunction, MutationKey } from '../core/types'
7+
import { UseMutationOptions, UseMutationResult } from './types'
8+
import { MutateFunction, MutationFunction, MutationKey } from '../core/types'
139

1410
// HOOK
1511

@@ -97,9 +93,9 @@ export function useMutation<
9793
}, [])
9894

9995
const mutate = React.useCallback<
100-
UseMutateFunction<TData, TError, TVariables, TContext>
96+
MutateFunction<TData, TError, TVariables, TContext>
10197
>((variables, mutateOptions) => {
102-
obsRef.current!.mutate(variables, mutateOptions).catch(noop)
98+
return obsRef.current!.mutate(variables, mutateOptions).catch(noop)
10399
}, [])
104100

105101
if (currentResult.error && obsRef.current.options.useErrorBoundary) {

0 commit comments

Comments
 (0)