import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import { Trans } from '@lingui/react/macro'; import type { Recipient } from '@prisma/client'; import { Loader } from 'lucide-react'; import { useRevalidator } from 'react-router'; import { DO_NOT_INVALIDATE_QUERY_ON_MUTATION } from '@documenso/lib/constants/trpc'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import type { TRecipientActionAuth } from '@documenso/lib/types/document-auth'; import { extractInitials } from '@documenso/lib/utils/recipient-formatter'; import type { FieldWithSignature } from '@documenso/prisma/types/field-with-signature'; import { trpc } from '@documenso/trpc/react'; import type { TRemovedSignedFieldWithTokenMutationSchema, TSignFieldWithTokenMutationSchema, } from '@documenso/trpc/server/field-router/schema'; import { useToast } from '@documenso/ui/primitives/use-toast'; import { DocumentSigningFieldContainer } from './document-signing-field-container'; import { useRequiredDocumentSigningContext } from './document-signing-provider'; export type DocumentSigningInitialsFieldProps = { field: FieldWithSignature; recipient: Recipient; onSignField?: (value: TSignFieldWithTokenMutationSchema) => Promise | void; onUnsignField?: (value: TRemovedSignedFieldWithTokenMutationSchema) => Promise | void; }; export const DocumentSigningInitialsField = ({ field, recipient, onSignField, onUnsignField, }: DocumentSigningInitialsFieldProps) => { const { toast } = useToast(); const { _ } = useLingui(); const { revalidate } = useRevalidator(); const { fullName } = useRequiredDocumentSigningContext(); const initials = extractInitials(fullName); const { mutateAsync: signFieldWithToken, isPending: isSignFieldWithTokenLoading } = trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); const { mutateAsync: removeSignedFieldWithToken, isPending: isRemoveSignedFieldWithTokenLoading, } = trpc.field.removeSignedFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); const isLoading = isSignFieldWithTokenLoading || isRemoveSignedFieldWithTokenLoading; const onSign = async (authOptions?: TRecipientActionAuth) => { try { const value = initials ?? ''; const payload: TSignFieldWithTokenMutationSchema = { token: recipient.token, fieldId: field.id, value, isBase64: false, authOptions, }; if (onSignField) { await onSignField(payload); return; } await signFieldWithToken(payload); await revalidate(); } catch (err) { const error = AppError.parseError(err); if (error.code === AppErrorCode.UNAUTHORIZED) { throw error; } console.error(err); toast({ title: _(msg`Error`), description: _(msg`An error occurred while signing the document.`), variant: 'destructive', }); } }; const onRemove = async () => { try { const payload: TRemovedSignedFieldWithTokenMutationSchema = { token: recipient.token, fieldId: field.id, }; if (onUnsignField) { await onUnsignField(payload); return; } await removeSignedFieldWithToken(payload); await revalidate(); } catch (err) { console.error(err); toast({ title: _(msg`Error`), description: _(msg`An error occurred while removing the field.`), variant: 'destructive', }); } }; return ( {isLoading && (
)} {!field.inserted && (

Initials

)} {field.inserted && (

{field.customText}

)}
); };