fix: changes from code review

This commit is contained in:
Ephraim Atta-Duncan
2024-01-02 04:38:35 +00:00
parent b9282f11b0
commit b76d2cea3b
6 changed files with 85 additions and 66 deletions

View File

@@ -1,7 +1,7 @@
{ {
"typescript.tsdk": "node_modules/typescript/lib", "typescript.tsdk": "node_modules/typescript/lib",
"editor.codeActionsOnSave": { "editor.codeActionsOnSave": {
"source.fixAll.eslint": true "source.fixAll.eslint": "explicit"
}, },
"eslint.validate": ["typescript", "typescriptreact", "javascript", "javascriptreact"], "eslint.validate": ["typescript", "typescriptreact", "javascript", "javascriptreact"],
"javascript.preferences.importModuleSpecifier": "non-relative", "javascript.preferences.importModuleSpecifier": "non-relative",

View File

@@ -6,12 +6,13 @@ import { Download, Edit, Pencil } from 'lucide-react';
import { useSession } from 'next-auth/react'; import { useSession } from 'next-auth/react';
import { match } from 'ts-pattern'; import { match } from 'ts-pattern';
import { downloadFile } from '@documenso/lib/client-only/download-pdf'; import { downloadPDF } from '@documenso/lib/client-only/download-pdf';
import type { Document, Recipient, User } from '@documenso/prisma/client'; import type { Document, Recipient, User } from '@documenso/prisma/client';
import { DocumentStatus, SigningStatus } from '@documenso/prisma/client'; import { DocumentStatus, SigningStatus } from '@documenso/prisma/client';
import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import type { DocumentWithData } from '@documenso/prisma/types/document-with-data';
import { trpc as trpcClient } from '@documenso/trpc/client'; import { trpc as trpcClient } from '@documenso/trpc/client';
import { Button } from '@documenso/ui/primitives/button'; import { Button } from '@documenso/ui/primitives/button';
import { useToast } from '@documenso/ui/primitives/use-toast';
export type DataTableActionButtonProps = { export type DataTableActionButtonProps = {
row: Document & { row: Document & {
@@ -22,6 +23,7 @@ export type DataTableActionButtonProps = {
export const DataTableActionButton = ({ row }: DataTableActionButtonProps) => { export const DataTableActionButton = ({ row }: DataTableActionButtonProps) => {
const { data: session } = useSession(); const { data: session } = useSession();
const { toast } = useToast();
if (!session) { if (!session) {
return null; return null;
@@ -37,25 +39,33 @@ export const DataTableActionButton = ({ row }: DataTableActionButtonProps) => {
const isSigned = recipient?.signingStatus === SigningStatus.SIGNED; const isSigned = recipient?.signingStatus === SigningStatus.SIGNED;
const onDownloadClick = async () => { const onDownloadClick = async () => {
let document: DocumentWithData | null = null; try {
let document: DocumentWithData | null = null;
if (!recipient) { if (!recipient) {
document = await trpcClient.document.getDocumentById.query({ document = await trpcClient.document.getDocumentById.query({
id: row.id, id: row.id,
}); });
} else { } else {
document = await trpcClient.document.getDocumentByToken.query({ document = await trpcClient.document.getDocumentByToken.query({
token: recipient.token, 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',
}); });
} }
const documentData = document?.documentData;
if (!documentData) {
return;
}
await downloadFile({ documentData, fileName: row.title });
}; };
return match({ return match({

View File

@@ -17,7 +17,7 @@ import {
} from 'lucide-react'; } from 'lucide-react';
import { useSession } from 'next-auth/react'; import { useSession } from 'next-auth/react';
import { downloadFile } from '@documenso/lib/client-only/download-pdf'; import { downloadPDF } from '@documenso/lib/client-only/download-pdf';
import type { Document, Recipient, User } from '@documenso/prisma/client'; import type { Document, Recipient, User } from '@documenso/prisma/client';
import { DocumentStatus } from '@documenso/prisma/client'; import { DocumentStatus } from '@documenso/prisma/client';
import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import type { DocumentWithData } from '@documenso/prisma/types/document-with-data';
@@ -63,25 +63,33 @@ export const DataTableActionDropdown = ({ row }: DataTableActionDropdownProps) =
const isDocumentDeletable = isOwner; const isDocumentDeletable = isOwner;
const onDownloadClick = async () => { const onDownloadClick = async () => {
let document: DocumentWithData | null = null; try {
let document: DocumentWithData | null = null;
if (!recipient) { if (!recipient) {
document = await trpcClient.document.getDocumentById.query({ document = await trpcClient.document.getDocumentById.query({
id: row.id, id: row.id,
}); });
} else { } else {
document = await trpcClient.document.getDocumentByToken.query({ document = await trpcClient.document.getDocumentByToken.query({
token: recipient.token, token: recipient.token,
});
}
const documentData = document?.documentData;
if (!documentData) {
return;
}
await downloadPDF({ documentData, fileName: row.title });
} catch (err) {
toast({
title: 'Something went wrong',
description: 'An error occurred while downloading your document.',
variant: 'destructive',
}); });
} }
const documentData = document?.documentData;
if (!documentData) {
return;
}
await downloadFile({ documentData, fileName: row.title });
}; };
const nonSignedRecipients = row.Recipient.filter((item) => item.signingStatus !== 'SIGNED'); const nonSignedRecipients = row.Recipient.filter((item) => item.signingStatus !== 'SIGNED');

View File

@@ -1,5 +1,4 @@
import type { DocumentData } from '@documenso/prisma/client'; import type { DocumentData } from '@documenso/prisma/client';
import { toast } from '@documenso/ui/primitives/use-toast';
import { getFile } from '../universal/upload/get-file'; import { getFile } from '../universal/upload/get-file';
@@ -8,30 +7,20 @@ type DownloadPDFProps = {
fileName?: string; fileName?: string;
}; };
export const downloadFile = async ({ documentData, fileName }: DownloadPDFProps) => { export const downloadPDF = async ({ documentData, fileName }: DownloadPDFProps) => {
try { const bytes = await getFile(documentData);
const bytes = await getFile(documentData);
const blob = new Blob([bytes], { const blob = new Blob([bytes], {
type: 'application/pdf', type: 'application/pdf',
}); });
const link = window.document.createElement('a'); const link = window.document.createElement('a');
const baseTitle = fileName?.includes('.pdf') ? fileName.split('.pdf')[0] : fileName; const baseTitle = fileName?.includes('.pdf') ? fileName.split('.pdf')[0] : fileName;
link.href = window.URL.createObjectURL(blob); link.href = window.URL.createObjectURL(blob);
link.download = baseTitle ? `${baseTitle}_signed.pdf` : 'document.pdf'; link.download = baseTitle ? `${baseTitle}_signed.pdf` : 'document.pdf';
link.click(); link.click();
window.URL.revokeObjectURL(link.href); window.URL.revokeObjectURL(link.href);
} catch (err) {
console.error(err);
toast({
title: 'Something went wrong',
description: 'An error occurred while downloading your document.',
variant: 'destructive',
});
}
}; };

View File

@@ -3,9 +3,10 @@
import type { HTMLAttributes } from 'react'; import type { HTMLAttributes } from 'react';
import { useState } from 'react'; import { useState } from 'react';
import { useToast } from '@/primitives/use-toast';
import { Download } from 'lucide-react'; import { Download } from 'lucide-react';
import { downloadFile } from '@documenso/lib/client-only/download-pdf'; import { downloadPDF } from '@documenso/lib/client-only/download-pdf';
import type { DocumentData } from '@documenso/prisma/client'; import type { DocumentData } from '@documenso/prisma/client';
import { Button } from '../../primitives/button'; import { Button } from '../../primitives/button';
@@ -24,17 +25,29 @@ export const DocumentDownloadButton = ({
...props ...props
}: DownloadButtonProps) => { }: DownloadButtonProps) => {
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const { toast } = useToast();
const onDownloadClick = async () => { const onDownloadClick = async () => {
setIsLoading(true); try {
setIsLoading(true);
if (!documentData) { if (!documentData) {
return; setIsLoading(false);
} return;
}
await downloadFile({ documentData, fileName }).then(() => { await downloadPDF({ documentData, fileName }).then(() => {
setIsLoading(false);
});
} catch (err) {
setIsLoading(false); setIsLoading(false);
});
toast({
title: 'Something went wrong',
description: 'An error occurred while downloading your document.',
variant: 'destructive',
});
}
}; };
return ( return (

View File

@@ -1,8 +1,7 @@
// Inspired by react-hot-toast library // Inspired by react-hot-toast library
import * as React from 'react'; import * as React from 'react';
import type { ToastActionElement } from './toast'; import type { ToastActionElement, ToastProps } from './toast';
import { type ToastProps } from './toast';
const TOAST_LIMIT = 1; const TOAST_LIMIT = 1;
const TOAST_REMOVE_DELAY = 1000000; const TOAST_REMOVE_DELAY = 1000000;