diff --git a/apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx b/apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx index c6c3c9ad3..4bd852248 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx @@ -139,6 +139,7 @@ export const DocumentLogsPageView = async ({ params, team }: DocumentLogsPageVie className="mr-2" documentId={document.id} documentStatus={document.status} + teamId={team?.id} /> diff --git a/apps/web/src/app/(dashboard)/documents/[id]/logs/download-certificate-button.tsx b/apps/web/src/app/(dashboard)/documents/[id]/logs/download-certificate-button.tsx index aed252670..7cc262d3d 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/logs/download-certificate-button.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/logs/download-certificate-button.tsx @@ -14,12 +14,14 @@ export type DownloadCertificateButtonProps = { className?: string; documentId: number; documentStatus: DocumentStatus; + teamId?: number; }; export const DownloadCertificateButton = ({ className, documentId, documentStatus, + teamId, }: DownloadCertificateButtonProps) => { const { toast } = useToast(); const { _ } = useLingui(); @@ -29,7 +31,7 @@ export const DownloadCertificateButton = ({ const onDownloadCertificatesClick = async () => { try { - const { url } = await downloadCertificate({ documentId }); + const { url } = await downloadCertificate({ documentId, teamId }); const iframe = Object.assign(document.createElement('iframe'), { src: url, diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx index 26409c01b..e021b66b2 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx @@ -206,9 +206,9 @@ export const TeamDocumentPreferencesForm = ({ {includeSenderDetails - ? _(msg`"${placeholderEmail}" on behalf of "${team.name}" has invited you to sign "example - document".`) - : _(msg`"${team.name}" has invited you to sign "example document".`)} + ? _(msg`'${placeholderEmail}' on behalf of '${team.name}' has invited you to sign 'example + document'.`) + : _(msg`'${team.name}' has invited you to sign 'example document'.`)} diff --git a/packages/lib/server-only/document/seal-document.ts b/packages/lib/server-only/document/seal-document.ts index 7c0c3bced..31e66d25f 100644 --- a/packages/lib/server-only/document/seal-document.ts +++ b/packages/lib/server-only/document/seal-document.ts @@ -10,6 +10,7 @@ import { DocumentStatus, RecipientRole, SigningStatus } from '@documenso/prisma/ import { WebhookTriggerEvents } from '@documenso/prisma/client'; import { signPdf } from '@documenso/signing'; +import { ZSupportedLanguageCodeSchema } from '../../constants/i18n'; import type { RequestMetadata } from '../../universal/extract-request-metadata'; import { getFile } from '../../universal/upload/get-file'; import { putPdfFile } from '../../universal/upload/put-file'; @@ -45,6 +46,7 @@ export const sealDocument = async ({ }, include: { documentData: true, + documentMeta: true, Recipient: true, }, }); @@ -90,7 +92,9 @@ export const sealDocument = async ({ // !: Need to write the fields onto the document as a hard copy const pdfData = await getFile(documentData); - const certificate = await getCertificatePdf({ documentId }) + const documentLanguage = ZSupportedLanguageCodeSchema.parse(document.documentMeta?.language); + + const certificate = await getCertificatePdf({ documentId, language: documentLanguage }) .then(async (doc) => PDFDocument.load(doc)) .catch(() => null); diff --git a/packages/lib/server-only/htmltopdf/get-certificate-pdf.ts b/packages/lib/server-only/htmltopdf/get-certificate-pdf.ts index 56c2e32cf..e5348ae1e 100644 --- a/packages/lib/server-only/htmltopdf/get-certificate-pdf.ts +++ b/packages/lib/server-only/htmltopdf/get-certificate-pdf.ts @@ -2,13 +2,15 @@ import { DateTime } from 'luxon'; import type { Browser } from 'playwright'; import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; +import type { SupportedLanguageCodes } from '../../constants/i18n'; import { encryptSecondaryData } from '../crypto/encrypt'; export type GetCertificatePdfOptions = { documentId: number; + language?: SupportedLanguageCodes; }; -export const getCertificatePdf = async ({ documentId }: GetCertificatePdfOptions) => { +export const getCertificatePdf = async ({ documentId, language }: GetCertificatePdfOptions) => { const { chromium } = await import('playwright'); const encryptedId = encryptSecondaryData({ @@ -32,7 +34,19 @@ export const getCertificatePdf = async ({ documentId }: GetCertificatePdfOptions ); } - const page = await browser.newPage(); + const browserContext = await browser.newContext(); + + const page = await browserContext.newPage(); + + if (language) { + await page.context().addCookies([ + { + name: 'language', + value: language, + url: NEXT_PUBLIC_WEBAPP_URL(), + }, + ]); + } await page.goto(`${NEXT_PUBLIC_WEBAPP_URL()}/__htmltopdf/certificate?d=${encryptedId}`, { waitUntil: 'networkidle', @@ -43,6 +57,8 @@ export const getCertificatePdf = async ({ documentId }: GetCertificatePdfOptions format: 'A4', }); + await browserContext.close(); + void browser.close(); return result;