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 { TSetDocumentAttachmentsSchema } from '@documenso/trpc/server/attachment-router/schema'; import { ZSetDocumentAttachmentsSchema } 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 = { documentId: number; }; export const AttachmentForm = ({ documentId }: AttachmentFormProps) => { const { toast } = useToast(); const { data: attachmentsData, refetch: refetchAttachments } = trpc.attachment.getDocumentAttachments.useQuery({ documentId, }); const { mutateAsync: setDocumentAttachments } = trpc.attachment.setDocumentAttachments.useMutation(); const defaultAttachments = [ { id: nanoid(12), label: '', url: '', type: AttachmentType.LINK, }, ]; const form = useForm({ resolver: zodResolver(ZSetDocumentAttachmentsSchema), defaultValues: { documentId, 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: TSetDocumentAttachmentsSchema) => { try { await setDocumentAttachments({ documentId, 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 )} />
))}
); };