import { useMemo } from 'react'; import { Trans, useLingui } from '@lingui/react/macro'; import { EmailDomainStatus } from '@prisma/client'; import { CheckCircle2Icon, ClockIcon } from 'lucide-react'; import { Link, useSearchParams } from 'react-router'; import { match } from 'ts-pattern'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; import { useCurrentOrganisation } from '@documenso/lib/client-only/providers/organisation'; import { ZUrlSearchParamsSchema } from '@documenso/lib/types/search-params'; import { trpc } from '@documenso/trpc/react'; import { AnimateGenericFadeInOut } from '@documenso/ui/components/animate/animate-generic-fade-in-out'; import { Alert, AlertDescription, AlertTitle } from '@documenso/ui/primitives/alert'; import { Badge } from '@documenso/ui/primitives/badge'; 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 { useToast } from '@documenso/ui/primitives/use-toast'; import { OrganisationEmailDomainDeleteDialog } from '../dialogs/organisation-email-domain-delete-dialog'; export const OrganisationEmailDomainsDataTable = () => { const { t } = useLingui(); const { toast } = useToast(); const [searchParams] = useSearchParams(); const updateSearchParams = useUpdateSearchParams(); const organisation = useCurrentOrganisation(); const parsedSearchParams = ZUrlSearchParamsSchema.parse(Object.fromEntries(searchParams ?? [])); const { mutate: verifyEmails, isPending: isVerifyingEmails } = trpc.enterprise.organisation.emailDomain.verify.useMutation({ onSuccess: () => { toast({ title: t`Email domains synced`, description: t`All email domains have been synced successfully`, }); }, }); const { data, isLoading, isLoadingError } = trpc.enterprise.organisation.emailDomain.find.useQuery( { organisationId: organisation.id, query: parsedSearchParams.query, page: parsedSearchParams.page, perPage: parsedSearchParams.perPage, }, { placeholderData: (previousData) => previousData, }, ); const onPaginationChange = (page: number, perPage: number) => { updateSearchParams({ page, perPage, }); }; const results = data ?? { data: [], perPage: 10, currentPage: 1, totalPages: 1, }; const columns = useMemo(() => { return [ { header: t`Domain`, accessorKey: 'domain', }, { header: t`Status`, accessorKey: 'status', cell: ({ row }) => match(row.original.status) .with(EmailDomainStatus.ACTIVE, () => ( Active )) .with(EmailDomainStatus.PENDING, () => ( Pending )) .exhaustive(), }, { header: t`Emails`, accessorKey: 'emailCount', cell: ({ row }) => row.original.emailCount, }, { header: t`Actions`, cell: ({ row }) => (
Delete } />
), }, ] satisfies DataTableColumnDef<(typeof results)['data'][number]>[]; }, []); return ( <>
), }} > {(table) => results.totalPages > 1 && ( ) }
{results.data.length > 0 && (
Sync Email Domains This will check and sync the status of all email domains for this organisation
)}
); };