|
import * as React from 'react'; |
|
|
|
import { processStep } from 'helpers/authenticationSteps'; |
|
import computeAuthStepVariables from 'helpers/computeAuthStepVariables'; |
|
import useAppAuth from './useAppAuth'; |
|
|
|
function getSteps(auth, hasConnection, useShared) { |
|
if (hasConnection) { |
|
if (useShared) { |
|
return auth?.sharedReconnectionSteps; |
|
} |
|
return auth?.reconnectionSteps; |
|
} |
|
|
|
if (useShared) { |
|
return auth?.sharedAuthenticationSteps; |
|
} |
|
|
|
return auth?.authenticationSteps; |
|
} |
|
|
|
export default function useAuthenticateApp(payload) { |
|
const { appKey, appAuthClientId, connectionId, useShared = false } = payload; |
|
const { data: auth } = useAppAuth(appKey); |
|
const [authenticationInProgress, setAuthenticationInProgress] = |
|
React.useState(false); |
|
const steps = getSteps(auth?.data, !!connectionId, useShared); |
|
|
|
const authenticate = React.useMemo(() => { |
|
if (!steps?.length) return; |
|
|
|
return async function authenticate(payload = {}) { |
|
const { fields } = payload; |
|
setAuthenticationInProgress(true); |
|
const response = { |
|
key: appKey, |
|
appAuthClientId: appAuthClientId || payload.appAuthClientId, |
|
connection: { |
|
id: connectionId, |
|
}, |
|
fields, |
|
}; |
|
let stepIndex = 0; |
|
|
|
while (stepIndex < steps?.length) { |
|
const step = steps[stepIndex]; |
|
const variables = computeAuthStepVariables(step.arguments, response); |
|
|
|
try { |
|
const stepResponse = await processStep(step, variables); |
|
response[step.name] = stepResponse; |
|
} catch (err) { |
|
console.log(err); |
|
setAuthenticationInProgress(false); |
|
throw err; |
|
} |
|
stepIndex++; |
|
|
|
if (stepIndex === steps.length) { |
|
return response; |
|
} |
|
setAuthenticationInProgress(false); |
|
} |
|
}; |
|
}, [steps, appKey, appAuthClientId, connectionId]); |
|
|
|
return { |
|
authenticate, |
|
inProgress: authenticationInProgress, |
|
}; |
|
} |
|
|