import React from 'react';
import styled from '@emotion/styled';
import {Breadcrumbs} from 'sentry/components/breadcrumbs';
import ButtonBar from 'sentry/components/buttonBar';
import FeedbackWidgetButton from 'sentry/components/feedback/widget/feedbackWidgetButton';
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 {MutableSearch} from 'sentry/utils/tokenizeSearch';
import {useLocation} from 'sentry/utils/useLocation';
import {useParams} from 'sentry/utils/useParams';
import {Referrer} from 'sentry/views/performance/browser/resources/referrer';
import ResourceInfo from 'sentry/views/performance/browser/resources/resourceSummaryPage/resourceInfo';
import ResourceSummaryCharts from 'sentry/views/performance/browser/resources/resourceSummaryPage/resourceSummaryCharts';
import ResourceSummaryTable from 'sentry/views/performance/browser/resources/resourceSummaryPage/resourceSummaryTable';
import SampleImages from 'sentry/views/performance/browser/resources/resourceSummaryPage/sampleImages';
import {FilterOptionsContainer} from 'sentry/views/performance/browser/resources/resourceView';
import {IMAGE_FILE_EXTENSIONS} from 'sentry/views/performance/browser/resources/shared/constants';
import RenderBlockingSelector from 'sentry/views/performance/browser/resources/shared/renderBlockingSelector';
import {ResourceSpanOps} from 'sentry/views/performance/browser/resources/shared/types';
import {useResourceModuleFilters} from 'sentry/views/performance/browser/resources/utils/useResourceFilters';
import {ModulePageProviders} from 'sentry/views/performance/modulePageProviders';
import {useModuleBreadcrumbs} from 'sentry/views/performance/utils/useModuleBreadcrumbs';
import {useModuleURL} from 'sentry/views/performance/utils/useModuleURL';
import {useSpanMetrics} from 'sentry/views/starfish/queries/useDiscover';
import {ModuleName, SpanMetricsField} from 'sentry/views/starfish/types';
import {SampleList} from 'sentry/views/starfish/views/spanSummaryPage/sampleList';
const {
SPAN_SELF_TIME,
SPAN_DESCRIPTION,
HTTP_DECODED_RESPONSE_CONTENT_LENGTH,
HTTP_RESPONSE_CONTENT_LENGTH,
HTTP_RESPONSE_TRANSFER_SIZE,
RESOURCE_RENDER_BLOCKING_STATUS,
SPAN_OP,
} = SpanMetricsField;
function ResourceSummary() {
const webVitalsModuleURL = useModuleURL('vital');
const {groupId} = useParams();
const filters = useResourceModuleFilters();
const selectedSpanOp = filters[SPAN_OP];
const {
query: {transaction},
} = useLocation();
const {data} = useSpanMetrics(
{
search: MutableSearch.fromQueryObject({
'span.group': groupId,
}),
fields: [
`avg(${SPAN_SELF_TIME})`,
`avg(${HTTP_RESPONSE_CONTENT_LENGTH})`,
`avg(${HTTP_DECODED_RESPONSE_CONTENT_LENGTH})`,
`avg(${HTTP_RESPONSE_TRANSFER_SIZE})`,
`sum(${SPAN_SELF_TIME})`,
'spm()',
SPAN_OP,
SPAN_DESCRIPTION,
'time_spent_percentage()',
'project.id',
],
},
Referrer.RESOURCE_SUMMARY_METRICS_RIBBON
);
const spanMetrics = selectedSpanOp
? data.find(item => item[SPAN_OP] === selectedSpanOp) ?? {}
: data[0] ?? {};
const uniqueSpanOps = new Set(data.map(item => item[SPAN_OP]));
const isImage =
filters[SPAN_OP] === ResourceSpanOps.IMAGE ||
IMAGE_FILE_EXTENSIONS.includes(
spanMetrics[SpanMetricsField.SPAN_DESCRIPTION]?.split('.').pop() || ''
) ||
(uniqueSpanOps.size === 1 && spanMetrics[SPAN_OP] === ResourceSpanOps.IMAGE);
const crumbs = useModuleBreadcrumbs('resource');
return (
{spanMetrics[SpanMetricsField.SPAN_DESCRIPTION]}
{isImage && (
)}
);
}
function PageWithProviders() {
return (
);
}
export default PageWithProviders;
const HeaderContainer = styled('div')`
display: flex;
justify-content: space-between;
flex-wrap: wrap;
`;