1import { useSelector } from 'react-redux';
2import { StoreState } from '../../../../types';
3
4const SUFFIX_REGEX = /\/api\/v[1|2]\/alerts/i;
5type AlertmanagerConfig = { url: string; status: string; actualUrl: string };
6
7export function useExternalAmSelector(): AlertmanagerConfig[] | undefined {
8  const discoveredAlertmanagers = useSelector(
9    (state: StoreState) => state.unifiedAlerting.externalAlertmanagers.discoveredAlertmanagers.result?.data
10  );
11  const alertmanagerConfig = useSelector(
12    (state: StoreState) => state.unifiedAlerting.externalAlertmanagers.alertmanagerConfig.result?.alertmanagers
13  );
14
15  if (!discoveredAlertmanagers || !alertmanagerConfig) {
16    return [];
17  }
18
19  const enabledAlertmanagers: AlertmanagerConfig[] = [];
20  const droppedAlertmanagers: AlertmanagerConfig[] = discoveredAlertmanagers?.droppedAlertManagers.map((am) => ({
21    url: am.url.replace(SUFFIX_REGEX, ''),
22    status: 'dropped',
23    actualUrl: am.url,
24  }));
25
26  for (const url of alertmanagerConfig) {
27    if (discoveredAlertmanagers.activeAlertManagers.length === 0) {
28      enabledAlertmanagers.push({
29        url: url,
30        status: 'pending',
31        actualUrl: '',
32      });
33    } else {
34      let found = false;
35      for (const activeAM of discoveredAlertmanagers.activeAlertManagers) {
36        if (activeAM.url === `${url}/api/v2/alerts`) {
37          found = true;
38          enabledAlertmanagers.push({
39            url: activeAM.url.replace(SUFFIX_REGEX, ''),
40            status: 'active',
41            actualUrl: activeAM.url,
42          });
43        }
44      }
45      if (!found) {
46        enabledAlertmanagers.push({
47          url: url,
48          status: 'pending',
49          actualUrl: '',
50        });
51      }
52    }
53  }
54
55  return [...enabledAlertmanagers, ...droppedAlertmanagers];
56}
57