import { fancyMinutes, useNumber } from '@/hooks/use-numer-formatter'; import type { IChartData } from '@/trpc/client'; import { cn } from '@/utils/cn'; import AutoSizer from 'react-virtualized-auto-sizer'; import { Area, AreaChart, Tooltip } from 'recharts'; import type { IChartMetric } from '@openpanel/validation'; import { ChartTooltipContainer, ChartTooltipHeader, ChartTooltipItem, } from '@/components/charts/chart-tooltip'; import { formatDate } from '@/utils/date'; import { getChartColor } from '@/utils/theme'; import { PreviousDiffIndicator, getDiffIndicator, } from '../common/previous-diff-indicator'; import { SerieName } from '../common/serie-name'; import { useReportChartContext } from '../context'; interface MetricCardProps { serie: IChartData['series'][number]; color?: string; metric: IChartMetric; unit?: string; } const TooltipContent = (props: { payload?: any[] }) => { const number = useNumber(); return ( {props.payload?.map((item) => { const { date, count } = item.payload; return (
{formatDate(new Date(date))}
{number.format(count)}
); })}
); }; export function MetricCard({ serie, color: _color, metric, unit, }: MetricCardProps) { const { isEditMode } = useReportChartContext(); const number = useNumber(); const renderValue = (value: number | undefined, unitClassName?: string) => { if (!value) { return
N/A
; } if (unit === 'min') { return <>{fancyMinutes(value)}; } return ( <> {number.short(value)} {unit && {unit}} ); }; const previous = serie.metrics.previous?.[metric]; const graphColors = getDiffIndicator( false, previous?.state, '#6ee7b7', // green '#fda4af', // red '#93c5fd', // blue ); return (
{({ width, height }) => ( )}
} value={renderValue(serie.metrics[metric], 'ml-1 font-light text-xl')} enhancer={ } />
); } export function MetricCardNumber({ label, value, enhancer, className, }: { label: React.ReactNode; value: React.ReactNode; enhancer?: React.ReactNode; className?: string; }) { return (
{label}
{value}
{enhancer}
); }