import React, { useState } from 'react'; import { RouteComponentProps } from 'react-router'; import { parse } from 'query-string'; import { Link } from 'react-router-dom'; import performPasswordReset from '@/api/auth/performPasswordReset'; import { httpErrorToHuman } from '@/api/http'; import LoginFormContainer from '@/components/auth/LoginFormContainer'; import FlashMessageRender from '@/components/FlashMessageRender'; import { Actions, useStoreActions } from 'easy-peasy'; import { ApplicationState } from '@/state/types'; type Props = Readonly<RouteComponentProps<{ token: string }> & {}>; export default (props: Props) => { const [ isLoading, setIsLoading ] = useState(false); const [ email, setEmail ] = useState(''); const [ password, setPassword ] = useState(''); const [ passwordConfirm, setPasswordConfirm ] = useState(''); const { clearFlashes, addFlash } = useStoreActions((actions: Actions<ApplicationState>) => actions.flashes); const parsed = parse(props.location.search); if (email.length === 0 && parsed.email) { setEmail(parsed.email as string); } const canSubmit = () => password && email && password.length >= 8 && password === passwordConfirm; const submit = (e: React.FormEvent<HTMLFormElement>) => { e.preventDefault(); if (!password || !email || !passwordConfirm) { return; } setIsLoading(true); clearFlashes(); performPasswordReset(email, { token: props.match.params.token, password, passwordConfirmation: passwordConfirm, }) .then(() => { addFlash({ type: 'success', message: 'Your password has been reset, please login to continue.' }); props.history.push('/auth/login'); }) .catch(error => { console.error(error); addFlash({ type: 'error', title: 'Error', message: httpErrorToHuman(error) }); }) .then(() => setIsLoading(false)); }; return ( <div> <h2 className={'text-center text-neutral-100 font-medium py-4'}> Reset Password </h2> <FlashMessageRender/> <LoginFormContainer onSubmit={submit}> <label>Email</label> <input className={'input'} value={email} disabled={true}/> <div className={'mt-6'}> <label htmlFor={'new_password'}>New Password</label> <input id={'new_password'} className={'input'} type={'password'} required={true} onChange={e => setPassword(e.target.value)} /> <p className={'input-help'}> Passwords must be at least 8 characters in length. </p> </div> <div className={'mt-6'}> <label htmlFor={'new_password_confirm'}>Confirm New Password</label> <input id={'new_password_confirm'} className={'input'} type={'password'} required={true} onChange={e => setPasswordConfirm(e.target.value)} /> </div> <div className={'mt-6'}> <button type={'submit'} className={'btn btn-primary btn-jumbo'} disabled={isLoading || !canSubmit()} > {isLoading ? <span className={'spinner white'}> </span> : 'Reset Password' } </button> </div> <div className={'mt-6 text-center'}> <Link to={'/auth/login'} className={'text-xs text-neutral-500 tracking-wide no-underline uppercase hover:text-neutral-600'} > Return to Login </Link> </div> </LoginFormContainer> </div> ); };