1- import { Suspense , useMemo } from 'react' ;
1+ import React , { useMemo , Suspense } from 'react' ;
22import { Route } from 'react-router-dom' ;
33import PropTypes from 'prop-types' ;
44
@@ -12,6 +12,7 @@ import { invokeEventHandlers } from './handlerService';
1212import { packageName } from './constants' ;
1313import { ModuleHierarchyProvider } from './components' ;
1414import events from './events' ;
15+ import loadRemoteComponent from './loadRemoteComponent' ;
1516
1617// Process and cache "app" type modules and render the routes
1718const AppRoutes = ( { modules, stripes } ) => {
@@ -23,11 +24,13 @@ const AppRoutes = ({ modules, stripes }) => {
2324 const perm = `module.${ name } .enabled` ;
2425 if ( ! stripes . hasPerm ( perm ) ) return null ;
2526
27+ const RemoteComponent = React . lazy ( ( ) => loadRemoteComponent ( module . url , module . name ) ) ;
2628 const connect = connectFor ( module . module , stripes . epics , stripes . logger ) ;
2729
2830 let ModuleComponent ;
31+
2932 try {
30- ModuleComponent = connect ( module . getModule ( ) ) ;
33+ ModuleComponent = connect ( RemoteComponent ) ;
3134 } catch ( error ) {
3235 console . error ( error ) ; // eslint-disable-line
3336 throw Error ( error ) ;
@@ -48,39 +51,41 @@ const AppRoutes = ({ modules, stripes }) => {
4851 } , [ modules . app , stripes ] ) ;
4952
5053 return cachedModules . map ( ( { ModuleComponent, connect, module, name, moduleStripes, stripes : propsStripes , displayName } ) => (
51- < Route
52- path = { module . route }
53- key = { module . route }
54- render = { props => {
55- const data = { displayName, name } ;
54+ < Suspense fallback = { < LoadingView /> } >
55+ < Route
56+ path = { module . route }
57+ key = { module . route }
58+ render = { props => {
59+ const data = { displayName, name } ;
5660
57- // allow SELECT_MODULE handlers to intervene
58- const handlerComponents = invokeEventHandlers ( events . SELECT_MODULE , moduleStripes , modules . handler , data ) ;
59- if ( handlerComponents . length ) {
60- return handlerComponents . map ( Handler => ( < Handler stripes = { propsStripes } data = { data } /> ) ) ;
61- }
61+ // allow SELECT_MODULE handlers to intervene
62+ const handlerComponents = invokeEventHandlers ( events . SELECT_MODULE , moduleStripes , modules . handler , data ) ;
63+ if ( handlerComponents . length ) {
64+ return handlerComponents . map ( Handler => ( < Handler stripes = { propsStripes } data = { data } /> ) ) ;
65+ }
6266
63- return (
64- < StripesContext . Provider value = { moduleStripes } >
65- < ModuleHierarchyProvider module = { module . module } >
66- < div id = { `${ name } -module-display` } data-module = { module . module } data-version = { module . version } >
67- < RouteErrorBoundary
68- escapeRoute = { module . home ?? module . route }
69- moduleName = { displayName }
70- stripes = { moduleStripes }
71- >
72- < TitleManager page = { displayName } >
73- < Suspense fallback = { < LoadingView /> } >
74- < ModuleComponent { ...props } connect = { connect } stripes = { moduleStripes } actAs = "app" />
75- </ Suspense >
76- </ TitleManager >
77- </ RouteErrorBoundary >
78- </ div >
79- </ ModuleHierarchyProvider >
80- </ StripesContext . Provider >
81- ) ;
82- } }
83- />
67+ return (
68+ < StripesContext . Provider value = { moduleStripes } >
69+ < ModuleHierarchyProvider module = { module . module } >
70+ < div id = { `${ name } -module-display` } data-module = { module . module } data-version = { module . version } >
71+ < RouteErrorBoundary
72+ escapeRoute = { module . home ?? module . route }
73+ moduleName = { displayName }
74+ stripes = { moduleStripes }
75+ >
76+ < TitleManager page = { displayName } >
77+ < Suspense fallback = { < LoadingView /> } >
78+ < ModuleComponent { ...props } connect = { connect } stripes = { moduleStripes } actAs = "app" />
79+ </ Suspense >
80+ </ TitleManager >
81+ </ RouteErrorBoundary >
82+ </ div >
83+ </ ModuleHierarchyProvider >
84+ </ StripesContext . Provider >
85+ ) ;
86+ } }
87+ />
88+ </ Suspense >
8489 ) ) ;
8590} ;
8691
0 commit comments