1+ /* eslint-disable @typescript-eslint/no-use-before-define */
2+ /* eslint-disable no-console */
13import { useEffect , useMemo , useState } from 'react' ;
2- import ReactDOM from 'react-dom' ;
34import { useLocation , useNavigate } from 'react-router-dom' ;
45import CssBaseline from '@mui/material/CssBaseline' ;
56import { ThemeProvider , StyledEngineProvider } from '@mui/material/styles' ;
@@ -23,10 +24,22 @@ function useQuery() {
2324 return useMemo ( ( ) => new URLSearchParams ( search ) , [ search ] ) ;
2425}
2526
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+
2638export default function FullPortal ( ) {
2739 const [ portalSelectionScreen , setPortalSelectionScreen ] = useState ( false ) ;
2840 const [ defaultPortalName , setDefaultPortalName ] = useState ( '' ) ;
2941 const [ availablePortals , setAvailablePortals ] = useState < string [ ] > ( [ ] ) ;
42+ const [ rootComponentProps , setRootComponentProps ] = useState < object | null > ( null ) ;
3043
3144 const navigate = useNavigate ( ) ;
3245 const query = useQuery ( ) ;
@@ -39,71 +52,16 @@ export default function FullPortal() {
3952 sessionStorage . setItem ( 'rsdk_locale' , localeOverride ) ;
4053 }
4154
42- // const outlet = document.getElementById("outlet");
43-
44- // from react_root.js with some modifications
45- // eslint-disable-next-line react/no-unstable-nested-components
46- function RootComponent ( props ) {
47- // const { portalTarget, styleSheetTarget } = props;
48- const PegaConnectObj = createPConnectComponent ( ) ;
49-
50- // remove from Provider to work around compiler error for now: context={StoreContext}
51- // return (
52- // <Provider store={PCore.getStore()} context={StoreContext} >
53- // <PegaConnectObj {...props} />
54- // </Provider>
55- // );
56-
57- // const thePConnObj = <div>the RootComponent</div>;
58- const thePConnObj = < PegaConnectObj { ...props } /> ;
59-
60- return (
61- // eslint-disable-next-line react/jsx-no-constructed-context-values
62- < StoreContext . Provider value = { { store : PCore . getStore ( ) } } > { thePConnObj } </ StoreContext . Provider >
63- ) ;
64- }
65-
6655 /**
6756 * Callback from onPCoreReady that's called once the top-level render object
6857 * is ready to be rendered
6958 * @param inRenderObj the initial, top-level PConnect object to render
7059 */
7160 function initialRender ( inRenderObj ) {
72- // modified from react_root.js render
73- const { props, domContainerID = null , componentName, portalTarget, styleSheetTarget } = inRenderObj ;
74- let target : any = null ;
75- if ( domContainerID !== null ) {
76- target = document . getElementById ( domContainerID ) ;
77- } else if ( portalTarget !== null ) {
78- target = portalTarget ;
79- }
80- const Component : any = RootComponent ;
81- if ( componentName ) {
82- Component . displayName = componentName ;
83- }
84-
85- // 1st arg was:
86- // <Component
87- // {...props}
88- // portalTarget={portalTarget}
89- // styleSheetTarget={styleSheetTarget}
90- // />,
61+ const { props, portalTarget, styleSheetTarget } = inRenderObj ;
9162
92- // var theComponent = <div>the Component</div>;
93- const theComponent = (
94- < StyledEngineProvider injectFirst >
95- < ThemeProvider theme = { theme } >
96- < CssBaseline />
97- < Component { ...props } portalTarget = { portalTarget } styleSheetTarget = { styleSheetTarget } /> ;
98- </ ThemeProvider >
99- </ StyledEngineProvider >
100- ) ;
101-
102- ReactDOM . render (
103- // was <Component
104- theComponent ,
105- target || document . getElementById ( 'pega-root' ) || document . getElementsByTagName ( domContainerID ) [ 0 ]
106- ) ;
63+ // set root components props
64+ setRootComponentProps ( { ...props , portalTarget, styleSheetTarget } ) ;
10765 }
10866
10967 /**
@@ -118,7 +76,6 @@ export default function FullPortal() {
11876 // Initialize the SdkComponentMap (local and pega-provided)
11977 // eslint-disable-next-line @typescript-eslint/no-unused-vars
12078 getSdkComponentMap ( localSdkComponentMap ) . then ( ( theComponentMap : any ) => {
121- // eslint-disable-next-line no-console
12279 console . log ( `SdkComponentMap initialized` ) ;
12380
12481 // Don't call initialRender until SdkComponentMap is fully initialized
@@ -137,15 +94,12 @@ export default function FullPortal() {
13794 if ( queryPortal ) {
13895 myLoadPortal ( 'pega-root' , queryPortal , [ ] ) ;
13996 } else if ( thePortal ) {
140- // eslint-disable-next-line no-console
14197 console . log ( `Loading specified appPortal: ${ thePortal } ` ) ;
14298 myLoadPortal ( 'pega-root' , thePortal , [ ] ) ;
14399 } else if ( myLoadDefaultPortal && defaultPortal && ! excludePortals . includes ( defaultPortal ) ) {
144- // eslint-disable-next-line no-console
145100 console . log ( `Loading default portal` ) ;
146101 myLoadDefaultPortal ( 'pega-root' , [ ] ) ;
147102 } else {
148- // eslint-disable-next-line no-console
149103 console . log ( 'Loading portal selection screen' ) ;
150104 setPortalSelectionScreen ( true ) ;
151105 setDefaultPortalName ( defaultPortal ) ;
@@ -162,39 +116,54 @@ export default function FullPortal() {
162116 }
163117
164118 function doRedirectDone ( ) {
165- navigate ( window . location . pathname ) ;
166- let localeOverride : any = sessionStorage . getItem ( 'rsdk_locale' ) ;
167- if ( ! localeOverride ) {
168- localeOverride = undefined ;
169- }
119+ const redirectUrl : any = sessionStorage . getItem ( 'url' ) ;
120+ navigate ( redirectUrl ) ;
121+ sessionStorage . removeItem ( 'url' ) ;
122+
123+ const locale : any = sessionStorage . getItem ( 'rsdk_locale' ) || undefined ;
170124 // appName and mainRedirect params have to be same as earlier invocation
171- loginIfNecessary ( { appName : 'portal' , mainRedirect : true , locale : localeOverride } ) ;
125+ loginIfNecessary ( { appName : 'portal' , mainRedirect : true , locale } ) ;
172126 }
173127
174128 // One time (initialization)
175129 useEffect ( ( ) => {
176- document . addEventListener ( 'SdkConstellationReady' , ( ) => {
177- // start the portal
178- startPortal ( ) ;
179- } ) ;
180- let localeOverride : any = sessionStorage . getItem ( 'rsdk_locale' ) ;
181- if ( ! localeOverride ) {
182- localeOverride = undefined ;
130+ document . addEventListener ( 'SdkConstellationReady' , handleSdkConstellationReady ) ;
131+
132+ const locale : any = sessionStorage . getItem ( 'rsdk_locale' ) || undefined ;
133+
134+ const isLoggedIn = sessionStorage . getItem ( 'isLoggedIn' ) ;
135+ const redirected = sessionStorage . getItem ( 'redirected' ) ;
136+ if ( isLoggedIn !== 'true' && redirected !== 'true' ) {
137+ sessionStorage . setItem ( 'url' , window . location . pathname ) ;
138+ navigate ( '/portal' ) ;
183139 }
140+ sessionStorage . setItem ( 'redirected' , 'true' ) ;
184141 // Login if needed, doing an initial main window redirect
185142 loginIfNecessary ( {
186143 appName : 'portal' ,
187144 mainRedirect : true ,
188145 redirectDoneCB : doRedirectDone ,
189- locale : localeOverride
146+ locale
147+ // semanticUrls: true //. enable this line for semantic urls
190148 } ) ;
191149 } , [ ] ) ;
192150
151+ const handleSdkConstellationReady = ( ) => {
152+ sessionStorage . setItem ( 'isLoggedIn' , 'true' ) ;
153+ // start the portal
154+ startPortal ( ) ;
155+ } ;
156+
193157 return portalSelectionScreen ? (
194158 < InvalidPortal defaultPortal = { defaultPortalName } portals = { availablePortals } onSelect = { loadSelectedPortal } />
195159 ) : (
196- < div >
197- < 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 >
198167 </ div >
199168 ) ;
200169}
0 commit comments