import {useEffect} from 'react'; import styled from '@emotion/styled'; import type {LocationDescriptor} from 'history'; import omit from 'lodash/omit'; import type {Crumb} from 'sentry/components/breadcrumbs'; import Breadcrumbs from 'sentry/components/breadcrumbs'; import ErrorBoundary from 'sentry/components/errorBoundary'; import * as Layout from 'sentry/components/layouts/thirds'; import {DatePageFilter} from 'sentry/components/organizations/datePageFilter'; import PageFilterBar from 'sentry/components/organizations/pageFilterBar'; import PageFiltersContainer from 'sentry/components/organizations/pageFilters/container'; import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import {browserHistory} from 'sentry/utils/browserHistory'; import {DurationUnit} from 'sentry/utils/discover/fields'; import {DiscoverDatasets} from 'sentry/utils/discover/types'; import {PageAlert, PageAlertProvider} from 'sentry/utils/performance/contexts/pageAlert'; import {useLocation} from 'sentry/utils/useLocation'; import useOrganization from 'sentry/utils/useOrganization'; import useRouter from 'sentry/utils/useRouter'; import {normalizeUrl} from 'sentry/utils/withDomainRequired'; import {SamplesTables} from 'sentry/views/performance/mobile/appStarts/screenSummary/samples'; import { COLD_START_TYPE, StartTypeSelector, } from 'sentry/views/performance/mobile/appStarts/screenSummary/startTypeSelector'; import {MetricsRibbon} from 'sentry/views/performance/mobile/screenload/screenLoadSpans/metricsRibbon'; import {ScreenLoadSpanSamples} from 'sentry/views/performance/mobile/screenload/screenLoadSpans/samples'; import { PRIMARY_RELEASE_ALIAS, ReleaseComparisonSelector, SECONDARY_RELEASE_ALIAS, } from 'sentry/views/starfish/components/releaseSelector'; import {SpanMetricsField} from 'sentry/views/starfish/types'; import {QueryParameterNames} from 'sentry/views/starfish/views/queryParameters'; import AppStartWidgets from './widgets'; type Query = { [SpanMetricsField.APP_START_TYPE]: string; 'device.class': string; primaryRelease: string; project: string; secondaryRelease: string; spanDescription: string; spanGroup: string; spanOp: string; transaction: string; }; function ScreenSummary() { const organization = useOrganization(); const location = useLocation(); const router = useRouter(); const { primaryRelease, secondaryRelease, transaction: transactionName, spanGroup, spanDescription, spanOp, [SpanMetricsField.APP_START_TYPE]: appStartType, 'device.class': deviceClass, } = location.query; useEffect(() => { // Default the start type to cold start if not present if (!appStartType) { browserHistory.replace({ ...location, query: { ...location.query, [SpanMetricsField.APP_START_TYPE]: COLD_START_TYPE, }, }); } }, [location, appStartType]); const startupModule: LocationDescriptor = { pathname: `/organizations/${organization.slug}/performance/mobile/app-startup/`, query: { ...omit(location.query, [ QueryParameterNames.SPANS_SORT, 'transaction', SpanMetricsField.SPAN_OP, SpanMetricsField.APP_START_TYPE, ]), }, }; const crumbs: Crumb[] = [ { label: t('Performance'), to: normalizeUrl(`/organizations/${organization.slug}/performance/`), preservePageFilters: true, }, { to: startupModule, label: t('App Starts'), preservePageFilters: true, }, { to: '', label: t('Screen Summary'), }, ]; return ( {transactionName} {spanGroup && spanOp && appStartType && ( { router.replace({ pathname: router.location.pathname, query: omit( router.location.query, 'spanGroup', 'transactionMethod', 'spanDescription', 'spanOp' ), }); }} /> )} ); } export default ScreenSummary; const ControlsContainer = styled('div')` display: flex; gap: ${space(1.5)}; `; const HeaderContainer = styled('div')` display: flex; flex-wrap: wrap; gap: ${space(2)}; justify-content: space-between; `; const SamplesContainer = styled('div')` margin-top: ${space(2)}; `;