'use client'; import { useMemo, useState } from 'react'; import { useRouter } from 'next/navigation'; import { Trans } from '@lingui/macro'; import { useSession } from 'next-auth/react'; import { useForm } from 'react-hook-form'; import { useAnalytics } from '@documenso/lib/client-only/hooks/use-analytics'; import type { DocumentAndSender } from '@documenso/lib/server-only/document/get-document-by-token'; import type { TRecipientActionAuth } from '@documenso/lib/types/document-auth'; import { sortFieldsByPosition, validateFieldsInserted } from '@documenso/lib/utils/fields'; import { type Field, type Recipient, RecipientRole } from '@documenso/prisma/client'; import { trpc } from '@documenso/trpc/react'; import { FieldToolTip } from '@documenso/ui/components/field/field-tooltip'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Card, CardContent } from '@documenso/ui/primitives/card'; import { Input } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; import { SignaturePad } from '@documenso/ui/primitives/signature-pad'; import { useRequiredSigningContext } from './provider'; import { SignDialog } from './sign-dialog'; export type SigningFormProps = { document: DocumentAndSender; recipient: Recipient; fields: Field[]; redirectUrl?: string | null; isRecipientsTurn: boolean; }; export const SigningForm = ({ document, recipient, fields, redirectUrl, isRecipientsTurn, }: SigningFormProps) => { const router = useRouter(); const analytics = useAnalytics(); const { data: session } = useSession(); const { fullName, signature, setFullName, setSignature } = useRequiredSigningContext(); const [validateUninsertedFields, setValidateUninsertedFields] = useState(false); const { mutateAsync: completeDocumentWithToken } = trpc.recipient.completeDocumentWithToken.useMutation(); const { handleSubmit, formState } = useForm(); // Keep the loading state going if successful since the redirect may take some time. const isSubmitting = formState.isSubmitting || formState.isSubmitSuccessful; const uninsertedFields = useMemo(() => { return sortFieldsByPosition(fields.filter((field) => !field.inserted)); }, [fields]); const fieldsValidated = () => { setValidateUninsertedFields(true); validateFieldsInserted(fields); }; const onFormSubmit = async () => { setValidateUninsertedFields(true); const isFieldsValid = validateFieldsInserted(fields); if (!isFieldsValid) { return; } await completeDocument(); // Reauth is currently not required for completing the document. // await executeActionAuthProcedure({ // onReauthFormSubmit: completeDocument, // actionTarget: 'DOCUMENT', // }); }; const completeDocument = async (authOptions?: TRecipientActionAuth) => { await completeDocumentWithToken({ token: recipient.token, documentId: document.id, authOptions, }); analytics.capture('App: Recipient has completed signing', { signerId: recipient.id, documentId: document.id, timestamp: new Date().toISOString(), }); redirectUrl ? router.push(redirectUrl) : router.push(`/sign/${recipient.token}/complete`); }; return (
); };