mirror of
https://github.com/documenso/documenso.git
synced 2026-08-15 02:53:32 +10:00
71 lines
1.9 KiB
TypeScript
71 lines
1.9 KiB
TypeScript
import type { EnvelopeItem } from '@prisma/client';
|
|
|
|
import { getEnvelopeItemPdfUrl } from '../utils/envelope-download';
|
|
import { downloadFile } from './download-file';
|
|
|
|
type DocumentVersion = 'original' | 'signed' | 'pending';
|
|
|
|
type DownloadPDFProps = {
|
|
envelopeItem: Pick<EnvelopeItem, 'id' | 'envelopeId'>;
|
|
token: string | undefined;
|
|
|
|
fileName?: string;
|
|
/**
|
|
* Specifies which version of the document to download.
|
|
* 'signed': Downloads the signed version (default).
|
|
* 'original': Downloads the original version.
|
|
* 'pending': Downloads the original document with currently-inserted fields burned in.
|
|
* Only valid while the envelope is in PENDING status. Not supported via
|
|
* recipient token.
|
|
*/
|
|
version?: DocumentVersion;
|
|
};
|
|
|
|
const versionToFilenameSuffix = (version: DocumentVersion): string => {
|
|
switch (version) {
|
|
case 'signed':
|
|
return '_signed.pdf';
|
|
case 'pending':
|
|
return '_pending.pdf';
|
|
case 'original':
|
|
return '.pdf';
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Fetches a PDF for an envelope item and returns it as a blob alongside the
|
|
* filename it should be saved as. Throws on non-OK responses.
|
|
*/
|
|
export const fetchPDF = async ({ envelopeItem, token, fileName, version = 'signed' }: DownloadPDFProps) => {
|
|
const downloadUrl = getEnvelopeItemPdfUrl({
|
|
type: 'download',
|
|
envelopeItem: envelopeItem,
|
|
token,
|
|
version,
|
|
});
|
|
|
|
const response = await fetch(downloadUrl);
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`Failed to download PDF: ${response.status}`);
|
|
}
|
|
|
|
const blob = await response.blob();
|
|
|
|
const baseTitle = (fileName ?? 'document').replace(/\.pdf$/, '');
|
|
|
|
return {
|
|
filename: `${baseTitle}${versionToFilenameSuffix(version)}`,
|
|
blob,
|
|
};
|
|
};
|
|
|
|
export const downloadPDF = async (options: DownloadPDFProps) => {
|
|
const { filename, blob } = await fetchPDF(options);
|
|
|
|
downloadFile({
|
|
filename,
|
|
data: blob,
|
|
});
|
|
};
|