import { Stack, Text, Group, Box, Divider, Paper } from "@mantine/core"; import { usePlayerHeadToHead } from "@/features/matches/queries"; import { useMemo, useEffect, useState, Suspense } from "react"; import { CrownIcon } from "@phosphor-icons/react"; import MatchList from "@/features/matches/components/match-list"; import PlayerHeadToHeadSkeleton from "./player-head-to-head-skeleton"; interface PlayerHeadToHeadSheetProps { player1Id: string; player1Name: string; player2Id: string; player2Name: string; isOpen?: boolean; } const PlayerHeadToHeadContent = ({ player1Id, player1Name, player2Id, player2Name, isOpen = true, }: PlayerHeadToHeadSheetProps) => { const [shouldFetch, setShouldFetch] = useState(false); useEffect(() => { if (isOpen && !shouldFetch) { setShouldFetch(true); } }, [isOpen, shouldFetch]); const { data: matches, isLoading } = usePlayerHeadToHead(player1Id, player2Id, shouldFetch); const stats = useMemo(() => { if (!matches || matches.length === 0) { return { player1Wins: 0, player2Wins: 0, player1CupsFor: 0, player2CupsFor: 0, player1CupsAgainst: 0, player2CupsAgainst: 0, player1AvgMargin: 0, player2AvgMargin: 0, }; } let player1Wins = 0; let player2Wins = 0; let player1CupsFor = 0; let player2CupsFor = 0; let player1CupsAgainst = 0; let player2CupsAgainst = 0; let player1TotalWinMargin = 0; let player2TotalWinMargin = 0; matches.forEach((match) => { const isPlayer1Home = match.home?.players?.some((p) => p.id === player1Id); const player1Cups = isPlayer1Home ? match.home_cups : match.away_cups; const player2Cups = isPlayer1Home ? match.away_cups : match.home_cups; if (player1Cups > player2Cups) { player1Wins++; player1TotalWinMargin += (player1Cups - player2Cups); } else if (player2Cups > player1Cups) { player2Wins++; player2TotalWinMargin += (player2Cups - player1Cups); } player1CupsFor += player1Cups; player2CupsFor += player2Cups; player1CupsAgainst += player2Cups; player2CupsAgainst += player1Cups; }); const player1AvgMargin = player1Wins > 0 ? player1TotalWinMargin / player1Wins : 0; const player2AvgMargin = player2Wins > 0 ? player2TotalWinMargin / player2Wins : 0; return { player1Wins, player2Wins, player1CupsFor, player2CupsFor, player1CupsAgainst, player2CupsAgainst, player1AvgMargin, player2AvgMargin, }; }, [matches, player1Id]); if (isLoading) { return ( Loading... ); } if (!matches || matches.length === 0) { return ( These players have not faced each other yet. ); } const totalMatches = stats.player1Wins + stats.player2Wins; const leader = stats.player1Wins > stats.player2Wins ? player1Name : stats.player2Wins > stats.player1Wins ? player2Name : null; return ( {player1Name} vs {player2Name} {stats.player1Wins} {player1Name} - {stats.player2Wins} {player2Name} {leader && ( {leader} leads the series )} {!leader && totalMatches > 0 && ( Series is tied )} Stats Comparison {stats.player1CupsFor} cups Total Cups cups {stats.player2CupsFor} {totalMatches > 0 ? (stats.player1CupsFor / totalMatches).toFixed(1) : "0.0"} avg Avg Cups/Match avg {totalMatches > 0 ? (stats.player2CupsFor / totalMatches).toFixed(1) : "0.0"} {!isNaN(stats.player1AvgMargin) ? stats.player1AvgMargin.toFixed(1) : "0.0"} margin Avg Win Margin margin {!isNaN(stats.player2AvgMargin) ? stats.player2AvgMargin.toFixed(1) : "0.0"} Match History ({totalMatches}) ); }; const PlayerHeadToHeadSheet = (props: PlayerHeadToHeadSheetProps) => { return ( }> ); }; export default PlayerHeadToHeadSheet;