'use client'; import { useSearchParams } from 'next/navigation'; import { History, MoreHorizontal, Trash2 } from 'lucide-react'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; import { TEAM_MEMBER_ROLE_MAP } from '@documenso/lib/constants/teams'; import { ZBaseTableSearchParamsSchema } from '@documenso/lib/types/search-params'; import { trpc } from '@documenso/trpc/react'; import { AvatarWithText } from '@documenso/ui/primitives/avatar'; import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger, } from '@documenso/ui/primitives/dropdown-menu'; import { Skeleton } from '@documenso/ui/primitives/skeleton'; import { TableCell } from '@documenso/ui/primitives/table'; import { useToast } from '@documenso/ui/primitives/use-toast'; import { LocaleDate } from '~/components/formatter/locale-date'; export type TeamMemberInvitesDataTableProps = { teamId: number; }; export const TeamMemberInvitesDataTable = ({ teamId }: TeamMemberInvitesDataTableProps) => { const searchParams = useSearchParams(); const updateSearchParams = useUpdateSearchParams(); const { toast } = useToast(); const parsedSearchParams = ZBaseTableSearchParamsSchema.parse( Object.fromEntries(searchParams ?? []), ); const { data, isLoading, isInitialLoading, isLoadingError } = trpc.team.findTeamMemberInvites.useQuery( { teamId, term: parsedSearchParams.query, page: parsedSearchParams.page, perPage: parsedSearchParams.perPage, }, { keepPreviousData: true, }, ); const { mutateAsync: resendTeamMemberInvitation } = trpc.team.resendTeamMemberInvitation.useMutation({ onSuccess: () => { toast({ title: 'Success', description: 'Invitation has been resent', }); }, onError: () => { toast({ title: 'Something went wrong', description: 'Unable to resend invitation. Please try again.', variant: 'destructive', }); }, }); const { mutateAsync: deleteTeamMemberInvitations } = trpc.team.deleteTeamMemberInvitations.useMutation({ onSuccess: () => { toast({ title: 'Success', description: 'Invitation has been deleted', }); }, onError: () => { toast({ title: 'Something went wrong', description: 'Unable to delete invitation. Please try again.', variant: 'destructive', }); }, }); const onPaginationChange = (page: number, perPage: number) => { updateSearchParams({ page, perPage, }); }; const results = data ?? { data: [], perPage: 10, currentPage: 1, totalPages: 1, }; return ( { return ( {row.original.email} } /> ); }, }, { header: 'Role', accessorKey: 'role', cell: ({ row }) => TEAM_MEMBER_ROLE_MAP[row.original.role] ?? row.original.role, }, { header: 'Invited At', accessorKey: 'createdAt', cell: ({ row }) => , }, { header: 'Actions', cell: ({ row }) => ( Actions resendTeamMemberInvitation({ teamId, invitationId: row.original.id, }) } > Resend deleteTeamMemberInvitations({ teamId, invitationIds: [row.original.id], }) } > Remove ), }, ]} data={results.data} perPage={results.perPage} currentPage={results.currentPage} totalPages={results.totalPages} onPaginationChange={onPaginationChange} error={{ enable: isLoadingError, }} skeleton={{ enable: isLoading && isInitialLoading, rows: 3, component: ( <>
), }} > {(table) => }
); };