Skip to content

Commit 086f62a

Browse files
authored
fix(insights): minor bugs/improvements to empty states (#74167)
1. Don't show extra filters on modules if there is no module data to begin with. For example on the assets module, we won't show the domain filter. This makes sense because these filters will not change anything in this context anyways. 2. Use correct docs links from each modules `settings.ts` 3. Remove duplicated `read docs`
1 parent 500ca23 commit 086f62a

File tree

8 files changed

+66
-36
lines changed

8 files changed

+66
-36
lines changed

static/app/views/insights/browser/resources/views/resourcesLandingPage.spec.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import {OrganizationFixture} from 'sentry-fixture/organization';
2+
import {ProjectFixture} from 'sentry-fixture/project';
23

34
import {render, screen, waitForElementToBeRemoved} from 'sentry-test/reactTestingLibrary';
45

56
import type {Organization} from 'sentry/types/organization';
67
import {useLocation} from 'sentry/utils/useLocation';
78
import usePageFilters from 'sentry/utils/usePageFilters';
9+
import useProjects from 'sentry/utils/useProjects';
810
import ResourcesLandingPage from 'sentry/views/insights/browser/resources/views/resourcesLandingPage';
911
import {SpanFunction, SpanMetricsField} from 'sentry/views/insights/types';
1012

@@ -22,6 +24,7 @@ const {SPM, TIME_SPENT_PERCENTAGE} = SpanFunction;
2224

2325
jest.mock('sentry/utils/useLocation');
2426
jest.mock('sentry/utils/usePageFilters');
27+
jest.mock('sentry/utils/useProjects');
2528

2629
const requestMocks: Record<string, jest.Mock> = {};
2730

@@ -154,6 +157,16 @@ const setupMocks = () => {
154157
action: 'PUSH',
155158
key: '',
156159
});
160+
161+
jest.mocked(useProjects).mockReturnValue({
162+
fetchError: null,
163+
fetching: false,
164+
hasMore: false,
165+
initiallyLoaded: true,
166+
projects: [ProjectFixture({hasInsightsAssets: true})],
167+
onSearch: jest.fn(),
168+
placeholders: [],
169+
});
157170
};
158171

159172
const setupMockRequests = (organization: Organization) => {

static/app/views/insights/browser/resources/views/resourcesLandingPage.tsx

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828
} from 'sentry/views/insights/browser/resources/utils/useResourceFilters';
2929
import {ModulePageProviders} from 'sentry/views/insights/common/components/modulePageProviders';
3030
import {ModulesOnboarding} from 'sentry/views/insights/common/components/modulesOnboarding';
31+
import {useHasFirstSpan} from 'sentry/views/insights/common/queries/useHasFirstSpan';
3132
import {useModuleBreadcrumbs} from 'sentry/views/insights/common/utils/useModuleBreadcrumbs';
3233
import {DomainSelector} from 'sentry/views/insights/common/views/spans/selectors/domainSelector';
3334
import {ModuleName} from 'sentry/views/insights/types';
@@ -36,7 +37,7 @@ const {SPAN_OP, SPAN_DOMAIN} = BrowserStarfishFields;
3637

