From 1dfe2b068606edb96bc88a03e7c3f984f439fa14 Mon Sep 17 00:00:00 2001 From: Dominik Buszowiecki Date: Fri, 24 Jul 2026 15:03:30 -0400 Subject: [PATCH] fix(replay): use org members endpoint for replay access selector The Replay Access Members selector in Org General Settings fetched from /organizations/{org}/users/ (OrganizationUsersEndpoint), which only returns members who share a project the requester can access and filters those projects by the requester's project *membership* for non-superusers. An owner/manager not on the relevant teams therefore got an empty member list (appearing stuck on loading), while superusers saw every member -- which is why the issue only reproduced for regular admins. Swap to the existing memberUsersQueryOptions helper, which hits /organizations/{org}/members/ and lists all org members regardless of the requester's team membership. Fixes REPLAY-947 --- .../organizationSettingsForm.spec.tsx | 6 +----- .../organizationSettingsForm.tsx | 10 ++++------ 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/static/app/views/settings/organizationGeneralSettings/organizationSettingsForm.spec.tsx b/static/app/views/settings/organizationGeneralSettings/organizationSettingsForm.spec.tsx index 3aed1116efba..79c460c41e11 100644 --- a/static/app/views/settings/organizationGeneralSettings/organizationSettingsForm.spec.tsx +++ b/static/app/views/settings/organizationGeneralSettings/organizationSettingsForm.spec.tsx @@ -40,10 +40,6 @@ describe('OrganizationSettingsForm', () => { url: '/organizations/org-slug/members/', body: [{user: UserFixture()}], }); - MockApiClient.addMockResponse({ - url: '/organizations/org-slug/users/', - body: [{user: UserFixture()}], - }); onSave.mockReset(); }); @@ -413,7 +409,7 @@ describe('OrganizationSettingsForm', () => { it('saves replayAccessMembers when a member is selected', async () => { const user = UserFixture(); MockApiClient.addMockResponse({ - url: `/organizations/${organization.slug}/users/`, + url: `/organizations/${organization.slug}/members/`, body: [{user}], }); const replayPutMock = MockApiClient.addMockResponse({ diff --git a/static/app/views/settings/organizationGeneralSettings/organizationSettingsForm.tsx b/static/app/views/settings/organizationGeneralSettings/organizationSettingsForm.tsx index f198f8efca29..97c007c57cfa 100644 --- a/static/app/views/settings/organizationGeneralSettings/organizationSettingsForm.tsx +++ b/static/app/views/settings/organizationGeneralSettings/organizationSettingsForm.tsx @@ -28,8 +28,7 @@ import { getLocalityDataFromOrganization, shouldDisplayLocalities, } from 'sentry/utils/cells'; -import {useProjectMembersQueryOptions} from 'sentry/utils/members/projectMembers'; -import {selectUsersFromMembers} from 'sentry/utils/members/shared'; +import {memberUsersQueryOptions} from 'sentry/utils/members/shared'; import {fetchMutation} from 'sentry/utils/queryClient'; import {RequestError} from 'sentry/utils/requestError/requestError'; import {slugify} from 'sentry/utils/slugify'; @@ -86,10 +85,9 @@ export function ReplayAccessMembersField({ organization: Organization; }) { const endpoint = `/organizations/${organization.slug}/`; - const {data: members = [], isPending: fetching} = useQuery({ - ...useProjectMembersQueryOptions(), - select: resp => selectUsersFromMembers(resp.json), - }); + const {data: members = [], isPending: fetching} = useQuery( + memberUsersQueryOptions({orgSlug: organization.slug}) + ); const memberOptions = members.map(m => ({value: m.id, label: m.name})); const replayMutationOpts = mutationOptions({