import React from 'react'; import { redirect } from 'next/navigation'; import { msg } from '@lingui/macro'; import { useLingui } from '@lingui/react'; import { DateTime } from 'luxon'; import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server'; import { DOCUMENT_STATUS } from '@documenso/lib/constants/document'; import { APP_I18N_OPTIONS, ZSupportedLanguageCodeSchema } from '@documenso/lib/constants/i18n'; import { RECIPIENT_ROLES_DESCRIPTION } from '@documenso/lib/constants/recipient-roles'; import { getEntireDocument } from '@documenso/lib/server-only/admin/get-entire-document'; import { decryptSecondaryData } from '@documenso/lib/server-only/crypto/decrypt'; import { findDocumentAuditLogs } from '@documenso/lib/server-only/document/find-document-audit-logs'; import { dynamicActivate } from '@documenso/lib/utils/i18n'; import { Card, CardContent } from '@documenso/ui/primitives/card'; import { Logo } from '~/components/branding/logo'; import { AuditLogDataTable } from './data-table'; type AuditLogProps = { searchParams: { d: string; }; }; /** * DO NOT USE TRANS. YOU MUST USE _ FOR THIS FILE AND ALL CHILDREN COMPONENTS. * * Cannot use dynamicActivate by itself to translate this specific page and all * children components because `not-found.tsx` page runs and overrides the i18n. */ export default async function AuditLog({ searchParams }: AuditLogProps) { const { i18n } = await setupI18nSSR(); const { _ } = useLingui(); const { d } = searchParams; if (typeof d !== 'string' || !d) { return redirect('/'); } const rawDocumentId = decryptSecondaryData(d); if (!rawDocumentId || isNaN(Number(rawDocumentId))) { return redirect('/'); } const documentId = Number(rawDocumentId); const document = await getEntireDocument({ id: documentId, }).catch(() => null); if (!document) { return redirect('/'); } const documentLanguage = ZSupportedLanguageCodeSchema.parse(document.documentMeta?.language); await dynamicActivate(i18n, documentLanguage); const { data: auditLogs } = await findDocumentAuditLogs({ documentId: documentId, userId: document.userId, teamId: document.teamId || undefined, perPage: 100_000, }); return (

{_(msg`Version History`)}

{_(msg`Document ID`)} {document.id}

{_(msg`Enclosed Document`)} {document.title}

{_(msg`Status`)} {_( document.deletedAt ? msg`Deleted` : DOCUMENT_STATUS[document.status].description, ).toUpperCase()}

{_(msg`Owner`)} {document.user.name} ({document.user.email})

{_(msg`Created At`)} {DateTime.fromJSDate(document.createdAt) .setLocale(APP_I18N_OPTIONS.defaultLocale) .toFormat('yyyy-mm-dd hh:mm:ss a (ZZZZ)')}

{_(msg`Last Updated`)} {DateTime.fromJSDate(document.updatedAt) .setLocale(APP_I18N_OPTIONS.defaultLocale) .toFormat('yyyy-mm-dd hh:mm:ss a (ZZZZ)')}

{_(msg`Time Zone`)} {document.documentMeta?.timezone ?? 'N/A'}

{_(msg`Recipients`)}

    {document.recipients.map((recipient) => (
  • [{_(RECIPIENT_ROLES_DESCRIPTION[recipient.role].roleName)}] {' '} {recipient.name} ({recipient.email})
  • ))}
); }