import { QueryParams } from 'constants/query'; import { PANEL_TYPES } from 'constants/queryBuilder'; import PanelWrapper from 'container/PanelWrapper/PanelWrapper'; import { CustomTimeType } from 'container/TopNav/DateTimeSelectionV2/config'; import { useIsDarkMode } from 'hooks/useDarkMode'; import useUrlQuery from 'hooks/useUrlQuery'; import { GetQueryResultsProps } from 'lib/dashboard/getQueryResults'; import GetMinMax from 'lib/getMinMax'; import getTimeString from 'lib/getTimeString'; import history from 'lib/history'; import { Dispatch, SetStateAction, useCallback, useEffect, useRef, } from 'react'; import { UseQueryResult } from 'react-query'; import { useDispatch } from 'react-redux'; import { useLocation } from 'react-router-dom'; import { UpdateTimeInterval } from 'store/actions'; import { SuccessResponse } from 'types/api'; import { Widgets } from 'types/api/dashboard/getAll'; import { MetricRangePayloadProps } from 'types/api/metrics/getQueryRange'; function WidgetGraph({ selectedWidget, queryResponse, setRequestData, selectedGraph, }: WidgetGraphProps): JSX.Element { const graphRef = useRef(null); const dispatch = useDispatch(); const urlQuery = useUrlQuery(); const location = useLocation(); const handleBackNavigation = (): void => { const searchParams = new URLSearchParams(window.location.search); const startTime = searchParams.get(QueryParams.startTime); const endTime = searchParams.get(QueryParams.endTime); const relativeTime = searchParams.get( QueryParams.relativeTime, ) as CustomTimeType; if (relativeTime) { dispatch(UpdateTimeInterval(relativeTime)); } else if (startTime && endTime && startTime !== endTime) { dispatch( UpdateTimeInterval('custom', [ parseInt(getTimeString(startTime), 10), parseInt(getTimeString(endTime), 10), ]), ); } }; const onDragSelect = useCallback( (start: number, end: number): void => { const startTimestamp = Math.trunc(start); const endTimestamp = Math.trunc(end); if (startTimestamp !== endTimestamp) { dispatch(UpdateTimeInterval('custom', [startTimestamp, endTimestamp])); } const { maxTime, minTime } = GetMinMax('custom', [ startTimestamp, endTimestamp, ]); urlQuery.set(QueryParams.startTime, minTime.toString()); urlQuery.set(QueryParams.endTime, maxTime.toString()); const generatedUrl = `${location.pathname}?${urlQuery.toString()}`; history.push(generatedUrl); }, [dispatch, location.pathname, urlQuery], ); useEffect(() => { window.addEventListener('popstate', handleBackNavigation); return (): void => { window.removeEventListener('popstate', handleBackNavigation); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const isDarkMode = useIsDarkMode(); return (
); } interface WidgetGraphProps { selectedWidget: Widgets; queryResponse: UseQueryResult< SuccessResponse, Error >; setRequestData: Dispatch>; selectedGraph: PANEL_TYPES; } export default WidgetGraph;