feat: expand session stats

This commit is contained in:
tresabhi committed 2024-11-12 15:12:34 -06:00
1 parent a53c20fa6a
commit 84dd3317dc
2 files changed
+64 -49

No files matched your search

@@ -1,20 +1,19 @@
import { import {
STAT_KEYS, compositeStats,
STAT_NAMES, compositeStatsKeys,
deltaTankStats, deltaTankStats,
fetchAverageDefinitions, fetchAverageDefinitions,
fetchTankDefinitions, fetchTankDefinitions,
generateStats, formatCompositeStat,
getAccountInfo, getAccountInfo,
getTankStats, getTankStats,
idToRegion, idToRegion,
prettifyStats,
searchPlayersAcrossRegions, searchPlayersAcrossRegions,
sumBlitzStarsStats, sumCompositeStats,
type AccountListWithServer, type AccountListWithServer,
type CompositeStatsKey,
type IndividualAccountInfo, type IndividualAccountInfo,
type IndividualTankStats, type IndividualTankStats,
type Stat,
} from '@blitzkit/core'; } from '@blitzkit/core';
import strings from '@blitzkit/core/lang/en-US.json'; import strings from '@blitzkit/core/lang/en-US.json';
import { import {
@@ -85,14 +84,12 @@ function Content() {
.map((entry) => { .map((entry) => {
const tank = tankDefinitions.tanks[entry.tank_id]; const tank = tankDefinitions.tanks[entry.tank_id];
const average = tankAverages.averages[tank.id]; const average = tankAverages.averages[tank.id];
const stats = generateStats(entry.all, average?.mu); const composite = compositeStats(
const statsPretty = prettifyStats(stats); { ...entry.all, battle_life_time: entry.battle_life_time },
average?.mu,
);
return { return { tank, composite };
tank,
stats,
statsPretty,
};
}) })
: undefined, : undefined,
[session.tracking && session.player, tankStatsB], [session.tracking && session.player, tankStatsB],
@@ -100,7 +97,7 @@ function Content() {
const total = useMemo( const total = useMemo(
() => () =>
delta delta
? prettifyStats(sumBlitzStarsStats(delta.map(({ stats }) => stats))) ? sumCompositeStats(delta.map(({ composite }) => composite))
: undefined, : undefined,
[delta], [delta],
); );
@@ -307,13 +304,12 @@ function Content() {
<Table.Header> <Table.Header>
<Table.Row> <Table.Row>
<Table.ColumnHeaderCell>Tank</Table.ColumnHeaderCell> <Table.ColumnHeaderCell>Tank</Table.ColumnHeaderCell>
{session.columns.map((column, index) => ( {session.columns.map((column, index) => (
<Table.ColumnHeaderCell <Table.ColumnHeaderCell
width="0" width="0"
key={column} key={column}
style={{ style={{ position: 'relative' }}
position: 'relative',
}}
> >
{index === 0 && session.columns.length < 4 && ( {index === 0 && session.columns.length < 4 && (
<DropdownMenu.Root> <DropdownMenu.Root>
@@ -334,22 +330,22 @@ function Content() {
</DropdownMenu.Trigger> </DropdownMenu.Trigger>
<DropdownMenu.Content> <DropdownMenu.Content>
{STAT_KEYS.filter( {compositeStatsKeys
(item) => !session.columns.includes(item), .filter((item) => !session.columns.includes(item))
).map((key) => ( .map((key) => (
<DropdownMenu.Item <DropdownMenu.Item
key={key} key={key}
onClick={() => { onClick={() => {
mutateSession((draft) => { mutateSession((draft) => {
(draft as SessionTracking).columns.unshift( (draft as SessionTracking).columns.unshift(
key as Stat, key,
); );
}); });
}} }}
> >
{STAT_NAMES[key]} {strings.common.composite_stats[key]}
</DropdownMenu.Item> </DropdownMenu.Item>
))} ))}
</DropdownMenu.Content> </DropdownMenu.Content>
</DropdownMenu.Root> </DropdownMenu.Root>
)} )}
@@ -362,7 +358,7 @@ function Content() {
(draft as SessionTracking).columns.splice(index, 1); (draft as SessionTracking).columns.splice(index, 1);
} else { } else {
(draft as SessionTracking).columns[index] = (draft as SessionTracking).columns[index] =
value as Stat; value as CompositeStatsKey;
} }
}); });
}} }}
@@ -370,14 +366,16 @@ function Content() {
<Select.Trigger variant="ghost" /> <Select.Trigger variant="ghost" />
<Select.Content> <Select.Content>
{STAT_KEYS.filter( {compositeStatsKeys
(item) => .filter(
!session.columns.includes(item) || item === column, (item) =>
).map((key) => ( !session.columns.includes(item) || item === column,
<Select.Item key={key} value={key}> )
{STAT_NAMES[key]} .map((key) => (
</Select.Item> <Select.Item key={key} value={key}>
))} {strings.common.composite_stats[key]}
</Select.Item>
))}
<Select.Separator /> <Select.Separator />
@@ -405,11 +403,13 @@ function Content() {
Total Total
</Table.RowHeaderCell> </Table.RowHeaderCell>
{session.columns.map((column) => ( {session.columns.map((column) => (
<Table.Cell key={column}>{total![column]}</Table.Cell> <Table.Cell key={column}>
{formatCompositeStat(total![column], column, total!)}
</Table.Cell>
))} ))}
</Table.Row> </Table.Row>
{delta.map(({ statsPretty, tank }) => { {delta.map(({ tank, composite }) => {
return ( return (
<Table.Row <Table.Row
key={tank.id} key={tank.id}
@@ -419,7 +419,13 @@ function Content() {
> >
<TankRowHeaderCell tank={tank} /> <TankRowHeaderCell tank={tank} />
{session.columns.map((column) => ( {session.columns.map((column) => (
<Table.Cell key={column}>{statsPretty[column]}</Table.Cell> <Table.Cell key={column}>
{formatCompositeStat(
composite[column],
column,
composite,
)}
</Table.Cell>
))} ))}
</Table.Row> </Table.Row>
); );
+13 -4
View File
@@ -1,11 +1,15 @@
import type { IndividualTankStats, Region, Stat } from '@blitzkit/core'; import type {
CompositeStatsKey,
IndividualTankStats,
Region,
} from '@blitzkit/core';
import { merge } from 'lodash-es'; import { merge } from 'lodash-es';
import { create } from 'zustand'; import { create } from 'zustand';
import { persist } from 'zustand/middleware'; import { persist } from 'zustand/middleware';
import { createContextualStore } from '../core/zustand/createContextualStore'; import { createContextualStore } from '../core/zustand/createContextualStore';
interface SessionBase { interface SessionBase {
columns: Stat[]; columns: CompositeStatsKey[];
} }
export interface SessionTracking extends SessionBase { export interface SessionTracking extends SessionBase {
@@ -28,10 +32,15 @@ export const Session = createContextualStore(() =>
create<Session>()( create<Session>()(
persist( persist(
(_) => ({ (_) => ({
columns: ['battles', 'winrate', 'wn8', 'averageDamage'], columns: [
'cumulative_battles',
'normalized_wins',
'cumulative_wn8',
'normalized_damage_dealt',
],
tracking: false, tracking: false,
}), }),
{ name: 'session-2', merge: (a, b) => merge(b, a) }, { name: 'session-3', merge: (a, b) => merge(b, a) },
), ),
), ),
); );