Skip to content

Commit 3b84fb9

Browse files
authored
feat(insights): link transaction summary web vitals to new web vitals (#78488)
1 parent b0a6fdf commit 3b84fb9

File tree

4 files changed

+45
-10
lines changed

4 files changed

+45
-10
lines changed

static/app/views/insights/common/utils/useModuleURL.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,20 @@ export type RoutableModuleNames = Exclude<ModuleNameStrings, '' | 'other'>;
3939

4040
export const useModuleURL = (
4141
moduleName: RoutableModuleNames,
42-
bare: boolean = false
42+
bare: boolean = false,
43+
view?: DomainView
4344
): string => {
44-
const builder = useModuleURLBuilder(bare);
45-
return builder(moduleName);
45+
const forceDomainView = Boolean(view);
46+
const builder = useModuleURLBuilder(bare, true, forceDomainView);
47+
return builder(moduleName, view);
4648
};
4749

4850
type URLBuilder = (moduleName: RoutableModuleNames, domainView?: DomainView) => string;
4951

5052
export function useModuleURLBuilder(
5153
bare: boolean = false,
52-
autoDetectDomainView: boolean = true
54+
autoDetectDomainView: boolean = true,
55+
forceDomainView?: boolean // TODO - eventually this param will be removed once we don't have modules in two spots
5356
): URLBuilder {
5457
const organization = useOrganization({allowNull: true}); // Some parts of the app, like the main sidebar, render even if the organization isn't available (during loading, or at all).
5558
const {isInDomainView, view: currentView} = useDomainViewFilters();
@@ -61,7 +64,7 @@ export function useModuleURLBuilder(
6164

6265
const {slug} = organization;
6366

64-
if (autoDetectDomainView && isInDomainView) {
67+
if ((autoDetectDomainView && isInDomainView) || forceDomainView) {
6568
return function (moduleName: RoutableModuleNames, domainView?: DomainView) {
6669
const view = domainView ?? currentView;
6770
return bare

static/app/views/insights/pages/domainViewHeader.tsx

Whitespace-only changes.

static/app/views/performance/transactionSummary/transactionOverview/content.spec.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,22 @@ import {render, screen} from 'sentry-test/reactTestingLibrary';
77
import type {InjectedRouter} from 'sentry/types/legacyReactRouter';
88
import EventView from 'sentry/utils/discover/eventView';
99
import {MEPSettingProvider} from 'sentry/utils/performance/contexts/metricsEnhancedSetting';
10+
import {useLocation} from 'sentry/utils/useLocation';
1011
import {SpanOperationBreakdownFilter} from 'sentry/views/performance/transactionSummary/filter';
1112
import SummaryContent from 'sentry/views/performance/transactionSummary/transactionOverview/content';
1213

14+
jest.mock('sentry/utils/useLocation');
15+
16+
jest.mocked(useLocation).mockReturnValue({
17+
action: 'POP',
18+
hash: '',
19+
key: 'abc123',
20+
pathname: '/organizations/org-slug/performance/',
21+
query: {},
22+
search: '',
23+
state: undefined,
24+
});
25+
1326
function initialize(query, additionalFeatures: string[] = []) {
1427
const features = ['transaction-event', 'performance-view', ...additionalFeatures];
1528
const organization = OrganizationFixture({

static/app/views/performance/transactionSummary/transactionOverview/userStats.tsx

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {Fragment} from 'react';
22
import styled from '@emotion/styled';
3-
import type {Location} from 'history';
3+
import type {Location, LocationDescriptor} from 'history';
44

55
import GuideAnchor from 'sentry/components/assistant/guideAnchor';
66
import {SectionHeading} from 'sentry/components/charts/styles';
@@ -17,6 +17,8 @@ import {WebVital} from 'sentry/utils/fields';
1717
import {useMetricsCardinalityContext} from 'sentry/utils/performance/contexts/metricsCardinality';
1818
import {useMEPSettingContext} from 'sentry/utils/performance/contexts/metricsEnhancedSetting';
1919
import {decodeScalar} from 'sentry/utils/queryString';
20+
import {useModuleURL} from 'sentry/views/insights/common/utils/useModuleURL';
21+
import {ModuleName} from 'sentry/views/insights/types';
2022
import {getTermHelp, PerformanceTerm} from 'sentry/views/performance/data';
2123
import {getTransactionMEPParamsIfApplicable} from 'sentry/views/performance/transactionSummary/transactionOverview/utils';
2224
import {vitalsRouteWithQuery} from 'sentry/views/performance/transactionSummary/transactionVitals/utils';
@@ -47,6 +49,10 @@ function UserStats({
4749
const hasTransactionSummaryCleanupFlag = organization.features.includes(
4850
'performance-transaction-summary-cleanup'
4951
);
52+
const webVitalsUrl = useModuleURL(ModuleName.VITAL, false, 'frontend');
53+
54+
const hasWebVitalsFlag = organization.features.includes('insights-initial-modules');
55+
const hasDomainViewFlag = organization.features.includes('insights-domain-view');
5056

5157
let userMisery = error !== null ? <div>{'\u2014'}</div> : <Placeholder height="34px" />;
5258

@@ -71,13 +77,24 @@ function UserStats({
7177

7278
const orgSlug = organization.slug;
7379

74-
const webVitalsTarget = vitalsRouteWithQuery({
80+
let webVitalsTarget: LocationDescriptor = vitalsRouteWithQuery({
7581
orgSlug,
7682
transaction: transactionName,
7783
projectID: decodeScalar(location.query.project),
7884
query: location.query,
7985
});
8086

87+
if (hasWebVitalsFlag && hasDomainViewFlag) {
88+
webVitalsTarget = {
89+
pathname: `${webVitalsUrl}/overview/`,
90+
query: {
91+
transaction: transactionName,
92+
},
93+
};
94+
}
95+
96+
const showLink = !hasDomainViewFlag || (hasDomainViewFlag && hasWebVitalsFlag);
97+
8198
const mepSetting = useMEPSettingContext();
8299
const mepCardinalityContext = useMetricsCardinalityContext();
83100
const queryExtras = getTransactionMEPParamsIfApplicable(
@@ -101,9 +118,11 @@ function UserStats({
101118
size="sm"
102119
/>
103120
</SectionHeading>
104-
<Link to={webVitalsTarget}>
105-
<IconOpen />
106-
</Link>
121+
{showLink && (
122+
<Link to={webVitalsTarget}>
123+
<IconOpen />
124+
</Link>
125+
)}
107126
</VitalsHeading>
108127
<VitalInfo
109128
location={location}

0 commit comments

Comments
 (0)