1import { useQueryParams } from 'app/core/hooks/useQueryParams';
2import store from 'app/core/store';
3import { useCallback } from 'react';
4import { ALERTMANAGER_NAME_LOCAL_STORAGE_KEY, ALERTMANAGER_NAME_QUERY_KEY } from '../utils/constants';
5import { getAlertManagerDataSources, GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';
6
7function isAlertManagerSource(alertManagerSourceName: string): boolean {
8  return (
9    alertManagerSourceName === GRAFANA_RULES_SOURCE_NAME ||
10    !!getAlertManagerDataSources().find((ds) => ds.name === alertManagerSourceName)
11  );
12}
13
14/* this will return am name either from query params or from local storage or a default (grafana).
15 *
16 * fallbackUrl - if provided, will redirect to this url if alertmanager provided in query no longer
17 */
18export function useAlertManagerSourceName(): [string | undefined, (alertManagerSourceName: string) => void] {
19  const [queryParams, updateQueryParams] = useQueryParams();
20
21  const update = useCallback(
22    (alertManagerSourceName: string) => {
23      if (!isAlertManagerSource(alertManagerSourceName)) {
24        return;
25      }
26      if (alertManagerSourceName === GRAFANA_RULES_SOURCE_NAME) {
27        store.delete(ALERTMANAGER_NAME_LOCAL_STORAGE_KEY);
28        updateQueryParams({ [ALERTMANAGER_NAME_QUERY_KEY]: null });
29      } else {
30        store.set(ALERTMANAGER_NAME_LOCAL_STORAGE_KEY, alertManagerSourceName);
31        updateQueryParams({ [ALERTMANAGER_NAME_QUERY_KEY]: alertManagerSourceName });
32      }
33    },
34    [updateQueryParams]
35  );
36
37  const querySource = queryParams[ALERTMANAGER_NAME_QUERY_KEY];
38
39  if (querySource && typeof querySource === 'string') {
40    if (isAlertManagerSource(querySource)) {
41      return [querySource, update];
42    } else {
43      // non existing alertmanager
44      return [undefined, update];
45    }
46  }
47  const storeSource = store.get(ALERTMANAGER_NAME_LOCAL_STORAGE_KEY);
48  if (storeSource && typeof storeSource === 'string' && isAlertManagerSource(storeSource)) {
49    update(storeSource);
50    return [storeSource, update];
51  }
52
53  return [GRAFANA_RULES_SOURCE_NAME, update];
54}
55