import { useState } from 'react'; import { useLingui } from '@lingui/react'; import { Trans } from '@lingui/react/macro'; import type { DocumentMeta, Field, Recipient } from '@prisma/client'; import { SigningStatus } from '@prisma/client'; import { Clock, EyeOffIcon } from 'lucide-react'; import { PDF_VIEWER_PAGE_SELECTOR } from '@documenso/lib/constants/pdf-viewer'; import { isTemplateRecipientEmailPlaceholder } from '@documenso/lib/constants/template'; import { parseMessageDescriptor } from '@documenso/lib/utils/i18n'; import { extractInitials } from '@documenso/lib/utils/recipient-formatter'; import { FieldRootContainer } from '@documenso/ui/components/field/field'; import { SignatureIcon } from '@documenso/ui/icons/signature'; import { Avatar, AvatarFallback } from '@documenso/ui/primitives/avatar'; import { Badge } from '@documenso/ui/primitives/badge'; import { FRIENDLY_FIELD_TYPE } from '@documenso/ui/primitives/document-flow/types'; import { ElementVisible } from '@documenso/ui/primitives/element-visible'; import { PopoverHover } from '@documenso/ui/primitives/popover'; import { getRecipientColorStyles } from '../../lib/recipient-colors'; import { FieldContent } from '../../primitives/document-flow/field-content'; const getRecipientDisplayText = (recipient: { name: string; email: string }) => { if (recipient.name && !isTemplateRecipientEmailPlaceholder(recipient.email)) { return `${recipient.name} (${recipient.email})`; } if (recipient.name && isTemplateRecipientEmailPlaceholder(recipient.email)) { return recipient.name; } return recipient.email; }; export type DocumentField = Field & { recipient: Pick; }; export type DocumentReadOnlyFieldsProps = { fields: DocumentField[]; documentMeta?: Pick; showFieldStatus?: boolean; /** * Required if you want to show colors. * * Can't derive this from the fields because sometimes recipients don't have fields * yet. */ recipientIds?: number[]; /** * Whether to show the recipient tooltip. * * @default false */ showRecipientTooltip?: boolean; /** * Whether to color code the recipient fields. * * @default false */ showRecipientColors?: boolean; }; export const mapFieldsWithRecipients = ( fields: Field[], recipients: Recipient[], ): DocumentField[] => { return fields.map((field) => { const recipient = recipients.find((recipient) => recipient.id === field.recipientId) || { id: field.recipientId, name: 'Unknown', email: 'Unknown', signingStatus: SigningStatus.NOT_SIGNED, }; return { ...field, recipient, signature: null }; }); }; export const DocumentReadOnlyFields = ({ documentMeta, fields, recipientIds = [], showFieldStatus = true, showRecipientTooltip = false, showRecipientColors = false, }: DocumentReadOnlyFieldsProps) => { const { _ } = useLingui(); const [hiddenFieldIds, setHiddenFieldIds] = useState>({}); const handleHideField = (fieldId: string) => { setHiddenFieldIds((prev) => ({ ...prev, [fieldId]: true })); }; const highestPageNumber = Math.max(...fields.map((field) => field.page)); return ( {fields.map( (field) => !hiddenFieldIds[field.secondaryId] && ( id === field.recipientId), 0, ), ) : undefined } > {showRecipientTooltip && (
{extractInitials(field.recipient.name || field.recipient.email)} } contentProps={{ className: 'relative flex w-fit flex-col p-4 text-sm', }} > {showFieldStatus && ( {field.recipient.signingStatus === SigningStatus.SIGNED ? ( <> Signed ) : ( <> Pending )} )}

{parseMessageDescriptor(_, FRIENDLY_FIELD_TYPE[field.type])} field

{getRecipientDisplayText(field.recipient)}

)}
), )}
); };