/
createMutation.ts
110 lines (100 loc) 路 2.93 KB
/
createMutation.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import { readable, derived } from 'svelte/store'
import {
type MutationFunction,
type MutationKey,
MutationObserver,
notifyManager,
parseMutationArgs,
} from '@tanstack/query-core'
import type {
CreateMutateFunction,
CreateMutationOptions,
CreateMutationResult,
} from './types'
import { useQueryClient } from './useQueryClient'
export function createMutation<
TData = unknown,
TError = unknown,
TVariables = void,
TContext = unknown,
>(
options: CreateMutationOptions<TData, TError, TVariables, TContext>,
): CreateMutationResult<TData, TError, TVariables, TContext>
export function createMutation<
TData = unknown,
TError = unknown,
TVariables = void,
TContext = unknown,
>(
mutationFn: MutationFunction<TData, TVariables>,
options?: Omit<
CreateMutationOptions<TData, TError, TVariables, TContext>,
'mutationFn'
>,
): CreateMutationResult<TData, TError, TVariables, TContext>
export function createMutation<
TData = unknown,
TError = unknown,
TVariables = void,
TContext = unknown,
>(
mutationKey: MutationKey,
options?: Omit<
CreateMutationOptions<TData, TError, TVariables, TContext>,
'mutationKey'
>,
): CreateMutationResult<TData, TError, TVariables, TContext>
export function createMutation<
TData = unknown,
TError = unknown,
TVariables = void,
TContext = unknown,
>(
mutationKey: MutationKey,
mutationFn?: MutationFunction<TData, TVariables>,
options?: Omit<
CreateMutationOptions<TData, TError, TVariables, TContext>,
'mutationKey' | 'mutationFn'
>,
): CreateMutationResult<TData, TError, TVariables, TContext>
export function createMutation<
TData = unknown,
TError = unknown,
TVariables = void,
TContext = unknown,
>(
arg1:
| MutationKey
| MutationFunction<TData, TVariables>
| CreateMutationOptions<TData, TError, TVariables, TContext>,
arg2?:
| MutationFunction<TData, TVariables>
| CreateMutationOptions<TData, TError, TVariables, TContext>,
arg3?: CreateMutationOptions<TData, TError, TVariables, TContext>,
): CreateMutationResult<TData, TError, TVariables, TContext> {
const options = parseMutationArgs(arg1, arg2, arg3)
const queryClient = useQueryClient()
let observer = new MutationObserver<TData, TError, TVariables, TContext>(
queryClient,
options,
)
let mutate: CreateMutateFunction<TData, TError, TVariables, TContext>
readable(observer).subscribe(($observer) => {
observer = $observer
mutate = (variables, mutateOptions) => {
observer.mutate(variables, mutateOptions).catch(noop)
}
observer.setOptions(options)
})
const result = readable(observer.getCurrentResult(), (set) => {
return observer.subscribe(notifyManager.batchCalls((val) => set(val)))
})
const { subscribe } = derived(result, ($result) => ({
...$result,
mutate,
mutateAsync: $result.mutate,
}))
return { subscribe }
}
// eslint-disable-next-line @typescript-eslint/no-empty-function
function noop() {}