1+ /* eslint-disable @typescript-eslint/no-use-before-define */
12/* eslint-disable no-console */
23import { useEffect , useMemo , useState } from 'react' ;
3- import ReactDOM from 'react-dom' ;
44import { useLocation , useNavigate } from 'react-router-dom' ;
55import CssBaseline from '@mui/material/CssBaseline' ;
66import { ThemeProvider , StyledEngineProvider } from '@mui/material/styles' ;
@@ -24,10 +24,22 @@ function useQuery() {
2424 return useMemo ( ( ) => new URLSearchParams ( search ) , [ search ] ) ;
2525}
2626
27+ function RootComponent ( props ) {
28+ const PegaConnectObj = createPConnectComponent ( ) ;
29+ const thePConnObj = < PegaConnectObj { ...props } /> ;
30+
31+ const contextValue = useMemo ( ( ) => {
32+ return { store : PCore . getStore ( ) } ;
33+ } , [ ] ) ;
34+
35+ return < StoreContext . Provider value = { contextValue } > { thePConnObj } </ StoreContext . Provider > ;
36+ }
37+
2738export default function FullPortal ( ) {
2839 const [ portalSelectionScreen , setPortalSelectionScreen ] = useState ( false ) ;
2940 const [ defaultPortalName , setDefaultPortalName ] = useState ( '' ) ;
3041 const [ availablePortals , setAvailablePortals ] = useState < string [ ] > ( [ ] ) ;
42+ const [ rootComponentProps , setRootComponentProps ] = useState < Element | null > ( null ) ;
3143
3244 const navigate = useNavigate ( ) ;
3345 const query = useQuery ( ) ;
@@ -40,71 +52,16 @@ export default function FullPortal() {
4052 sessionStorage . setItem ( 'rsdk_locale' , localeOverride ) ;
4153 }
4254
43- // const outlet = document.getElementById("outlet");
44-
45- // from react_root.js with some modifications
46- // eslint-disable-next-line react/no-unstable-nested-components
47- function RootComponent ( props ) {
48- // const { portalTarget, styleSheetTarget } = props;
49- const PegaConnectObj = createPConnectComponent ( ) ;
50-
51- // remove from Provider to work around compiler error for now: context={StoreContext}
52- // return (
53- // <Provider store={PCore.getStore()} context={StoreContext} >
54- // <PegaConnectObj {...props} />
55- // </Provider>
56- // );
57-
58- // const thePConnObj = <div>the RootComponent</div>;
59- const thePConnObj = < PegaConnectObj { ...props } /> ;
60-
61- return (
62- // eslint-disable-next-line react/jsx-no-constructed-context-values
63- < StoreContext . Provider value = { { store : PCore . getStore ( ) } } > { thePConnObj } </ StoreContext . Provider >
64- ) ;
65- }
66-
6755 /**
6856 * Callback from onPCoreReady that's called once the top-level render object
6957 * is ready to be rendered
7058 * @param inRenderObj the initial, top-level PConnect object to render
7159 */
7260 function initialRender ( inRenderObj ) {
73- // modified from react_root.js render
74- const { props, domContainerID = null , componentName, portalTarget, styleSheetTarget } = inRenderObj ;
75- let target : any = null ;
76- if ( domContainerID !== null ) {
77- target = document . getElementById ( domContainerID ) ;
78- } else if ( portalTarget !== null ) {
79- target = portalTarget ;
80- }
81- const Component : any = RootComponent ;
82- if ( componentName ) {
83- Component . displayName = componentName ;
84- }
85-
86- // 1st arg was:
87- // <Component
88- // {...props}
89- // portalTarget={portalTarget}
90- // styleSheetTarget={styleSheetTarget}
91- // />,
92-
93- // var theComponent = <div>the Component</div>;
94- const theComponent = (
95- < StyledEngineProvider injectFirst >
96- < ThemeProvider theme = { theme } >
97- < CssBaseline />
98- < Component { ...props } portalTarget = { portalTarget } styleSheetTarget = { styleSheetTarget } /> ;
99- </ ThemeProvider >
100- </ StyledEngineProvider >
101- ) ;
61+ const { props, portalTarget, styleSheetTarget } = inRenderObj ;
10262
103- ReactDOM . render (
104- // was <Component
105- theComponent ,
106- target || document . getElementById ( 'pega-root' ) || document . getElementsByTagName ( domContainerID ) [ 0 ]
107- ) ;
63+ // set root components props
64+ setRootComponentProps ( { ...props , portalTarget, styleSheetTarget } ) ;
10865 }
10966
11067 /**
@@ -162,25 +119,18 @@ export default function FullPortal() {
162119 const redirectUrl : any = sessionStorage . getItem ( 'url' ) ;
163120 navigate ( redirectUrl ) ;
164121 sessionStorage . removeItem ( 'url' ) ;
165- let localeOverride : any = sessionStorage . getItem ( 'rsdk_locale' ) ;
166- if ( ! localeOverride ) {
167- localeOverride = undefined ;
168- }
122+
123+ const locale : any = sessionStorage . getItem ( 'rsdk_locale' ) || undefined ;
169124 // appName and mainRedirect params have to be same as earlier invocation
170- loginIfNecessary ( { appName : 'portal' , mainRedirect : true , locale : localeOverride , enableSemanticUrls : true } ) ;
125+ loginIfNecessary ( { appName : 'portal' , mainRedirect : true , locale } ) ;
171126 }
172127
173128 // One time (initialization)
174129 useEffect ( ( ) => {
175- document . addEventListener ( 'SdkConstellationReady' , ( ) => {
176- // start the portal
177- sessionStorage . setItem ( 'isLoggedIn' , 'true' ) ;
178- startPortal ( ) ;
179- } ) ;
180- let localeOverride : any = sessionStorage . getItem ( 'rsdk_locale' ) ;
181- if ( ! localeOverride ) {
182- localeOverride = undefined ;
183- }
130+ document . addEventListener ( 'SdkConstellationReady' , handleSdkConstellationReady ) ;
131+
132+ const locale : any = sessionStorage . getItem ( 'rsdk_locale' ) || undefined ;
133+
184134 const isLoggedIn = sessionStorage . getItem ( 'isLoggedIn' ) ;
185135 const redirected = sessionStorage . getItem ( 'redirected' ) ;
186136 if ( isLoggedIn !== 'true' && redirected !== 'true' ) {
@@ -193,16 +143,27 @@ export default function FullPortal() {
193143 appName : 'portal' ,
194144 mainRedirect : true ,
195145 redirectDoneCB : doRedirectDone ,
196- locale : localeOverride ,
197- enableSemanticUrls : true
146+ locale
147+ // semanticUrls : true
198148 } ) ;
199149 } , [ ] ) ;
200150
151+ const handleSdkConstellationReady = ( ) => {
152+ sessionStorage . setItem ( 'isLoggedIn' , 'true' ) ;
153+ // start the portal
154+ startPortal ( ) ;
155+ } ;
156+
201157 return portalSelectionScreen ? (
202158 < InvalidPortal defaultPortal = { defaultPortalName } portals = { availablePortals } onSelect = { loadSelectedPortal } />
203159 ) : (
204- < div >
205- < div id = 'pega-root' />
160+ < div id = 'pega-root' >
161+ < StyledEngineProvider injectFirst >
162+ < ThemeProvider theme = { theme } >
163+ < CssBaseline />
164+ { rootComponentProps && < RootComponent { ...rootComponentProps } /> }
165+ </ ThemeProvider >
166+ </ StyledEngineProvider >
206167 </ div >
207168 ) ;
208169}
0 commit comments