'use client'; import { useMemo, useState } from 'react'; import { ColumnDef } from '@tanstack/react-table'; import { Ellipsis } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { Database } from '@kit/supabase/database'; import { Button } from '@kit/ui/button'; import { DataTable } from '@kit/ui/data-table'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@kit/ui/dropdown-menu'; import { If } from '@kit/ui/if'; import { Input } from '@kit/ui/input'; import { ProfileAvatar } from '@kit/ui/profile-avatar'; import { Trans } from '@kit/ui/trans'; import { RoleBadge } from '../members/role-badge'; import { DeleteInvitationDialog } from './delete-invitation-dialog'; import { UpdateInvitationDialog } from './update-invitation-dialog'; type Invitations = Database['public']['Functions']['get_account_invitations']['Returns']; type AccountInvitationsTableProps = { invitations: Invitations; permissions: { canUpdateInvitation: boolean; canRemoveInvitation: boolean; }; }; export function AccountInvitationsTable({ invitations, permissions, }: AccountInvitationsTableProps) { const { t } = useTranslation('teams'); const [search, setSearch] = useState(''); const columns = useGetColumns(permissions); const filteredInvitations = invitations.filter((member) => { const searchString = search.toLowerCase(); const email = member.email.split('@')[0]?.toLowerCase() ?? ''; return ( email.includes(searchString) || member.role.toLowerCase().includes(searchString) ); }); return (
setSearch((e.target as HTMLInputElement).value)} placeholder={t(`searchInvitations`)} />
); } function useGetColumns(permissions: { canUpdateInvitation: boolean; canRemoveInvitation: boolean; }): ColumnDef[] { const { t } = useTranslation('teams'); return useMemo( () => [ { header: t('emailLabel'), size: 200, cell: ({ row }) => { const member = row.original; const email = member.email; return ( {email} ); }, }, { header: t('roleLabel'), cell: ({ row }) => { const { role } = row.original; return ; }, }, { header: t('invitedAtLabel'), cell: ({ row }) => { return new Date(row.original.created_at).toLocaleDateString(); }, }, { header: '', id: 'actions', cell: ({ row }) => ( ), }, ], [permissions, t], ); } function ActionsDropdown({ permissions, invitation, }: { permissions: AccountInvitationsTableProps['permissions']; invitation: Invitations[0]; }) { const [isDeletingInvite, setIsDeletingInvite] = useState(false); const [isUpdatingRole, setIsUpdatingRole] = useState(false); return ( <> setIsUpdatingRole(true)}> setIsDeletingInvite(true)}> ); }