'use client'; import Link from 'next/link'; import { Trans, msg } from '@lingui/macro'; import { useLingui } from '@lingui/react'; import { CheckCircle, Download, 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 { trpc as trpcClient } from '@documenso/trpc/client'; import { Button } from '@documenso/ui/primitives/button'; import { useToast } from '@documenso/ui/primitives/use-toast'; export type DocumentPageViewButtonProps = { document: Document & { User: Pick; Recipient: Recipient[]; team: Pick | null; }; team?: Pick; }; export const DocumentPageViewButton = ({ document, team }: DocumentPageViewButtonProps) => { const { data: session } = useSession(); const { toast } = useToast(); const { _ } = useLingui(); if (!session) { return null; } const recipient = document.Recipient.find((recipient) => recipient.email === session.user.email); const isRecipient = !!recipient; const isPending = document.status === DocumentStatus.PENDING; const isComplete = document.status === DocumentStatus.COMPLETED; const isSigned = recipient?.signingStatus === SigningStatus.SIGNED; const role = recipient?.role; const documentsPath = formatDocumentsPath(document.team?.url); const onDownloadClick = async () => { try { const documentWithData = await trpcClient.document.getDocumentById.query({ id: document.id, teamId: team?.id, }); const documentData = documentWithData?.documentData; if (!documentData) { throw new Error('No document available'); } await downloadPDF({ documentData, fileName: documentWithData.title }); } catch (err) { toast({ title: _(msg`Something went wrong`), description: _(msg`An error occurred while downloading your document.`), variant: 'destructive', }); } }; return match({ isRecipient, isPending, isComplete, isSigned, }) .with({ isRecipient: true, isPending: true, isSigned: false }, () => ( )) .with({ isComplete: false }, () => ( )) .with({ isComplete: true }, () => ( )) .otherwise(() => null); };