import { LoadingPanel } from '@/components/common/LoadingPanel'; import { useDateRange, useMessages } from '@/components/hooks'; import { useWebsiteStatsQuery } from '@/components/hooks/queries/useWebsiteStatsQuery'; import { MetricCard } from '@/components/metrics/MetricCard'; import { MetricsBar } from '@/components/metrics/MetricsBar'; import { formatLongNumber, formatShortTime } from '@/lib/format'; export function WebsiteMetricsBar({ websiteId, }: { websiteId: string; showChange?: boolean; compareMode?: boolean; }) { const { isAllTime } = useDateRange(); const { formatMessage, labels, getErrorMessage } = useMessages(); const { data, isLoading, isFetching, error } = useWebsiteStatsQuery(websiteId); const { pageviews, visitors, visits, bounces, totaltime, comparison } = data || {}; const metrics = data ? [ { value: visitors, label: formatMessage(labels.visitors), change: visitors - comparison.visitors, formatValue: formatLongNumber, tooltip: 'Number of unique visitors to your website', }, { value: visits, label: formatMessage(labels.visits), change: visits - comparison.visits, formatValue: formatLongNumber, tooltip: 'Total number of sessions on your website', }, { value: pageviews, label: formatMessage(labels.views), change: pageviews - comparison.pageviews, formatValue: formatLongNumber, tooltip: 'Total number of pages viewed', }, { label: formatMessage(labels.bounceRate), value: (Math.min(visits, bounces) / visits) * 100, prev: (Math.min(comparison.visits, comparison.bounces) / comparison.visits) * 100, change: (Math.min(visits, bounces) / visits) * 100 - (Math.min(comparison.visits, comparison.bounces) / comparison.visits) * 100, formatValue: n => `${Math.round(+n)}%`, reverseColors: true, tooltip: 'Percentage of visits that leave after viewing only one page', }, { label: formatMessage(labels.visitDuration), value: totaltime / visits, prev: comparison.totaltime / comparison.visits, change: totaltime / visits - comparison.totaltime / comparison.visits, formatValue: n => `${+n < 0 ? '-' : ''}${formatShortTime(Math.abs(~~n), ['m', 's'], ' ')}`, tooltip: 'Average time spent on your website per visit', }, ] : null; return ( {metrics?.map(({ label, value, prev, change, formatValue, reverseColors, tooltip }) => { return ( ); })} ); }