import { useEffect, useState } from 'react'; import { useDeepCompareEffect } from 'react-use'; import { SelectableValue, toOption } from '@grafana/data'; import { CloudWatchDatasource } from './datasource'; import { Dimensions } from './types'; import { appendTemplateVariables } from './utils/utils'; export const useRegions = (datasource: CloudWatchDatasource): [Array>, boolean] => { const [regionsIsLoading, setRegionsIsLoading] = useState(false); const [regions, setRegions] = useState>>([{ label: 'default', value: 'default' }]); useEffect(() => { setRegionsIsLoading(true); const variableOptionGroup = { label: 'Template Variables', options: datasource.getVariables().map(toOption), }; datasource .getRegions() .then((regions: Array>) => setRegions([...regions, variableOptionGroup])) .finally(() => setRegionsIsLoading(false)); }, [datasource]); return [regions, regionsIsLoading]; }; export const useNamespaces = (datasource: CloudWatchDatasource) => { const [namespaces, setNamespaces] = useState>>([]); useEffect(() => { datasource.getNamespaces().then((namespaces) => { setNamespaces(appendTemplateVariables(datasource, namespaces)); }); }, [datasource]); return namespaces; }; export const useMetrics = (datasource: CloudWatchDatasource, region: string, namespace: string | undefined) => { const [metrics, setMetrics] = useState>>([]); useEffect(() => { datasource.getMetrics(namespace, region).then((result: Array>) => { setMetrics(appendTemplateVariables(datasource, result)); }); }, [datasource, region, namespace]); return metrics; }; export const useDimensionKeys = ( datasource: CloudWatchDatasource, region: string, namespace: string | undefined, metricName: string | undefined, dimensionFilter?: Dimensions ) => { const [dimensionKeys, setDimensionKeys] = useState>>([]); // doing deep comparison to avoid making new api calls to list metrics unless dimension filter object props changes useDeepCompareEffect(() => { datasource .getDimensionKeys(namespace, region, dimensionFilter, metricName) .then((result: Array>) => { setDimensionKeys(appendTemplateVariables(datasource, result)); }); }, [datasource, region, namespace, metricName, dimensionFilter]); return dimensionKeys; };