grafana/public/app/features/dashboard/components/DashboardSettings/AutoRefreshIntervals.tsx
Zoltán Bedi 8232b6ebbc
Chore: eslint react hook fix for public folder (#31174)
* Fixes under public/app/plugins

* Fixes under public/app/plugins/datasource

* Fixes under public/app/features

* Fixes under public/app/features

* Fixes under public/app/features

* Fixes under public/app/components

* Fix PanelNotSupported test

* Fix one more warning

* Fix warning in usePanelSave

* Fix traceview empty response

* Azure monitor fixes

* More fixes

* Fix tests for azure monitor

* Fixes after merging master

* Add comment for disabled rules

* Fixes after merging master

* Fixes after merging master

* Adress review comments

* Fix azure tests

* Address review feedbacks
2021-03-25 12:42:14 +01:00

94 lines
2.8 KiB
TypeScript

import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';
import { Input, defaultIntervals, Field } from '@grafana/ui';
import { getTimeSrv } from '../../services/TimeSrv';
export interface Props {
refreshIntervals: string[];
onRefreshIntervalChange: (interval: string[]) => void;
getIntervalsFunc?: typeof getValidIntervals;
validateIntervalsFunc?: typeof validateIntervals;
}
export const AutoRefreshIntervals: FC<Props> = ({
refreshIntervals,
onRefreshIntervalChange,
getIntervalsFunc = getValidIntervals,
validateIntervalsFunc = validateIntervals,
}) => {
const [intervals, setIntervals] = useState<string[]>(getIntervalsFunc(refreshIntervals ?? defaultIntervals));
const [invalidIntervalsMessage, setInvalidIntervalsMessage] = useState<string | null>(null);
useEffect(() => {
const intervals = getIntervalsFunc(refreshIntervals ?? defaultIntervals);
setIntervals(intervals);
}, [getIntervalsFunc, refreshIntervals]);
const intervalsString = useMemo(() => {
if (!Array.isArray(intervals)) {
return '';
}
return intervals.join(',');
}, [intervals]);
const onIntervalsChange = useCallback(
(event: React.FormEvent<HTMLInputElement>) => {
const newIntervals = event.currentTarget.value ? event.currentTarget.value.split(',') : [];
setIntervals(newIntervals);
},
[setIntervals]
);
const onIntervalsBlur = useCallback(
(event: React.FormEvent<HTMLInputElement>) => {
const invalidMessage = validateIntervalsFunc(intervals);
if (invalidMessage === null) {
// only refresh dashboard JSON if intervals are valid
onRefreshIntervalChange(getIntervalsFunc(intervals));
}
setInvalidIntervalsMessage(invalidMessage);
},
[getIntervalsFunc, intervals, onRefreshIntervalChange, validateIntervalsFunc]
);
return (
<Field
label="Auto refresh"
description="Define the auto refresh intervals that should be available in the auto refresh dropdown"
error={invalidIntervalsMessage}
invalid={!!invalidIntervalsMessage}
>
<Input
invalid={!!invalidIntervalsMessage}
value={intervalsString}
onChange={onIntervalsChange}
onBlur={onIntervalsBlur}
/>
</Field>
);
};
export const validateIntervals = (
intervals: string[],
dependencies: { getTimeSrv: typeof getTimeSrv } = { getTimeSrv }
): string | null => {
try {
getValidIntervals(intervals, dependencies);
return null;
} catch (err) {
return err.message;
}
};
export const getValidIntervals = (
intervals: string[],
dependencies: { getTimeSrv: typeof getTimeSrv } = { getTimeSrv }
) => {
const cleanIntervals = intervals.filter((i) => i.trim() !== '').map((interval) => interval.replace(/\s+/g, ''));
return [...new Set(dependencies.getTimeSrv().getValidIntervals(cleanIntervals))];
};