import { useState } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import { Trans } from '@lingui/react/macro'; import type { Team } from '@prisma/client'; import { type Document, type Recipient, SigningStatus } from '@prisma/client'; import { History } from 'lucide-react'; import { useForm } from 'react-hook-form'; import * as z from 'zod'; import { useSession } from '@documenso/lib/client-only/providers/session'; import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter'; 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 { useOptionalCurrentTeam } from '~/providers/team'; import { StackAvatar } from '../general/stack-avatar'; const FORM_ID = 'resend-email'; export type DocumentResendDialogProps = { document: Document & { team: Pick | null; }; recipients: Recipient[]; }; 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 DocumentResendDialog = ({ document, recipients }: DocumentResendDialogProps) => { const { user } = useSession(); const team = useOptionalCurrentTeam(); const { toast } = useToast(); const { _ } = useLingui(); const [isOpen, setIsOpen] = useState(false); const isOwner = document.userId === 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 }); 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)) } /> ))} )} />
); };