Path: blob/develop/resources/scripts/components/dashboard/forms/UpdatePasswordForm.tsx
7454 views
import { Fragment } from 'react';1import { Actions, State, useStoreActions, useStoreState } from 'easy-peasy';2import { Form, Formik, FormikHelpers } from 'formik';3import Field from '@/components/elements/Field';4import * as Yup from 'yup';5import SpinnerOverlay from '@/components/elements/SpinnerOverlay';6import updateAccountPassword from '@/api/account/updateAccountPassword';7import { httpErrorToHuman } from '@/api/http';8import { ApplicationStore } from '@/state';9import tw from 'twin.macro';10import { Button } from '@/components/elements/button/index';1112interface Values {13current: string;14password: string;15confirmPassword: string;16}1718const schema = Yup.object().shape({19current: Yup.string().min(1).required('You must provide your current password.'),20password: Yup.string().min(8).required(),21confirmPassword: Yup.string().test(22'password',23'Password confirmation does not match the password you entered.',24function (value) {25return value === this.parent.password;26},27),28});2930export default () => {31const user = useStoreState((state: State<ApplicationStore>) => state.user.data);32const { clearFlashes, addFlash } = useStoreActions((actions: Actions<ApplicationStore>) => actions.flashes);3334if (!user) {35return null;36}3738const submit = (values: Values, { setSubmitting }: FormikHelpers<Values>) => {39clearFlashes('account:password');40updateAccountPassword({ ...values })41.then(() => {42// @ts-expect-error this is valid43window.location = '/auth/login';44})45.catch(error =>46addFlash({47key: 'account:password',48type: 'error',49title: 'Error',50message: httpErrorToHuman(error),51}),52)53.then(() => setSubmitting(false));54};5556return (57<Fragment>58<Formik59onSubmit={submit}60validationSchema={schema}61initialValues={{ current: '', password: '', confirmPassword: '' }}62>63{({ isSubmitting, isValid }) => (64<Fragment>65<SpinnerOverlay size={'large'} visible={isSubmitting} />66<Form css={tw`m-0`}>67<Field68id={'current_password'}69type={'password'}70name={'current'}71label={'Current Password'}72/>73<div css={tw`mt-6`}>74<Field75id={'new_password'}76type={'password'}77name={'password'}78label={'New Password'}79description={80'Your new password should be at least 8 characters in length and unique to this website.'81}82/>83</div>84<div css={tw`mt-6`}>85<Field86id={'confirm_new_password'}87type={'password'}88name={'confirmPassword'}89label={'Confirm New Password'}90/>91</div>92<div css={tw`mt-6`}>93<Button disabled={isSubmitting || !isValid}>Update Password</Button>94</div>95</Form>96</Fragment>97)}98</Formik>99</Fragment>100);101};102103104