'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 { Badge } from '@kit/ui/badge'; 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 { RemoveMemberDialog } from './remove-member-dialog'; import { RoleBadge } from './role-badge'; import { TransferOwnershipDialog } from './transfer-ownership-dialog'; import { UpdateMemberRoleDialog } from './update-member-role-dialog'; type Members = Database['public']['Functions']['get_account_members']['Returns']; interface Permissions { canUpdateRole: (roleHierarchy: number) => boolean; canRemoveFromAccount: (roleHierarchy: number) => boolean; canTransferOwnership: boolean; } type AccountMembersTableProps = { members: Members; currentUserId: string; currentAccountId: string; userRoleHierarchy: number; isPrimaryOwner: boolean; canManageRoles: boolean; }; export function AccountMembersTable({ members, currentUserId, currentAccountId, isPrimaryOwner, userRoleHierarchy, canManageRoles, }: AccountMembersTableProps) { const [search, setSearch] = useState(''); const { t } = useTranslation('teams'); const permissions = { canUpdateRole: (targetRole: number) => { return ( isPrimaryOwner || (canManageRoles && userRoleHierarchy < targetRole) ); }, canRemoveFromAccount: (targetRole: number) => { return ( isPrimaryOwner || (canManageRoles && userRoleHierarchy < targetRole) ); }, canTransferOwnership: isPrimaryOwner, }; const columns = useGetColumns(permissions, { currentUserId, currentAccountId, currentRoleHierarchy: userRoleHierarchy, }); const filteredMembers = members.filter((member) => { const searchString = search.toLowerCase(); const displayName = member.name ?? member.email.split('@')[0]; return ( displayName.includes(searchString) || member.role.toLowerCase().includes(searchString) ); }); return (