Skip to content

Commit e2215c1

Browse files
committed
[WIP] LazyComponent
1 parent 3b4323c commit e2215c1

1 file changed

Lines changed: 27 additions & 13 deletions

File tree

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,39 @@
1-
import { Suspense, JSX } from "react";
1+
import { Suspense, JSX, ComponentType, ReactNode } from "react";
22

3-
const promise: { name: string; promise: Promise<void>; response?:()=>JSX.Element }[] = [];
4-
const DynamicComponent = ({ name }: { name: string }) => {
3+
const promise: { factorySerialized: string; promise: Promise<void>; response?: () => JSX.Element, reject?: unknown }[] = [];
4+
const DynamicComponent = ({ factory, beforeLoad, afterLoad }: { factory: () => Promise<unknown>, beforeLoad?: () => void, afterLoad?: () => void }) => {
5+
const fSerialized = factory.toString();
56
for (const prom of promise) {
6-
if (prom.name === name) {
7-
return prom.response && prom.response();
7+
if (prom.factorySerialized === fSerialized) {
8+
if (prom.response) {
9+
!!afterLoad && afterLoad();
10+
return prom.response && prom.response();
11+
}
12+
if (prom.reject) {
13+
throw prom.reject;
14+
}
15+
throw prom.promise;
816
}
917
}
1018

1119
const current: typeof promise[number] = {
12-
name,
13-
promise: import(`../components/hooks/${name}/${name.charAt(0).toUpperCase() + name.substring(1)}.tsx`).then((res) => {
14-
current.response = res[name.charAt(0).toUpperCase() + name.substring(1)]
15-
}),
20+
factorySerialized: fSerialized,
21+
promise: (() => {
22+
!!beforeLoad && beforeLoad();
23+
return factory()
24+
.then((res) => {
25+
const keys = Object.getOwnPropertyNames(res);
26+
current.response = Reflect.get(res as object, keys[0]);
27+
})
28+
.catch(err => current.reject = err);
29+
})(),
1630
}
1731
promise.push(current);
1832
throw current.promise;
1933
};
2034

21-
const LazyComponent = ({ name }: { name: string }) => {
22-
return <Suspense fallback="loading">
23-
<DynamicComponent name={name} />
35+
export const LazyComponent = <T extends ComponentType<unknown>>({ factory, fallback, beforeLoad, afterLoad }: { factory: () => Promise<T | { default: T }>, fallback?: ReactNode, beforeLoad?: ()=>void, afterLoad?: ()=>void }) => {
36+
return <Suspense fallback={fallback}>
37+
<DynamicComponent factory={factory} beforeLoad={beforeLoad} afterLoad={afterLoad} />
2438
</Suspense>
25-
}
39+
}

0 commit comments

Comments
 (0)