import styled from '@emotion/styled'; import isNumber from 'lodash/isNumber'; import { ColorizedRating, getPolarity, getPolarityRating, type Polarity, } from 'sentry/components/percentChange'; import {IconArrow} from 'sentry/icons'; import {space} from 'sentry/styles/space'; import { DEEMPHASIS_COLOR_NAME, LOADING_PLACEHOLDER, } from 'sentry/views/dashboards/widgets/bigNumberWidget/settings'; import type {TableData} from 'sentry/views/dashboards/widgets/common/types'; import {DEFAULT_FIELD} from '../common/settings'; interface DifferenceToPreviousPeriodValueProps { previousPeriodValue: number; renderer: (datum: TableData[number]) => React.ReactNode; value: number; field?: string; preferredPolarity?: Polarity; } export function DifferenceToPreviousPeriodValue({ value: currentValue, previousPeriodValue: previousValue, preferredPolarity = '', field = DEFAULT_FIELD, renderer, }: DifferenceToPreviousPeriodValueProps) { if (!isNumber(currentValue) || !isNumber(previousValue)) { return {LOADING_PLACEHOLDER}; } const difference = currentValue - previousValue; const polarity = getPolarity(difference); const rating = getPolarityRating(polarity, preferredPolarity); const directionMarker = getDifferenceDirectionMarker(difference); // Create a fake data row so we can pass it to field renderers. Omit the +/- sign since the direction marker will indicate it const differenceAsDatum = { [field ?? 'unknown']: Math.abs(difference), }; return ( {directionMarker} {renderer(differenceAsDatum)} ); } const Difference = styled(ColorizedRating)` display: flex; gap: ${space(0.25)}; margin-bottom: 6cqh; @container (min-height: 50px) { margin-bottom: 10cqh; } `; const Text = styled('div')` font-size: 14px; @container (min-height: 50px) { font-size: clamp(14px, calc(10px + 4cqi), 30cqh); } `; const Deemphasize = styled('span')` color: ${p => p.theme[DEEMPHASIS_COLOR_NAME]}; `; function getDifferenceDirectionMarker(difference: number) { if (difference > 0) { return ; } if (difference < 0) { return ; } return null; }