import { useRouter } from 'next/navigation'; import { zodResolver } from '@hookform/resolvers/zod'; import { Plus } from 'lucide-react'; import { Controller, useFieldArray, useForm } from 'react-hook-form'; import * as z from 'zod'; import type { Recipient } from '@documenso/prisma/client'; import { RecipientRole } from '@documenso/prisma/client'; import { trpc } from '@documenso/trpc/react'; import { Button } from '@documenso/ui/primitives/button'; import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@documenso/ui/primitives/dialog'; import { FormErrorMessage } from '@documenso/ui/primitives/form/form-error-message'; import { Input } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; import { ROLE_ICONS } from '@documenso/ui/primitives/recipient-role-icons'; import { Select, SelectContent, SelectItem, SelectTrigger } from '@documenso/ui/primitives/select'; import { useToast } from '@documenso/ui/primitives/use-toast'; const ZAddRecipientsForNewDocumentSchema = z.object({ recipients: z.array( z.object({ email: z.string().email(), name: z.string(), role: z.nativeEnum(RecipientRole), }), ), }); type TAddRecipientsForNewDocumentSchema = z.infer; export type UseTemplateDialogProps = { templateId: number; recipients: Recipient[]; documentRootPath: string; }; export function UseTemplateDialog({ recipients, documentRootPath, templateId, }: UseTemplateDialogProps) { const router = useRouter(); const { toast } = useToast(); const { control, handleSubmit, formState: { errors, isSubmitting }, } = useForm({ resolver: zodResolver(ZAddRecipientsForNewDocumentSchema), defaultValues: { recipients: recipients.length > 0 ? recipients.map((recipient) => ({ nativeId: recipient.id, formId: String(recipient.id), name: recipient.name, email: recipient.email, role: recipient.role, })) : [ { name: '', email: '', role: RecipientRole.SIGNER, }, ], }, }); const { mutateAsync: createDocumentFromTemplate, isLoading: isCreatingDocumentFromTemplate } = trpc.template.createDocumentFromTemplate.useMutation(); const onSubmit = async (data: TAddRecipientsForNewDocumentSchema) => { try { const { id } = await createDocumentFromTemplate({ templateId, recipients: data.recipients, }); toast({ title: 'Document created', description: 'Your document has been created from the template successfully.', duration: 5000, }); router.push(`${documentRootPath}/${id}`); } catch (err) { toast({ title: 'Error', description: 'An error occurred while creating document from template.', variant: 'destructive', }); } }; const onCreateDocumentFromTemplate = handleSubmit(onSubmit); const { fields: formRecipients } = useFieldArray({ control, name: 'recipients', }); return ( Document Recipients Add the recipients to create the template with.
{formRecipients.map((recipient, index) => (
( )} />
( )} />
( )} />
))}
); }