import {
Box,
Text,
Group,
Stack,
ThemeIcon,
Skeleton,
Divider,
} from "@mantine/core";
import {
CrownIcon,
XIcon,
FireIcon,
ShieldIcon,
ChartLineUpIcon,
ShieldCheckIcon,
BoxingGloveIcon,
Icon,
ArrowUpIcon,
ArrowDownIcon,
} from "@phosphor-icons/react";
import { BaseStats } from "@/types/stats";
interface StatsOverviewProps {
statsData: BaseStats | null;
isLoading?: boolean;
}
const StatItem = ({
label,
value,
suffix = "",
Icon,
}: {
label: string;
value: number | null;
suffix?: string;
Icon?: Icon;
isLoading?: boolean;
}) => {
return (
{Icon && (
)}
{label}
{value !== null ? (
{`${value}${suffix}`}
) : (
)}
);
};
const StatsOverview = ({ statsData, isLoading = false }: StatsOverviewProps) => {
if (!statsData && !isLoading) {
return (
No stats available yet
);
}
if (!statsData) return null;
const overallStats = {
matches: statsData.matches,
wins: statsData.wins,
losses: statsData.losses,
total_cups_made: statsData.total_cups_made,
total_cups_against: statsData.total_cups_against,
};
const avgCupsPerMatch =
overallStats.matches > 0
? parseFloat((overallStats.total_cups_made / overallStats.matches).toFixed(1))
: 0;
const avgCupsAgainstPerMatch =
overallStats.matches > 0
? parseFloat((overallStats.total_cups_against / overallStats.matches).toFixed(1))
: 0;
const avgMarginOfVictory = statsData.margin_of_victory ? parseFloat(statsData.margin_of_victory.toFixed(1)) : 0;
const avgMarginOfLoss = statsData.margin_of_loss ? parseFloat(statsData.margin_of_loss.toFixed(1)) : 0;
const allStats = [
{ label: "Matches Played", value: overallStats.matches, Icon: BoxingGloveIcon },
{ label: "Wins", value: overallStats.wins, Icon: CrownIcon },
{ label: "Losses", value: overallStats.losses, Icon: XIcon },
{ label: "Cups Made", value: overallStats.total_cups_made, Icon: FireIcon },
{ label: "Cups Against", value: overallStats.total_cups_against, Icon: ShieldIcon },
{ label: "Avg Cups Per Game", value: avgCupsPerMatch > 0 ? avgCupsPerMatch : null, Icon: ChartLineUpIcon },
{ label: "Avg Cups Against", value: avgCupsAgainstPerMatch > 0 ? avgCupsAgainstPerMatch : null, Icon: ShieldCheckIcon },
{ label: "Avg Win Margin", value: avgMarginOfVictory > 0 ? avgMarginOfVictory : null, Icon: ArrowUpIcon },
{ label: "Avg Loss Margin", value: avgMarginOfLoss > 0 ? avgMarginOfLoss : null, Icon: ArrowDownIcon },
];
return (
{allStats.map((stat, index) => (
{index < allStats.length - 1 && }
))}
);
};
export const StatsSkeleton = () => {
const skeletonStats = [
{ label: "Matches Played", Icon: BoxingGloveIcon },
{ label: "Wins", Icon: CrownIcon },
{ label: "Losses", Icon: XIcon },
{ label: "Cups Made", Icon: FireIcon },
{ label: "Cups Against", Icon: ShieldIcon },
{ label: "Avg Cups Per Game", Icon: ChartLineUpIcon },
{ label: "Avg Cups Against", Icon: ShieldCheckIcon },
{ label: "Avg Win Margin", Icon: ArrowUpIcon },
{ label: "Avg Loss Margin", Icon: ArrowDownIcon },
];
return (
{skeletonStats.map((stat, index) => (
{index < skeletonStats.length - 1 && }
))}
);
};
export default StatsOverview;