feat: totals

This commit is contained in:
TrèsAbhi committed 2024-05-01 22:11:12 -05:00
1 parent ff92b3dd45
commit 352cb70830
3 files changed
+74 -13

No files matched your search

+44 -10
View File
@@ -25,6 +25,7 @@ import {
generateStats, generateStats,
prettifyStats, prettifyStats,
STAT_NAMES, STAT_NAMES,
sumStats,
} from '../../../core/blitz/generateStats'; } from '../../../core/blitz/generateStats';
import { import {
getAccountInfo, getAccountInfo,
@@ -75,12 +76,30 @@ export default function Page() {
const delta = useMemo( const delta = useMemo(
() => () =>
session.tracking && tankStatsB session.tracking && tankStatsB
? deltaTankStats(session.player.stats, tankStatsB).sort( ? deltaTankStats(session.player.stats, tankStatsB)
(a, b) => b.last_battle_time - a.last_battle_time, .sort((a, b) => b.last_battle_time - a.last_battle_time)
) .map((entry) => {
const tank = awaitedTankDefinitions[entry.tank_id];
const average = awaitedTankAvearges[tank.id];
const stats = generateStats(entry.all, average?.all);
const statsPretty = prettifyStats(stats);
return {
tank,
stats,
statsPretty,
};
})
: undefined, : undefined,
[session.tracking && session.player, tankStatsB], [session.tracking && session.player, tankStatsB],
); );
const total = useMemo(
() =>
delta
? prettifyStats(sumStats(delta.map(({ stats }) => stats)))
: undefined,
[delta],
);
const search = debounce(async () => { const search = debounce(async () => {
if (!input.current) return; if (!input.current) return;
@@ -338,13 +357,28 @@ export default function Page() {
</Table.Header> </Table.Header>
<Table.Body> <Table.Body>
{delta.map((entry) => { <Table.Row
const tank = awaitedTankDefinitions[entry.tank_id]; style={{
const average = awaitedTankAvearges[tank.id]; overflow: 'hidden',
const stats = prettifyStats( }}
generateStats(entry.all, average?.all), >
); <Table.RowHeaderCell
style={{
paddingLeft: 32,
position: 'relative',
overflowY: 'hidden',
}}
>
Total
</Table.RowHeaderCell>
{session.columns.map((column) => (
<Table.Cell key={column} align="right">
{total![column]}
</Table.Cell>
))}
</Table.Row>
{delta.map(({ statsPretty, tank }) => {
return ( return (
<Table.Row <Table.Row
key={tank.id} key={tank.id}
@@ -402,7 +436,7 @@ export default function Page() {
</Table.RowHeaderCell> </Table.RowHeaderCell>
{session.columns.map((column) => ( {session.columns.map((column) => (
<Table.Cell key={column} align="right"> <Table.Cell key={column} align="right">
{stats[column]} {statsPretty[column]}
</Table.Cell> </Table.Cell>
))} ))}
</Table.Row> </Table.Row>
+29 -2
View File
@@ -7,23 +7,50 @@ export const STAT_NAMES: Record<Stat, string> = {
battles: 'Battles', battles: 'Battles',
winrate: 'Winrate', winrate: 'Winrate',
wn8: 'WN8', wn8: 'WN8',
averageDamage: 'Damage',
damage: 'Damage', damage: 'Damage',
wins: 'Wins',
}; };
export function generateStats(s: AllStats, e?: AllStats) { export function generateStats(s: AllStats, e?: AllStats) {
return { return {
battles: s.battles, battles: s.battles,
wins: s.wins,
winrate: s.wins / s.battles, winrate: s.wins / s.battles,
wn8: e ? calculateWN8(e, s) : null, wn8: e ? calculateWN8(e, s) : null,
damage: s.damage_dealt / s.battles, damage: s.damage_dealt,
averageDamage: s.damage_dealt / s.battles,
}; };
} }
export function prettifyStats(s: ReturnType<typeof generateStats>) { export function prettifyStats(s: ReturnType<typeof generateStats>) {
return { return {
battles: `${s.battles}`, battles: `${s.battles}`,
wins: `${s.wins}`,
winrate: `${(s.winrate * 100).toFixed(0)}%`, winrate: `${(s.winrate * 100).toFixed(0)}%`,
wn8: s.wn8 ? s.wn8.toFixed(0) : '--', wn8: s.wn8 ? s.wn8.toFixed(0) : '--',
damage: s.damage.toFixed(0), damage: `${s.damage}`,
averageDamage: s.averageDamage.toFixed(0),
} satisfies Record<Stat, string>; } satisfies Record<Stat, string>;
} }
export function sumStats(s: ReturnType<typeof generateStats>[]) {
function sum(slice: (stat: ReturnType<typeof generateStats>) => number) {
return s.reduce((a, b) => a + slice(b), 0);
}
const battles = sum((s) => s.battles);
const wins = sum((s) => s.wins);
const damage = sum((s) => s.damage);
return {
battles,
wins,
winrate: wins / battles,
damage,
averageDamage: damage / battles,
wn8:
sum((s) => (s.wn8 ? s.wn8 * s.battles : 0)) /
sum((s) => (s.wn8 ? s.battles : 0)),
} satisfies ReturnType<typeof generateStats>;
}
+1 -1
View File
@@ -29,7 +29,7 @@ type Session = SessionTracking | SessionNotTracking;
export const useSession = create<Session>()( export const useSession = create<Session>()(
persist( persist(
(set) => ({ (set) => ({
columns: ['battles', 'winrate', 'wn8', 'damage'], columns: ['battles', 'winrate', 'wn8', 'averageDamage'],
tracking: false, tracking: false,
}), }),
{ name: 'session-2', merge: (a, b) => merge(b, a) }, { name: 'session-2', merge: (a, b) => merge(b, a) },