2025-04-01 10:38:02 +09:00

48 lines
1.9 KiB
TypeScript

import { t } from 'app/core/internationalization';
import { EditableRuleIdentifier, RuleGroupIdentifier } from 'app/types/unified-alerting';
import { alertRuleApi } from '../../api/alertRuleApi';
import { deleteRuleAction } from '../../reducers/ruler/ruleGroups';
import { useAsync } from '../useAsync';
import { useProduceNewRuleGroup } from './useProduceNewRuleGroup';
/**
* Delete a single rule from a (ruler) group. This hook will ensure that mutations on the rule group are safe and will always
* use the latest definition of the ruler group identifier.
*
* If no more rules are left in the group it will remove the entire group instead of updating.
*/
export function useDeleteRuleFromGroup() {
const [produceNewRuleGroup] = useProduceNewRuleGroup();
const [upsertRuleGroup] = alertRuleApi.endpoints.upsertRuleGroupForNamespace.useMutation();
const [deleteRuleGroup] = alertRuleApi.endpoints.deleteRuleGroupFromNamespace.useMutation();
return useAsync(async (ruleGroup: RuleGroupIdentifier, ruleIdentifier: EditableRuleIdentifier) => {
const { groupName, namespaceName } = ruleGroup;
const action = deleteRuleAction({ identifier: ruleIdentifier });
const { newRuleGroupDefinition, rulerConfig } = await produceNewRuleGroup(ruleGroup, action);
const successMessage = t('alerting.rules.delete-rule.success', 'Rule successfully deleted');
// if we have no more rules left after reducing, remove the entire group
if (newRuleGroupDefinition.rules.length === 0) {
return deleteRuleGroup({
rulerConfig,
namespace: namespaceName,
group: groupName,
notificationOptions: { successMessage },
}).unwrap();
}
// otherwise just update the group
return upsertRuleGroup({
rulerConfig,
namespace: namespaceName,
payload: newRuleGroupDefinition,
notificationOptions: { successMessage },
}).unwrap();
});
}