From 2962a110f64547d878ae45493a9c2065169a08bb Mon Sep 17 00:00:00 2001 From: Chris Stockton <180184+cstockton@users.noreply.github.com> Date: Fri, 25 Jul 2025 08:32:17 -0700 Subject: [PATCH] fix: use gotrue_id for member search and partition (#37418) It is possible to have multiple emails from different providers, a common example being SSO users. The user flow being: 1) Sign up with email using name@company.local 2) Upgrade to teams or enterprise 3) Enable SSO for the Org using domain company.local 4) Sign in with name@company.local 5) The SSO provider now handles the login, assigning new gotrue_id but uses the same primary_email 6) View the teams members and one will be omitted This change fixes the case above so that both users are displayed. It also uses the gotrue_id to ensure that the "You" badge displays the correct user. Co-authored-by: Chris Stockton --- .../interfaces/Organization/TeamSettings/MemberRow.tsx | 2 +- .../interfaces/Organization/TeamSettings/MembersView.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx index 4eccdd17f71..068c517764d 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx @@ -88,7 +88,7 @@ export const MemberRow = ({ member }: MemberRowProps) => { />

{member.primary_email}

- {member.primary_email === profile?.primary_email && You} + {member.gotrue_id === profile?.gotrue_id && You}
{(member.metadata as any)?.origin && ( diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/MembersView.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/MembersView.tsx index 2de693bc844..3ecc3b3de90 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/MembersView.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/MembersView.tsx @@ -54,13 +54,13 @@ const MembersView = ({ searchString }: MembersViewProps) => { const [[user], otherMembers] = partition( filteredMembers, - (m) => m.primary_email === profile?.primary_email + (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.primary_email === profile?.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)