123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 |
- import type React from 'react';
- import {createContext, useCallback, useContext, useMemo} from 'react';
- import type {Location} from 'history';
- import {defined} from 'sentry/utils';
- import type {Sort} from 'sentry/utils/discover/fields';
- import {DiscoverDatasets} from 'sentry/utils/discover/types';
- import {useLocation} from 'sentry/utils/useLocation';
- import {useNavigate} from 'sentry/utils/useNavigate';
- import useOrganization from 'sentry/utils/useOrganization';
- import {
- defaultDataset,
- getDatasetFromLocation,
- updateLocationWithDataset,
- } from './dataset';
- import {defaultFields, getFieldsFromLocation, updateLocationWithFields} from './fields';
- import {
- defaultGroupBys,
- getGroupBysFromLocation,
- updateLocationWithGroupBys,
- } from './groupBys';
- import {defaultMode, getModeFromLocation, Mode, updateLocationWithMode} from './mode';
- import {defaultQuery, getQueryFromLocation, updateLocationWithQuery} from './query';
- import {
- defaultSortBys,
- getSortBysFromLocation,
- updateLocationWithSortBys,
- } from './sortBys';
- import {defaultTitle, getTitleFromLocation, updateLocationWithTitle} from './title';
- import type {BaseVisualize, Visualize} from './visualizes';
- import {
- defaultVisualizes,
- getVisualizesFromLocation,
- updateLocationWithVisualizes,
- } from './visualizes';
- interface ReadablePageParams {
- dataset: DiscoverDatasets | undefined;
- fields: string[];
- groupBys: string[];
- mode: Mode;
- query: string;
- sortBys: Sort[];
- visualizes: Visualize[];
- title?: string;
- }
- interface WritablePageParams {
- dataset?: DiscoverDatasets | null;
- fields?: string[] | null;
- groupBys?: string[] | null;
- mode?: Mode | null;
- query?: string | null;
- sortBys?: Sort[] | null;
- title?: string | null;
- visualizes?: BaseVisualize[] | null;
- }
- export interface SuggestedQuery {
- fields: string[];
- groupBys: string[];
- mode: Mode;
- query: string;
- sortBys: Sort[];
- title: string;
- visualizes: BaseVisualize[];
- }
- function defaultPageParams(): ReadablePageParams {
- const dataset = defaultDataset();
- const fields = defaultFields();
- const groupBys = defaultGroupBys();
- const mode = defaultMode();
- const query = defaultQuery();
- const visualizes = defaultVisualizes();
- const title = defaultTitle();
- const sortBys = defaultSortBys(mode, fields, visualizes);
- return {
- dataset,
- fields,
- groupBys,
- mode,
- query,
- sortBys,
- title,
- visualizes,
- };
- }
- const PageParamsContext = createContext<ReadablePageParams>(defaultPageParams());
- interface PageParamsProviderProps {
- children: React.ReactNode;
- }
- export function PageParamsProvider({children}: PageParamsProviderProps) {
- const location = useLocation();
- const pageParams: ReadablePageParams = useMemo(() => {
- const dataset = getDatasetFromLocation(location);
- const fields = getFieldsFromLocation(location);
- const groupBys = getGroupBysFromLocation(location);
- const mode = getModeFromLocation(location);
- const query = getQueryFromLocation(location);
- const visualizes = getVisualizesFromLocation(location);
- const sortBys = getSortBysFromLocation(location, mode, fields, groupBys, visualizes);
- const title = getTitleFromLocation(location);
- return {
- dataset,
- fields,
- groupBys,
- mode,
- query,
- sortBys,
- title,
- visualizes,
- };
- }, [location]);
- return (
- <PageParamsContext.Provider value={pageParams}>{children}</PageParamsContext.Provider>
- );
- }
- export function useExplorePageParams(): ReadablePageParams {
- return useContext(PageParamsContext);
- }
- export function useExploreDataset(): DiscoverDatasets {
- const organization = useOrganization();
- const pageParams = useExplorePageParams();
- if (defined(pageParams.dataset)) {
- return pageParams.dataset;
- }
- return organization.features.includes('visibility-explore-rpc')
- ? DiscoverDatasets.SPANS_EAP_RPC
- : DiscoverDatasets.SPANS_EAP;
- }
- export function useExploreFields(): string[] {
- const pageParams = useExplorePageParams();
- return pageParams.fields;
- }
- export function useExploreGroupBys(): string[] {
- const pageParams = useExplorePageParams();
- return pageParams.groupBys;
- }
- export function useExploreMode(): Mode {
- const pageParams = useExplorePageParams();
- return pageParams.mode;
- }
- export function useExploreQuery(): string {
- const pageParams = useExplorePageParams();
- return pageParams.query;
- }
- export function useExploreSortBys(): Sort[] {
- const pageParams = useExplorePageParams();
- return pageParams.sortBys;
- }
- export function useExploreTitle(): string | undefined {
- const pageParams = useExplorePageParams();
- return pageParams.title;
- }
- export function useExploreVisualizes(): Visualize[] {
- const pageParams = useExplorePageParams();
- return pageParams.visualizes;
- }
- export function newExploreTarget(
- location: Location,
- pageParams: WritablePageParams
- ): Location {
- const target = {...location, query: {...location.query}};
- updateLocationWithDataset(target, pageParams.dataset);
- updateLocationWithFields(target, pageParams.fields);
- updateLocationWithGroupBys(target, pageParams.groupBys);
- updateLocationWithMode(target, pageParams.mode);
- updateLocationWithQuery(target, pageParams.query);
- updateLocationWithSortBys(target, pageParams.sortBys);
- updateLocationWithVisualizes(target, pageParams.visualizes);
- updateLocationWithTitle(target, pageParams.title);
- return target;
- }
- export function useSetExplorePageParams() {
- const location = useLocation();
- const navigate = useNavigate();
- return useCallback(
- (pageParams: WritablePageParams) => {
- const target = newExploreTarget(location, pageParams);
- navigate(target);
- },
- [location, navigate]
- );
- }
- export function useSetExploreDataset() {
- const setPageParams = useSetExplorePageParams();
- return useCallback(
- (dataset: DiscoverDatasets) => {
- setPageParams({dataset});
- },
- [setPageParams]
- );
- }
- export function useSetExploreFields() {
- const setPageParams = useSetExplorePageParams();
- return useCallback(
- (fields: string[]) => {
- setPageParams({fields});
- },
- [setPageParams]
- );
- }
- export function useSetExploreGroupBys() {
- const setPageParams = useSetExplorePageParams();
- return useCallback(
- (groupBys: string[]) => {
- setPageParams({groupBys});
- },
- [setPageParams]
- );
- }
- export function useSetExploreMode() {
- const pageParams = useExplorePageParams();
- const setPageParams = useSetExplorePageParams();
- return useCallback(
- (mode: Mode) => {
- if (mode === Mode.SAMPLES && pageParams.groupBys.some(groupBy => groupBy !== '')) {
- // When switching from the aggregates to samples mode, carry
- // over any group bys as they are helpful context when looking
- // for examples.
- const fields = [...pageParams.fields];
- for (const groupBy of pageParams.groupBys) {
- if (groupBy !== '' && !fields.includes(groupBy)) {
- fields.push(groupBy);
- }
- }
- setPageParams({
- mode,
- fields,
- });
- } else {
- setPageParams({mode});
- }
- },
- [pageParams, setPageParams]
- );
- }
- export function useSetExploreQuery() {
- const setPageParams = useSetExplorePageParams();
- return useCallback(
- (query: string) => {
- setPageParams({query});
- },
- [setPageParams]
- );
- }
- export function useSetExploreSortBys() {
- const setPageParams = useSetExplorePageParams();
- return useCallback(
- (sortBys: Sort[]) => {
- setPageParams({sortBys});
- },
- [setPageParams]
- );
- }
- export function useSetExploreVisualizes() {
- const pageParams = useExplorePageParams();
- const setPageParams = useSetExplorePageParams();
- return useCallback(
- (visualizes: BaseVisualize[], field?: string) => {
- const writablePageParams: WritablePageParams = {visualizes};
- if (defined(field) && !pageParams.fields.includes(field)) {
- writablePageParams.fields = [...pageParams.fields, field];
- }
- setPageParams(writablePageParams);
- },
- [pageParams, setPageParams]
- );
- }
|