mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-24 20:19:49 +02:00
feat: start of tank averages
This commit is contained in:
1 parent
51c998163d
commit
dd9b3ce869
7 files changed
+122
-56
No files matched your search
@@ -1 +1 @@
|
|||||||
["1.10.0","1.10.1","1.10.2","1.11.0","1.12.0","1.12.1","1.12.2","1.12.3","1.12.4","1.12.5","1.12.6","1.12.7","1.12.8","1.12.9","1.13.0","1.13.1","1.13.2","1.13.3","1.14.0","1.14.1","1.14.2","1.14.3","1.14.4","1.15.0","1.15.1","1.15.10","1.15.11","1.15.12","1.15.13","1.15.2","1.15.3","1.15.4","1.15.5","1.15.6","1.15.7","1.15.8","1.15.9","1.16.0","1.16.1","1.16.2","1.16.3","1.16.4","1.17.0","1.17.1","1.17.2","1.18.0","1.18.1","1.18.2","1.18.3","1.19.0","1.19.1","1.19.2","1.19.3","1.19.4","1.19.5","1.19.6","1.20.0","1.20.1","1.20.2","1.20.3","1.3.0","1.3.1","1.3.2","1.3.3","1.4.0","1.4.1","1.5.0","1.5.1","1.5.2","1.5.3","1.5.4","1.6.0","1.7.0","1.7.1","1.7.2","1.7.3-1.7.4","1.7.5","1.7.6","1.7.7","1.8.0","1.8.1","1.9.0","1.9.1","1.9.2","1.9.3","1.9.4","1.9.5"]
|
["1.10.0","1.10.1","1.10.2","1.11.0","1.12.0","1.12.1","1.12.2","1.12.3","1.12.4","1.12.5","1.12.6","1.12.7","1.12.8","1.12.9","1.13.0","1.13.1","1.13.2","1.13.3","1.14.0","1.14.1","1.14.2","1.14.3","1.14.4","1.15.0","1.15.1","1.15.10","1.15.11","1.15.12","1.15.13","1.15.2","1.15.3","1.15.4","1.15.5","1.15.6","1.15.7","1.15.8","1.15.9","1.16.0","1.16.1","1.16.2","1.16.3","1.16.4","1.17.0","1.17.1","1.17.2","1.18.0","1.18.1","1.18.2","1.18.3","1.19.0","1.19.1","1.19.2","1.19.3","1.19.4","1.19.5","1.19.6","1.20.0","1.20.1","1.20.2","1.20.3","1.20.4","1.3.0","1.3.1","1.3.2","1.3.3","1.4.0","1.4.1","1.5.0","1.5.1","1.5.2","1.5.3","1.5.4","1.6.0","1.7.0","1.7.1","1.7.2","1.7.3-1.7.4","1.7.5","1.7.6","1.7.7","1.8.0","1.8.1","1.9.0","1.9.1","1.9.2","1.9.3","1.9.4","1.9.5"]
|
||||||
+9
-3
@@ -1,6 +1,6 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { Flex } from '@radix-ui/themes';
|
import { Box, Flex } from '@radix-ui/themes';
|
||||||
import { Ad, AdType } from '../components/Ad';
|
import { Ad, AdType } from '../components/Ad';
|
||||||
import { AdMidSectionResponsive } from '../components/AdMidSectionResponsive';
|
import { AdMidSectionResponsive } from '../components/AdMidSectionResponsive';
|
||||||
import {
|
import {
|
||||||
@@ -11,6 +11,7 @@ import {
|
|||||||
ratingTool,
|
ratingTool,
|
||||||
sessionTool,
|
sessionTool,
|
||||||
tankopediaTool,
|
tankopediaTool,
|
||||||
|
tankPerformanceTool,
|
||||||
} from '../constants/tools';
|
} from '../constants/tools';
|
||||||
import { useAdExempt } from '../hooks/useAdExempt';
|
import { useAdExempt } from '../hooks/useAdExempt';
|
||||||
import { Hero } from './components/Hero';
|
import { Hero } from './components/Hero';
|
||||||
@@ -64,13 +65,13 @@ export default function Page() {
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
<Flex gap="4" direction={{ initial: 'column', sm: 'row' }}>
|
<Flex gap="4" direction={{ initial: 'column', sm: 'row' }}>
|
||||||
<ToolCard tool={compareTool} />
|
|
||||||
<ToolCard tool={playerStatsTool} />
|
<ToolCard tool={playerStatsTool} />
|
||||||
|
<ToolCard tool={compareTool} />
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|
||||||
<Flex gap="4" direction={{ initial: 'column', sm: 'row' }}>
|
<Flex gap="4" direction={{ initial: 'column', sm: 'row' }}>
|
||||||
|
<ToolCard tool={tankPerformanceTool} />
|
||||||
<ToolCard tool={sessionTool} />
|
<ToolCard tool={sessionTool} />
|
||||||
<ToolCard tool={ratingTool} />
|
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|
||||||
{!exempt && (
|
{!exempt && (
|
||||||
@@ -86,8 +87,13 @@ export default function Page() {
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
<Flex gap="4" direction={{ initial: 'column', sm: 'row' }}>
|
<Flex gap="4" direction={{ initial: 'column', sm: 'row' }}>
|
||||||
|
<ToolCard tool={ratingTool} />
|
||||||
<ToolCard tool={discordTool} />
|
<ToolCard tool={discordTool} />
|
||||||
|
</Flex>
|
||||||
|
|
||||||
|
<Flex gap="4" direction={{ initial: 'column', sm: 'row' }}>
|
||||||
<ToolCard tool={moreTool} />
|
<ToolCard tool={moreTool} />
|
||||||
|
<Box flexGrow="1" />
|
||||||
</Flex>
|
</Flex>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import {
|
|||||||
Flex,
|
Flex,
|
||||||
Heading,
|
Heading,
|
||||||
IconButton,
|
IconButton,
|
||||||
Link,
|
|
||||||
Select,
|
Select,
|
||||||
Spinner,
|
Spinner,
|
||||||
Table,
|
Table,
|
||||||
@@ -23,6 +22,7 @@ import {
|
|||||||
import { debounce } from 'lodash';
|
import { debounce } from 'lodash';
|
||||||
import { use, useEffect, useMemo, useRef, useState } from 'react';
|
import { use, useEffect, useMemo, useRef, useState } from 'react';
|
||||||
import PageWrapper from '../../../components/PageWrapper';
|
import PageWrapper from '../../../components/PageWrapper';
|
||||||
|
import { TankRowHeaderCell } from '../../../components/TankRowHeaderCell';
|
||||||
import { UNLOCALIZED_REGION_NAMES_SHORT } from '../../../constants/regions';
|
import { UNLOCALIZED_REGION_NAMES_SHORT } from '../../../constants/regions';
|
||||||
import {
|
import {
|
||||||
STAT_KEYS,
|
STAT_KEYS,
|
||||||
@@ -42,11 +42,9 @@ import searchPlayersAcrossRegions, {
|
|||||||
AccountListWithServer,
|
AccountListWithServer,
|
||||||
} from '../../../core/blitz/searchPlayersAcrossRegions';
|
} from '../../../core/blitz/searchPlayersAcrossRegions';
|
||||||
import { tankDefinitions } from '../../../core/blitzkit/tankDefinitions';
|
import { tankDefinitions } from '../../../core/blitzkit/tankDefinitions';
|
||||||
import { tankIcon } from '../../../core/blitzkit/tankIcon';
|
|
||||||
import { tankAverages } from '../../../core/blitzstars/tankAverages';
|
import { tankAverages } from '../../../core/blitzstars/tankAverages';
|
||||||
import { deltaTankStats } from '../../../core/statistics/deltaTankStats';
|
import { deltaTankStats } from '../../../core/statistics/deltaTankStats';
|
||||||
import { useWideFormat } from '../../../hooks/useWideFormat';
|
import { useWideFormat } from '../../../hooks/useWideFormat';
|
||||||
import { theme } from '../../../stitches.config';
|
|
||||||
import mutateSession, {
|
import mutateSession, {
|
||||||
SessionTracking,
|
SessionTracking,
|
||||||
useSession,
|
useSession,
|
||||||
@@ -483,55 +481,7 @@ export default function Page({
|
|||||||
overflow: 'hidden',
|
overflow: 'hidden',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Table.RowHeaderCell
|
<TankRowHeaderCell tank={tank} />
|
||||||
style={{
|
|
||||||
paddingLeft: 32,
|
|
||||||
position: 'relative',
|
|
||||||
overflowY: 'hidden',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Link href={`/tools/tankopedia/${tank.id}`}>
|
|
||||||
<img
|
|
||||||
alt={tank.name}
|
|
||||||
draggable={false}
|
|
||||||
src={tankIcon(tank.id)}
|
|
||||||
style={{
|
|
||||||
position: 'absolute',
|
|
||||||
width: 128 + 32,
|
|
||||||
height: '200%',
|
|
||||||
top: '-50%',
|
|
||||||
left: 0,
|
|
||||||
objectFit: 'contain',
|
|
||||||
objectPosition: '50% 50%',
|
|
||||||
overflow: 'hidden',
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
backgroundColor: 'red',
|
|
||||||
position: 'absolute',
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
height: '100%',
|
|
||||||
width: 128,
|
|
||||||
background:
|
|
||||||
'linear-gradient(90deg, #00000080, #00000000)',
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<Text
|
|
||||||
style={{
|
|
||||||
color: theme.colors.textHighContrast,
|
|
||||||
position: 'relative',
|
|
||||||
textWrap: 'nowrap',
|
|
||||||
textShadow: 'black 0 0 4px',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{tank.name}
|
|
||||||
</Text>
|
|
||||||
</Link>
|
|
||||||
</Table.RowHeaderCell>
|
|
||||||
{session.columns.map((column) => (
|
{session.columns.map((column) => (
|
||||||
<Table.Cell key={column}>{statsPretty[column]}</Table.Cell>
|
<Table.Cell key={column}>{statsPretty[column]}</Table.Cell>
|
||||||
))}
|
))}
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
import { Table } from '@radix-ui/themes';
|
||||||
|
import { use } from 'react';
|
||||||
|
import PageWrapper from '../../../components/PageWrapper';
|
||||||
|
import { TankRowHeaderCell } from '../../../components/TankRowHeaderCell';
|
||||||
|
import { averageDefinitionsArray } from '../../../core/blitzkit/averageDefinitions';
|
||||||
|
import { tankDefinitions } from '../../../core/blitzkit/tankDefinitions';
|
||||||
|
|
||||||
|
export default function Page() {
|
||||||
|
const awaitedTankDefinitions = use(tankDefinitions);
|
||||||
|
const awaitedAverageDefinitionsArray = use(averageDefinitionsArray);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<PageWrapper color="jade">
|
||||||
|
<Table.Root variant="surface">
|
||||||
|
{awaitedAverageDefinitionsArray.map((averages) => {
|
||||||
|
const tank = awaitedTankDefinitions[averages.id];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Table.Row key={averages.id}>
|
||||||
|
<TankRowHeaderCell tank={tank} />
|
||||||
|
<Table.Cell>{Math.round(averages.mu.wins * 100)}%</Table.Cell>
|
||||||
|
</Table.Row>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</Table.Root>
|
||||||
|
</PageWrapper>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
import { Table, Text } from '@radix-ui/themes';
|
||||||
|
import { TankDefinition } from '../core/blitzkit/tankDefinitions';
|
||||||
|
import { tankIcon } from '../core/blitzkit/tankIcon';
|
||||||
|
import { theme } from '../stitches.config';
|
||||||
|
import { Link } from './Link';
|
||||||
|
|
||||||
|
interface TankRowHeaderCellProps {
|
||||||
|
tank: TankDefinition;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function TankRowHeaderCell({ tank }: TankRowHeaderCellProps) {
|
||||||
|
return (
|
||||||
|
<Table.RowHeaderCell
|
||||||
|
style={{
|
||||||
|
paddingLeft: 32,
|
||||||
|
position: 'relative',
|
||||||
|
overflowY: 'hidden',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Link href={`/tools/tankopedia/${tank.id}`}>
|
||||||
|
<img
|
||||||
|
alt={tank.name}
|
||||||
|
draggable={false}
|
||||||
|
src={tankIcon(tank.id)}
|
||||||
|
style={{
|
||||||
|
position: 'absolute',
|
||||||
|
width: 128 + 32,
|
||||||
|
height: '200%',
|
||||||
|
top: '-50%',
|
||||||
|
left: 0,
|
||||||
|
objectFit: 'contain',
|
||||||
|
objectPosition: '50% 50%',
|
||||||
|
overflow: 'hidden',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
backgroundColor: 'red',
|
||||||
|
position: 'absolute',
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
height: '100%',
|
||||||
|
width: 128,
|
||||||
|
background: 'linear-gradient(90deg, #00000080, #00000000)',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Text
|
||||||
|
style={{
|
||||||
|
color: theme.colors.textHighContrast,
|
||||||
|
position: 'relative',
|
||||||
|
textWrap: 'nowrap',
|
||||||
|
textShadow: 'black 0 0 4px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{tank.name}
|
||||||
|
</Text>
|
||||||
|
</Link>
|
||||||
|
</Table.RowHeaderCell>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -106,6 +106,18 @@ export const playerStatsTool: Tool = {
|
|||||||
image: 'YelSOfT',
|
image: 'YelSOfT',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const tankPerformanceTool: Tool = {
|
||||||
|
id: 'tank-performance',
|
||||||
|
title: 'Tank performance',
|
||||||
|
description: 'Tank performance statistics',
|
||||||
|
pageDescription: 'Tank performance statistics in World of Tanks Blitz',
|
||||||
|
button: {
|
||||||
|
text: 'View tanks',
|
||||||
|
color: 'jade',
|
||||||
|
},
|
||||||
|
image: 'vOKFB03',
|
||||||
|
};
|
||||||
|
|
||||||
export const TOOLS: Tool[] = [
|
export const TOOLS: Tool[] = [
|
||||||
tankopediaTool,
|
tankopediaTool,
|
||||||
ratingTool,
|
ratingTool,
|
||||||
@@ -114,4 +126,5 @@ export const TOOLS: Tool[] = [
|
|||||||
sessionTool,
|
sessionTool,
|
||||||
discordTool,
|
discordTool,
|
||||||
moreTool,
|
moreTool,
|
||||||
|
tankPerformanceTool,
|
||||||
];
|
];
|
||||||
@@ -37,3 +37,10 @@ export const averageDefinitions = fetch(asset('definitions/averages.pb'))
|
|||||||
);
|
);
|
||||||
})
|
})
|
||||||
.then((data) => data.averages);
|
.then((data) => data.averages);
|
||||||
|
|
||||||
|
export const averageDefinitionsArray = averageDefinitions.then((data) =>
|
||||||
|
Object.entries(data).map(([key, value]) => ({
|
||||||
|
id: Number(key),
|
||||||
|
...(value as AverageDefinitionsEntry),
|
||||||
|
})),
|
||||||
|
);
|
||||||
Reference in new issue
Block a user