diff --git a/static/app/views/settings/organizationIntegrations/integrationExternalTeamMappings.tsx b/static/app/views/settings/organizationIntegrations/integrationExternalTeamMappings.tsx
index ce651ab22a7157..6f3f17e77f825c 100644
--- a/static/app/views/settings/organizationIntegrations/integrationExternalTeamMappings.tsx
+++ b/static/app/views/settings/organizationIntegrations/integrationExternalTeamMappings.tsx
@@ -10,8 +10,7 @@ import type {
} from 'sentry/types/integrations';
import type {Team} from 'sentry/types/organization';
import {getApiUrl} from 'sentry/utils/api/getApiUrl';
-import {useApiQuery} from 'sentry/utils/queryClient';
-import {useApi} from 'sentry/utils/useApi';
+import {fetchMutation, useApiQuery, useMutation} from 'sentry/utils/queryClient';
import {useLocation} from 'sentry/utils/useLocation';
import {useOrganization} from 'sentry/utils/useOrganization';
@@ -26,7 +25,6 @@ export function IntegrationExternalTeamMappings(props: Props) {
const {integration} = props;
const organization = useOrganization();
const location = useLocation();
- const api = useApi({persistInFlight: true});
const ORGANIZATION_TEAMS_ENDPOINT = getApiUrl(
'/organizations/$organizationIdOrSlug/teams/',
{
@@ -59,32 +57,32 @@ export function IntegrationExternalTeamMappings(props: Props) {
return Promise.all([refetchTeams(), refetchInitialResults()]);
};
- if (isTeamsPending || isInitialResultsPending) {
- return ;
- }
- if (isTeamsError || isInitialResultsError) {
- return fetchData()} />;
- }
-
- const handleDelete = async (mapping: ExternalActorMapping) => {
- try {
+ const deleteMutation = useMutation({
+ mutationFn: (mapping: ExternalActorMapping) => {
const team = teams.find(item => item.id === mapping.teamId);
if (!team) {
throw new Error('Cannot find correct team slug.');
}
- const endpoint = `/teams/${organization.slug}/${team.slug}/external-teams/${mapping.id}/`;
-
- await api.requestPromise(endpoint, {
+ return fetchMutation({
+ url: `/teams/${organization.slug}/${team.slug}/external-teams/${mapping.id}/`,
method: 'DELETE',
});
- // remove config and update state
+ },
+ onSuccess: () => {
addSuccessMessage(t('Deletion successful'));
fetchData();
- } catch {
- // no 4xx errors should happen on delete
+ },
+ onError: () => {
addErrorMessage(t('An error occurred'));
- }
- };
+ },
+ });
+
+ if (isTeamsPending || isInitialResultsPending) {
+ return ;
+ }
+ if (isTeamsError || isInitialResultsError) {
+ return fetchData()} />;
+ }
const handleSubmitSuccess = () => {
fetchData();
@@ -146,7 +144,7 @@ export function IntegrationExternalTeamMappings(props: Props) {
getBaseFormEndpoint={mapping => getBaseFormEndpoint(mapping)}
defaultOptions={defaultTeamOptions()}
onCreate={onCreate}
- onDelete={handleDelete}
+ onDelete={deleteMutation.mutate}
onSubmitSuccess={async () => {
await fetchData();
}}
diff --git a/static/app/views/settings/organizationIntegrations/integrationExternalUserMappings.tsx b/static/app/views/settings/organizationIntegrations/integrationExternalUserMappings.tsx
index 5de4579c4813ea..94129b2d284a32 100644
--- a/static/app/views/settings/organizationIntegrations/integrationExternalUserMappings.tsx
+++ b/static/app/views/settings/organizationIntegrations/integrationExternalUserMappings.tsx
@@ -13,8 +13,7 @@ import type {
} from 'sentry/types/integrations';
import type {Member} from 'sentry/types/organization';
import {getApiUrl} from 'sentry/utils/api/getApiUrl';
-import {useApiQuery} from 'sentry/utils/queryClient';
-import {useApi} from 'sentry/utils/useApi';
+import {fetchMutation, useApiQuery, useMutation} from 'sentry/utils/queryClient';
import {useOrganization} from 'sentry/utils/useOrganization';
import {IntegrationExternalMappingForm} from './integrationExternalMappingForm';
@@ -27,7 +26,6 @@ type Props = {
export function IntegrationExternalUserMappings(props: Props) {
const {integration} = props;
const organization = useOrganization();
- const api = useApi({persistInFlight: true});
const DATA_ENDPOINT = getApiUrl('/organizations/$organizationIdOrSlug/members/', {
path: {organizationIdOrSlug: organization.slug},
@@ -62,6 +60,21 @@ export function IntegrationExternalUserMappings(props: Props) {
return Promise.all([refetchMembers(), refetchInitialResults()]);
};
+ const deleteMutation = useMutation({
+ mutationFn: (mapping: ExternalActorMapping) =>
+ fetchMutation({
+ url: `/organizations/${organization.slug}/external-users/${mapping.id}/`,
+ method: 'DELETE',
+ }),
+ onSuccess: () => {
+ addSuccessMessage(t('Deletion successful'));
+ fetchData();
+ },
+ onError: () => {
+ addErrorMessage(t('An error occurred'));
+ },
+ });
+
if (isMembersPending || isInitialResultsPending) {
return ;
}
@@ -69,23 +82,6 @@ export function IntegrationExternalUserMappings(props: Props) {
return fetchData()} />;
}
- const handleDelete = async (mapping: ExternalActorMapping) => {
- try {
- await api.requestPromise(
- `/organizations/${organization.slug}/external-users/${mapping.id}/`,
- {
- method: 'DELETE',
- }
- );
- // remove config and update state
- addSuccessMessage(t('Deletion successful'));
- fetchData();
- } catch {
- // no 4xx errors should happen on delete
- addErrorMessage(t('An error occurred'));
- }
- };
-
const handleSubmitSuccess = () => {
// Don't bother updating state. The info is in array of objects for each object in another array of objects.
// Easier and less error-prone to re-fetch the data and re-calculate state.
@@ -139,7 +135,7 @@ export function IntegrationExternalUserMappings(props: Props) {
getBaseFormEndpoint={() => BASE_FORM_ENDPOINT}
defaultOptions={defaultUserOptions}
onCreate={openMembersModal}
- onDelete={handleDelete}
+ onDelete={deleteMutation.mutate}
onSubmitSuccess={async () => {
await fetchData();
}}