Skip to content

Commit add4ae8

Browse files
committed
refactor: full portal code refactor
1 parent f5ed724 commit add4ae8

File tree

1 file changed

+38
-77
lines changed
  • packages/react-sdk-components/src/samples/FullPortal

1 file changed

+38
-77
lines changed
Lines changed: 38 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
/* eslint-disable @typescript-eslint/no-use-before-define */
12
/* eslint-disable no-console */
23
import { useEffect, useMemo, useState } from 'react';
3-
import ReactDOM from 'react-dom';
44
import { useLocation, useNavigate } from 'react-router-dom';
55
import CssBaseline from '@mui/material/CssBaseline';
66
import { 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+
2738
export 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

Comments
 (0)