diff --git a/static/app/components/workflowEngine/ui/actionMetadata.tsx b/static/app/components/workflowEngine/ui/actionMetadata.tsx index b88dfa67c9df9d..b3e45ca8395c15 100644 --- a/static/app/components/workflowEngine/ui/actionMetadata.tsx +++ b/static/app/components/workflowEngine/ui/actionMetadata.tsx @@ -68,6 +68,10 @@ export const ActionMetadata: Partial< name: t('Slack'), icon: , }, + [ActionType.SLACK_STAGING]: { + name: t('Slack (Staging)'), + icon: , + }, [ActionType.WEBHOOK]: { name: t('Webhook'), icon: , diff --git a/static/app/types/workflowEngine/actions.tsx b/static/app/types/workflowEngine/actions.tsx index 764fbd20e2116f..9a7c6b3c9bfc2c 100644 --- a/static/app/types/workflowEngine/actions.tsx +++ b/static/app/types/workflowEngine/actions.tsx @@ -35,6 +35,7 @@ export enum ActionTarget { export enum ActionType { SLACK = 'slack', + SLACK_STAGING = 'slack_staging', MSTEAMS = 'msteams', DISCORD = 'discord', PAGERDUTY = 'pagerduty', diff --git a/static/app/views/automations/components/actionNodes.tsx b/static/app/views/automations/components/actionNodes.tsx index a1f7f3c3113019..935ed4a91bb8bb 100644 --- a/static/app/views/automations/components/actionNodes.tsx +++ b/static/app/views/automations/components/actionNodes.tsx @@ -217,6 +217,15 @@ export const actionNodesMap = new Map([ validate: validateSlackAction, }, ], + [ + ActionType.SLACK_STAGING, + { + label: t('Slack (Staging)'), + action: SlackNode, + details: SlackDetails, + validate: validateSlackAction, + }, + ], [ ActionType.WEBHOOK, { diff --git a/static/app/views/automations/new.spec.tsx b/static/app/views/automations/new.spec.tsx index b52e27ee41a453..8faeaccf3e1aef 100644 --- a/static/app/views/automations/new.spec.tsx +++ b/static/app/views/automations/new.spec.tsx @@ -128,6 +128,11 @@ describe('AutomationNewSettings', () => { handlerGroup: ActionGroup.OTHER, integrations: undefined, }), + ActionHandlerFixture({ + type: ActionType.SLACK_STAGING, + handlerGroup: ActionGroup.NOTIFICATION, + integrations: [{id: 'slack-staging-1', name: 'My Slack Staging Workspace'}], + }), ], }); @@ -332,6 +337,16 @@ describe('AutomationNewSettings', () => { delay: null, }); + await addAction('Slack (Staging)'); + { + const stagingTargets = screen.getAllByRole('textbox', {name: 'Target'}); + const stagingTarget = stagingTargets.at(-1); + expect(stagingTarget).toBeDefined(); + await userEvent.type(stagingTarget as HTMLElement, '#staging-alerts', { + delay: null, + }); + } + await addAction('Discord'); await userEvent.type(screen.getByPlaceholderText('channel ID or URL'), '123', { delay: null, @@ -490,6 +505,15 @@ describe('AutomationNewSettings', () => { targetDisplay: null, }, }, + slack_staging: { + type: 'slack_staging', + integrationId: 'slack-staging-1', + config: { + targetType: 'specific', + targetIdentifier: '', + targetDisplay: '#staging-alerts', + }, + }, }; await waitFor(() => expect(saveWorkflow).toHaveBeenCalled()); diff --git a/static/app/views/automations/utils/getIncompatibleActionWarning.tsx b/static/app/views/automations/utils/getIncompatibleActionWarning.tsx index c2cdc9e15ee084..86aae718701193 100644 --- a/static/app/views/automations/utils/getIncompatibleActionWarning.tsx +++ b/static/app/views/automations/utils/getIncompatibleActionWarning.tsx @@ -5,6 +5,7 @@ import type {Detector} from 'sentry/types/workflowEngine/detectors'; const METRIC_DETECTOR_SUPPORTED_ACTIONS = new Set([ ActionType.EMAIL, ActionType.SLACK, + ActionType.SLACK_STAGING, ActionType.MSTEAMS, ActionType.PAGERDUTY, ActionType.OPSGENIE,