'use client'; import { useEffect } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { InfoIcon } from 'lucide-react'; import { useForm } from 'react-hook-form'; import { DATE_FORMATS, DEFAULT_DOCUMENT_DATE_FORMAT } from '@documenso/lib/constants/date-formats'; import { DOCUMENT_AUTH_TYPES } from '@documenso/lib/constants/document-auth'; import { DEFAULT_DOCUMENT_TIME_ZONE, TIME_ZONES } from '@documenso/lib/constants/time-zones'; import { DocumentAccessAuth, DocumentActionAuth } from '@documenso/lib/types/document-auth'; import { extractDocumentAuthMethods } from '@documenso/lib/utils/document-auth'; import { DocumentStatus, type Field, type Recipient, SendStatus } from '@documenso/prisma/client'; import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from '@documenso/ui/primitives/accordion'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@documenso/ui/primitives/form/form'; 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[]; document: DocumentWithData; onSubmit: (_data: TAddSettingsFormSchema) => void; }; export const AddSettingsFormPartial = ({ documentFlow, recipients, fields, document, onSubmit, }: AddSettingsFormProps) => { const { documentAuthOption } = extractDocumentAuthMethods({ documentAuth: document.authOptions, }); const form = useForm({ resolver: zodResolver(ZAddSettingsFormSchema), defaultValues: { title: document.title, globalAccessAuth: documentAuthOption?.globalAccessAuth || undefined, globalActionAuth: documentAuthOption?.globalActionAuth || undefined, meta: { timezone: document.documentMeta?.timezone ?? DEFAULT_DOCUMENT_TIME_ZONE, dateFormat: document.documentMeta?.dateFormat ?? DEFAULT_DOCUMENT_DATE_FORMAT, redirectUrl: document.documentMeta?.redirectUrl ?? '', }, }, }); const { stepIndex, currentStep, totalSteps, previousStep } = useStep(); const documentHasBeenSent = recipients.some( (recipient) => recipient.sendStatus === SendStatus.SENT, ); // 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) { form.setValue('meta.timezone', Intl.DateTimeFormat().resolvedOptions().timeZone); } }, [documentHasBeenSent, form, form.setValue, form.formState.touchedFields.meta?.timezone]); return ( <> {fields.map((field, index) => ( ))}
( Title )} /> ( Document access

The authentication requirement for recipients to view the document.

  • Require account - The recipient must have an account, and be signed in to view the document
  • None - The document can be accessed directly by the URL sent to the recipient
)} /> ( Recipient signing authentication

The authentication requirement for recipients to sign fields.

You can also override this global setting by setting the authentication requirements directly on each recipient in the next step.

  • Require account - The recipient must have an account, and be signed in to sign fields
  • None - The recipient does not need any authentication to sign fields
)} /> Advanced Options
( 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 )} />
); };