/
react.ts
61 lines (55 loc) · 1.27 KB
/
react.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
import { useState } from "https://esm.sh/react@18.2.0";
import {
useObservable,
useSubscription,
} from "https://esm.sh/observable-hooks@4.2.0";
import { Observable, switchMap } from "./rxjs.ts";
type UseResourceReturnType<T extends any> =
| {
isLoading: true;
isError: false;
data: undefined;
}
| {
isLoading: false;
isError: false;
data: T;
}
| {
isLoading: false;
isError: true;
data: undefined;
};
export const useResource = <T extends any, P extends React.DependencyList>(
observableInit: (...params: P) => Observable<T>,
dependencyList?: P
) => {
const [state, setState] = useState<UseResourceReturnType<T>>({
isLoading: true,
isError: false,
data: undefined,
});
const resource = dependencyList
? useObservable<T, P>((inputs$) => {
return inputs$.pipe(switchMap((params) => observableInit(...params)));
}, dependencyList as [...P])
: useObservable<T>(observableInit);
useSubscription(
resource,
(value) => {
setState({
isLoading: false,
isError: false,
data: value,
});
},
(_error) => {
setState({
isLoading: false,
isError: true,
data: undefined,
});
}
);
return state;
};