import styled from '@emotion/styled'; import {BarChart} from 'sentry/components/charts/barChart'; import type {DateTimeObject} from 'sentry/components/charts/utils'; import LoadingError from 'sentry/components/loadingError'; import LoadingIndicator from 'sentry/components/loadingIndicator'; import {normalizeDateTimeParams} from 'sentry/components/organizations/pageFilters/parse'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import type {Organization} from 'sentry/types/organization'; import getDuration from 'sentry/utils/duration/getDuration'; import {useApiQuery} from 'sentry/utils/queryClient'; import {barAxisLabel, sortSeriesByDay} from './utils'; export type TimeToResolution = Record; interface TeamResolutionTimeProps extends DateTimeObject { organization: Organization; teamSlug: string; environment?: string; } function TeamResolutionTime({ organization, teamSlug, environment, start, end, period, utc, }: TeamResolutionTimeProps) { const datetime = {start, end, period, utc}; const { data: resolutionTime, isPending, isError, refetch, } = useApiQuery( [ `/teams/${organization.slug}/${teamSlug}/time-to-resolution/`, { query: { ...normalizeDateTimeParams(datetime), environment, }, }, ], {staleTime: 5000} ); if (isPending) { return ( ); } if (isError) { return ; } const data = Object.entries(resolutionTime ?? {}).map(([bucket, {avg}]) => ({ value: avg, name: new Date(bucket).getTime(), })); const seriesData = sortSeriesByDay(data); return ( getDuration(value, 1), }} yAxis={{ // Each yAxis marker will increase by 1 day minInterval: 86400, axisLabel: { formatter: (value: number) => { if (value === 0) { return ''; } return getDuration(value, 0, true, true); }, }, }} legend={{right: 0, top: 0}} xAxis={barAxisLabel()} series={[ { seriesName: t('Time to Resolution'), data: seriesData, silent: true, barCategoryGap: '5%', }, ]} /> ); } export default TeamResolutionTime; const ChartWrapper = styled('div')` padding: ${space(2)} ${space(2)} 0 ${space(2)}; `;