import { useMemo } from 'react'; import { useLingui } from '@lingui/react/macro'; import { Trans } from '@lingui/react/macro'; import { EditIcon, MoreHorizontalIcon, Trash2Icon } from 'lucide-react'; import { Link, useSearchParams } from 'react-router'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; import { ZUrlSearchParamsSchema } from '@documenso/lib/types/search-params'; import { SUBSCRIPTION_CLAIM_FEATURE_FLAGS } from '@documenso/lib/types/subscription'; import { trpc } from '@documenso/trpc/react'; import { CopyTextButton } from '@documenso/ui/components/common/copy-text-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 { 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 { ClaimDeleteDialog } from '../dialogs/claim-delete-dialog'; import { ClaimUpdateDialog } from '../dialogs/claim-update-dialog'; export const AdminClaimsTable = () => { const { t } = useLingui(); const { toast } = useToast(); const [searchParams] = useSearchParams(); const updateSearchParams = useUpdateSearchParams(); const parsedSearchParams = ZUrlSearchParamsSchema.parse(Object.fromEntries(searchParams ?? [])); const { data, isLoading, isLoadingError } = trpc.admin.claims.find.useQuery({ query: parsedSearchParams.query, page: parsedSearchParams.page, perPage: parsedSearchParams.perPage, }); 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`ID`, accessorKey: 'id', maxSize: 50, cell: ({ row }) => ( toast({ title: t`ID copied to clipboard` })} /> ), }, { header: t`Name`, accessorKey: 'name', cell: ({ row }) => ( {row.original.name} ), }, { header: t`Allowed teams`, accessorKey: 'teamCount', cell: ({ row }) => { if (row.original.teamCount === 0) { return

{t`Unlimited`}

; } return

{row.original.teamCount}

; }, }, { header: t`Feature Flags`, cell: ({ row }) => { const flags = Object.values(SUBSCRIPTION_CLAIM_FEATURE_FLAGS).filter( ({ key }) => row.original.flags[key], ); if (flags.length === 0) { return

{t`None`}

; } return ( ); }, }, { id: 'actions', cell: ({ row }) => ( Actions e.preventDefault()}>
Update
} /> e.preventDefault()}>
Delete
} />
), }, ] satisfies DataTableColumnDef<(typeof results)['data'][number]>[]; }, []); return (
), }} > {(table) => }
); };