Path: blob/develop/resources/scripts/components/dashboard/forms/UpdateEmailAddressForm.tsx
7454 views
import { Fragment } from 'react';1import { Actions, State, useStoreActions, useStoreState } from 'easy-peasy';2import { Form, Formik, FormikHelpers } from 'formik';3import * as Yup from 'yup';4import SpinnerOverlay from '@/components/elements/SpinnerOverlay';5import Field from '@/components/elements/Field';6import { httpErrorToHuman } from '@/api/http';7import { ApplicationStore } from '@/state';8import tw from 'twin.macro';9import { Button } from '@/components/elements/button/index';1011interface Values {12email: string;13password: string;14}1516const schema = Yup.object().shape({17email: Yup.string().email().required(),18password: Yup.string().required('You must provide your current account password.'),19});2021export default () => {22const user = useStoreState((state: State<ApplicationStore>) => state.user.data);23const updateEmail = useStoreActions((state: Actions<ApplicationStore>) => state.user.updateUserEmail);2425const { clearFlashes, addFlash } = useStoreActions((actions: Actions<ApplicationStore>) => actions.flashes);2627const submit = (values: Values, { resetForm, setSubmitting }: FormikHelpers<Values>) => {28clearFlashes('account:email');2930updateEmail({ ...values })31.then(() =>32addFlash({33type: 'success',34key: 'account:email',35message: 'Your primary email has been updated.',36}),37)38.catch(error =>39addFlash({40type: 'error',41key: 'account:email',42title: 'Error',43message: httpErrorToHuman(error),44}),45)46.then(() => {47resetForm();48setSubmitting(false);49});50};5152return (53<Formik onSubmit={submit} validationSchema={schema} initialValues={{ email: user!.email, password: '' }}>54{({ isSubmitting, isValid }) => (55<Fragment>56<SpinnerOverlay size={'large'} visible={isSubmitting} />57<Form css={tw`m-0`}>58<Field id={'current_email'} type={'email'} name={'email'} label={'Email'} />59<div css={tw`mt-6`}>60<Field61id={'confirm_password'}62type={'password'}63name={'password'}64label={'Confirm Password'}65/>66</div>67<div css={tw`mt-6`}>68<Button disabled={isSubmitting || !isValid}>Update Email</Button>69</div>70</Form>71</Fragment>72)}73</Formik>74);75};767778