Skip to content

Commit 9a95f9a

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
1 parent 1427b1e commit 9a95f9a

File tree

3 files changed

+93
-44
lines changed

3 files changed

+93
-44
lines changed

src/core/types.ts

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

567-
export interface MutationObserverResult<
567+
export type MutateAsyncFunction<
568+
TData = unknown,
569+
TError = unknown,
570+
TVariables = void,
571+
TContext = unknown
572+
> = (
573+
variables: TVariables,
574+
options?: MutateOptions<TData, TError, TVariables, TContext>
575+
) => Promise<TData>
576+
577+
export interface MutationObserverBaseResult<
568578
TData = unknown,
569579
TError = unknown,
570580
TVariables = void,
@@ -575,9 +585,81 @@ export interface MutationObserverResult<
575585
isLoading: boolean
576586
isSuccess: boolean
577587
mutate: MutateFunction<TData, TError, TVariables, TContext>
588+
mutateAsync: MutateAsyncFunction<TData, TError, TVariables, TContext>
578589
reset: () => void
579590
}
580591

592+
export interface MutationObserverIdleResult<
593+
TData = unknown,
594+
TError = unknown,
595+
TVariables = void,
596+
TContext = unknown
597+
> extends MutationObserverBaseResult<TData, TError, TVariables, TContext> {
598+
data: undefined
599+
error: null
600+
isError: false
601+
isIdle: true
602+
isLoading: false
603+
isSuccess: false
604+
status: 'idle'
605+
}
606+
607+
export interface MutationObserverLoadingResult<
608+
TData = unknown,
609+
TError = unknown,
610+
TVariables = void,
611+
TContext = unknown
612+
> extends MutationObserverBaseResult<TData, TError, TVariables, TContext> {
613+
data: undefined
614+
error: null
615+
isError: false
616+
isIdle: false
617+
isLoading: true
618+
isSuccess: false
619+
status: 'loading'
620+
}
621+
622+
export interface MutationObserverErrorResult<
623+
TData = unknown,
624+
TError = unknown,
625+
TVariables = void,
626+
TContext = unknown
627+
> extends MutationObserverBaseResult<TData, TError, TVariables, TContext> {
628+
data: undefined
629+
error: TError
630+
isError: true
631+
isIdle: false
632+
isLoading: false
633+
isSuccess: false
634+
status: 'error'
635+
}
636+
637+
export interface MutationObserverSuccessResult<
638+
TData = unknown,
639+
TError = unknown,
640+
TVariables = void,
641+
TContext = unknown
642+
> extends MutationObserverBaseResult<TData, TError, TVariables, TContext> {
643+
data: TData
644+
error: null
645+
isError: false
646+
isIdle: false
647+
isLoading: false
648+
isSuccess: true
649+
status: 'success'
650+
}
651+
652+
export type MutationObserverResult<
653+
TData = unknown,
654+
TError = unknown,
655+
TVariables = void,
656+
TContext = unknown
657+
> =
658+
| MutationObserverIdleResult<TData, TError, TVariables, TContext>
659+
| MutationObserverLoadingResult<TData, TError, TVariables, TContext>
660+
| MutationObserverErrorResult<TData, TError, TVariables, TContext>
661+
| MutationObserverSuccessResult<TData, TError, TVariables, TContext>
662+
581663
export interface DefaultOptions<TError = unknown> {
582664
queries?: QueryObserverOptions<unknown, TError>
583665
mutations?: MutationObserverOptions<unknown, TError, unknown, unknown>

src/react/types.ts

Lines changed: 6 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import { RetryValue, RetryDelayValue } from '../core/retryer'
22
import {
33
InfiniteQueryObserverOptions,
44
InfiniteQueryObserverResult,
5-
MutateOptions,
6-
MutationStatus,
5+
MutationObserverResult,
76
MutationKey,
87
QueryObserverOptions,
98
QueryObserverResult,
@@ -99,44 +98,16 @@ export interface UseMutationOptions<
9998
useErrorBoundary?: boolean
10099
}
101100

102-
export type UseMutateFunction<
101+
export type UseBaseMutationResult<
103102
TData = unknown,
104103
TError = unknown,
105-
TVariables = void,
106-
TContext = unknown
107-
> = (
108-
variables: TVariables,
109-
options?: MutateOptions<TData, TError, TVariables, TContext>
110-
) => void
111-
112-
export type UseMutateAsyncFunction<
113-
TData = unknown,
114-
TError = unknown,
115-
TVariables = void,
104+
TVariables = unknown,
116105
TContext = unknown
117-
> = (
118-
variables: TVariables,
119-
options?: MutateOptions<TData, TError, TVariables, TContext>
120-
) => Promise<TData>
106+
> = MutationObserverResult<TData, TError, TVariables, TContext>
121107

122-
export interface UseMutationResult<
108+
export type UseMutationResult<
123109
TData = unknown,
124110
TError = unknown,
125111
TVariables = unknown,
126112
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>
138-
mutateAsync: UseMutateAsyncFunction<TData, TError, TVariables, TContext>
139-
reset: () => void
140-
status: MutationStatus
141-
variables: TVariables | undefined
142-
}
113+
> = 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)