import * as React from 'react'; import Alert from '@mui/material/Alert'; import DialogTitle from '@mui/material/DialogTitle'; import DialogContent from '@mui/material/DialogContent'; import DialogContentText from '@mui/material/DialogContentText'; import Dialog from '@mui/material/Dialog'; import LoadingButton from '@mui/lab/LoadingButton'; import { FieldValues, SubmitHandler } from 'react-hook-form'; import useFormatMessage from 'hooks/useFormatMessage'; import computeAuthStepVariables from 'helpers/computeAuthStepVariables'; import { processStep } from 'helpers/authenticationSteps'; import InputCreator from 'components/InputCreator'; import type { IApp, IField } from '@automatisch/types'; import { Form } from './style'; const generateDocsLink = (link: string) => (str: string) => ( {str} ); type AddAppConnectionProps = { onClose: () => void; application: IApp; connectionId?: string; }; type Response = { [key: string]: any; } export default function AddAppConnection(props: AddAppConnectionProps): React.ReactElement { const { application, connectionId, onClose } = props; const { name, authDocUrl, key, fields, authenticationSteps, reconnectionSteps } = application; const formatMessage = useFormatMessage(); const [errorMessage, setErrorMessage] = React.useState(null); const [inProgress, setInProgress] = React.useState(false); const hasConnection = Boolean(connectionId); const steps = hasConnection ? reconnectionSteps : authenticationSteps; React.useEffect(() => { if (window.opener) { window.opener.postMessage({ source: 'automatisch', payload: window.location.search }); window.close(); } }, []); const submitHandler: SubmitHandler = React.useCallback(async (data) => { setInProgress(true); setErrorMessage(null); const response: Response = { key, connection: { id: connectionId }, fields: data, }; 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) { const error = err as Error; console.log(error); setErrorMessage(error.message); break; } stepIndex++; if (stepIndex === steps.length) { onClose(); } } setInProgress(false); }, [connectionId, key, steps, onClose]); return ( {hasConnection ? formatMessage('app.reconnectConnection') : formatMessage('app.addConnection')} {formatMessage( 'addAppConnection.callToDocs', { appName: name, docsLink: generateDocsLink(authDocUrl) } )} {errorMessage && ( {errorMessage} )}
{fields?.map((field: IField) => ())} {formatMessage('addAppConnection.submit')}
); };