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