3738
function ResourcesLandingPage() {
3839
const filters = useResourceModuleFilters();
39-
40+
const hasModuleData = useHasFirstSpan(ModuleName.RESOURCE);
4041
const crumbs = useModuleBreadcrumbs('resource');
4142

4243
return (
@@ -69,14 +70,16 @@ function ResourcesLandingPage() {
6970
<EnvironmentPageFilter />
7071
<DatePageFilter />
7172
</PageFilterBar>
72-
<DomainSelector
73-
emptyOptionLocation="top"
74-
value={filters[SPAN_DOMAIN] || ''}
75-
additionalQuery={[
76-
...DEFAULT_RESOURCE_FILTERS,
77-
`${SPAN_OP}:[${DEFAULT_RESOURCE_TYPES.join(',')}]`,
78-
]}
79-
/>
73+
{hasModuleData && (
74+
<DomainSelector
75+
emptyOptionLocation="top"
76+
value={filters[SPAN_DOMAIN] || ''}
77+
additionalQuery={[
78+
...DEFAULT_RESOURCE_FILTERS,
79+
`${SPAN_OP}:[${DEFAULT_RESOURCE_TYPES.join(',')}]`,
80+
]}
81+
/>
82+
)}
8083
</FilterOptionsContainer>
8184
<ModulesOnboarding moduleName={ModuleName.RESOURCE}>
8285
<ResourceView />

static/app/views/insights/browser/webVitals/views/webVitalsLandingPage.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import type {WebVitals} from 'sentry/views/insights/browser/webVitals/types';
3737
import decodeBrowserTypes from 'sentry/views/insights/browser/webVitals/utils/queryParameterDecoders/browserType';
3838
import {ModulePageProviders} from 'sentry/views/insights/common/components/modulePageProviders';
3939
import {ModulesOnboarding} from 'sentry/views/insights/common/components/modulesOnboarding';
40+
import {useHasFirstSpan} from 'sentry/views/insights/common/queries/useHasFirstSpan';
4041
import {useOnboardingProject} from 'sentry/views/insights/common/queries/useOnboardingProject';
4142
import {useHasDataTrackAnalytics} from 'sentry/views/insights/common/utils/useHasDataTrackAnalytics';
4243
import {useModuleBreadcrumbs} from 'sentry/views/insights/common/utils/useModuleBreadcrumbs';
@@ -47,6 +48,7 @@ export function WebVitalsLandingPage() {
4748
const organization = useOrganization();
4849
const location = useLocation();
4950
const onboardingProject = useOnboardingProject();
51+
const hasModuleData = useHasFirstSpan(ModuleName.VITAL);
5052

5153
const router = useRouter();
5254

@@ -98,7 +100,7 @@ export function WebVitalsLandingPage() {
98100
<EnvironmentPageFilter />
99101
<DatePageFilter />
100102
</PageFilterBar>
101-
<BrowserTypeSelector />
103+
{hasModuleData && <BrowserTypeSelector />}
102104
</TopMenuContainer>
103105
<MainContentContainer>
104106
<ModulesOnboarding moduleName={ModuleName.VITAL}>

static/app/views/insights/common/components/modulesOnboarding.tsx

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import webVitalsPreviewImg from 'sentry-images/insights/module-upsells/insights-
1515
import emptyStateImg from 'sentry-images/spot/performance-waiting-for-span.svg';
1616

1717
import {LinkButton} from 'sentry/components/button';
18-
import ExternalLink from 'sentry/components/links/externalLink';
1918
import LoadingIndicator from 'sentry/components/loadingIndicator';
2019
import Panel from 'sentry/components/panels/panel';
2120
import {t, tct} from 'sentry/locale';
@@ -101,12 +100,7 @@ function ModulesOnboardingPanel({moduleName}: {moduleName: ModuleName}) {
101100
<ContentContainer>
102101
<Fragment>
103102
<Header>{emptyStateContent.heading}</Header>
104-
<p>
105-
{emptyStateContent.description}{' '}
106-
<ExternalLink href={MODULE_PRODUCT_DOC_LINKS[moduleName]}>
107-
{t('Read Docs')}
108-
</ExternalLink>
109-
</p>
103+
<p>{emptyStateContent.description}</p>
110104
</Fragment>
111105
<SplitContainer>
112106
<ModulePreview moduleName={moduleName} />
@@ -142,7 +136,7 @@ function ModulePreview({moduleName}: ModulePreviewProps) {
142136
<ModulePreviewImage src={emptyStateContent.imageSrc} />
143137
{emptyStateContent.supportedSdks && (
144138
<SupportedSdkContainer>
145-
<div>{t('Supporting Today: ')}</div>
139+
<div>{t('Supported Today: ')}</div>
146140
<SupportedSdkList>
147141
{emptyStateContent.supportedSdks.map(sdk => (
148142
<SupportedSdkIconContainer key={sdk}>
@@ -424,7 +418,7 @@ const EMPTY_STATE_CONTENT: Record<TitleableModuleNames, EmptyStateContent> = {
424418
imageSrc: queuesPreviewImg,
425419
},
426420
screen_load: {
427-
heading: t('Perhaps 255 items was too large of a pagination size'),
421+
heading: t(`Don’t lose your customer’s attention before your app loads`),
428422
description: tct(
429423
'View the most active [dataTypePlural] in your mobile application and monitor your releases for screen load performance.',
430424
{
@@ -433,7 +427,7 @@ const EMPTY_STATE_CONTENT: Record<TitleableModuleNames, EmptyStateContent> = {
433427
}
434428
),
435429
valuePropDescription: tct('[dataType] insights include:', {
436-
dataType: MODULE_DATA_TYPES[ModuleName.RESOURCE],
430+
dataType: MODULE_DATA_TYPES[ModuleName.SCREEN_LOAD],
437431
}),
438432
valuePropPoints: [
439433
t('Compare metrics across releases, root causing performance degradations.'),

static/app/views/insights/database/views/databaseLandingPage.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {ModulePageProviders} from 'sentry/views/insights/common/components/modul
2626
import {ModulesOnboarding} from 'sentry/views/insights/common/components/modulesOnboarding';
2727
import {useSpanMetrics} from 'sentry/views/insights/common/queries/useDiscover';
2828
import {useSpanMetricsSeries} from 'sentry/views/insights/common/queries/useDiscoverSeries';
29+
import {useHasFirstSpan} from 'sentry/views/insights/common/queries/useHasFirstSpan';
2930
import {useOnboardingProject} from 'sentry/views/insights/common/queries/useOnboardingProject';
3031
import {useHasDataTrackAnalytics} from 'sentry/views/insights/common/utils/useHasDataTrackAnalytics';
3132
import {useModuleBreadcrumbs} from 'sentry/views/insights/common/utils/useModuleBreadcrumbs';
@@ -54,6 +55,7 @@ export function DatabaseLandingPage() {
5455
const moduleName = ModuleName.DB;
5556
const location = useLocation();
5657
const onboardingProject = useOnboardingProject();
58+
const hasModuleData = useHasFirstSpan(moduleName);
5759

5860
const selectedAggregate = DEFAULT_DURATION_AGGREGATE;
5961
const spanDescription = decodeScalar(location.query?.['span.description'], '');
@@ -177,7 +179,7 @@ export function DatabaseLandingPage() {
177179
<Layout.Body>
178180
<Layout.Main fullWidth>
179181
<ModuleLayout.Layout>
180-
{!onboardingProject && !isCriticalDataLoading && (
182+
{hasModuleData && !onboardingProject && !isCriticalDataLoading && (
181183
<NoDataMessage
182184
Wrapper={AlertBanner}
183185
isDataAvailable={isAnyCriticalDataAvailable}

static/app/views/insights/mobile/common/components/screensTemplate.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {type ReactNode, useCallback} from 'react';
1+
import {Fragment, type ReactNode, useCallback} from 'react';
22
import styled from '@emotion/styled';
33
import omit from 'lodash/omit';
44

@@ -19,6 +19,7 @@ import {useLocation} from 'sentry/utils/useLocation';
1919
import useOrganization from 'sentry/utils/useOrganization';
2020
import {ModulesOnboarding} from 'sentry/views/insights/common/components/modulesOnboarding';
2121
import {ReleaseComparisonSelector} from 'sentry/views/insights/common/components/releaseSelector';
22+
import {useHasFirstSpan} from 'sentry/views/insights/common/queries/useHasFirstSpan';
2223
import {useOnboardingProject} from 'sentry/views/insights/common/queries/useOnboardingProject';
2324
import {useModuleBreadcrumbs} from 'sentry/views/insights/common/utils/useModuleBreadcrumbs';
2425
import useCrossPlatformProject from 'sentry/views/insights/mobile/common/queries/useCrossPlatformProject';
@@ -47,6 +48,7 @@ export default function ScreensTemplate({
4748
const onboardingProject = useOnboardingProject();
4849
const location = useLocation();
4950
const {isProjectCrossPlatform} = useCrossPlatformProject();
51+
const hasModuleData = useHasFirstSpan(moduleName);
5052

5153
const handleProjectChange = useCallback(() => {
5254
browserHistory.replace({
@@ -89,8 +91,12 @@ export default function ScreensTemplate({
8991
<EnvironmentPageFilter />
9092
<DatePageFilter />
9193
</PageFilterBar>
92-
<ReleaseComparisonSelector />
93-
{additionalSelectors}
94+
{hasModuleData && (
95+
<Fragment>
96+
<ReleaseComparisonSelector />
97+
{additionalSelectors}
98+
</Fragment>
99+
)}
94100
</Container>
95101
<PageAlert />
96102
<ErrorBoundary mini>

static/app/views/insights/mobile/screenload/views/screenloadLandingPage.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import useOrganization from 'sentry/utils/useOrganization';
1616
import {ModulePageProviders} from 'sentry/views/insights/common/components/modulePageProviders';
1717
import {ModulesOnboarding} from 'sentry/views/insights/common/components/modulesOnboarding';
1818
import {ReleaseComparisonSelector} from 'sentry/views/insights/common/components/releaseSelector';
19+
import {useHasFirstSpan} from 'sentry/views/insights/common/queries/useHasFirstSpan';
1920
import {useOnboardingProject} from 'sentry/views/insights/common/queries/useOnboardingProject';
2021
import {useModuleBreadcrumbs} from 'sentry/views/insights/common/utils/useModuleBreadcrumbs';
2122
import useCrossPlatformProject from 'sentry/views/insights/mobile/common/queries/useCrossPlatformProject';
@@ -33,6 +34,7 @@ import Onboarding from 'sentry/views/performance/onboarding';
3334
export function PageloadModule() {
3435
const organization = useOrganization();
3536
const onboardingProject = useOnboardingProject();
37+
const hasModuleData = useHasFirstSpan(ModuleName.SCREEN_LOAD);
3638
const {isProjectCrossPlatform} = useCrossPlatformProject();
3739

3840
const crumbs = useModuleBreadcrumbs('screen_load');
@@ -69,7 +71,7 @@ export function PageloadModule() {
6971
<EnvironmentPageFilter />
7072
<DatePageFilter />
7173
</PageFilterBar>
72-
<ReleaseComparisonSelector />
74+
{hasModuleData && <ReleaseComparisonSelector />}
7375
</Container>
7476
<PageAlert />
7577
<ErrorBoundary mini>

static/app/views/insights/settings.ts

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ import {t} from 'sentry/locale';
22
import {
33
DATA_TYPE as RESOURCE_DATA_TYPE,
44
DATA_TYPE_PLURAL as RESOURCE_DATA_TYPE_PLURAL,
5+
MODULE_DOC_LINK as RESOURCES_MODULE_DOC_LINK,
56
MODULE_TITLE as RESOURCES_MODULE_TITLE,
67
} from 'sentry/views/insights/browser/resources/settings';
78
import {
89
DATA_TYPE as WEB_VITALS_DATA_TYPE,
910
DATA_TYPE_PLURAL as WEB_VITALS_DATA_TYPE_PLURAL,
11+
MODULE_DOC_LINK as VITALS_MODULE_DOC_LINK,
1012
MODULE_TITLE as VITALS_MODULE_TITLE,
1113
} from 'sentry/views/insights/browser/webVitals/settings';
1214
import {
@@ -18,29 +20,37 @@ import {
1820
import {
1921
DATA_TYPE as DB_DATA_TYPE,
2022
DATA_TYPE_PLURAL as DB_DATA_TYPE_PLURAL,
23+
MODULE_DOC_LINK as DB_MODULE_DOC_LINK,
2124
MODULE_TITLE as DB_MODULE_TITLE,
2225
} from 'sentry/views/insights/database/settings';
2326
import {
2427
DATA_TYPE as HTTP_DATA_TYPE,
2528
DATA_TYPE_PLURAL as HTTP_DATA_TYPE_PLURAL,
29+
MODULE_DOC_LINK as HTTP_MODULE_DOC_LINK,
2630
MODULE_TITLE as HTTP_MODULE_TITLE,
2731
} from 'sentry/views/insights/http/settings';
2832
import {
2933
DATA_TYPE as AI_DATA_TYPE,
3034
DATA_TYPE_PLURAL as AI_DATA_TYPE_PLURAL,
35+
MODULE_DOC_LINK as AI_MODULE_DOC_LINK,
3136
MODULE_TITLE as AI_MODULE_TITLE,
3237
} from 'sentry/views/insights/llmMonitoring/settings';
3338
import {
3439
DATA_TYPE as APP_STARTS_DATA_TYPE,
3540
DATA_TYPE_PLURAL as APP_STARTS_DATA_TYPE_PLURAL,
41+
MODULE_DOC_LINK as APP_STARTS_MODULE_DOC_LINK,
3642
MODULE_TITLE as APP_STARTS_MODULE_TITLE,
3743
} from 'sentry/views/insights/mobile/appStarts/settings';
3844
import {
3945
DATA_TYPE as SCREEN_LOAD_DATA_TYPE,
4046
DATA_TYPE_PLURAL as SCREEN_LOAD_DATA_TYPE_PLURAL,
47+
MODULE_DOC_LINK as SCREEN_LOADS_MODULE_DOC_LINK,
4148
MODULE_TITLE as SCREEN_LOADS_MODULE_TITLE,
4249
} from 'sentry/views/insights/mobile/screenload/settings';
43-
import {MODULE_TITLE as MOBILE_UI_MODULE_TITLE} from 'sentry/views/insights/mobile/ui/settings';
50+
import {
51+
MODULE_DOC_LINK as MODULE_MODULE_DOC_LINK,
52+
MODULE_TITLE as MOBILE_UI_MODULE_TITLE,
53+
} from 'sentry/views/insights/mobile/ui/settings';
4454
import {
4555
DATA_TYPE as QUEUE_DATA_TYPE,
4656
DATA_TYPE_PLURAL as QUEUE_DATA_TYPE_PLURAL,
@@ -100,18 +110,16 @@ export const MODULE_DATA_TYPES_PLURAL: Record<ModuleName, string> = {
100110
};
101111

102112
export const MODULE_PRODUCT_DOC_LINKS: Record<ModuleName, string> = {
103-
[ModuleName.DB]: 'https://docs.sentry.io/product/insights/database/',
104-
[ModuleName.HTTP]: 'https://docs.sentry.io/product/insights/http/',
113+
[ModuleName.DB]: DB_MODULE_DOC_LINK,
114+
[ModuleName.HTTP]: HTTP_MODULE_DOC_LINK,
105115
[ModuleName.CACHE]: CACHE_MODULE_DOC_LINK,
106116
[ModuleName.QUEUE]: QUEUE_MODULE_DOC_LINK,
107-
[ModuleName.SCREEN_LOAD]:
108-
'https://docs.sentry.io/product/insights/mobile-vitals/screen-loads/',
109-
[ModuleName.APP_START]:
110-
'https://docs.sentry.io/product/insights/mobile-vitals/app-starts/',
111-
[ModuleName.VITAL]: 'https://docs.sentry.io/product/insights/web-vitals/',
112-
[ModuleName.RESOURCE]: 'https://docs.sentry.io/product/insights/assets/',
113-
[ModuleName.AI]: 'https://docs.sentry.io/product/insights/llm-monitoring/',
114-
[ModuleName.MOBILE_UI]: 'https://docs.sentry.io/product/insights/mobile-vitals/ui/',
117+
[ModuleName.SCREEN_LOAD]: SCREEN_LOADS_MODULE_DOC_LINK,
118+
[ModuleName.APP_START]: APP_STARTS_MODULE_DOC_LINK,
119+
[ModuleName.VITAL]: VITALS_MODULE_DOC_LINK,
120+
[ModuleName.RESOURCE]: RESOURCES_MODULE_DOC_LINK,
121+
[ModuleName.AI]: AI_MODULE_DOC_LINK,
122+
[ModuleName.MOBILE_UI]: MODULE_MODULE_DOC_LINK,
115123
[ModuleName.OTHER]: '',
116124
[ModuleName.ALL]: '',
117125
};

0 commit comments

Comments
 (0)