MCPcopy Index your code
hub / github.com/Linen-dev/linen.dev / useAsyncFn

Function useAsyncFn

apps/web/hooks/useAsyncFn.tsx:40–76  ·  view source on GitHub ↗
(
  fn: T,
  deps: DependencyList = [],
  initialState: StateFromFunctionReturningPromise<T> = { loading: false }
)

Source from the content-addressed store, hash-verified

38> = [StateFromFunctionReturningPromise<T>, T];
39
40export default function useAsyncFn<T extends FunctionReturningPromise>(
41 fn: T,
42 deps: DependencyList = [],
43 initialState: StateFromFunctionReturningPromise<T> = { loading: false }
44): AsyncFnReturn<T> {
45 const lastCallId = useRef(0);
46 const isMounted = useMounted();
47 const [state, set] =
48 useState<StateFromFunctionReturningPromise<T>>(initialState);
49
50 const callback = useCallback((...args: Parameters<T>): ReturnType<T> => {
51 const callId = ++lastCallId.current;
52
53 if (!state.loading) {
54 set((prevState) => ({ ...prevState, loading: true }));
55 }
56
57 return fn(...args).then(
58 (value) => {
59 isMounted() &&
60 callId === lastCallId.current &&
61 set({ value, loading: false });
62
63 return value;
64 },
65 (error) => {
66 isMounted() &&
67 callId === lastCallId.current &&
68 set({ error, loading: false });
69
70 return error;
71 }
72 ) as ReturnType<T>;
73 }, deps);
74
75 return [state, callback as unknown as T];
76}

Callers 2

MatrixViewFunction · 0.85
useAsyncFunction · 0.85

Calls 2

useMountedFunction · 0.85
fnFunction · 0.85

Tested by

no test coverage detected