mirror of
https://github.com/grafana/grafana.git
synced 2025-02-13 09:05:45 -06:00
88 lines
2.9 KiB
TypeScript
88 lines
2.9 KiB
TypeScript
import React, { useCallback, useEffect } from 'react';
|
|
import { Route, Redirect, Switch } from 'react-router-dom';
|
|
|
|
import { Alert, LoadingPlaceholder } from '@grafana/ui';
|
|
import { useQueryParams } from 'app/core/hooks/useQueryParams';
|
|
import { MuteTimeInterval } from 'app/plugins/datasource/alertmanager/types';
|
|
import { useDispatch } from 'app/types';
|
|
|
|
import MuteTimingForm from './components/amroutes/MuteTimingForm';
|
|
import { useAlertManagerSourceName } from './hooks/useAlertManagerSourceName';
|
|
import { useAlertManagersByPermission } from './hooks/useAlertManagerSources';
|
|
import { useUnifiedAlertingSelector } from './hooks/useUnifiedAlertingSelector';
|
|
import { fetchAlertManagerConfigAction } from './state/actions';
|
|
import { initialAsyncRequestState } from './utils/redux';
|
|
|
|
const MuteTimings = () => {
|
|
const [queryParams] = useQueryParams();
|
|
const dispatch = useDispatch();
|
|
const alertManagers = useAlertManagersByPermission('notification');
|
|
const [alertManagerSourceName] = useAlertManagerSourceName(alertManagers);
|
|
|
|
const amConfigs = useUnifiedAlertingSelector((state) => state.amConfigs);
|
|
|
|
const fetchConfig = useCallback(() => {
|
|
if (alertManagerSourceName) {
|
|
dispatch(fetchAlertManagerConfigAction(alertManagerSourceName));
|
|
}
|
|
}, [alertManagerSourceName, dispatch]);
|
|
|
|
useEffect(() => {
|
|
fetchConfig();
|
|
}, [fetchConfig]);
|
|
|
|
const { result, error, loading } =
|
|
(alertManagerSourceName && amConfigs[alertManagerSourceName]) || initialAsyncRequestState;
|
|
|
|
const config = result?.alertmanager_config;
|
|
|
|
const getMuteTimingByName = useCallback(
|
|
(id: string): MuteTimeInterval | undefined => {
|
|
const timing = config?.mute_time_intervals?.find(({ name }: MuteTimeInterval) => name === id);
|
|
|
|
if (timing) {
|
|
const provenance = (config?.muteTimeProvenances ?? {})[timing.name];
|
|
|
|
return {
|
|
...timing,
|
|
provenance,
|
|
};
|
|
}
|
|
|
|
return timing;
|
|
},
|
|
[config]
|
|
);
|
|
|
|
return (
|
|
<>
|
|
{loading && <LoadingPlaceholder text="Loading mute timing" />}
|
|
{error && !loading && (
|
|
<Alert severity="error" title={`Error loading Alertmanager config for ${alertManagerSourceName}`}>
|
|
{error.message || 'Unknown error.'}
|
|
</Alert>
|
|
)}
|
|
{result && !error && (
|
|
<Switch>
|
|
<Route exact path="/alerting/routes/mute-timing/new">
|
|
<MuteTimingForm />
|
|
</Route>
|
|
<Route exact path="/alerting/routes/mute-timing/edit">
|
|
{() => {
|
|
if (queryParams['muteName']) {
|
|
const muteTiming = getMuteTimingByName(String(queryParams['muteName']));
|
|
const provenance = muteTiming?.provenance;
|
|
|
|
return <MuteTimingForm muteTiming={muteTiming} showError={!muteTiming} provenance={provenance} />;
|
|
}
|
|
return <Redirect to="/alerting/routes" />;
|
|
}}
|
|
</Route>
|
|
</Switch>
|
|
)}
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default MuteTimings;
|