import React, { useRef } from 'react'; import { Link, RouteComponentProps } from 'react-router-dom'; import login, { LoginData } from '@/api/auth/login'; import LoginFormContainer from '@/components/auth/LoginFormContainer'; import { ActionCreator, Actions, useStoreActions, useStoreState } from 'easy-peasy'; import { ApplicationStore } from '@/state'; import { FormikProps, withFormik } from 'formik'; import { object, string } from 'yup'; import Field from '@/components/elements/Field'; import { httpErrorToHuman } from '@/api/http'; import { FlashMessage } from '@/state/flashes'; import ReCAPTCHA from 'react-google-recaptcha'; import tw from 'twin.macro'; import Button from '@/components/elements/Button'; type OwnProps = RouteComponentProps & { clearFlashes: ActionCreator; addFlash: ActionCreator; } const LoginContainer = ({ isSubmitting, setFieldValue, values, submitForm, handleSubmit }: OwnProps & FormikProps) => { const ref = useRef(null); const { enabled: recaptchaEnabled, siteKey } = useStoreState(state => state.settings.data!.recaptcha); const submit = (e: React.FormEvent) => { e.preventDefault(); if (ref.current && !values.recaptchaData) { return ref.current.execute(); } handleSubmit(e); }; return ( {ref.current && ref.current.render()}
{recaptchaEnabled && { ref.current && ref.current.reset(); setFieldValue('recaptchaData', token); submitForm(); }} onExpired={() => setFieldValue('recaptchaData', null)} /> }
Forgot password?
); }; const EnhancedForm = withFormik({ displayName: 'LoginContainerForm', mapPropsToValues: () => ({ username: '', password: '', recaptchaData: null, }), validationSchema: () => object().shape({ username: string().required('A username or email must be provided.'), password: string().required('Please enter your account password.'), }), handleSubmit: (values, { props, setFieldValue, setSubmitting }) => { props.clearFlashes(); login(values) .then(response => { if (response.complete) { // @ts-ignore window.location = response.intended || '/'; return; } props.history.replace('/auth/login/checkpoint', { token: response.confirmationToken }); }) .catch(error => { console.error(error); setSubmitting(false); setFieldValue('recaptchaData', null); props.addFlash({ type: 'error', title: 'Error', message: httpErrorToHuman(error) }); }); }, })(LoginContainer); export default (props: RouteComponentProps) => { const { clearFlashes, addFlash } = useStoreActions((actions: Actions) => actions.flashes); return ( ); };