import { averageDefinitions, AverageDefinitionsEntryWithId, BlitzkitStats, formatCompact, } from '@blitzkit/core'; import { Table } from '@radix-ui/themes'; import { memo, use, useCallback } from 'react'; import { StickyRowHeaderCell } from '../../../../components/StickyRowHeaderCell'; import { useAveragesExclusionRatio } from '../../../../hooks/useAveragesExclusionRatio'; import * as TankPerformancePersistent from '../../../../stores/tankPerformancePersistent'; interface TotalProps { tanks: AverageDefinitionsEntryWithId[]; } export const Total = memo( ({ tanks }) => { const awaitedAverageDefinitions = use(averageDefinitions); const playerCountPeriod = TankPerformancePersistent.use( (state) => state.playerCountPeriod, ); const ratio = useAveragesExclusionRatio(); const sum = useCallback( (slice: (tank: BlitzkitStats) => number) => { return tanks.reduce( (acc, tank) => acc + tank.samples.total * slice(tank.mu), 0, ); }, [tanks], ); const battles = sum(({ battles }) => battles); const winrate = sum(({ wins }) => wins) / battles; const damage = sum(({ damage_dealt }) => damage_dealt) / battles; const survival = sum(({ survived_battles }) => survived_battles) / battles; const xp = sum(({ xp }) => xp) / battles; const kills = sum(({ frags }) => frags) / battles; const spots = sum(({ spotted }) => spotted) / battles; const hits = sum(({ hits }) => hits) / battles; const shots = sum(({ shots }) => shots) / battles; const accuracy = hits / shots; const damageReceived = sum(({ damage_received }) => damage_received) / battles; const damageRatio = damage / damageReceived; const capturePoints = sum(({ capture_points }) => capture_points) / battles; return ( Total {(winrate * 100).toFixed(1)}% {formatCompact( ratio * awaitedAverageDefinitions.samples[playerCountPeriod], )} {Math.round(damage).toLocaleString()} {Math.round(survival * 100).toFixed(1)}% {Math.round(xp).toLocaleString()} {kills.toFixed(2)} {spots.toFixed(2)} {(accuracy * 100).toFixed(0)}% {shots.toFixed(1)} {hits.toFixed(1)} {damageRatio.toFixed(2)} {Math.round(damageReceived).toLocaleString()} {capturePoints.toFixed(2)} ); }, (prev, next) => prev.tanks === next.tanks, );