'use client'; import { useState } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { Trans, msg } from '@lingui/macro'; import { useLingui } from '@lingui/react'; import { History } from 'lucide-react'; import { useSession } from 'next-auth/react'; import { useForm } from 'react-hook-form'; import * as z from 'zod'; import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter'; import type { Team } from '@documenso/prisma/client'; import { type Document, type Recipient, SigningStatus } from '@documenso/prisma/client'; import { trpc as trpcReact } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Checkbox } from '@documenso/ui/primitives/checkbox'; import { Dialog, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@documenso/ui/primitives/dialog'; import { DropdownMenuItem } from '@documenso/ui/primitives/dropdown-menu'; import { Form, FormControl, FormField, FormItem, FormLabel, } from '@documenso/ui/primitives/form/form'; import { useToast } from '@documenso/ui/primitives/use-toast'; import { StackAvatar } from '~/components/(dashboard)/avatar/stack-avatar'; const FORM_ID = 'resend-email'; export type ResendDocumentActionItemProps = { document: Document & { team: Pick | null; }; recipients: Recipient[]; team?: Pick; }; export const ZResendDocumentFormSchema = z.object({ recipients: z.array(z.number()).min(1, { message: 'You must select at least one item.', }), }); export type TResendDocumentFormSchema = z.infer; export const ResendDocumentActionItem = ({ document, recipients, team, }: ResendDocumentActionItemProps) => { const { data: session } = useSession(); const { toast } = useToast(); const { _ } = useLingui(); const [isOpen, setIsOpen] = useState(false); const isOwner = document.userId === session?.user?.id; const isCurrentTeamDocument = team && document.team?.url === team.url; const isDisabled = (!isOwner && !isCurrentTeamDocument) || document.status !== 'PENDING' || !recipients.some((r) => r.signingStatus === SigningStatus.NOT_SIGNED); const { mutateAsync: resendDocument } = trpcReact.document.resendDocument.useMutation(); const form = useForm({ resolver: zodResolver(ZResendDocumentFormSchema), defaultValues: { recipients: [], }, }); const { handleSubmit, formState: { isSubmitting }, } = form; const onFormSubmit = async ({ recipients }: TResendDocumentFormSchema) => { try { await resendDocument({ documentId: document.id, recipients, teamId: team?.id }); toast({ title: _(msg`Document re-sent`), description: _(msg`Your document has been re-sent successfully.`), duration: 5000, }); setIsOpen(false); } catch (err) { toast({ title: _(msg`Something went wrong`), description: _(msg`This document could not be re-sent at this time. Please try again.`), variant: 'destructive', duration: 7500, }); } }; return ( e.preventDefault()}> Resend

Who do you want to remind?

( <> {recipients.map((recipient) => ( {recipient.email} checked ? onChange([...value, recipient.id]) : onChange(value.filter((v) => v !== recipient.id)) } /> ))} )} />
); };