import { AlertCircle, HelpCircle } from 'lucide-react' import { useParams } from 'common' import AlertError from 'components/ui/AlertError' import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' import { useOrganizationRolesV2Query } from 'data/organization-members/organization-roles-query' import { useOrganizationMembersQuery } from 'data/organizations/organization-members-query' import { DOCS_URL } from 'lib/constants' import { useProfile } from 'lib/profile' import { partition } from 'lodash' import { useMemo } from 'react' import { Button, Card, Loading, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Tooltip, TooltipContent, TooltipTrigger, } from 'ui' import { Admonition } from 'ui-patterns' import { MemberRow } from './MemberRow' export interface MembersViewProps { searchString: string } const MembersView = ({ searchString }: MembersViewProps) => { const { slug } = useParams() const { profile } = useProfile() const { data: members = [], error: membersError, isLoading: isLoadingMembers, isError: isErrorMembers, isSuccess: isSuccessMembers, } = useOrganizationMembersQuery({ slug }) const { data: roles, error: rolesError, isSuccess: isSuccessRoles, isError: isErrorRoles, } = useOrganizationRolesV2Query({ slug, }) const filteredMembers = useMemo(() => { return !searchString ? members : members.filter((member) => { if (member.invited_at) { return member.primary_email?.includes(searchString) } if (member.gotrue_id) { return ( member.username.includes(searchString) || member.primary_email?.includes(searchString) ) } }) }, [members, searchString]) const [[user], otherMembers] = partition( filteredMembers, (m) => m.gotrue_id === profile?.gotrue_id ) const sortedMembers = otherMembers.sort((a, b) => (a.primary_email ?? '').localeCompare(b.primary_email ?? '') ) const userMember = members.find((m) => m.gotrue_id === profile?.gotrue_id) const orgScopedRoleIds = (roles?.org_scoped_roles ?? []).map((r) => r.id) const isOrgScopedRole = orgScopedRoleIds.includes(userMember?.role_ids?.[0] ?? -1) return ( <> {isLoadingMembers && } {isErrorMembers && ( )} {isErrorRoles && ( )} {isSuccessMembers && (
User Enabled MFA Role How to configure access control? {[ ...(isSuccessRoles && isSuccessMembers && !isOrgScopedRole ? [ , ] : []), ...(!!user ? [] : []), ...sortedMembers.map((member) => ( )), ...(searchString.length > 0 && filteredMembers.length === 0 ? [

No users matched the search query "{searchString}"

, ] : []),

{searchString ? `${filteredMembers.length} of ` : ''} {members.length || '0'} {members.length == 1 ? 'user' : 'users'}

, ]}
)} ) } export default MembersView