import {Fragment, useEffect} from 'react'; import styled from '@emotion/styled'; import type {Location} from 'history'; import LoadingIndicator from 'sentry/components/loadingIndicator'; import type {Organization} from 'sentry/types/organization'; import {browserHistory} from 'sentry/utils/browserHistory'; import type EventView from 'sentry/utils/discover/eventView'; import type {MetricDataSwitcherOutcome} from 'sentry/utils/performance/contexts/metricsCardinality'; import {useMetricsCardinalityContext} from 'sentry/utils/performance/contexts/metricsCardinality'; import { canUseMetricsData, MEPState, METRIC_SEARCH_SETTING_PARAM, } from 'sentry/utils/performance/contexts/metricsEnhancedSetting'; import {decodeScalar} from 'sentry/utils/queryString'; interface MetricDataSwitchProps { children: (props: MetricDataSwitcherOutcome) => React.ReactNode; eventView: EventView; location: Location; organization: Organization; hideLoadingIndicator?: boolean; } /** * This component decides based on some stats about current projects whether to show certain views of the landing page. * It is primarily needed for the rollout during which time users, despite having the flag enabled, * may or may not have sampling rules, compatible sdk's etc. This can be simplified post rollout. */ export function MetricsDataSwitcher(props: MetricDataSwitchProps) { const isUsingMetrics = canUseMetricsData(props.organization); const metricsCardinality = useMetricsCardinalityContext(); if (!isUsingMetrics) { return ( {props.children({ forceTransactionsOnly: true, })} ); } if (metricsCardinality.isLoading && !props.hideLoadingIndicator) { return ( ); } if (!metricsCardinality.outcome) { return ( {props.children({ forceTransactionsOnly: true, })} ); } return ( ); } interface SwitcherHandlerProps { eventView: EventView; location: Location; outcome: MetricDataSwitcherOutcome; switcherChildren: MetricDataSwitchProps['children']; } function MetricsSwitchHandler({ switcherChildren, outcome, location, eventView, }: SwitcherHandlerProps) { const {query} = location; const mepSearchState = decodeScalar(query[METRIC_SEARCH_SETTING_PARAM], ''); const hasQuery = decodeScalar(query.query, ''); const queryIsTransactionsBased = mepSearchState === MEPState.TRANSACTIONS_ONLY; const shouldAdjustQuery = hasQuery && queryIsTransactionsBased && !outcome.forceTransactionsOnly; useEffect(() => { if (shouldAdjustQuery) { browserHistory.push({ pathname: location.pathname, query: { ...location.query, cursor: undefined, query: undefined, [METRIC_SEARCH_SETTING_PARAM]: undefined, }, }); } }, [shouldAdjustQuery, location]); if (hasQuery && queryIsTransactionsBased && !outcome.forceTransactionsOnly) { eventView.query = ''; // TODO: Create switcher provider and move it to the route level to remove the need for this. } return {switcherChildren(outcome)}; } const LoadingContainer = styled('div')` display: flex; justify-content: center; `;