import {Fragment, useState} from 'react'; import styled from '@emotion/styled'; import omit from 'lodash/omit'; import Breadcrumbs from 'sentry/components/breadcrumbs'; import FloatingFeedbackWidget from 'sentry/components/feedback/widget/floatingFeedbackWidget'; import * as Layout from 'sentry/components/layouts/thirds'; import {DatePageFilter} from 'sentry/components/organizations/datePageFilter'; import {EnvironmentPageFilter} from 'sentry/components/organizations/environmentPageFilter'; import PageFilterBar from 'sentry/components/organizations/pageFilterBar'; import {ProjectPageFilter} from 'sentry/components/organizations/projectPageFilter'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; 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 WebVitalMeters from 'sentry/views/performance/browser/webVitals/components/webVitalMeters'; import {PagePerformanceTable} from 'sentry/views/performance/browser/webVitals/pagePerformanceTable'; import {PerformanceScoreChart} from 'sentry/views/performance/browser/webVitals/performanceScoreChart'; import {USE_STORED_SCORES} from 'sentry/views/performance/browser/webVitals/settings'; import {calculatePerformanceScoreFromTableDataRow} from 'sentry/views/performance/browser/webVitals/utils/queries/rawWebVitalsQueries/calculatePerformanceScore'; import {useProjectRawWebVitalsQuery} from 'sentry/views/performance/browser/webVitals/utils/queries/rawWebVitalsQueries/useProjectRawWebVitalsQuery'; import {calculatePerformanceScoreFromStoredTableDataRow} from 'sentry/views/performance/browser/webVitals/utils/queries/storedScoreQueries/calculatePerformanceScoreFromStored'; import {useProjectWebVitalsScoresQuery} from 'sentry/views/performance/browser/webVitals/utils/queries/storedScoreQueries/useProjectWebVitalsScoresQuery'; import {WebVitals} from 'sentry/views/performance/browser/webVitals/utils/types'; import {useOnboardingProject} from 'sentry/views/performance/browser/webVitals/utils/useOnboardingProject'; import {WebVitalsDetailPanel} from 'sentry/views/performance/browser/webVitals/webVitalsDetailPanel'; import {ModulePageProviders} from 'sentry/views/performance/database/modulePageProviders'; import Onboarding from 'sentry/views/performance/onboarding'; export default function WebVitalsLandingPage() { const organization = useOrganization(); const location = useLocation(); const onboardingProject = useOnboardingProject(); const router = useRouter(); const [state, setState] = useState<{webVital: WebVitals | null}>({ webVital: (location.query.webVital as WebVitals) ?? null, }); const {data: projectData, isLoading} = useProjectRawWebVitalsQuery({}); const {data: projectScores, isLoading: isProjectScoresLoading} = useProjectWebVitalsScoresQuery({enabled: USE_STORED_SCORES}); const noTransactions = !isLoading && !projectData?.data?.[0]?.['count()']; const projectScore = (USE_STORED_SCORES && isProjectScoresLoading) || isLoading || noTransactions ? undefined : USE_STORED_SCORES ? calculatePerformanceScoreFromStoredTableDataRow(projectScores?.data?.[0]) : calculatePerformanceScoreFromTableDataRow(projectData?.data?.[0]); return ( {t('Web Vitals')} {onboardingProject && ( )} {!onboardingProject && ( setState({...state, webVital})} /> )} { router.replace({ pathname: router.location.pathname, query: omit(router.location.query, 'webVital'), }); setState({...state, webVital: null}); }} /> ); } const TopMenuContainer = styled('div')` display: flex; `; const PerformanceScoreChartContainer = styled('div')` margin-bottom: ${space(1)}; `; const OnboardingContainer = styled('div')` margin-top: ${space(2)}; `;