|
1 | 1 | 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'; |
2 | 4 |
|
3 | 5 | import StoreContext from '../../../bridge/Context/StoreContext'; |
4 | 6 | import createPConnectComponent from '../../../bridge/react_pconnect'; |
@@ -29,21 +31,28 @@ function RootComponent(props) { |
29 | 31 | interface PegaContextProps { |
30 | 32 | isPegaReady: boolean; |
31 | 33 | rootPConnect?: typeof PConnect; // Function to get Pega Connect object, if available |
| 34 | + createCase: (mashupCaseType: string, options: CaseOptions) => Promise<void>; |
32 | 35 | PegaContainer: React.FC; |
33 | 36 | } |
34 | 37 |
|
35 | 38 | declare const myLoadMashup: any; |
36 | 39 |
|
37 | 40 | const PegaContext = createContext<PegaContextProps | undefined>(undefined); |
38 | 41 |
|
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 }) => { |
40 | 47 | const { isAuthenticated } = usePegaAuth(); |
41 | 48 | const [isPegaReady, setIsPegaReady] = useState<boolean>(false); |
42 | 49 | const [rootProps, setRootProps] = useState<{ |
43 | 50 | getPConnect?: () => typeof PConnect; |
44 | 51 | [key: string]: any; |
45 | 52 | }>({}); |
46 | 53 |
|
| 54 | + const [loading, setLoading] = useState<boolean>(false); |
| 55 | + |
47 | 56 | const startMashup = async () => { |
48 | 57 | try { |
49 | 58 | PCore.onPCoreReady(async renderObj => { |
@@ -84,9 +93,53 @@ export const PegaReadyProvider: React.FC<React.PropsWithChildren> = ({ children |
84 | 93 | return undefined; |
85 | 94 | }, [rootProps]); |
86 | 95 |
|
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 | + }; |
88 | 132 |
|
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 | + ); |
90 | 143 | }; |
91 | 144 |
|
92 | 145 | export const usePega = () => { |
|
0 commit comments