import { z as zod } from 'zod'; import { useCallback } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { useBoolean, useCountdownSeconds } from 'minimal-shared/hooks'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import IconButton from '@mui/material/IconButton'; import InputAdornment from '@mui/material/InputAdornment'; import { paths } from 'src/routes/paths'; import { useRouter, useSearchParams } from 'src/routes/hooks'; import { SentIcon } from 'src/assets/icons'; import { Iconify } from 'src/components/iconify'; import { Form, Field } from 'src/components/hook-form'; import { FormHead } from '../../components/form-head'; import { FormReturnLink } from '../../components/form-return-link'; import { FormResendCode } from '../../components/form-resend-code'; import { resetPassword, updatePassword } from '../../context/amplify'; // ---------------------------------------------------------------------- export type UpdatePasswordSchemaType = zod.infer; export const UpdatePasswordSchema = zod .object({ code: zod .string() .min(1, { message: 'Code is required!' }) .min(6, { message: 'Code must be at least 6 characters!' }), email: zod .string() .min(1, { message: 'Email is required!' }) .email({ message: 'Email must be a valid email address!' }), password: zod .string() .min(1, { message: 'Password is required!' }) .min(6, { message: 'Password must be at least 6 characters!' }), confirmPassword: zod.string().min(1, { message: 'Confirm password is required!' }), }) .refine((data) => data.password === data.confirmPassword, { message: 'Passwords do not match!', path: ['confirmPassword'], }); // ---------------------------------------------------------------------- export function AmplifyUpdatePasswordView() { const router = useRouter(); const searchParams = useSearchParams(); const email = searchParams.get('email'); const showPassword = useBoolean(); const countdown = useCountdownSeconds(5); const defaultValues: UpdatePasswordSchemaType = { code: '', email: email || '', password: '', confirmPassword: '', }; const methods = useForm({ resolver: zodResolver(UpdatePasswordSchema), defaultValues, }); const { watch, handleSubmit, formState: { isSubmitting }, } = methods; const values = watch(); const onSubmit = handleSubmit(async (data) => { try { await updatePassword({ username: data.email, confirmationCode: data.code, newPassword: data.password, }); router.push(paths.auth.amplify.signIn); } catch (error) { console.error(error); } }); const handleResendCode = useCallback(async () => { if (!countdown.isCounting) { try { countdown.reset(); countdown.start(); await resetPassword({ username: values.email }); } catch (error) { console.error(error); } } }, [countdown, values.email]); const renderForm = () => ( ), }, }} /> ), }, }} /> ); return ( <> } title="Request sent successfully!" description={`We've sent a 6-digit confirmation email to your email. \nPlease enter the code in below box to verify your email.`} />
{renderForm()}
); }