'use client'; import Link from 'next/link'; import { CheckCircle, Download, Edit, EyeIcon, Pencil } from 'lucide-react'; import { useSession } from 'next-auth/react'; import { match } from 'ts-pattern'; import { downloadPDF } from '@documenso/lib/client-only/download-pdf'; import { formatDocumentsPath } from '@documenso/lib/utils/teams'; import type { Document, Recipient, Team, User } from '@documenso/prisma/client'; import { DocumentStatus, RecipientRole, SigningStatus } from '@documenso/prisma/client'; import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import { trpc as trpcClient } from '@documenso/trpc/client'; import { Button } from '@documenso/ui/primitives/button'; import { useToast } from '@documenso/ui/primitives/use-toast'; export type DataTableActionButtonProps = { row: Document & { User: Pick; Recipient: Recipient[]; team: Pick | null; }; team?: Pick; }; export const DataTableActionButton = ({ row, team }: DataTableActionButtonProps) => { const { data: session } = useSession(); const { toast } = useToast(); if (!session) { return null; } const recipient = row.Recipient.find((recipient) => recipient.email === session.user.email); const isOwner = row.User.id === session.user.id; const isRecipient = !!recipient; const isDraft = row.status === DocumentStatus.DRAFT; const isPending = row.status === DocumentStatus.PENDING; const isComplete = row.status === DocumentStatus.COMPLETED; const isSigned = recipient?.signingStatus === SigningStatus.SIGNED; const role = recipient?.role; const isCurrentTeamDocument = team && row.team?.url === team.url; const documentsPath = formatDocumentsPath(team?.url); const onDownloadClick = async () => { try { let document: DocumentWithData | null = null; if (!recipient) { document = await trpcClient.document.getDocumentById.query({ id: row.id, teamId: team?.id, }); } else { document = await trpcClient.document.getDocumentByToken.query({ token: recipient.token, }); } const documentData = document?.documentData; if (!documentData) { throw Error('No document available'); } await downloadPDF({ documentData, fileName: row.title }); } catch (err) { toast({ title: 'Something went wrong', description: 'An error occurred while downloading your document.', variant: 'destructive', }); } }; // TODO: Consider if want to keep this logic for hiding viewing for CC'ers if (recipient?.role === RecipientRole.CC && isComplete === false) { return null; } return match({ isOwner, isRecipient, isDraft, isPending, isComplete, isSigned, isCurrentTeamDocument, }) .with( isOwner ? { isDraft: true, isOwner: true } : { isDraft: true, isCurrentTeamDocument: true }, () => ( ), ) .with({ isRecipient: true, isPending: true, isSigned: false }, () => ( )) .with({ isPending: true, isSigned: true }, () => ( )) .with({ isComplete: true }, () => ( )) .otherwise(() =>
); };