Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions static/app/components/preprod/preprodBuildsTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ import {IconCheckmark, IconCommit} from 'sentry/icons';
import {t} from 'sentry/locale';
import type {BuildDetailsApiResponse} from 'sentry/views/preprod/types/buildDetailsTypes';
import {
formattedDownloadSize,
formattedInstallSize,
formattedPrimaryMetricDownloadSize,
formattedPrimaryMetricInstallSize,
getLabels,
getPlatformIconFromPlatform,
} from 'sentry/views/preprod/utils/labelUtils';
Expand Down Expand Up @@ -137,11 +137,11 @@ export function PreprodBuildsTable({
</SimpleTable.RowCell>

<SimpleTable.RowCell>
<Text>{formattedInstallSize(build)}</Text>
<Text>{formattedPrimaryMetricInstallSize(build.size_info)}</Text>
</SimpleTable.RowCell>

<SimpleTable.RowCell>
<Text>{formattedDownloadSize(build)}</Text>
<Text>{formattedPrimaryMetricDownloadSize(build.size_info)}</Text>
</SimpleTable.RowCell>

<SimpleTable.RowCell>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ import {
type BuildDetailsApiResponse,
} from 'sentry/views/preprod/types/buildDetailsTypes';
import {
formattedDownloadSize,
formattedInstallSize,
formattedPrimaryMetricDownloadSize,
formattedPrimaryMetricInstallSize,
getLabels,
getPlatformIconFromPlatform,
getReadablePlatformLabel,
Expand Down Expand Up @@ -100,15 +100,19 @@ export function BuildCompareHeaderContent(props: BuildCompareHeaderContentProps)
<Tooltip title={labels.installSizeDescription}>
<Flex gap="sm" align="center">
<IconCode size="sm" color="gray300" />
<Text underline="dotted">{formattedInstallSize(buildDetails)}</Text>
<Text underline="dotted">
{formattedPrimaryMetricInstallSize(buildDetails.size_info)}
</Text>
</Flex>
</Tooltip>
)}
{isSizeInfoCompleted(buildDetails.size_info) && (
<Tooltip title={labels.downloadSizeDescription}>
<Flex gap="sm" align="center">
<IconDownload size="sm" color="gray300" />
<Text underline="dotted">{formattedDownloadSize(buildDetails)}</Text>
<Text underline="dotted">
{formattedPrimaryMetricDownloadSize(buildDetails.size_info)}
</Text>
</Flex>
</Tooltip>
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ import {
} from 'sentry/icons';
import {IconBranch} from 'sentry/icons/iconBranch';
import {t} from 'sentry/locale';
import {formatBytesBase10} from 'sentry/utils/bytes/formatBytesBase10';
import parseLinkHeader from 'sentry/utils/parseLinkHeader';
import {useApiQuery, useMutation, type UseApiQueryResult} from 'sentry/utils/queryClient';
import {decodeScalar} from 'sentry/utils/queryString';
Expand All @@ -39,6 +38,10 @@ import {
type BuildDetailsApiResponse,
} from 'sentry/views/preprod/types/buildDetailsTypes';
import type {ListBuildsApiResponse} from 'sentry/views/preprod/types/listBuildsTypes';
import {
formattedPrimaryMetricDownloadSize,
formattedPrimaryMetricInstallSize,
} from 'sentry/views/preprod/utils/labelUtils';

import {SizeCompareSelectedBuilds} from './sizeCompareSelectedBuilds';

Expand Down Expand Up @@ -249,13 +252,13 @@ function BuildItem({build, isSelected, onSelect}: BuildItemProps) {
{isSizeInfoCompleted(sizeInfo) && (
<Flex align="center" gap="sm">
<IconCode size="xs" color="gray300" />
<Text>{formatBytesBase10(sizeInfo.install_size_bytes)}</Text>
<Text>{formattedPrimaryMetricInstallSize(sizeInfo)}</Text>
</Flex>
)}
{isSizeInfoCompleted(sizeInfo) && (
<Flex align="center" gap="sm">
<IconDownload size="xs" color="gray300" />
<Text>{formatBytesBase10(sizeInfo.download_size_bytes)}</Text>
<Text>{formattedPrimaryMetricDownloadSize(sizeInfo)}</Text>
</Flex>
)}
</Flex>
Expand Down
28 changes: 22 additions & 6 deletions static/app/views/preprod/buildDetails/buildDetails.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {

import {render, screen, waitFor} from 'sentry-test/reactTestingLibrary';

import {MetricsArtifactType} from 'sentry/views/preprod/types/appSizeTypes';
import {BuildDetailsSizeAnalysisState} from 'sentry/views/preprod/types/buildDetailsTypes';

import BuildDetails from './buildDetails';
Expand Down Expand Up @@ -98,8 +99,13 @@ describe('BuildDetails', () => {
body: PreprodBuildDetailsWithSizeInfoFixture(
{
state: BuildDetailsSizeAnalysisState.COMPLETED,
install_size_bytes: 1024000,
download_size_bytes: 512000,
size_metrics: [
{
metrics_artifact_type: MetricsArtifactType.MAIN_ARTIFACT,
install_size_bytes: 1024000,
download_size_bytes: 512000,
},
],
},
{
vcs_info: PreprodVcsInfoFullFixture(),
Expand Down Expand Up @@ -168,8 +174,13 @@ describe('BuildDetails', () => {
}
return PreprodBuildDetailsWithSizeInfoFixture({
state: BuildDetailsSizeAnalysisState.COMPLETED,
install_size_bytes: 1024000,
download_size_bytes: 512000,
size_metrics: [
{
metrics_artifact_type: MetricsArtifactType.MAIN_ARTIFACT,
install_size_bytes: 1024000,
download_size_bytes: 512000,
},
],
});
},
});
Expand Down Expand Up @@ -215,8 +226,13 @@ describe('BuildDetails', () => {
method: 'GET',
body: PreprodBuildDetailsWithSizeInfoFixture({
state: BuildDetailsSizeAnalysisState.COMPLETED,
install_size_bytes: 1024000,
download_size_bytes: 512000,
size_metrics: [
{
metrics_artifact_type: MetricsArtifactType.MAIN_ARTIFACT,
install_size_bytes: 1024000,
download_size_bytes: 512000,
},
],
}),
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import styled from '@emotion/styled';
import {PlatformIcon} from 'platformicons';

import {CodeBlock} from '@sentry/scraps/code';
import {Flex} from '@sentry/scraps/layout';
import {Flex, Stack} from '@sentry/scraps/layout';
import {Heading, Text} from '@sentry/scraps/text';
import {Tooltip} from '@sentry/scraps/tooltip';

Expand All @@ -12,12 +12,16 @@ import {t} from 'sentry/locale';
import {formatBytesBase10} from 'sentry/utils/bytes/formatBytesBase10';
import {getFormat, getFormattedDate, getUtcToSystem} from 'sentry/utils/dates';
import {openInstallModal} from 'sentry/views/preprod/components/installModal';
import {MetricsArtifactType} from 'sentry/views/preprod/types/appSizeTypes';
import {
BuildDetailsSizeAnalysisState,
getMainArtifactSizeMetric,
type BuildDetailsAppInfo,
type BuildDetailsSizeInfo,
} from 'sentry/views/preprod/types/buildDetailsTypes';
import {
formattedPrimaryMetricDownloadSize,
formattedPrimaryMetricInstallSize,
getLabels,
getPlatformIconFromPlatform,
getReadableArtifactTypeLabel,
Expand All @@ -40,6 +44,101 @@ export function BuildDetailsSidebarAppInfo(props: BuildDetailsSidebarAppInfoProp
timeZone: true,
});

let sizeInfoGroup = null;
if (
props.sizeInfo &&
props.sizeInfo.state === BuildDetailsSizeAnalysisState.COMPLETED
) {
const primarySizeMetric = getMainArtifactSizeMetric(props.sizeInfo);
const watchAppMetrics = props.sizeInfo.size_metrics.find(
metric => metric.metrics_artifact_type === MetricsArtifactType.WATCH_ARTIFACT
);

let installSizeContent = (
<Text size="md">{formattedPrimaryMetricInstallSize(props.sizeInfo)}</Text>
);
let downloadSizeContent = (
<Text size="md">{formattedPrimaryMetricDownloadSize(props.sizeInfo)}</Text>
);
if (watchAppMetrics) {
installSizeContent = (
<Tooltip
title={
<Stack align="start">
<Flex gap="sm">
<Text size="md" bold>
{t('App')}:
</Text>
<Text size="md">
{formatBytesBase10(primarySizeMetric?.install_size_bytes ?? 0)}
</Text>
</Flex>
<Flex gap="sm">
<Text size="md" bold>
{t('Watch')}:
</Text>
<Text size="md">
{formatBytesBase10(watchAppMetrics.install_size_bytes)}
</Text>
</Flex>
</Stack>
}
position="left"
>
<Text size="md" underline="dotted">
{formattedPrimaryMetricInstallSize(props.sizeInfo)}
</Text>
</Tooltip>
);
downloadSizeContent = (
<Tooltip
title={
<Stack align="start">
<Flex gap="sm">
<Text size="md" bold>
{t('App')}:
</Text>
<Text size="md">
{formatBytesBase10(watchAppMetrics.download_size_bytes)}
</Text>
</Flex>
<Flex gap="sm">
<Text size="md" bold>
{t('Watch')}:
</Text>
<Text size="md">
{formatBytesBase10(watchAppMetrics.download_size_bytes)}
</Text>
</Flex>
</Stack>
}
position="left"
>
<Text size="md" underline="dotted">
{formattedPrimaryMetricDownloadSize(props.sizeInfo)}
</Text>
</Tooltip>
);
}

sizeInfoGroup = (
<Flex gap="sm">
<Flex direction="column" gap="xs" flex={1}>
<Tooltip title={labels.installSizeDescription} position="left">
<Heading as="h4">{labels.installSizeLabel}</Heading>
</Tooltip>
{installSizeContent}
</Flex>
<Flex direction="column" gap="xs" flex={1}>
<Tooltip title={labels.downloadSizeDescription} position="left">
<Heading as="h4">{labels.downloadSizeLabel}</Heading>
</Tooltip>
{downloadSizeContent}
</Flex>
</Flex>
);
}

return (
<Flex direction="column" gap="xl">
<Flex align="center" gap="sm">
Expand All @@ -49,27 +148,7 @@ export function BuildDetailsSidebarAppInfo(props: BuildDetailsSidebarAppInfoProp
{props.appInfo.name && <Heading as="h3">{props.appInfo.name}</Heading>}
</Flex>

{props.sizeInfo &&
props.sizeInfo.state === BuildDetailsSizeAnalysisState.COMPLETED && (
<Flex gap="sm">
<Flex direction="column" gap="xs" flex={1}>
<Tooltip title={labels.installSizeDescription} position="left">
<Heading as="h4">{labels.installSizeLabel}</Heading>
</Tooltip>
<Text size="md">
{formatBytesBase10(props.sizeInfo.install_size_bytes)}
</Text>
</Flex>
<Flex direction="column" gap="xs" flex={1}>
<Tooltip title={labels.downloadSizeDescription} position="left">
<Heading as="h4">{labels.downloadSizeLabel}</Heading>
</Tooltip>
<Text size="md">
{formatBytesBase10(props.sizeInfo.download_size_bytes)}
</Text>
</Flex>
</Flex>
)}
{sizeInfoGroup}

<Flex wrap="wrap" gap="md">
<Flex gap="2xs" align="center">
Expand Down
20 changes: 18 additions & 2 deletions static/app/views/preprod/types/buildDetailsTypes.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/* eslint-disable typescript-sort-keys/interface */
import {MetricsArtifactType} from 'sentry/views/preprod/types/appSizeTypes';

import type {Platform} from './sharedTypes';

export interface BuildDetailsApiResponse {
Expand Down Expand Up @@ -42,6 +45,12 @@ export interface BuildDetailsVcsInfo {
provider?: string | null;
}

interface BuildDetailsSizeInfoSizeMetric {
metrics_artifact_type: MetricsArtifactType;
install_size_bytes: number;
download_size_bytes: number;
}

interface BuildDetailsSizeInfoPending {
state: BuildDetailsSizeAnalysisState.PENDING;
}
Expand All @@ -51,9 +60,8 @@ interface BuildDetailsSizeInfoProcessing {
}

interface BuildDetailsSizeInfoCompleted {
download_size_bytes: number;
install_size_bytes: number;
state: BuildDetailsSizeAnalysisState.COMPLETED;
size_metrics: BuildDetailsSizeInfoSizeMetric[];
}

interface BuildDetailsSizeInfoFailed {
Expand Down Expand Up @@ -83,6 +91,14 @@ export function isSizeInfoProcessing(
);
}

export function getMainArtifactSizeMetric(
sizeInfo: BuildDetailsSizeInfoCompleted
): BuildDetailsSizeInfoSizeMetric | undefined {
return sizeInfo.size_metrics.find(
metric => metric.metrics_artifact_type === MetricsArtifactType.MAIN_ARTIFACT
);
}

export enum BuildDetailsState {
UPLOADING = 0,
UPLOADED = 1,
Expand Down
29 changes: 22 additions & 7 deletions static/app/views/preprod/utils/labelUtils.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ import {formatBytesBase10} from 'sentry/utils/bytes/formatBytesBase10';
import {unreachable} from 'sentry/utils/unreachable';
import {
BuildDetailsArtifactType,
getMainArtifactSizeMetric,
isSizeInfoCompleted,
type BuildDetailsApiResponse,
type BuildDetailsSizeInfo,
} from 'sentry/views/preprod/types/buildDetailsTypes';
import type {Platform} from 'sentry/views/preprod/types/sharedTypes';

Expand Down Expand Up @@ -114,16 +115,30 @@ export function getReadablePlatformLabel(platform: Platform): string {
}
}

export function formattedInstallSize(build: BuildDetailsApiResponse): string {
if (isSizeInfoCompleted(build?.size_info)) {
return formatBytesBase10(build.size_info.install_size_bytes);
export function formattedPrimaryMetricInstallSize(
sizeInfo: BuildDetailsSizeInfo | undefined
): string {
if (isSizeInfoCompleted(sizeInfo)) {
const primarySizeMetric = getMainArtifactSizeMetric(sizeInfo);
if (!primarySizeMetric) {
return '-';
}

return formatBytesBase10(primarySizeMetric.install_size_bytes);
}
return '-';
}

export function formattedDownloadSize(build: BuildDetailsApiResponse): string {
if (isSizeInfoCompleted(build?.size_info)) {
return formatBytesBase10(build.size_info.download_size_bytes);
export function formattedPrimaryMetricDownloadSize(
sizeInfo: BuildDetailsSizeInfo | undefined
): string {
if (isSizeInfoCompleted(sizeInfo)) {
const primarySizeMetric = getMainArtifactSizeMetric(sizeInfo);
if (!primarySizeMetric) {
return '-';
}

return formatBytesBase10(primarySizeMetric.download_size_bytes);
}
return '-';
}
Loading