|
@@ -7,6 +7,7 @@ import {
|
|
|
useState,
|
|
|
} from 'react';
|
|
|
import * as Sentry from '@sentry/react';
|
|
|
+import isEqual from 'lodash/isEqual';
|
|
|
|
|
|
import {MRI} from 'sentry/types';
|
|
|
import {
|
|
@@ -19,6 +20,7 @@ import {
|
|
|
} from 'sentry/utils/metrics';
|
|
|
import {useMetricsMeta} from 'sentry/utils/metrics/useMetricsMeta';
|
|
|
import {decodeList} from 'sentry/utils/queryString';
|
|
|
+import {useLocalStorageState} from 'sentry/utils/useLocalStorageState';
|
|
|
import usePageFilters from 'sentry/utils/usePageFilters';
|
|
|
import useRouter from 'sentry/utils/useRouter';
|
|
|
import {FocusArea} from 'sentry/views/ddm/chartBrush';
|
|
@@ -31,30 +33,34 @@ interface DDMContextValue {
|
|
|
addWidgets: (widgets: Partial<MetricWidgetQueryParams>[]) => void;
|
|
|
duplicateWidget: (index: number) => void;
|
|
|
focusArea: FocusArea | null;
|
|
|
+ isDefaultQuery: boolean;
|
|
|
isLoading: boolean;
|
|
|
metricsMeta: ReturnType<typeof useMetricsMeta>['data'];
|
|
|
removeFocusArea: () => void;
|
|
|
removeWidget: (index: number) => void;
|
|
|
selectedWidgetIndex: number;
|
|
|
+ setDefaultQuery: (query: Record<string, any> | null) => void;
|
|
|
setSelectedWidgetIndex: (index: number) => void;
|
|
|
updateWidget: (index: number, data: Partial<MetricWidgetQueryParams>) => void;
|
|
|
widgets: MetricWidgetQueryParams[];
|
|
|
}
|
|
|
|
|
|
export const DDMContext = createContext<DDMContextValue>({
|
|
|
- selectedWidgetIndex: 0,
|
|
|
- setSelectedWidgetIndex: () => {},
|
|
|
+ addFocusArea: () => {},
|
|
|
addWidget: () => {},
|
|
|
addWidgets: () => {},
|
|
|
- updateWidget: () => {},
|
|
|
- removeWidget: () => {},
|
|
|
- addFocusArea: () => {},
|
|
|
- removeFocusArea: () => {},
|
|
|
duplicateWidget: () => {},
|
|
|
- widgets: [],
|
|
|
- metricsMeta: [],
|
|
|
- isLoading: false,
|
|
|
focusArea: null,
|
|
|
+ isDefaultQuery: false,
|
|
|
+ isLoading: false,
|
|
|
+ metricsMeta: [],
|
|
|
+ removeFocusArea: () => {},
|
|
|
+ removeWidget: () => {},
|
|
|
+ selectedWidgetIndex: 0,
|
|
|
+ setDefaultQuery: () => {},
|
|
|
+ setSelectedWidgetIndex: () => {},
|
|
|
+ updateWidget: () => {},
|
|
|
+ widgets: [],
|
|
|
});
|
|
|
|
|
|
export function useDDMContext() {
|
|
@@ -172,10 +178,37 @@ export function useMetricWidgets() {
|
|
|
};
|
|
|
}
|
|
|
|
|
|
+const useDefaultQuery = () => {
|
|
|
+ const router = useRouter();
|
|
|
+ const [defaultQuery, setDefaultQuery] = useLocalStorageState<Record<
|
|
|
+ string,
|
|
|
+ any
|
|
|
+ > | null>('ddm:default-query', null);
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ if (defaultQuery) {
|
|
|
+ router.replace({...router.location, query: defaultQuery});
|
|
|
+ }
|
|
|
+ // Only call on page load
|
|
|
+ // eslint-disable-next-line react-hooks/exhaustive-deps
|
|
|
+ }, []);
|
|
|
+
|
|
|
+ return useMemo(
|
|
|
+ () => ({
|
|
|
+ defaultQuery,
|
|
|
+ setDefaultQuery,
|
|
|
+ isDefaultQuery: !!defaultQuery && isEqual(defaultQuery, router.location.query),
|
|
|
+ }),
|
|
|
+ [defaultQuery, router.location.query, setDefaultQuery]
|
|
|
+ );
|
|
|
+};
|
|
|
+
|
|
|
export function DDMContextProvider({children}: {children: React.ReactNode}) {
|
|
|
const router = useRouter();
|
|
|
const updateQuery = useUpdateQuery();
|
|
|
|
|
|
+ const {setDefaultQuery, isDefaultQuery} = useDefaultQuery();
|
|
|
+
|
|
|
const [selectedWidgetIndex, setSelectedWidgetIndex] = useState(0);
|
|
|
const {widgets, updateWidget, addWidget, addWidgets, removeWidget, duplicateWidget} =
|
|
|
useMetricWidgets();
|
|
@@ -262,20 +295,24 @@ export function DDMContextProvider({children}: {children: React.ReactNode}) {
|
|
|
focusArea,
|
|
|
addFocusArea: handleAddFocusArea,
|
|
|
removeFocusArea: handleRemoveFocusArea,
|
|
|
+ setDefaultQuery,
|
|
|
+ isDefaultQuery,
|
|
|
}),
|
|
|
[
|
|
|
- addWidgets,
|
|
|
handleAddWidget,
|
|
|
- handleDuplicate,
|
|
|
+ addWidgets,
|
|
|
+ selectedWidgetIndex,
|
|
|
+ widgets,
|
|
|
handleUpdateWidget,
|
|
|
removeWidget,
|
|
|
+ handleDuplicate,
|
|
|
isLoading,
|
|
|
metricsMeta,
|
|
|
- selectedWidgetIndex,
|
|
|
- widgets,
|
|
|
focusArea,
|
|
|
handleAddFocusArea,
|
|
|
handleRemoveFocusArea,
|
|
|
+ setDefaultQuery,
|
|
|
+ isDefaultQuery,
|
|
|
]
|
|
|
);
|
|
|
|