import { DEFAULT_ENTITY_VERSION } from 'constants/app'; import { QueryParams } from 'constants/query'; import { PANEL_TYPES } from 'constants/queryBuilder'; import { CustomTimeType } from 'container/TopNav/DateTimeSelectionV2/config'; import { useGetQueryRange } from 'hooks/queryBuilder/useGetQueryRange'; import { useStepInterval } from 'hooks/queryBuilder/useStepInterval'; import { useIntersectionObserver } from 'hooks/useIntersectionObserver'; import { getDashboardVariables } from 'lib/dashbaordVariables/getDashboardVariables'; import { GetQueryResultsProps } from 'lib/dashboard/getQueryResults'; import getTimeString from 'lib/getTimeString'; import isEmpty from 'lodash-es/isEmpty'; import { useDashboard } from 'providers/Dashboard/Dashboard'; import { memo, useEffect, useRef, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { UpdateTimeInterval } from 'store/actions'; import { AppState } from 'store/reducers'; import { GlobalReducer } from 'types/reducer/globalTime'; import { getGraphType } from 'utils/getGraphType'; import { getSortedSeriesData } from 'utils/getSortedSeriesData'; import EmptyWidget from '../EmptyWidget'; import { MenuItemKeys } from '../WidgetHeader/contants'; import { GridCardGraphProps } from './types'; import WidgetGraphComponent from './WidgetGraphComponent'; function GridCardGraph({ widget, headerMenuList = [MenuItemKeys.View], isQueryEnabled, threshold, variables, version, onClickHandler, onDragSelect, }: GridCardGraphProps): JSX.Element { const dispatch = useDispatch(); const [errorMessage, setErrorMessage] = useState(); const { toScrollWidgetId, setToScrollWidgetId } = useDashboard(); const { minTime, maxTime, selectedTime: globalSelectedInterval } = useSelector< AppState, GlobalReducer >((state) => state.globalTime); 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), ]), ); } }; useEffect(() => { window.addEventListener('popstate', handleBackNavigation); return (): void => { window.removeEventListener('popstate', handleBackNavigation); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const graphRef = useRef(null); const isVisible = useIntersectionObserver(graphRef, undefined, true); useEffect(() => { if (toScrollWidgetId === widget.id) { graphRef.current?.scrollIntoView({ behavior: 'smooth', block: 'center', }); graphRef.current?.focus(); setToScrollWidgetId(''); } }, [toScrollWidgetId, setToScrollWidgetId, widget.id]); const updatedQuery = useStepInterval(widget?.query); const isEmptyWidget = widget?.id === PANEL_TYPES.EMPTY_WIDGET || isEmpty(widget); const queryEnabledCondition = isVisible && !isEmptyWidget && isQueryEnabled; const [requestData, setRequestData] = useState(() => { if (widget.panelTypes !== PANEL_TYPES.LIST) { return { selectedTime: widget?.timePreferance, graphType: getGraphType(widget.panelTypes), query: updatedQuery, globalSelectedInterval, variables: getDashboardVariables(variables), }; } updatedQuery.builder.queryData[0].pageSize = 10; return { query: updatedQuery, graphType: PANEL_TYPES.LIST, selectedTime: widget.timePreferance || 'GLOBAL_TIME', globalSelectedInterval, tableParams: { pagination: { offset: 0, limit: updatedQuery.builder.queryData[0].limit || 0, }, }, }; }); const queryResponse = useGetQueryRange( { ...requestData, variables: getDashboardVariables(variables), selectedTime: widget.timePreferance || 'GLOBAL_TIME', globalSelectedInterval, }, version || DEFAULT_ENTITY_VERSION, { queryKey: [ maxTime, minTime, globalSelectedInterval, variables, widget?.query, widget?.panelTypes, widget.timePreferance, requestData, ], retry(failureCount, error): boolean { if ( String(error).includes('status: error') && String(error).includes('i/o timeout') ) { return false; } return failureCount < 2; }, keepPreviousData: true, enabled: queryEnabledCondition, refetchOnMount: false, onError: (error) => { setErrorMessage(error.message); }, }, ); const isEmptyLayout = widget?.id === PANEL_TYPES.EMPTY_WIDGET; if (queryResponse.data && widget.panelTypes === PANEL_TYPES.BAR) { const sortedSeriesData = getSortedSeriesData( queryResponse.data?.payload.data.result, ); queryResponse.data.payload.data.result = sortedSeriesData; } const menuList = widget.panelTypes === PANEL_TYPES.TABLE || widget.panelTypes === PANEL_TYPES.LIST || widget.panelTypes === PANEL_TYPES.PIE ? headerMenuList.filter((menu) => menu !== MenuItemKeys.CreateAlerts) : headerMenuList; return (
{isEmptyLayout ? ( ) : ( )}
); } GridCardGraph.defaultProps = { onDragSelect: undefined, onClickHandler: undefined, isQueryEnabled: true, threshold: undefined, headerMenuList: [MenuItemKeys.View], version: 'v3', }; export default memo(GridCardGraph);