Skip to content

Commit 1582fa9

Browse files
committed
refactor: create case mashup api moved to PegaReady Context
1 parent 21f34fe commit 1582fa9

File tree

3 files changed

+72
-34
lines changed

3 files changed

+72
-34
lines changed

packages/react-sdk-components/src/samples/Embedded/MainScreen/index.tsx

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ const useStyles = makeStyles(theme => ({
107107

108108
export default function MainScreen() {
109109
const { isAuthenticated } = usePegaAuth();
110-
const { isPegaReady, PegaContainer } = usePega();
110+
const { isPegaReady, PegaContainer, createCase } = usePega();
111111

112112
const classes = useStyles();
113113

@@ -149,14 +149,8 @@ export default function MainScreen() {
149149
setShowLandingPage(false);
150150
setShowPega(true);
151151
const sdkConfig = await getSdkConfig();
152-
let mashupCaseType = sdkConfig.serverConfig.appMashupCaseType;
153-
// If mashupCaseType is null or undefined, get the first case type from the environment info
154-
if (!mashupCaseType) {
155-
const caseTypes = PCore.getEnvironmentInfo()?.environmentInfoObject?.pyCaseTypeList;
156-
if (caseTypes && caseTypes.length > 0) {
157-
mashupCaseType = mashupCaseType = caseTypes[0].pyWorkTypeImplementationClassName;
158-
}
159-
}
152+
const mashupCaseType = sdkConfig.serverConfig.appMashupCaseType;
153+
160154
let selectedPhoneGUID = '';
161155
const phoneName = optionClicked ? optionClicked.trim() : '';
162156
switch (phoneName) {
@@ -188,12 +182,10 @@ export default function MainScreen() {
188182
console.warn(`Unexpected case type: ${mashupCaseType}. PhoneModelss field not set.`);
189183
}
190184

191-
// Create a new case using the mashup API
192-
PCore.getMashupApi()
193-
.createCase(mashupCaseType, PCore.getConstants().APP.APP, options)
194-
.then(() => {
195-
console.log('createCase rendering is complete');
196-
});
185+
// Call the createCase function from context to create a new case using the mashup API
186+
createCase(mashupCaseType, options).then(() => {
187+
console.log('createCase rendering is complete');
188+
});
197189
};
198190

199191
function renderLandingPage() {
@@ -241,7 +233,7 @@ export default function MainScreen() {
241233
);
242234
}
243235

244-
if (!isAuthenticated) return <div>Loading...</div>;
236+
if (!isAuthenticated) return <div style={{ textAlign: 'center' }}>Loading...</div>;
245237

246238
return (
247239
<div className={classes.appContainer}>

packages/react-sdk-components/src/samples/Embedded/context/PegaReadyContext.tsx

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { createContext, useContext, useEffect, useMemo, useState } from 'react';
2+
import { CssBaseline, StyledEngineProvider, ThemeProvider } from '@mui/material';
3+
import type { CaseOptions } from '@pega/pcore-pconnect-typedefs/mashup/types';
24

35
import StoreContext from '../../../bridge/Context/StoreContext';
46
import createPConnectComponent from '../../../bridge/react_pconnect';
@@ -29,21 +31,28 @@ function RootComponent(props) {
2931
interface PegaContextProps {
3032
isPegaReady: boolean;
3133
rootPConnect?: typeof PConnect; // Function to get Pega Connect object, if available
34+
createCase: (mashupCaseType: string, options: CaseOptions) => Promise<void>;
3235
PegaContainer: React.FC;
3336
}
3437

3538
declare const myLoadMashup: any;
3639

3740
const PegaContext = createContext<PegaContextProps | undefined>(undefined);
3841

39-
export const PegaReadyProvider: React.FC<React.PropsWithChildren> = ({ children }) => {
42+
interface PegaReadyProviderProps {
43+
theme: any;
44+
}
45+
46+
export const PegaReadyProvider: React.FC<React.PropsWithChildren<PegaReadyProviderProps>> = ({ children, theme }) => {
4047
const { isAuthenticated } = usePegaAuth();
4148
const [isPegaReady, setIsPegaReady] = useState<boolean>(false);
4249
const [rootProps, setRootProps] = useState<{
4350
getPConnect?: () => typeof PConnect;
4451
[key: string]: any;
4552
}>({});
4653

54+
const [loading, setLoading] = useState<boolean>(false);
55+
4756
const startMashup = async () => {
4857
try {
4958
PCore.onPCoreReady(async renderObj => {
@@ -84,9 +93,53 @@ export const PegaReadyProvider: React.FC<React.PropsWithChildren> = ({ children
8493
return undefined;
8594
}, [rootProps]);
8695

87-
const PegaContainer = () => (isPegaReady ? <RootComponent {...rootProps} /> : null);
96+
const createCase = (mashupCaseType: string, options: CaseOptions) => {
97+
if (!isPegaReady) {
98+
console.error('Pega is not ready. Cannot create case.');
99+
return Promise.reject('Pega is not ready');
100+
}
101+
102+
setLoading(true);
103+
return new Promise<void>((resolve, reject) => {
104+
// If mashupCaseType is null or undefined, get the first case type from the environment info
105+
if (!mashupCaseType) {
106+
const caseTypes = PCore.getEnvironmentInfo()?.environmentInfoObject?.pyCaseTypeList;
107+
if (caseTypes && caseTypes.length > 0) {
108+
mashupCaseType = caseTypes[0].pyWorkTypeImplementationClassName;
109+
}
110+
}
111+
112+
PCore.getMashupApi()
113+
.createCase(mashupCaseType, PCore.getConstants().APP.APP, options)
114+
.then(() => {
115+
resolve();
116+
})
117+
.catch(error => {
118+
console.error('Error creating case:', error);
119+
reject(error);
120+
})
121+
.finally(() => {
122+
setLoading(false);
123+
});
124+
});
125+
};
126+
127+
const PegaContainer = () => {
128+
if (loading) return <div style={{ textAlign: 'center' }}>Loading...</div>;
129+
130+
return isPegaReady ? <RootComponent {...rootProps} /> : null;
131+
};
88132

89-
return <PegaContext.Provider value={{ isPegaReady, rootPConnect, PegaContainer }}>{children}</PegaContext.Provider>;
133+
return (
134+
<PegaContext.Provider value={{ isPegaReady, rootPConnect, createCase, PegaContainer }}>
135+
<StyledEngineProvider injectFirst>
136+
<ThemeProvider theme={theme}>
137+
<CssBaseline />
138+
{children}
139+
</ThemeProvider>
140+
</StyledEngineProvider>
141+
</PegaContext.Provider>
142+
);
90143
};
91144

92145
export const usePega = () => {
Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { CssBaseline, StyledEngineProvider, ThemeProvider } from '@mui/material';
2-
31
import PegaAuthProvider from './context/PegaAuthProvider';
42
import { PegaReadyProvider } from './context/PegaReadyContext';
53

@@ -10,18 +8,13 @@ import './styles.css';
108

119
export default function Embedded() {
1210
return (
13-
<StyledEngineProvider injectFirst>
14-
<ThemeProvider theme={theme}>
15-
<CssBaseline />
16-
<PegaAuthProvider>
17-
<PegaReadyProvider>
18-
<>
19-
<Header />
20-
<MainScreen />
21-
</>
22-
</PegaReadyProvider>
23-
</PegaAuthProvider>
24-
</ThemeProvider>
25-
</StyledEngineProvider>
11+
<PegaAuthProvider>
12+
<PegaReadyProvider theme={theme}>
13+
<>
14+
<Header />
15+
<MainScreen />
16+
</>
17+
</PegaReadyProvider>
18+
</PegaAuthProvider>
2619
);
2720
}

0 commit comments

Comments
 (0)