import { useMemo, useTransition } from 'react'; import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import { Trans } from '@lingui/react/macro'; import { RecipientRole } from '@prisma/client'; import { CheckCircleIcon, EyeIcon, Loader, PencilIcon } from 'lucide-react'; import { DateTime } from 'luxon'; import { Link, useSearchParams } from 'react-router'; import { match } from 'ts-pattern'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status'; import { trpc } from '@documenso/trpc/react'; import type { TFindDocumentsResponse } from '@documenso/trpc/server/document-router/schema'; import { Button } from '@documenso/ui/primitives/button'; import type { DataTableColumnDef } from '@documenso/ui/primitives/data-table'; import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; import { Skeleton } from '@documenso/ui/primitives/skeleton'; import { TableCell } from '@documenso/ui/primitives/table'; import { useOptionalCurrentTeam } from '~/providers/team'; import { StackAvatarsWithTooltip } from '../general/stack-avatars-with-tooltip'; export type DocumentsTableProps = { data?: TFindDocumentsResponse; isLoading?: boolean; isLoadingError?: boolean; }; type DocumentsTableRow = TFindDocumentsResponse['data'][number]; export const InboxTable = () => { const { _, i18n } = useLingui(); const team = useOptionalCurrentTeam(); const [isPending, startTransition] = useTransition(); const [searchParams] = useSearchParams(); const updateSearchParams = useUpdateSearchParams(); const page = searchParams?.get?.('page') ? Number(searchParams.get('page')) : undefined; const perPage = searchParams?.get?.('perPage') ? Number(searchParams.get('perPage')) : undefined; const { data, isLoading, isLoadingError } = trpc.document.findDocumentsInternal.useQuery({ status: ExtendedDocumentStatus.INBOX, page: page || 1, perPage: perPage || 10, }); const columns = useMemo(() => { return [ { header: _(msg`Created`), accessorKey: 'createdAt', cell: ({ row }) => i18n.date(row.original.createdAt, { ...DateTime.DATETIME_SHORT, hourCycle: 'h12' }), }, { header: _(msg`Title`), cell: ({ row }) => ( {row.original.title} ), }, { id: 'sender', header: _(msg`Sender`), cell: ({ row }) => row.original.user.name ?? row.original.user.email, }, { header: _(msg`Recipient`), accessorKey: 'recipient', cell: ({ row }) => ( ), }, { header: _(msg`Actions`), cell: ({ row }) => (
), }, ] satisfies DataTableColumnDef[]; }, [team]); const onPaginationChange = (page: number, perPage: number) => { startTransition(() => { updateSearchParams({ page, perPage, }); }); }; const results = data ?? { data: [], perPage: 10, currentPage: 1, totalPages: 1, }; return (

Documents that require your attention will appear here

} skeleton={{ enable: isLoading || false, rows: 5, component: ( <>
), }} > {(table) => results.totalPages > 1 && ( ) } {isPending && (
)} ); };