committed by
GitHub
4 changed files with 88 additions and 20 deletions
@ -0,0 +1,72 @@ |
|||
import React from "react"; |
|||
|
|||
import { Button, Container, FormControl, FormErrorMessage, FormLabel, Heading, Input, Text } from "@chakra-ui/react"; |
|||
import { SubmitHandler, useForm } from "react-hook-form"; |
|||
|
|||
import { LoginService, NewPassword } from "../client"; |
|||
import useCustomToast from "../hooks/useCustomToast"; |
|||
|
|||
interface NewPasswordForm extends NewPassword { |
|||
confirm_password: string; |
|||
} |
|||
|
|||
const ResetPassword: React.FC = () => { |
|||
const { register, handleSubmit, getValues, formState: { errors } } = useForm<NewPasswordForm>({ |
|||
mode: 'onBlur', |
|||
criteriaMode: 'all', |
|||
defaultValues: { |
|||
new_password: '', |
|||
} |
|||
}); |
|||
const showToast = useCustomToast(); |
|||
|
|||
const onSubmit: SubmitHandler<NewPasswordForm> = async (data) => { |
|||
try { |
|||
const token = new URLSearchParams(window.location.search).get('token'); |
|||
await LoginService.resetPassword({ |
|||
requestBody: { new_password: data.new_password, token: token! } |
|||
}); |
|||
showToast("Password reset.", "Your password has been reset successfully.", "success"); |
|||
} catch (error) { |
|||
showToast("Error", "An error occurred while resetting your password.", "error"); |
|||
} |
|||
}; |
|||
|
|||
return ( |
|||
<Container |
|||
as="form" |
|||
onSubmit={handleSubmit(onSubmit)} |
|||
h="100vh" |
|||
maxW="sm" |
|||
alignItems="stretch" |
|||
justifyContent="center" |
|||
gap={4} |
|||
centerContent |
|||
> |
|||
<Heading size="xl" color="ui.main" textAlign="center" mb={2}> |
|||
Reset Password |
|||
</Heading> |
|||
<Text textAlign="center"> |
|||
Please enter your new password and confirm it to reset your password. |
|||
</Text> |
|||
<FormControl mt={4} isInvalid={!!errors.new_password}> |
|||
<FormLabel htmlFor='password'>Set Password</FormLabel> |
|||
<Input id='password' {...register('new_password', { required: 'Password is required', minLength: { value: 8, message: 'Password must be at least 8 characters' } })} placeholder='Password' type='password' /> |
|||
{errors.new_password && <FormErrorMessage>{errors.new_password.message}</FormErrorMessage>} |
|||
</FormControl> |
|||
<FormControl mt={4} isInvalid={!!errors.confirm_password}> |
|||
<FormLabel htmlFor='confirm_password'>Confirm Password</FormLabel> |
|||
<Input id='confirm_password' {...register('confirm_password', { |
|||
required: 'Please confirm your password', |
|||
validate: value => value === getValues().new_password || 'The passwords do not match' |
|||
})} placeholder='Password' type='password' /> |
|||
{errors.confirm_password && <FormErrorMessage>{errors.confirm_password.message}</FormErrorMessage>} |
|||
</FormControl> |
|||
<Button bg="ui.main" color="white" _hover={{ opacity: 0.8 }} type="submit"> |
|||
Reset Password |
|||
</Button> |
|||
</Container> |
|||
); |
|||
}; |
|||
|
|||
export default ResetPassword; |
Loading…
Reference in new issue