diff --git a/frontend/src/container/AlertHistory/Timeline/Graph/Graph.tsx b/frontend/src/container/AlertHistory/Timeline/Graph/Graph.tsx index 5adf1c481a..b3eecda24c 100644 --- a/frontend/src/container/AlertHistory/Timeline/Graph/Graph.tsx +++ b/frontend/src/container/AlertHistory/Timeline/Graph/Graph.tsx @@ -1,10 +1,15 @@ import { Color } from '@signozhq/design-tokens'; import Uplot from 'components/Uplot'; +import { QueryParams } from 'constants/query'; import { useIsDarkMode } from 'hooks/useDarkMode'; import { useResizeObserver } from 'hooks/useDimensions'; +import useUrlQuery from 'hooks/useUrlQuery'; +import history from 'lib/history'; import heatmapPlugin from 'lib/uPlotLib/plugins/heatmapPlugin'; import timelinePlugin from 'lib/uPlotLib/plugins/timelinePlugin'; import { useMemo, useRef } from 'react'; +import { useDispatch } from 'react-redux'; +import { UpdateTimeInterval } from 'store/actions'; import { AlertRuleTimelineGraphResponse } from 'types/api/alerts/def'; import uPlot, { AlignedData } from 'uplot'; @@ -41,11 +46,13 @@ function HorizontalTimelineGraph({ return [timestamps, states]; }, [data]); + const urlQuery = useUrlQuery(); + const dispatch = useDispatch(); + const options: uPlot.Options = useMemo( () => ({ width, height: 85, - cursor: { show: false }, axes: [ { @@ -66,6 +73,40 @@ function HorizontalTimelineGraph({ label: 'States', }, ], + hooks: { + setSelect: [ + (self): void => { + const selection = self.select; + if (selection) { + const startTime = self.posToVal(selection.left, 'x'); + const endTime = self.posToVal(selection.left + selection.width, 'x'); + + const diff = endTime - startTime; + + if (diff > 0) { + if (urlQuery.has(QueryParams.relativeTime)) { + urlQuery.delete(QueryParams.relativeTime); + } + + const startTimestamp = Math.floor(startTime * 1000); + const endTimestamp = Math.floor(endTime * 1000); + + if (startTimestamp !== endTimestamp) { + dispatch(UpdateTimeInterval('custom', [startTimestamp, endTimestamp])); + } + + urlQuery.set(QueryParams.startTime, startTimestamp.toString()); + urlQuery.set(QueryParams.endTime, endTimestamp.toString()); + + history.push({ + search: urlQuery.toString(), + }); + } + } + }, + ], + }, + plugins: transformedData?.length > 1 ? [ @@ -76,7 +117,7 @@ function HorizontalTimelineGraph({ ] : [], }), - [width, isDarkMode, transformedData], + [width, isDarkMode, transformedData.length, urlQuery, dispatch], ); return ; } diff --git a/frontend/src/pages/AlertDetails/hooks.tsx b/frontend/src/pages/AlertDetails/hooks.tsx index c6f7b64d64..c9257ad47b 100644 --- a/frontend/src/pages/AlertDetails/hooks.tsx +++ b/frontend/src/pages/AlertDetails/hooks.tsx @@ -17,6 +17,7 @@ import AlertHistory from 'container/AlertHistory'; import { TIMELINE_TABLE_PAGE_SIZE } from 'container/AlertHistory/constants'; import { AlertDetailsTab, TimelineFilter } from 'container/AlertHistory/types'; import { urlKey } from 'container/AllError/utils'; +import { RelativeTimeMap } from 'container/TopNav/DateTimeSelection/config'; import useAxiosError from 'hooks/useAxiosError'; import { useNotifications } from 'hooks/useNotifications'; import useUrlQuery from 'hooks/useUrlQuery'; @@ -31,9 +32,7 @@ import PaginationInfoText from 'periscope/components/PaginationInfoText/Paginati import { useAlertRule } from 'providers/Alert'; import { useCallback, useMemo } from 'react'; import { useMutation, useQuery, useQueryClient } from 'react-query'; -import { useSelector } from 'react-redux'; import { generatePath, useLocation } from 'react-router-dom'; -import { AppState } from 'store/reducers'; import { ErrorResponse, SuccessResponse } from 'types/api'; import { AlertDef, @@ -44,7 +43,6 @@ import { AlertRuleTopContributorsPayload, } from 'types/api/alerts/def'; import { PayloadProps } from 'types/api/alerts/get'; -import { GlobalReducer } from 'types/reducer/globalTime'; import { nanoToMilli } from 'utils/timeUtils'; export const useAlertHistoryQueryParams = (): { @@ -56,11 +54,10 @@ export const useAlertHistoryQueryParams = (): { } => { const params = useUrlQuery(); - const globalTime = useSelector( - (state) => state.globalTime, - ); const startTime = params.get(QueryParams.startTime); const endTime = params.get(QueryParams.endTime); + const relativeTime = + params.get(QueryParams.relativeTime) ?? RelativeTimeMap['6hr']; const intStartTime = parseInt(startTime || '0', 10); const intEndTime = parseInt(endTime || '0', 10); @@ -69,8 +66,8 @@ export const useAlertHistoryQueryParams = (): { const { maxTime, minTime } = useMemo(() => { if (hasStartAndEndParams) return GetMinMax('custom', [intStartTime, intEndTime]); - return GetMinMax(globalTime.selectedTime); - }, [hasStartAndEndParams, intStartTime, intEndTime, globalTime.selectedTime]); + return GetMinMax(relativeTime); + }, [hasStartAndEndParams, intStartTime, intEndTime, relativeTime]); const ruleId = params.get(QueryParams.ruleId);