import {HeaderDatum} from '@common/admin/analytics/use-admin-report'; import React, { cloneElement, Fragment, isValidElement, ReactElement, } from 'react'; import {TrendingUpIcon} from '@common/icons/material/TrendingUp'; import {TrendingDownIcon} from '@common/icons/material/TrendingDown'; import {createSvgIconFromTree} from '@common/icons/create-svg-icon'; import {AdminReportPageColGap} from '@common/admin/analytics/visitors-report-charts'; import {FormattedNumber} from '@common/i18n/formatted-number'; import {FormattedBytes} from '@common/uploads/formatted-bytes'; import {TrendingFlatIcon} from '@common/icons/material/TrendingFlat'; import {AnimatePresence, m} from 'framer-motion'; import {opacityAnimation} from '@common/ui/animation/opacity-animation'; import {Skeleton} from '@common/ui/skeleton/skeleton'; interface AdminHeaderReportProps { report?: HeaderDatum[]; isLoading?: boolean; } export function AdminHeaderReport({report, isLoading}: AdminHeaderReportProps) { return (
{report?.map(datum => ( ))}
); } interface ValueMetricItemProps { datum: HeaderDatum; isLoading?: boolean; } function ReportItem({datum, isLoading = false}: ValueMetricItemProps) { let icon; if (isValidElement(datum.icon)) { icon = cloneElement(datum.icon, {size: 'lg'}); } else { const IconEl = createSvgIconFromTree(datum.icon); icon = ; } return (
{icon}
{isLoading ? ( ) : ( )}

{datum.name}

{(datum.percentageChange != null || datum.previousValue != null) && (
)}
); } interface FormattedValueProps { datum: HeaderDatum; } function FormattedValue({datum}: FormattedValueProps) { switch (datum.type) { case 'fileSize': return ; case 'percentage': return ( ); default: return ; } } interface TrendingIndicatorProps { datum: HeaderDatum; } function TrendingIndicator({datum}: TrendingIndicatorProps) { const percentage = calculatePercentage(datum); let icon: ReactElement; if (percentage > 0) { icon = ; } else if (percentage === 0) { icon = ; } else { icon = ; } return ( {icon}
{percentage}%
); } function calculatePercentage({ percentageChange, previousValue, currentValue, }: HeaderDatum) { if ( percentageChange != null || previousValue == null || currentValue == null ) { return percentageChange ?? 0; } if (previousValue === 0) { return 100; } return Math.round(((currentValue - previousValue) / previousValue) * 100); }