deno.land / x / jotai@v1.8.4 / src / urql / atomWithMutation.ts

atomWithMutation.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
import type { AnyVariables, Client, OperationContext, OperationResult, TypedDocumentNode,} from '@urql/core'import { atom } from 'jotai'import type { Getter } from 'jotai'import { clientAtom } from './clientAtom'
type MutationAction<Data, Variables extends AnyVariables> = { variables: Variables context?: Partial<OperationContext> callback?: (result: OperationResult<Data, Variables>) => void}
export function atomWithMutation<Data, Variables extends AnyVariables>( createQuery: (get: Getter) => TypedDocumentNode<Data, Variables> | string, getClient: (get: Getter) => Client = (get) => get(clientAtom)) { const operationResultAtom = atom< OperationResult<Data, Variables> | Promise<OperationResult<Data, Variables>> >( new Promise<OperationResult<Data, Variables>>(() => {}) // infinite pending ) const queryResultAtom = atom( (get) => get(operationResultAtom), async (get, set, action: MutationAction<Data, Variables>) => { set( operationResultAtom, new Promise<OperationResult<Data, Variables>>(() => {}) // new fetch ) const client = getClient(get) const query = createQuery(get) return client .mutation(query, action.variables, action.context) .toPromise() .then((result) => { action.callback?.(result) if (result.error) { throw result.error } set(operationResultAtom, result) }) } ) return queryResultAtom}
jotai

Version Info

Tagged at
2 years ago