'use client'; import { useEffect } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { Trans } from '@lingui/macro'; import { InfoIcon } from 'lucide-react'; import { useForm } from 'react-hook-form'; import { match } from 'ts-pattern'; import { DATE_FORMATS, DEFAULT_DOCUMENT_DATE_FORMAT } from '@documenso/lib/constants/date-formats'; import { SUPPORTED_LANGUAGES } from '@documenso/lib/constants/i18n'; import { DEFAULT_DOCUMENT_TIME_ZONE, TIME_ZONES } from '@documenso/lib/constants/time-zones'; import type { TDocument } from '@documenso/lib/types/document'; import { extractDocumentAuthMethods } from '@documenso/lib/utils/document-auth'; import { DocumentVisibility, TeamMemberRole } from '@documenso/prisma/client'; import { DocumentStatus, type Field, type Recipient, SendStatus } from '@documenso/prisma/client'; import { DocumentGlobalAuthAccessSelect, DocumentGlobalAuthAccessTooltip, } from '@documenso/ui/components/document/document-global-auth-access-select'; import { DocumentGlobalAuthActionSelect, DocumentGlobalAuthActionTooltip, } from '@documenso/ui/components/document/document-global-auth-action-select'; import { DocumentVisibilitySelect, DocumentVisibilityTooltip, } from '@documenso/ui/components/document/document-visibility-select'; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from '@documenso/ui/primitives/accordion'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@documenso/ui/primitives/form/form'; import { Checkbox } from '../checkbox'; import { Combobox } from '../combobox'; import { Input } from '../input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../select'; import { useStep } from '../stepper'; import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip'; import type { TAddSettingsFormSchema } from './add-settings.types'; import { ZAddSettingsFormSchema } from './add-settings.types'; import { DocumentFlowFormContainerActions, DocumentFlowFormContainerContent, DocumentFlowFormContainerFooter, DocumentFlowFormContainerHeader, DocumentFlowFormContainerStep, } from './document-flow-root'; import { ShowFieldItem } from './show-field-item'; import type { DocumentFlowStep } from './types'; export type AddSettingsFormProps = { documentFlow: DocumentFlowStep; recipients: Recipient[]; fields: Field[]; isDocumentEnterprise: boolean; isDocumentPdfLoaded: boolean; document: TDocument; currentTeamMemberRole?: TeamMemberRole; onSubmit: (_data: TAddSettingsFormSchema) => void; }; export const AddSettingsFormPartial = ({ documentFlow, recipients, fields, isDocumentEnterprise, isDocumentPdfLoaded, document, currentTeamMemberRole, onSubmit, }: AddSettingsFormProps) => { const { documentAuthOption } = extractDocumentAuthMethods({ documentAuth: document.authOptions, }); const form = useForm({ resolver: zodResolver(ZAddSettingsFormSchema), defaultValues: { title: document.title, externalId: document.externalId || '', visibility: document.visibility || '', globalAccessAuth: documentAuthOption?.globalAccessAuth || undefined, globalActionAuth: documentAuthOption?.globalActionAuth || undefined, includeSigningCertificate: document.includeSigningCertificate ?? true, includeAuditTrailLog: document.includeAuditTrailLog ?? true, meta: { timezone: TIME_ZONES.find((timezone) => timezone === document.documentMeta?.timezone) ?? DEFAULT_DOCUMENT_TIME_ZONE, dateFormat: DATE_FORMATS.find((format) => format.value === document.documentMeta?.dateFormat) ?.value ?? DEFAULT_DOCUMENT_DATE_FORMAT, redirectUrl: document.documentMeta?.redirectUrl ?? '', language: document.documentMeta?.language ?? 'en', }, }, }); const { stepIndex, currentStep, totalSteps, previousStep } = useStep(); const documentHasBeenSent = recipients.some( (recipient) => recipient.sendStatus === SendStatus.SENT, ); const canUpdateVisibility = match(currentTeamMemberRole) .with(TeamMemberRole.ADMIN, () => true) .with( TeamMemberRole.MANAGER, () => document.visibility === DocumentVisibility.EVERYONE || document.visibility === DocumentVisibility.MANAGER_AND_ABOVE, ) .otherwise(() => false); // We almost always want to set the timezone to the user's local timezone to avoid confusion // when the document is signed. useEffect(() => { if ( !form.formState.touchedFields.meta?.timezone && !documentHasBeenSent && !document.documentMeta?.timezone ) { form.setValue('meta.timezone', Intl.DateTimeFormat().resolvedOptions().timeZone); } }, [ documentHasBeenSent, form, form.setValue, form.formState.touchedFields.meta?.timezone, document.documentMeta?.timezone, ]); return ( <> {isDocumentPdfLoaded && fields.map((field, index) => ( ))}
( Title )} /> ( Language Controls the language for the document, including the language to be used for email notifications, and the final certificate that is generated and attached to the document. )} /> ( Document access )} /> {currentTeamMemberRole && ( ( Document visibility )} /> )} ( Recipient action authentication )} /> Certificates
(
Include signing certificate{' '} Including the signing certificate means that the certificate will be attached to the document. You won't be able to remove it.

If you don't include it, you can download it individually.
)} /> (
Include audit trail{' '} Including the audit trail means that the log of all actions will be attached to the document. You won't be able to remove it.{' '}

If you don't include it, you can download it individually.
)} />
{isDocumentEnterprise && ( ( Recipient action authentication )} /> )} Advanced Options
( External ID{' '} Add an external ID to the document. This can be used to identify the document in external systems. )} /> ( Date Format )} /> ( Time Zone value && field.onChange(value)} disabled={documentHasBeenSent} /> )} /> ( Redirect URL{' '} Add a URL to redirect the user to once the document is signed )} />
); };