import { useEffect } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { Trash } from 'lucide-react'; import { useFieldArray, useForm } from 'react-hook-form'; import { nanoid } from '@documenso/lib/universal/id'; import { AttachmentType } from '@documenso/prisma/generated/types'; import { trpc } from '@documenso/trpc/react'; import type { TSetTemplateAttachmentsSchema } from '@documenso/trpc/server/attachment-router/schema'; import { ZSetTemplateAttachmentsSchema } from '@documenso/trpc/server/attachment-router/schema'; import { Button } from '@documenso/ui/primitives/button'; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@documenso/ui/primitives/dialog'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@documenso/ui/primitives/form/form'; import { Input } from '@documenso/ui/primitives/input'; import { useToast } from '@documenso/ui/primitives/use-toast'; export type AttachmentFormProps = { templateId: number; }; export const AttachmentForm = ({ templateId }: AttachmentFormProps) => { const { toast } = useToast(); const { data: attachmentsData, refetch: refetchAttachments } = trpc.attachment.getTemplateAttachments.useQuery({ templateId, }); const { mutateAsync: setTemplateAttachments } = trpc.attachment.setTemplateAttachments.useMutation(); const defaultAttachments = [ { id: nanoid(12), label: '', url: '', type: AttachmentType.LINK, }, ]; const form = useForm({ resolver: zodResolver(ZSetTemplateAttachmentsSchema), defaultValues: { templateId, attachments: attachmentsData ?? defaultAttachments, }, }); const { fields: attachments, append: appendAttachment, remove: removeAttachment, } = useFieldArray({ control: form.control, name: 'attachments', }); const onAddAttachment = () => { appendAttachment({ id: nanoid(12), label: '', url: '', type: AttachmentType.LINK, }); }; const onRemoveAttachment = (index: number) => { removeAttachment(index); }; useEffect(() => { if (attachmentsData && attachmentsData.length > 0) { form.setValue('attachments', attachmentsData); } }, [attachmentsData]); const onSubmit = async (data: TSetTemplateAttachmentsSchema) => { try { await setTemplateAttachments({ templateId, attachments: data.attachments, }); toast({ title: 'Attachment(s) updated', description: 'The attachment(s) have been updated successfully', }); await refetchAttachments(); } catch (error) { console.error(error); toast({ title: 'Something went wrong', description: 'We encountered an unknown error while attempting to create the attachments.', variant: 'destructive', duration: 5000, }); } }; return ( Attachments
{attachments.map((attachment, index) => (
( Label )} /> ( URL )} />
))}
); };