Skip to content

Commit b1fb5e3

Browse files
authored
refactor: full portal code refactor (#538)
1 parent 38f77b0 commit b1fb5e3

File tree

1 file changed

+48
-79
lines changed

1 file changed

+48
-79
lines changed

src/samples/FullPortal/index.tsx

Lines changed: 48 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
/* eslint-disable @typescript-eslint/no-use-before-define */
2+
/* eslint-disable no-console */
13
import { useEffect, useMemo, useState } from 'react';
2-
import ReactDOM from 'react-dom';
34
import { useLocation, useNavigate } from 'react-router-dom';
45
import CssBaseline from '@mui/material/CssBaseline';
56
import { 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+
2638
export 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

Comments
 (0)