import { useEffect, useMemo, useState } from 'react'; import { Trans } from '@lingui/react/macro'; import { useSearchParams } from 'react-router'; import { Link } from 'react-router'; import { z } from 'zod'; import { formatAvatarUrl } from '@documenso/lib/utils/avatars'; import { parseToIntegerArray } from '@documenso/lib/utils/params'; import { formatDocumentsPath } from '@documenso/lib/utils/teams'; import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status'; import { trpc } from '@documenso/trpc/react'; import { type TFindDocumentsInternalResponse, ZFindDocumentsInternalRequestSchema, } from '@documenso/trpc/server/document-router/schema'; import { Avatar, AvatarFallback, AvatarImage } from '@documenso/ui/primitives/avatar'; import { Tabs, TabsList, TabsTrigger } from '@documenso/ui/primitives/tabs'; import { DocumentSearch } from '~/components/general/document/document-search'; import { DocumentStatus } from '~/components/general/document/document-status'; import { DocumentUploadDropzone } from '~/components/general/document/document-upload'; import { PeriodSelector } from '~/components/general/period-selector'; import { DocumentsTable } from '~/components/tables/documents-table'; import { DocumentsTableEmptyState } from '~/components/tables/documents-table-empty-state'; import { DocumentsTableSenderFilter } from '~/components/tables/documents-table-sender-filter'; import { useOptionalCurrentTeam } from '~/providers/team'; import { appMetaTags } from '~/utils/meta'; export function meta() { return appMetaTags('Documents'); } const ZSearchParamsSchema = ZFindDocumentsInternalRequestSchema.pick({ status: true, period: true, page: true, perPage: true, query: true, }).extend({ senderIds: z.string().transform(parseToIntegerArray).optional().catch([]), }); export default function DocumentsPage() { const [searchParams] = useSearchParams(); const team = useOptionalCurrentTeam(); const [stats, setStats] = useState({ [ExtendedDocumentStatus.DRAFT]: 0, [ExtendedDocumentStatus.PENDING]: 0, [ExtendedDocumentStatus.COMPLETED]: 0, [ExtendedDocumentStatus.INBOX]: 0, [ExtendedDocumentStatus.ALL]: 0, }); const findDocumentSearchParams = useMemo( () => ZSearchParamsSchema.safeParse(Object.fromEntries(searchParams.entries())).data || {}, [searchParams], ); const { data, isLoading, isLoadingError, refetch } = trpc.document.findDocumentsInternal.useQuery( { ...findDocumentSearchParams, }, ); // Refetch the documents when the team URL changes. useEffect(() => { void refetch(); }, [team?.url]); const getTabHref = (value: keyof typeof ExtendedDocumentStatus) => { const params = new URLSearchParams(searchParams); params.set('status', value); if (value === ExtendedDocumentStatus.ALL) { params.delete('status'); } if (params.has('page')) { params.delete('page'); } return `${formatDocumentsPath(team?.url)}?${params.toString()}`; }; useEffect(() => { if (data?.stats) { setStats(data.stats); } }, [data?.stats]); return (
{team && ( {team.avatarImageId && } {team.name.slice(0, 1)} )}

Documents

{[ ExtendedDocumentStatus.INBOX, ExtendedDocumentStatus.PENDING, ExtendedDocumentStatus.COMPLETED, ExtendedDocumentStatus.DRAFT, ExtendedDocumentStatus.ALL, ].map((value) => ( {value !== ExtendedDocumentStatus.ALL && ( {stats[value]} )} ))} {team && }
{data && data.count === 0 ? ( ) : ( )}
); }