UNPKG

815 BTypeScriptView Raw
1import * as React from 'react';
2
3export default function useThenable<T>(create: () => PromiseLike<T>) {
4 const [promise] = React.useState(create);
5
6 let initialState: [boolean, T | undefined] = [false, undefined];
7
8 // Check if our thenable is synchronous
9 promise.then((result) => {
10 initialState = [true, result];
11 });
12
13 const [state, setState] = React.useState(initialState);
14 const [resolved] = state;
15
16 React.useEffect(() => {
17 let cancelled = false;
18
19 const resolve = async () => {
20 let result;
21
22 try {
23 result = await promise;
24 } finally {
25 if (!cancelled) {
26 setState([true, result]);
27 }
28 }
29 };
30
31 if (!resolved) {
32 resolve();
33 }
34
35 return () => {
36 cancelled = true;
37 };
38 }, [promise, resolved]);
39
40 return state;
41}