diff --git a/packages/lib/utils/recipients.ts b/packages/lib/utils/recipients.ts index f3a2a6e92..d5e1b2bf8 100644 --- a/packages/lib/utils/recipients.ts +++ b/packages/lib/utils/recipients.ts @@ -1,6 +1,6 @@ import { isSignatureFieldType } from '@documenso/prisma/guards/is-signature-field'; -import type { Envelope } from '@prisma/client'; -import { type Field, RecipientRole, SigningStatus } from '@prisma/client'; +import type { Envelope, Field, Recipient } from '@prisma/client'; +import { RecipientRole, SigningStatus } from '@prisma/client'; import { NEXT_PUBLIC_WEBAPP_URL } from '../constants/app'; import { AppError, AppErrorCode } from '../errors/app-error'; @@ -8,15 +8,6 @@ import type { TRecipientLite } from '../types/recipient'; import { extractLegacyIds } from '../universal/id'; import { zEmail } from './zod'; -type RecipientWithSigningOrder = { - role: RecipientRole; - signingOrder?: number | null; -}; - -type CanUpdateRecipient = (recipient: T) => boolean; - -const canUpdateAnyRecipient = () => true; - /** * Roles that require fields to be assigned before a document can be distributed. * @@ -24,11 +15,14 @@ const canUpdateAnyRecipient = () => true; */ export const RECIPIENT_ROLES_THAT_REQUIRE_FIELDS = [RecipientRole.SIGNER] as const; -export const isCcRecipient = (recipient: Pick) => { +// signingOrder isn't required when submitting the recipient form (Zod: z.number().optional()) +type RecipientWithSigningOrder = Pick & Partial>; + +export const isCcRecipient = (recipient: Pick) => { return recipient.role === RecipientRole.CC; }; -export const getRecipientSigningOrder = (recipient: Pick) => { +export const getRecipientSigningOrder = (recipient: RecipientWithSigningOrder) => { if (isCcRecipient(recipient)) { return null; } @@ -36,6 +30,13 @@ export const getRecipientSigningOrder = (recipient: Pick[]) => { + const nonCcRecipients = recipients.filter((recipient) => !isCcRecipient(recipient)); + const lastNonCcRecipient = nonCcRecipients[nonCcRecipients.length - 1]; + + return lastNonCcRecipient?.role === RecipientRole.ASSISTANT; +}; + export const sortRecipientsForSigningOrder = (recipients: T[]): T[] => { return [...recipients].sort((r1, r2) => { const r1IsCcRecipient = isCcRecipient(r1); @@ -54,16 +55,9 @@ export const sortRecipientsForSigningOrder = []) => { - const nonCcRecipients = recipients.filter((recipient) => !isCcRecipient(recipient)); - const lastNonCcRecipient = nonCcRecipients[nonCcRecipients.length - 1]; - - return lastNonCcRecipient?.role === RecipientRole.ASSISTANT; -}; - export const normalizeRecipientSigningOrders = ( recipients: T[], - canUpdateRecipient: CanUpdateRecipient = canUpdateAnyRecipient, + canUpdateRecipient: (recipient: T) => boolean = () => true, ): Array => { const nonCcRecipients = recipients.filter((recipient) => !isCcRecipient(recipient)); const ccRecipients = recipients.filter((recipient) => isCcRecipient(recipient));