UNPKG

3.09 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5require('./chunk/constants.js');
6var utils = require('./chunk/utils.js');
7var core = require('./core.js');
8
9let def = "default";
10
11let typeLoading = "loading";
12
13let typeResolve = "resolve";
14
15let typeReject = "reject";
16
17let defMsLoading = 100;
18
19let WhenLoading = () => ({ loading, ...props }) =>
20 utils.isFunction(loading) ? loading(props) : loading;
21
22let WhenError = () => ({ error = "", ...props }) =>
23 utils.isFunction(error) ? error(props) : error;
24
25let WhenEmpty = () => () => "";
26
27/**
28 * It allows to load a component asynchronously.
29 * @param {Function} callback
30 * @param {object} [props]
31 *
32 * @todo add promise error detection behavior
33 */
34function useLazy(callback, args = [], msLoading = defMsLoading) {
35 let [Component, setComponent] = core.useState(WhenEmpty);
36 core.useEffect(() => {
37 let cancel;
38 let ready;
39
40 callback()
41 .then(data => {
42 ready = true;
43 if (!cancel) {
44 let value = def in data ? data[def] : data;
45 setComponent(() => props =>
46 utils.isFunction(value) ? value(props) : value
47 );
48 }
49 })
50 .catch(() => {
51 ready = true;
52 if (!cancel) setComponent(WhenError);
53 });
54
55 setTimeout(
56 () => !cancel && !ready && setComponent(WhenLoading),
57 msLoading
58 );
59 return () => {
60 cancel = true;
61 if (ready) setComponent(() => WhenEmpty);
62 };
63 }, args);
64
65 return Component;
66}
67
68function useLazyNode(callback, msLoading = defMsLoading) {
69 let [prevent, setPrevent] = core.useState(true);
70 let [status, setStatus] = core.useState();
71 let [Component, setComponent] = core.useState(WhenEmpty);
72
73 function CaseProxy(props) {
74 if (prevent) setPrevent(prevent => (prevent ? false : prevent));
75 return status == typeLoading
76 ? WhenLoading()(props)
77 : status == typeResolve
78 ? Component(props)
79 : status == typeReject
80 ? WhenError()(props)
81 : WhenEmpty()();
82 }
83
84 core.useEffect(() => {
85 if (!prevent) {
86 callback()
87 .then(md => {
88 setStatus(typeResolve);
89 setComponent(() => (def in md ? md[def] : md));
90 })
91 .catch(e => setStatus(typeReject));
92 setTimeout(
93 () =>
94 setStatus(status =>
95 [typeLoading, typeReject, typeResolve].includes(status)
96 ? status
97 : typeLoading
98 ),
99 msLoading
100 );
101 }
102 }, [prevent]);
103
104 return CaseProxy;
105}
106
107exports.useLazy = useLazy;
108exports.useLazyNode = useLazyNode;
109//# sourceMappingURL=use-lazy.js.map