import { css } from '@emotion/css';
import { useMemo } from 'react';
import { GrafanaTheme2, intervalToAbbreviatedDurationString } from '@grafana/data';
import { Icon, Spinner, Stack, Tooltip, useStyles2 } from '@grafana/ui';
import { Trans } from 'app/core/internationalization';
import { CombinedRule } from 'app/types/unified-alerting';
import { PromAlertingRuleState } from 'app/types/unified-alerting-dto';
import { getFirstActiveAt, isAlertingRule, isGrafanaRecordingRule, isRecordingRule } from '../../utils/rules';
import { StateTag } from '../StateTag';
import { AlertStateTag } from './AlertStateTag';
interface Props {
rule: CombinedRule;
isDeleting: boolean;
isCreating: boolean;
isPaused?: boolean;
}
export const RuleState = ({ rule, isDeleting, isCreating, isPaused }: Props) => {
const style = useStyles2(getStyle);
const { promRule, rulerRule } = rule;
// return how long the rule has been in its firing state, if any
const RecordingRuleState = () => {
if (isPaused && isGrafanaRecordingRule(rulerRule)) {
return (
Paused
);
} else {
return Recording rule;
}
};
const forTime = useMemo(() => {
if (
promRule &&
isAlertingRule(promRule) &&
promRule.alerts?.length &&
promRule.state !== PromAlertingRuleState.Inactive
) {
// find earliest alert
const firstActiveAt = promRule.activeAt ? new Date(promRule.activeAt) : getFirstActiveAt(promRule);
// calculate time elapsed from earliest alert
if (firstActiveAt) {
return (
for{' '}
{intervalToAbbreviatedDurationString(
{
start: firstActiveAt,
end: new Date(),
},
false
)}
);
}
}
return null;
}, [promRule, style]);
if (isDeleting) {
return (
Deleting
);
} else if (isCreating) {
return (
Creating
);
} else if (promRule && isAlertingRule(promRule)) {
return (
{!isPaused && forTime}
);
} else if (promRule && isRecordingRule(promRule)) {
return ;
}
return <>n/a>;
};
const getStyle = (theme: GrafanaTheme2) => ({
for: css({
fontSize: theme.typography.bodySmall.fontSize,
color: theme.colors.text.secondary,
whiteSpace: 'nowrap',
paddingTop: '2px',
}),
});