import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import type { DateTimeFormatOptions } from 'luxon'; import { DateTime } from 'luxon'; import { P, match } from 'ts-pattern'; import { UAParser } from 'ua-parser-js'; import { APP_I18N_OPTIONS } from '@documenso/lib/constants/i18n'; import { DOCUMENT_AUDIT_LOG_TYPE, type TDocumentAuditLog, } from '@documenso/lib/types/document-audit-logs'; import { formatDocumentAuditLogAction } from '@documenso/lib/utils/document-audit-logs'; import { cn } from '@documenso/ui/lib/utils'; import { Card, CardContent } from '@documenso/ui/primitives/card'; export type AuditLogDataTableProps = { logs: TDocumentAuditLog[]; }; const dateFormat: DateTimeFormatOptions = { ...DateTime.DATETIME_SHORT, hourCycle: 'h12', }; /** * Get the color indicator for the audit log type */ const getAuditLogIndicatorColor = (type: string) => match(type) .with(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_RECIPIENT_COMPLETED, () => 'bg-green-500') .with(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_RECIPIENT_REJECTED, () => 'bg-red-500') .with(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_SENT, () => 'bg-orange-500') .with( P.union( DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_FIELD_INSERTED, DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_FIELD_UNINSERTED, ), () => 'bg-blue-500', ) .otherwise(() => 'bg-muted'); /** * DO NOT USE TRANS. YOU MUST USE _ FOR THIS FILE AND ALL CHILDREN COMPONENTS. */ const formatUserAgent = (userAgent: string | null | undefined, userAgentInfo: UAParser.IResult) => { if (!userAgent) { return msg`N/A`; } const browser = userAgentInfo.browser.name; const version = userAgentInfo.browser.version; const os = userAgentInfo.os.name; // If we can parse meaningful browser info, format it nicely if (browser && os) { const browserInfo = version ? `${browser} ${version}` : browser; return msg`${browserInfo} on ${os}`; } return msg`${userAgent}`; }; export const InternalAuditLogTable = ({ logs }: AuditLogDataTableProps) => { const { _ } = useLingui(); const parser = new UAParser(); return (