deno.land / x / jotai@v1.8.4 / src / utils / useAtomCallback.ts

useAtomCallback.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
import { useCallback, useMemo } from 'react'import { atom, useSetAtom } from 'jotai'import type { Setter, WritableAtom } from 'jotai'
type Scope = NonNullable<Parameters<typeof useSetAtom>[1]>type WriteGetter = Parameters<WritableAtom<unknown, unknown>['write']>[0]
type Callback<Result, Arg> = undefined extends Arg ? (arg?: Arg) => Result : (arg: Arg) => Result
export function useAtomCallback<Result, Arg>( callback: (get: WriteGetter, set: Setter, arg: Arg) => Promise<Result>, scope?: Scope): Callback<Promise<Result>, Arg>
export function useAtomCallback<Result, Arg>( callback: (get: WriteGetter, set: Setter, arg: Arg) => Result, scope?: Scope): Callback<Result | Promise<Result>, Arg>
export function useAtomCallback<Result, Arg>( callback: ( get: WriteGetter, set: Setter, arg: Arg ) => Result | Promise<Result>, scope?: Scope) { const anAtom = useMemo( () => atom( null, ( get, set, [arg, resolve, reject]: [ Arg, (result: Result | Promise<Result>) => void, (reason: unknown) => void ] ) => { try { resolve(callback(get, set, arg)) } catch (e) { reject(e) } } ), [callback] ) const invoke = useSetAtom(anAtom, scope) return useCallback( (arg: Arg) => { let isSync = true let settled: { v?: Result | Promise<Result>; e?: unknown } = {} const promise = new Promise<Result>((resolve, reject) => { invoke([ arg, (v) => { if (isSync) { settled = { v } } else { resolve(v) } }, (e) => { if (isSync) { settled = { e } } else { reject(e) } }, ]) }) isSync = false if ('e' in settled) { throw settled.e } if ('v' in settled) { return settled.v } return promise }, [invoke] )}
jotai

Version Info

Tagged at
2 years ago