import { useLimits } from '@documenso/ee/server-only/limits/provider/client'; import { trpc as trpcReact } from '@documenso/trpc/react'; import { Alert, AlertDescription } from '@documenso/ui/primitives/alert'; import { Button } from '@documenso/ui/primitives/button'; import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@documenso/ui/primitives/dialog'; import { Input } from '@documenso/ui/primitives/input'; import { useToast } from '@documenso/ui/primitives/use-toast'; import { msg } from '@lingui/core/macro'; import { Trans, useLingui } from '@lingui/react/macro'; import { DocumentStatus, EnvelopeType } from '@prisma/client'; import { useEffect, useState } from 'react'; import { match, P } from 'ts-pattern'; type EnvelopeDeleteDialogProps = { id: string; type: EnvelopeType; trigger?: React.ReactNode; onDelete?: () => Promise | void; status: DocumentStatus; title: string; canManageDocument: boolean; }; export const EnvelopeDeleteDialog = ({ id, type, trigger, onDelete, status, title, canManageDocument, }: EnvelopeDeleteDialogProps) => { const { toast } = useToast(); const { refreshLimits } = useLimits(); const { t } = useLingui(); const deleteMessage = msg`delete`; const [open, setOpen] = useState(false); const [inputValue, setInputValue] = useState(''); const [isDeleteEnabled, setIsDeleteEnabled] = useState(status === DocumentStatus.DRAFT); const isDocument = type === EnvelopeType.DOCUMENT; const { mutateAsync: deleteEnvelope, isPending } = trpcReact.envelope.delete.useMutation({ onSuccess: async () => { void refreshLimits(); toast({ title: canManageDocument ? isDocument ? t`Document deleted` : t`Template deleted` : isDocument ? t`Document hidden` : t`Template hidden`, description: canManageDocument ? t`"${title}" has been successfully deleted` : t`"${title}" has been successfully hidden`, duration: 5000, }); await onDelete?.(); setOpen(false); }, onError: () => { toast({ title: t`Something went wrong`, description: isDocument ? t`This document could not be deleted at this time. Please try again.` : t`This template could not be deleted at this time. Please try again.`, variant: 'destructive', duration: 7500, }); }, }); useEffect(() => { if (open) { setInputValue(''); setIsDeleteEnabled(status === DocumentStatus.DRAFT); } }, [open, status]); const onInputChange = (event: React.ChangeEvent) => { setInputValue(event.target.value); setIsDeleteEnabled(event.target.value === t(deleteMessage)); }; return ( !isPending && setOpen(value)}> {trigger} Are you sure? {canManageDocument ? ( You are about to delete "{title}" ) : ( You are about to hide "{title}" )} {canManageDocument ? ( {match(status) .with(DocumentStatus.DRAFT, () => ( {type === EnvelopeType.DOCUMENT ? ( Please note that this action is irreversible. Once confirmed, this document will be permanently deleted. ) : ( Please note that this action is irreversible. Once confirmed, this template will be permanently deleted. )} )) .with(DocumentStatus.PENDING, () => (

Please note that this action is irreversible.

Once confirmed, the following will occur:

  • Document will be permanently deleted
  • Document signing process will be cancelled
  • All inserted signatures will be voided
  • All recipients will be notified
)) .with(P.union(DocumentStatus.COMPLETED, DocumentStatus.REJECTED, DocumentStatus.CANCELLED), () => (

By deleting this document, the following will occur:

  • The document will be hidden from your account
  • Recipients will still retain their copy of the document
)) .exhaustive()}
) : ( Please contact support if you would like to revert this action. )} {status !== DocumentStatus.DRAFT && canManageDocument && ( )}
); };