123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- import type {ComponentProps} from 'react';
- import {useMemo} from 'react';
- import styled from '@emotion/styled';
- import type {Polarity} from 'sentry/components/percentChange';
- import {space} from 'sentry/styles/space';
- import type {NewQuery} from 'sentry/types/organization';
- import type {TableData, TableDataRow} from 'sentry/utils/discover/discoverQuery';
- import EventView from 'sentry/utils/discover/eventView';
- import type {DiscoverDatasets} from 'sentry/utils/discover/types';
- import {MutableSearch} from 'sentry/utils/tokenizeSearch';
- import {useLocation} from 'sentry/utils/useLocation';
- import usePageFilters from 'sentry/utils/usePageFilters';
- import {MetricReadout} from 'sentry/views/insights/common/components/metricReadout';
- import {ReadoutRibbon} from 'sentry/views/insights/common/components/ribbon';
- import {useReleaseSelection} from 'sentry/views/insights/common/queries/useReleases';
- import {appendReleaseFilters} from 'sentry/views/insights/common/utils/releaseComparison';
- import useCrossPlatformProject from 'sentry/views/insights/mobile/common/queries/useCrossPlatformProject';
- import {useTableQuery} from 'sentry/views/insights/mobile/screenload/components/tables/screensTable';
- interface BlockProps {
- dataKey: string | ((data?: TableDataRow[]) => number | undefined);
- title: string;
- unit: ComponentProps<typeof MetricReadout>['unit'];
- allowZero?: boolean;
- preferredPolarity?: Polarity;
- }
- export function MobileMetricsRibbon({
- filters,
- blocks,
- fields,
- referrer,
- dataset,
- }: {
- blocks: BlockProps[];
- dataset: DiscoverDatasets;
- fields: string[];
- referrer: string;
- filters?: string[];
- }) {
- const {selection} = usePageFilters();
- const location = useLocation();
- const {
- primaryRelease,
- secondaryRelease,
- isLoading: isReleasesLoading,
- } = useReleaseSelection();
- const {isProjectCrossPlatform, selectedPlatform} = useCrossPlatformProject();
- const queryString = useMemo(() => {
- const searchQuery = new MutableSearch([...(filters ?? [])]);
- if (isProjectCrossPlatform) {
- searchQuery.addFilterValue('os.name', selectedPlatform);
- }
- return appendReleaseFilters(searchQuery, primaryRelease, secondaryRelease);
- }, [
- filters,
- isProjectCrossPlatform,
- primaryRelease,
- secondaryRelease,
- selectedPlatform,
- ]);
- const newQuery: NewQuery = {
- name: 'ScreenMetricsRibbon',
- fields,
- query: queryString,
- dataset,
- version: 2,
- projects: selection.projects,
- };
- const eventView = EventView.fromNewQueryWithLocation(newQuery, location);
- const {data, isPending} = useTableQuery({
- eventView,
- enabled: !isReleasesLoading,
- referrer,
- });
- return (
- <StyledReadoutRibbon>
- {blocks.map(({title, dataKey, unit, preferredPolarity}) => (
- <MetricsBlock
- key={title}
- title={title}
- unit={unit}
- dataKey={dataKey}
- data={data}
- isLoading={isPending}
- preferredPolarity={preferredPolarity}
- />
- ))}
- </StyledReadoutRibbon>
- );
- }
- const StyledReadoutRibbon = styled(ReadoutRibbon)`
- margin-bottom: ${space(2)};
- `;
- function MetricsBlock({
- title,
- unit,
- data,
- dataKey,
- isLoading,
- allowZero,
- preferredPolarity,
- }: {
- isLoading: boolean;
- title: string;
- data?: TableData;
- release?: string;
- } & BlockProps) {
- const value =
- typeof dataKey === 'function'
- ? dataKey(data?.data)
- : (data?.data?.[0]?.[dataKey] as number);
- const hasData = (value && value !== 0) || (value === 0 && allowZero);
- return (
- <MetricReadout
- title={title}
- value={hasData ? value : undefined}
- isLoading={isLoading}
- unit={unit}
- preferredPolarity={preferredPolarity}
- />
- );
- }
|