import React from "react"; import { Tooltip } from '../../util/tooltip' import { SecondsSinceLastLoad } from '../../util/seconds-since-last-load' import classNames from "classnames"; import numberFormatter, { durationFormatter } from '../../util/number-formatter' import { METRIC_MAPPING } from './graph-util' import { formatDateRange } from '../../util/date.js' function Maybe({condition, children}) { if (condition) { return children } else { return null } } export default class TopStats extends React.Component { renderPercentageComparison(name, comparison, forceDarkBg = false) { const formattedComparison = numberFormatter(Math.abs(comparison)) const defaultClassName = classNames({ "pl-2 text-xs dark:text-gray-100": !forceDarkBg, "pl-2 text-xs text-gray-100": forceDarkBg }) const noChangeClassName = classNames({ "pl-2 text-xs text-gray-700 dark:text-gray-300": !forceDarkBg, "pl-2 text-xs text-gray-300": forceDarkBg }) if (comparison > 0) { const color = name === 'Bounce rate' ? 'text-red-400' : 'text-green-500' return ↑ {formattedComparison}% } else if (comparison < 0) { const color = name === 'Bounce rate' ? 'text-green-500' : 'text-red-400' return ↓ {formattedComparison}% } else if (comparison === 0) { return 〰 0% } else { return null } } topStatNumberShort(name, value) { if (['visit duration', 'time on page'].includes(name.toLowerCase())) { return durationFormatter(value) } else if (['bounce rate', 'conversion rate'].includes(name.toLowerCase())) { return value + '%' } else if (['average revenue', 'total revenue'].includes(name.toLowerCase())) { return value?.short } else { return numberFormatter(value) } } topStatNumberLong(name, value) { if (['visit duration', 'time on page'].includes(name.toLowerCase())) { return durationFormatter(value) } else if (['bounce rate', 'conversion rate'].includes(name.toLowerCase())) { return value + '%' } else if (['average revenue', 'total revenue'].includes(name.toLowerCase())) { return value?.long } else { return (value || 0).toLocaleString() } } topStatTooltip(stat, query) { let statName = stat.name.toLowerCase() statName = stat.value === 1 ? statName.slice(0, -1) : statName const { topStatData, lastLoadTimestamp } = this.props const showingImported = topStatData?.imported_source && topStatData?.with_imported return (
Last updated
Based only on native data
}{this.topStatNumberShort(stat.name, stat.value)}
{ formatDateRange(site, topStatData.from, topStatData.to) }
{ this.topStatNumberShort(stat.name, stat.comparison_value) }
{ formatDateRange(site, topStatData.comparing_from, topStatData.comparing_to) }