2024-02-26 09:39:09 -05:00
import React from 'react' ;
2024-03-07 19:16:23 +01:00
import { Box , Button , Container , FormControl , FormErrorMessage , FormLabel , Heading , Input , useColorModeValue } from '@chakra-ui/react' ;
2024-02-26 09:39:09 -05:00
import { SubmitHandler , useForm } from 'react-hook-form' ;
2024-03-07 19:16:23 +01:00
import { useMutation } from 'react-query' ;
import { ApiError , UpdatePassword , UsersService } from '../../client' ;
2024-02-26 09:39:09 -05:00
import useCustomToast from '../../hooks/useCustomToast' ;
interface UpdatePasswordForm extends UpdatePassword {
confirm_password : string ;
}
const ChangePassword : React.FC = ( ) = > {
const color = useColorModeValue ( 'gray.700' , 'white' ) ;
const showToast = useCustomToast ( ) ;
2024-03-07 19:16:23 +01:00
const { register , handleSubmit , reset , getValues , formState : { errors , isSubmitting } } = useForm < UpdatePasswordForm > ( {
mode : 'onBlur' ,
criteriaMode : 'all'
} ) ;
2024-02-26 09:39:09 -05:00
2024-03-07 19:16:23 +01:00
const UpdatePassword = async ( data : UpdatePassword ) = > {
await UsersService . updatePasswordMe ( { requestBody : data } )
}
const mutation = useMutation ( UpdatePassword , {
onSuccess : ( ) = > {
2024-02-26 09:39:09 -05:00
showToast ( 'Success!' , 'Password updated.' , 'success' ) ;
reset ( ) ;
2024-03-07 19:16:23 +01:00
} ,
onError : ( err : ApiError ) = > {
const errDetail = err . body . detail ;
2024-02-26 09:39:09 -05:00
showToast ( 'Something went wrong.' , ` ${ errDetail } ` , 'error' ) ;
}
2024-03-07 19:16:23 +01:00
} )
2024-02-26 09:39:09 -05:00
2024-03-07 19:16:23 +01:00
const onSubmit : SubmitHandler < UpdatePasswordForm > = async ( data ) = > {
mutation . mutate ( data ) ;
2024-02-26 09:39:09 -05:00
}
return (
< >
< Container maxW = 'full' as = 'form' onSubmit = { handleSubmit ( onSubmit ) } >
< Heading size = 'sm' py = { 4 } >
Change Password
< / Heading >
< Box w = { { 'sm' : 'full' , 'md' : '50%' } } >
2024-03-07 19:16:23 +01:00
< FormControl isRequired isInvalid = { ! ! errors . current_password } >
< FormLabel color = { color } htmlFor = 'current_password' > Current password < / FormLabel >
< Input id = 'current_password' { ...register ( 'current_password' , { required : 'Password is required' , minLength : { value : 8 , message : 'Password must be at least 8 characters' } } ) } placeholder = 'Password' type = 'password' / >
{ errors . current_password && < FormErrorMessage > { errors . current_password . message } < / FormErrorMessage > }
2024-02-26 09:39:09 -05:00
< / FormControl >
2024-03-07 19:16:23 +01:00
< FormControl mt = { 4 } isRequired 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 > }
2024-02-26 09:39:09 -05:00
< / FormControl >
2024-03-07 19:16:23 +01:00
< FormControl mt = { 4 } isRequired 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 > }
2024-02-26 09:39:09 -05:00
< / FormControl >
< Button bg = 'ui.main' color = 'white' _hover = { { opacity : 0.8 } } mt = { 4 } type = 'submit' isLoading = { isSubmitting } >
Save
< / Button >
< / Box >
< / C o n t a i n e r >
< / >
) ;
}
export default ChangePassword ;