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