import type {ReactNode} from 'react'; import styled from '@emotion/styled'; import {IconArrow, IconMute} from 'sentry/icons'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import type {ColorOrAlias} from 'sentry/utils/theme'; import {hasActiveIncident} from 'sentry/views/alerts/list/rules/utils'; import {getThresholdUnits} from 'sentry/views/alerts/rules/metric/constants'; import { AlertRuleComparisonType, AlertRuleThresholdType, AlertRuleTriggerType, } from 'sentry/views/alerts/rules/metric/types'; import type {MetricAlert} from '../../types'; import {IncidentStatus} from '../../types'; interface Props { rule: MetricAlert; } export default function ActivatedMetricAlertRuleStatus({rule}: Props): ReactNode { if (rule.snooze) { return ( {t('Muted')} ); } const isUnhealthy = hasActiveIncident(rule); let iconColor: ColorOrAlias = 'successText'; let iconDirection: 'up' | 'down' = rule.thresholdType === AlertRuleThresholdType.ABOVE ? 'down' : 'up'; let thresholdTypeText = rule.thresholdType === AlertRuleThresholdType.ABOVE ? t('Below') : t('Above'); if (isUnhealthy) { iconColor = rule.latestIncident?.status === IncidentStatus.CRITICAL ? 'errorText' : 'warningText'; // if unhealthy, swap icon direction iconDirection = rule.thresholdType === AlertRuleThresholdType.ABOVE ? 'up' : 'down'; thresholdTypeText = rule.thresholdType === AlertRuleThresholdType.ABOVE ? t('Above') : t('Below'); } let threshold = rule.triggers.find( ({label}) => label === AlertRuleTriggerType.CRITICAL )?.alertThreshold; if (isUnhealthy && rule.latestIncident?.status === IncidentStatus.WARNING) { threshold = rule.triggers.find( ({label}) => label === AlertRuleTriggerType.WARNING )?.alertThreshold; } else if (!isUnhealthy && rule.latestIncident && rule.resolveThreshold) { threshold = rule.resolveThreshold; } return ( {`${thresholdTypeText} ${threshold}`} {getThresholdUnits( rule.aggregate, rule.comparisonDelta ? AlertRuleComparisonType.CHANGE : AlertRuleComparisonType.COUNT )} ); } // TODO: see static/app/components/profiling/flex.tsx and utilize the FlexContainer styled component const FlexCenter = styled('div')` display: flex; flex-direction: row; align-items: center; `; const IssueAlertStatusWrapper = styled('div')` display: flex; align-items: center; gap: ${space(1)}; line-height: 2; `; const TriggerText = styled('div')` margin-left: ${space(1)}; white-space: nowrap; font-variant-numeric: tabular-nums; `;