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}
{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);
}