Path: blob/1.0-develop/resources/scripts/components/auth/ResetPasswordContainer.tsx
7461 views
import React, { useState } from 'react';1import { RouteComponentProps } from 'react-router';2import { Link } from 'react-router-dom';3import performPasswordReset from '@/api/auth/performPasswordReset';4import { httpErrorToHuman } from '@/api/http';5import LoginFormContainer from '@/components/auth/LoginFormContainer';6import { Actions, useStoreActions } from 'easy-peasy';7import { ApplicationStore } from '@/state';8import { Formik, FormikHelpers } from 'formik';9import { object, ref, string } from 'yup';10import Field from '@/components/elements/Field';11import Input from '@/components/elements/Input';12import tw from 'twin.macro';13import Button from '@/components/elements/Button';1415interface Values {16password: string;17passwordConfirmation: string;18}1920export default ({ match, location }: RouteComponentProps<{ token: string }>) => {21const [email, setEmail] = useState('');2223const { clearFlashes, addFlash } = useStoreActions((actions: Actions<ApplicationStore>) => actions.flashes);2425const parsed = new URLSearchParams(location.search);26if (email.length === 0 && parsed.get('email')) {27setEmail(parsed.get('email') || '');28}2930const submit = ({ password, passwordConfirmation }: Values, { setSubmitting }: FormikHelpers<Values>) => {31clearFlashes();32performPasswordReset(email, { token: match.params.token, password, passwordConfirmation })33.then(() => {34// @ts-expect-error this is valid35window.location = '/';36})37.catch((error) => {38console.error(error);3940setSubmitting(false);41addFlash({ type: 'error', title: 'Error', message: httpErrorToHuman(error) });42});43};4445return (46<Formik47onSubmit={submit}48initialValues={{49password: '',50passwordConfirmation: '',51}}52validationSchema={object().shape({53password: string()54.required('A new password is required.')55.min(8, 'Your new password should be at least 8 characters in length.'),56passwordConfirmation: string()57.required('Your new password does not match.')58// @ts-expect-error this is valid59.oneOf([ref('password'), null], 'Your new password does not match.'),60})}61>62{({ isSubmitting }) => (63<LoginFormContainer title={'Reset Password'} css={tw`w-full flex`}>64<div>65<label>Email</label>66<Input value={email} isLight disabled />67</div>68<div css={tw`mt-6`}>69<Field70light71label={'New Password'}72name={'password'}73type={'password'}74description={'Passwords must be at least 8 characters in length.'}75/>76</div>77<div css={tw`mt-6`}>78<Field light label={'Confirm New Password'} name={'passwordConfirmation'} type={'password'} />79</div>80<div css={tw`mt-6`}>81<Button size={'xlarge'} type={'submit'} disabled={isSubmitting} isLoading={isSubmitting}>82Reset Password83</Button>84</div>85<div css={tw`mt-6 text-center`}>86<Link87to={'/auth/login'}88css={tw`text-xs text-neutral-500 tracking-wide no-underline uppercase hover:text-neutral-600`}89>90Return to Login91</Link>92</div>93</LoginFormContainer>94)}95</Formik>96);97};9899100