import { useState } from 'react'; import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import { Trans } from '@lingui/react/macro'; import type { Document, Recipient, Team, User } from '@prisma/client'; import { DocumentStatus } from '@prisma/client'; import { Copy, Download, Edit, Loader, MoreHorizontal, ScrollTextIcon, Share, Trash2, } from 'lucide-react'; import { Link, useNavigate } from 'react-router'; import { downloadPDF } from '@documenso/lib/client-only/download-pdf'; import { useSession } from '@documenso/lib/client-only/providers/session'; import { isDocumentCompleted } from '@documenso/lib/utils/document'; import { formatDocumentsPath } from '@documenso/lib/utils/teams'; import { trpc as trpcClient } from '@documenso/trpc/client'; import { DocumentShareButton } from '@documenso/ui/components/document/document-share-button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger, } from '@documenso/ui/primitives/dropdown-menu'; import { useToast } from '@documenso/ui/primitives/use-toast'; import { DocumentDeleteDialog } from '~/components/dialogs/document-delete-dialog'; import { DocumentDuplicateDialog } from '~/components/dialogs/document-duplicate-dialog'; import { DocumentResendDialog } from '~/components/dialogs/document-resend-dialog'; import { DocumentRecipientLinkCopyDialog } from '~/components/general/document/document-recipient-link-copy-dialog'; import { useCurrentTeam } from '~/providers/team'; export type DocumentPageViewDropdownProps = { document: Document & { user: Pick; recipients: Recipient[]; team: Pick | null; }; }; export const DocumentPageViewDropdown = ({ document }: DocumentPageViewDropdownProps) => { const { user } = useSession(); const { toast } = useToast(); const { _ } = useLingui(); const navigate = useNavigate(); const team = useCurrentTeam(); const [isDeleteDialogOpen, setDeleteDialogOpen] = useState(false); const [isDuplicateDialogOpen, setDuplicateDialogOpen] = useState(false); const recipient = document.recipients.find((recipient) => recipient.email === user.email); const isOwner = document.user.id === user.id; const isDraft = document.status === DocumentStatus.DRAFT; const isPending = document.status === DocumentStatus.PENDING; const isDeleted = document.deletedAt !== null; const isComplete = isDocumentCompleted(document); const isCurrentTeamDocument = team && document.team?.url === team.url; const canManageDocument = Boolean(isOwner || isCurrentTeamDocument); const documentsPath = formatDocumentsPath(team.url); const onDownloadClick = async () => { try { const documentWithData = await trpcClient.document.getDocumentById.query( { documentId: document.id, }, { context: { teamId: team?.id?.toString(), }, }, ); const documentData = documentWithData?.documentData; if (!documentData) { return; } await downloadPDF({ documentData, fileName: document.title }); } catch (err) { toast({ title: _(msg`Something went wrong`), description: _(msg`An error occurred while downloading your document.`), variant: 'destructive', }); } }; const onDownloadOriginalClick = async () => { try { const documentWithData = await trpcClient.document.getDocumentById.query( { documentId: document.id, }, { context: { teamId: team?.id?.toString(), }, }, ); const documentData = documentWithData?.documentData; if (!documentData) { return; } await downloadPDF({ documentData, fileName: document.title, version: 'original' }); } catch (err) { toast({ title: _(msg`Something went wrong`), description: _(msg`An error occurred while downloading your document.`), variant: 'destructive', }); } }; const nonSignedRecipients = document.recipients.filter((item) => item.signingStatus !== 'SIGNED'); return ( Action {(isOwner || isCurrentTeamDocument) && !isComplete && ( Edit )} {isComplete && ( Download )} Download Original Audit Log setDuplicateDialogOpen(true)}> Duplicate setDeleteDialogOpen(true)} disabled={isDeleted}> Delete Share {canManageDocument && ( e.preventDefault()} > Signing Links } /> )} ( e.preventDefault()}>
{loading ? : } Share Signing Card
)} />
{ void navigate(documentsPath); }} /> {isDuplicateDialogOpen && ( )}
); };