Skip to content

Commit 4437b77

Browse files
ref(project-creation): Introduce useCreateProjectRules hook
1 parent d39033d commit 4437b77

File tree

3 files changed

+56
-26
lines changed

3 files changed

+56
-26
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import {useMutation} from 'sentry/utils/queryClient';
2+
import type RequestError from 'sentry/utils/requestError/requestError';
3+
import useApi from 'sentry/utils/useApi';
4+
import useOrganization from 'sentry/utils/useOrganization';
5+
import type {RequestDataFragment} from 'sentry/views/projectInstall/issueAlertOptions';
6+
7+
interface Variables
8+
extends Partial<
9+
Pick<
10+
RequestDataFragment,
11+
'conditions' | 'actions' | 'actionMatch' | 'frequency' | 'name'
12+
>
13+
> {
14+
projectSlug: string;
15+
}
16+
17+
export function useCreateProjectRules() {
18+
const api = useApi();
19+
const organization = useOrganization();
20+
// TODO(priscila): Introduce better response types
21+
return useMutation<{id: string}, RequestError, Variables>({
22+
mutationFn: ({projectSlug, name, conditions, actions, actionMatch, frequency}) => {
23+
return api.requestPromise(`/projects/${organization.slug}/${projectSlug}/rules/`, {
24+
method: 'POST',
25+
data: {
26+
name,
27+
conditions,
28+
actions,
29+
actionMatch,
30+
frequency,
31+
},
32+
});
33+
},
34+
});
35+
}

static/app/views/projectInstall/createProject.tsx

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import List from 'sentry/components/list';
1919
import ListItem from 'sentry/components/list/listItem';
2020
import {SupportedLanguages} from 'sentry/components/onboarding/frameworkSuggestionModal';
2121
import {useCreateProject} from 'sentry/components/onboarding/useCreateProject';
22+
import {useCreateProjectRules} from 'sentry/components/onboarding/useCreateProjectRules';
2223
import type {Platform} from 'sentry/components/platformPicker';
2324
import PlatformPicker from 'sentry/components/platformPicker';
2425
import TeamSelector from 'sentry/components/teamSelector';
@@ -140,6 +141,7 @@ export function CreateProject() {
140141
const {createNotificationAction, notificationProps} = useCreateNotificationAction();
141142
const canUserCreateProject = useCanCreateProject();
142143
const createProject = useCreateProject();
144+
const createProjectRules = useCreateProjectRules();
143145
const {teams} = useTeams();
144146
const accessTeams = teams.filter((team: Team) => team.access.includes('team:admin'));
145147
const referrer = decodeScalar(location.query.referrer);
@@ -157,19 +159,14 @@ export function CreateProject() {
157159
const ruleIds = [];
158160

159161
if (alertRuleConfig?.shouldCreateCustomRule) {
160-
const ruleData = await api.requestPromise(
161-
`/projects/${organization.slug}/${project.slug}/rules/`,
162-
{
163-
method: 'POST',
164-
data: {
165-
name: project.name,
166-
conditions: alertRuleConfig?.conditions,
167-
actions: alertRuleConfig?.actions,
168-
actionMatch: alertRuleConfig?.actionMatch,
169-
frequency: alertRuleConfig?.frequency,
170-
},
171-
}
172-
);
162+
const ruleData = await createProjectRules.mutateAsync({
163+
projectSlug: project.slug,
164+
name: project.name,
165+
conditions: alertRuleConfig?.conditions,
166+
actions: alertRuleConfig?.actions,
167+
actionMatch: alertRuleConfig?.actionMatch,
168+
frequency: alertRuleConfig?.frequency,
169+
});
173170

174171
ruleIds.push(ruleData.id);
175172
}
@@ -189,7 +186,7 @@ export function CreateProject() {
189186

190187
return ruleIds;
191188
},
192-
[organization, api, createNotificationAction]
189+
[createNotificationAction, createProjectRules]
193190
);
194191

195192
const autoFill = useMemo(() => {

static/app/views/projectInstall/issueAlertNotificationOptions.tsx

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ import {Fragment, useCallback, useEffect, useMemo, useState} from 'react';
22
import styled from '@emotion/styled';
33

44
import MultipleCheckbox from 'sentry/components/forms/controls/multipleCheckbox';
5+
import {useCreateProjectRules} from 'sentry/components/onboarding/useCreateProjectRules';
56
import {t, tct} from 'sentry/locale';
67
import {space} from 'sentry/styles/space';
78
import {type IntegrationAction, IssueAlertActionType} from 'sentry/types/alerts';
89
import type {OrganizationIntegration} from 'sentry/types/integrations';
910
import {useApiQuery} from 'sentry/utils/queryClient';
1011
import useRouteAnalyticsParams from 'sentry/utils/routeAnalytics/useRouteAnalyticsParams';
11-
import useApi from 'sentry/utils/useApi';
1212
import useOrganization from 'sentry/utils/useOrganization';
1313
import SetupMessagingIntegrationButton, {
1414
MessagingIntegrationAnalyticsView,
@@ -77,8 +77,8 @@ export type IssueAlertNotificationProps = {
7777
};
7878

7979
export function useCreateNotificationAction() {
80-
const api = useApi();
8180
const organization = useOrganization();
81+
const createProjectRules = useCreateProjectRules();
8282

8383
const messagingIntegrationsQuery = useApiQuery<OrganizationIntegration[]>(
8484
[`/organizations/${organization.slug}/integrations/?integrationType=messaging`],
@@ -174,18 +174,16 @@ export function useCreateNotificationAction() {
174174
return undefined;
175175
}
176176

177-
return api.requestPromise(`/projects/${organization.slug}/${projectSlug}/rules/`, {
178-
method: 'POST',
179-
data: {
180-
name,
181-
conditions,
182-
actions: [integrationAction],
183-
actionMatch,
184-
frequency,
185-
},
177+
return createProjectRules.mutateAsync({
178+
projectSlug,
179+
name,
180+
conditions,
181+
actions: [integrationAction],
182+
actionMatch,
183+
frequency,
186184
});
187185
},
188-
[actions, api, provider, integration, channel, organization.slug]
186+
[actions, provider, integration, channel, createProjectRules]
189187
);
190188

191189
return {

0 commit comments

Comments
 (0)