feat: introduce app configs with shared auth clients (#1213)
This commit is contained in:
100
packages/web/src/hooks/useAuthenticateApp.ee.ts
Normal file
100
packages/web/src/hooks/useAuthenticateApp.ee.ts
Normal file
@@ -0,0 +1,100 @@
|
||||
import { IApp } from '@automatisch/types';
|
||||
import * as React from 'react';
|
||||
|
||||
import { processStep } from 'helpers/authenticationSteps';
|
||||
import computeAuthStepVariables from 'helpers/computeAuthStepVariables';
|
||||
import useApp from './useApp';
|
||||
|
||||
type UseAuthenticateAppParams = {
|
||||
appKey: string;
|
||||
appAuthClientId?: string;
|
||||
useShared?: boolean;
|
||||
connectionId?: string;
|
||||
}
|
||||
|
||||
type AuthenticatePayload = {
|
||||
fields?: Record<string, string>;
|
||||
appAuthClientId?: string;
|
||||
}
|
||||
|
||||
function getSteps(auth: IApp['auth'], hasConnection: boolean, useShared: boolean) {
|
||||
if (hasConnection) {
|
||||
if (useShared) {
|
||||
return auth?.sharedReconnectionSteps;
|
||||
}
|
||||
|
||||
return auth?.reconnectionSteps;
|
||||
}
|
||||
|
||||
if (useShared) {
|
||||
return auth?.sharedAuthenticationSteps;
|
||||
}
|
||||
|
||||
return auth?.authenticationSteps;
|
||||
}
|
||||
|
||||
export default function useAuthenticateApp(payload: UseAuthenticateAppParams) {
|
||||
const {
|
||||
appKey,
|
||||
appAuthClientId,
|
||||
connectionId,
|
||||
useShared = false,
|
||||
} = payload;
|
||||
const { app } = useApp(appKey);
|
||||
const [
|
||||
authenticationInProgress,
|
||||
setAuthenticationInProgress
|
||||
] = React.useState(false);
|
||||
const steps = getSteps(app?.auth, !!connectionId, useShared);
|
||||
|
||||
const authenticate = React.useMemo(() => {
|
||||
if (!steps?.length) return;
|
||||
|
||||
return async function authenticate(payload: AuthenticatePayload = {}) {
|
||||
const {
|
||||
fields,
|
||||
} = payload;
|
||||
setAuthenticationInProgress(true);
|
||||
|
||||
const response: Record<string, any> = {
|
||||
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);
|
||||
throw err;
|
||||
|
||||
setAuthenticationInProgress(false);
|
||||
break;
|
||||
}
|
||||
|
||||
stepIndex++;
|
||||
|
||||
if (stepIndex === steps.length) {
|
||||
return response;
|
||||
}
|
||||
|
||||
setAuthenticationInProgress(false);
|
||||
}
|
||||
}
|
||||
}, [steps, appKey, appAuthClientId, connectionId]);
|
||||
|
||||
return {
|
||||
authenticate,
|
||||
inProgress: authenticationInProgress,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user