import { useEffect, useState } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { Trans } from '@lingui/react/macro'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { AppError } from '@documenso/lib/errors/app-error'; import { DocumentAuth, type TRecipientActionAuth } from '@documenso/lib/types/document-auth'; import { Alert, AlertDescription, AlertTitle } from '@documenso/ui/primitives/alert'; import { Button } from '@documenso/ui/primitives/button'; import { DialogFooter } from '@documenso/ui/primitives/dialog'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@documenso/ui/primitives/form/form'; import { Input } from '@documenso/ui/primitives/input'; import { useRequiredDocumentSigningAuthContext } from './document-signing-auth-provider'; export type DocumentSigningAuthPasswordProps = { actionTarget?: 'FIELD' | 'DOCUMENT'; actionVerb?: string; open: boolean; onOpenChange: (value: boolean) => void; onReauthFormSubmit: (values?: TRecipientActionAuth) => Promise | void; }; const ZPasswordAuthFormSchema = z.object({ password: z .string() .min(1, { message: 'Password is required' }) .max(72, { message: 'Password must be at most 72 characters long' }), }); type TPasswordAuthFormSchema = z.infer; export const DocumentSigningAuthPassword = ({ actionTarget = 'FIELD', actionVerb = 'sign', onReauthFormSubmit, open, onOpenChange, }: DocumentSigningAuthPasswordProps) => { const { recipient, isCurrentlyAuthenticating, setIsCurrentlyAuthenticating } = useRequiredDocumentSigningAuthContext(); const form = useForm({ resolver: zodResolver(ZPasswordAuthFormSchema), defaultValues: { password: '', }, }); const [formErrorCode, setFormErrorCode] = useState(null); const onFormSubmit = async ({ password }: TPasswordAuthFormSchema) => { try { setIsCurrentlyAuthenticating(true); await onReauthFormSubmit({ type: DocumentAuth.PASSWORD, password, }); setIsCurrentlyAuthenticating(false); onOpenChange(false); } catch (err) { setIsCurrentlyAuthenticating(false); const error = AppError.parseError(err); setFormErrorCode(error.code); // Todo: Alert. } }; useEffect(() => { form.reset({ password: '', }); setFormErrorCode(null); // eslint-disable-next-line react-hooks/exhaustive-deps }, [open]); return (
{formErrorCode && ( Unauthorized We were unable to verify your details. Please try again or contact support )} ( Password )} />
); };