import React, { useEffect, useRef, useState } from 'react'; import { Link, RouteComponentProps } from 'react-router-dom'; import login from '@/api/auth/login'; import LoginFormContainer from '@/components/auth/LoginFormContainer'; import { useStoreState } from 'easy-peasy'; import { Formik, FormikHelpers } from 'formik'; import { object, string } from 'yup'; import Field from '@/components/elements/Field'; import tw from 'twin.macro'; import Button from '@/components/elements/Button'; import Reaptcha from 'reaptcha'; import useFlash from '@/plugins/useFlash'; interface Values { username: string; password: string; } const LoginContainer = ({ history }: RouteComponentProps) => { const ref = useRef(null); const [ token, setToken ] = useState(''); const { clearFlashes, clearAndAddHttpError } = useFlash(); const { enabled: recaptchaEnabled, siteKey } = useStoreState(state => state.settings.data!.recaptcha); useEffect(() => { clearFlashes(); }, []); const onSubmit = (values: Values, { setSubmitting }: FormikHelpers) => { clearFlashes(); // If there is no token in the state yet, request the token and then abort this submit request // since it will be re-submitted when the recaptcha data is returned by the component. if (recaptchaEnabled && !token) { ref.current!.execute().catch(error => { console.error(error); setSubmitting(false); clearAndAddHttpError({ error }); }); return; } login({ ...values, recaptchaData: token }) .then(response => { if (response.complete) { // @ts-ignore window.location = response.intended || '/'; return; } history.replace('/auth/login/checkpoint', { token: response.confirmationToken }); }) .catch(error => { console.error(error); setToken(''); if (ref.current) ref.current.reset(); setSubmitting(false); clearAndAddHttpError({ error }); }); }; return ( {({ isSubmitting, setSubmitting, submitForm }) => (
{recaptchaEnabled && { setToken(response); submitForm(); }} onExpire={() => { setSubmitting(false); setToken(''); }} /> }
Forgot password?
)}
); }; export default LoginContainer;