'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 { 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, 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 )} /> )} {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 )} />
); };