import React, { FC, useCallback, useEffect } from 'react'; import { useDispatch } from 'react-redux'; import { Redirect, Route, RouteChildrenProps, Switch, useLocation } from 'react-router-dom'; import { Alert, LoadingPlaceholder, withErrorBoundary } from '@grafana/ui'; import { Silence } from 'app/plugins/datasource/alertmanager/types'; import { AlertManagerPicker } from './components/AlertManagerPicker'; import { AlertingPageWrapper } from './components/AlertingPageWrapper'; import { NoAlertManagerWarning } from './components/NoAlertManagerWarning'; import SilencesEditor from './components/silences/SilencesEditor'; import SilencesTable from './components/silences/SilencesTable'; import { useAlertManagerSourceName } from './hooks/useAlertManagerSourceName'; import { useAlertManagersByPermission } from './hooks/useAlertManagerSources'; import { useUnifiedAlertingSelector } from './hooks/useUnifiedAlertingSelector'; import { fetchAmAlertsAction, fetchSilencesAction } from './state/actions'; import { SILENCES_POLL_INTERVAL_MS } from './utils/constants'; import { AsyncRequestState, initialAsyncRequestState } from './utils/redux'; const Silences: FC = () => { const alertManagers = useAlertManagersByPermission('instance'); const [alertManagerSourceName, setAlertManagerSourceName] = useAlertManagerSourceName(alertManagers); const dispatch = useDispatch(); const silences = useUnifiedAlertingSelector((state) => state.silences); const alertsRequests = useUnifiedAlertingSelector((state) => state.amAlerts); const alertsRequest = alertManagerSourceName ? alertsRequests[alertManagerSourceName] || initialAsyncRequestState : undefined; const location = useLocation(); const isRoot = location.pathname.endsWith('/alerting/silences'); useEffect(() => { function fetchAll() { if (alertManagerSourceName) { dispatch(fetchSilencesAction(alertManagerSourceName)); dispatch(fetchAmAlertsAction(alertManagerSourceName)); } } fetchAll(); const interval = setInterval(() => fetchAll, SILENCES_POLL_INTERVAL_MS); return () => { clearInterval(interval); }; }, [alertManagerSourceName, dispatch]); const { result, loading, error }: AsyncRequestState = (alertManagerSourceName && silences[alertManagerSourceName]) || initialAsyncRequestState; const getSilenceById = useCallback((id: string) => result && result.find((silence) => silence.id === id), [result]); if (!alertManagerSourceName) { return isRoot ? ( ) : ( ); } return ( {error && !loading && ( {error.message || 'Unknown error.'} )} {alertsRequest?.error && !alertsRequest?.loading && ( {alertsRequest.error?.message || 'Unknown error.'} )} {loading && } {result && !error && ( {({ match }: RouteChildrenProps<{ id: string }>) => { return ( match?.params.id && ( ) ); }} )} ); }; export default withErrorBoundary(Silences, { style: 'page' });