mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-24 20:19:49 +02:00
feat: expand session stats
This commit is contained in:
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>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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) },
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
Reference in new issue
Block a user