import { zodResolver } from '@hookform/resolvers/zod'; import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import { Trans } from '@lingui/react/macro'; import { useForm } from 'react-hook-form'; import { useNavigate } from 'react-router'; import { match } from 'ts-pattern'; import { z } from 'zod'; import { authClient } from '@documenso/auth/client'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { ZPasswordSchema } from '@documenso/trpc/server/auth-router/schema'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@documenso/ui/primitives/form/form'; import { PasswordInput } from '@documenso/ui/primitives/password-input'; import { useToast } from '@documenso/ui/primitives/use-toast'; export const ZResetPasswordFormSchema = z .object({ password: ZPasswordSchema, repeatedPassword: ZPasswordSchema, }) .refine((data) => data.password === data.repeatedPassword, { path: ['repeatedPassword'], message: "Passwords don't match", }); export type TResetPasswordFormSchema = z.infer; export type ResetPasswordFormProps = { className?: string; token: string; }; export const ResetPasswordForm = ({ className, token }: ResetPasswordFormProps) => { const navigate = useNavigate(); const { _ } = useLingui(); const { toast } = useToast(); const form = useForm({ values: { password: '', repeatedPassword: '', }, resolver: zodResolver(ZResetPasswordFormSchema), }); const isSubmitting = form.formState.isSubmitting; const onFormSubmit = async ({ password }: Omit) => { try { await authClient.emailPassword.resetPassword({ password, token, }); await navigate('/signin'); form.reset(); toast({ title: _(msg`Password updated`), description: _(msg`Your password has been updated successfully.`), duration: 5000, }); } catch (err) { const error = AppError.parseError(err); const errorMessage = match(error.code) .with(AppErrorCode.EXPIRED_CODE, () => msg`Token has expired. Please try again.`) .with('INVALID_TOKEN', () => msg`Invalid token provided. Please try again.`) .with( 'SAME_PASSWORD', () => msg`Your new password cannot be the same as your old password.`, ) .otherwise( () => msg`We encountered an unknown error while attempting to reset your password. Please try again later.`, ); toast({ title: _(msg`An error occurred`), description: _(errorMessage), variant: 'destructive', }); } }; return (
( Password )} /> ( Repeat Password )} />
); };