mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-23 11:39:50 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dc9ab2067d | ||
|
|
e8e1f7bafb | ||
|
|
e50a456025 | ||
|
|
d442bbca1a |
No files matched your search
@@ -0,0 +1,7 @@
|
|||||||
|
# Blitzkrieg 1.13.3
|
||||||
|
|
||||||
|
Streamer's delight!
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Added config context menu for the session tracker embed
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "blitzkrieg",
|
"name": "blitzkrieg",
|
||||||
"version": "1.13.2",
|
"version": "1.13.3",
|
||||||
"description": "🎉 Tools for everything World of Tanks Blitz",
|
"description": "🎉 Tools for everything World of Tanks Blitz",
|
||||||
"main": "src/server.ts",
|
"main": "src/server.ts",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
|
import { ContextMenu } from '@radix-ui/themes';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import * as Breakdown from '../../../components/Breakdown';
|
import * as Breakdown from '../../../components/Breakdown';
|
||||||
import { TreeTypeEnum } from '../../../components/Tanks';
|
import { TreeTypeEnum } from '../../../components/Tanks';
|
||||||
@@ -13,6 +14,7 @@ import { tankAverages } from '../../../core/blitzstars/tankAverages';
|
|||||||
import { useSession } from '../../../stores/session';
|
import { useSession } from '../../../stores/session';
|
||||||
import { IndividualTankStats, TanksStats } from '../../../types/tanksStats';
|
import { IndividualTankStats, TanksStats } from '../../../types/tanksStats';
|
||||||
import { CustomColumnDisplay } from '../../tools/session/components/CustomColumn';
|
import { CustomColumnDisplay } from '../../tools/session/components/CustomColumn';
|
||||||
|
import { Menu } from '../../tools/session/components/Menu';
|
||||||
|
|
||||||
const REFRESH_RATE = 1 / 5;
|
const REFRESH_RATE = 1 / 5;
|
||||||
|
|
||||||
@@ -193,6 +195,9 @@ export default function SessionPage() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<ContextMenu.Root>
|
||||||
|
<ContextMenu.Trigger>
|
||||||
|
<div>
|
||||||
<Breakdown.Root>
|
<Breakdown.Root>
|
||||||
{session.showTotal &&
|
{session.showTotal &&
|
||||||
session.isTracking &&
|
session.isTracking &&
|
||||||
@@ -216,7 +221,8 @@ export default function SessionPage() {
|
|||||||
return {
|
return {
|
||||||
...rowStat,
|
...rowStat,
|
||||||
delta:
|
delta:
|
||||||
customColumn.showDelta && rowStat.percentile === undefined
|
customColumn.showDelta &&
|
||||||
|
rowStat.percentile === undefined
|
||||||
? rowStat.delta
|
? rowStat.delta
|
||||||
: undefined,
|
: undefined,
|
||||||
};
|
};
|
||||||
@@ -225,7 +231,9 @@ export default function SessionPage() {
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{diff?.list
|
{diff?.list
|
||||||
.sort((a, b) => b.stats.last_battle_time - a.stats.last_battle_time)
|
.sort(
|
||||||
|
(a, b) => b.stats.last_battle_time - a.stats.last_battle_time,
|
||||||
|
)
|
||||||
.map(({ stats, tankopedia, career, careerWN8, currentWN8 }) => {
|
.map(({ stats, tankopedia, career, careerWN8, currentWN8 }) => {
|
||||||
const rowStats: Record<
|
const rowStats: Record<
|
||||||
CustomColumnDisplay,
|
CustomColumnDisplay,
|
||||||
@@ -238,12 +246,14 @@ export default function SessionPage() {
|
|||||||
},
|
},
|
||||||
winrate: {
|
winrate: {
|
||||||
title: 'Winrate',
|
title: 'Winrate',
|
||||||
current: `${(100 * (stats.all.wins / stats.all.battles)).toFixed(
|
current: `${(
|
||||||
2,
|
100 *
|
||||||
)}%`,
|
(stats.all.wins / stats.all.battles)
|
||||||
career: `${(100 * (career.all.wins / career.all.battles)).toFixed(
|
).toFixed(2)}%`,
|
||||||
2,
|
career: `${(
|
||||||
)}%`,
|
100 *
|
||||||
|
(career.all.wins / career.all.battles)
|
||||||
|
).toFixed(2)}%`,
|
||||||
delta:
|
delta:
|
||||||
stats.all.wins / stats.all.battles -
|
stats.all.wins / stats.all.battles -
|
||||||
career.all.wins / career.all.battles,
|
career.all.wins / career.all.battles,
|
||||||
@@ -286,7 +296,8 @@ export default function SessionPage() {
|
|||||||
type="tank"
|
type="tank"
|
||||||
tankType={tankopedia?.type}
|
tankType={tankopedia?.type}
|
||||||
treeType={(() => {
|
treeType={(() => {
|
||||||
if (tankopedia?.is_collectible) return TreeTypeEnum.Collector;
|
if (tankopedia?.is_collectible)
|
||||||
|
return TreeTypeEnum.Collector;
|
||||||
if (tankopedia?.is_premium) return TreeTypeEnum.Premium;
|
if (tankopedia?.is_premium) return TreeTypeEnum.Premium;
|
||||||
})()}
|
})()}
|
||||||
stats={session.customColumns.map((customColumn) => {
|
stats={session.customColumns.map((customColumn) => {
|
||||||
@@ -297,7 +308,8 @@ export default function SessionPage() {
|
|||||||
return {
|
return {
|
||||||
...rowStat,
|
...rowStat,
|
||||||
delta:
|
delta:
|
||||||
customColumn.showDelta && rowStat.percentile === undefined
|
customColumn.showDelta &&
|
||||||
|
rowStat.percentile === undefined
|
||||||
? rowStat.delta
|
? rowStat.delta
|
||||||
: undefined,
|
: undefined,
|
||||||
};
|
};
|
||||||
@@ -306,5 +318,10 @@ export default function SessionPage() {
|
|||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</Breakdown.Root>
|
</Breakdown.Root>
|
||||||
|
</div>
|
||||||
|
</ContextMenu.Trigger>
|
||||||
|
|
||||||
|
<Menu Builder={ContextMenu} />
|
||||||
|
</ContextMenu.Root>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { DropdownMenu } from '@radix-ui/themes';
|
import { ContextMenu, DropdownMenu } from '@radix-ui/themes';
|
||||||
import mutateSession, { useSession } from '../../../../stores/session';
|
import mutateSession, { useSession } from '../../../../stores/session';
|
||||||
|
|
||||||
export type CustomColumnDisplay =
|
export type CustomColumnDisplay =
|
||||||
@@ -11,20 +11,21 @@ export type CustomColumnDisplay =
|
|||||||
const NO_DELTA: CustomColumnDisplay[] = ['battles', 'wn8', 'none'];
|
const NO_DELTA: CustomColumnDisplay[] = ['battles', 'wn8', 'none'];
|
||||||
|
|
||||||
interface CustomColumn {
|
interface CustomColumn {
|
||||||
|
Builder: typeof DropdownMenu | typeof ContextMenu;
|
||||||
column: number;
|
column: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function CustomColumn({ column }: CustomColumn) {
|
export function CustomColumn({ column, Builder }: CustomColumn) {
|
||||||
const customColumn = useSession((state) => state.customColumns[column]);
|
const customColumn = useSession((state) => state.customColumns[column]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DropdownMenu.Sub>
|
<Builder.Sub>
|
||||||
<DropdownMenu.SubTrigger>Column {column + 1}</DropdownMenu.SubTrigger>
|
<Builder.SubTrigger>Column {column + 1}</Builder.SubTrigger>
|
||||||
|
|
||||||
<DropdownMenu.SubContent>
|
<Builder.SubContent>
|
||||||
<DropdownMenu.Label>Display</DropdownMenu.Label>
|
<Builder.Label>Display</Builder.Label>
|
||||||
|
|
||||||
<DropdownMenu.RadioGroup
|
<Builder.RadioGroup
|
||||||
value={customColumn.display}
|
value={customColumn.display}
|
||||||
onValueChange={(event) =>
|
onValueChange={(event) =>
|
||||||
mutateSession((draft) => {
|
mutateSession((draft) => {
|
||||||
@@ -33,22 +34,18 @@ export function CustomColumn({ column }: CustomColumn) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<DropdownMenu.RadioItem value="battles">
|
<Builder.RadioItem value="battles">Battles</Builder.RadioItem>
|
||||||
Battles
|
<Builder.RadioItem value="winrate">Winrate</Builder.RadioItem>
|
||||||
</DropdownMenu.RadioItem>
|
<Builder.RadioItem value="wn8">WN8</Builder.RadioItem>
|
||||||
<DropdownMenu.RadioItem value="winrate">
|
<Builder.RadioItem value="damage">Damage</Builder.RadioItem>
|
||||||
Winrate
|
<Builder.RadioItem value="none">None</Builder.RadioItem>
|
||||||
</DropdownMenu.RadioItem>
|
</Builder.RadioGroup>
|
||||||
<DropdownMenu.RadioItem value="wn8">WN8</DropdownMenu.RadioItem>
|
|
||||||
<DropdownMenu.RadioItem value="damage">Damage</DropdownMenu.RadioItem>
|
|
||||||
<DropdownMenu.RadioItem value="none">None</DropdownMenu.RadioItem>
|
|
||||||
</DropdownMenu.RadioGroup>
|
|
||||||
|
|
||||||
{!NO_DELTA.includes(customColumn.display) && (
|
{!NO_DELTA.includes(customColumn.display) && (
|
||||||
<>
|
<>
|
||||||
<DropdownMenu.Separator />
|
<Builder.Separator />
|
||||||
|
|
||||||
<DropdownMenu.CheckboxItem
|
<Builder.CheckboxItem
|
||||||
checked={customColumn.showDelta}
|
checked={customColumn.showDelta}
|
||||||
onCheckedChange={(checked) =>
|
onCheckedChange={(checked) =>
|
||||||
mutateSession((draft) => {
|
mutateSession((draft) => {
|
||||||
@@ -57,10 +54,10 @@ export function CustomColumn({ column }: CustomColumn) {
|
|||||||
}
|
}
|
||||||
>
|
>
|
||||||
Show delta
|
Show delta
|
||||||
</DropdownMenu.CheckboxItem>
|
</Builder.CheckboxItem>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</DropdownMenu.SubContent>
|
</Builder.SubContent>
|
||||||
</DropdownMenu.Sub>
|
</Builder.Sub>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
import { ContextMenu, DropdownMenu } from '@radix-ui/themes';
|
||||||
|
import { useSession } from '../../../../stores/session';
|
||||||
|
import { CustomColumn } from './CustomColumn';
|
||||||
|
|
||||||
|
interface ContextMenuProps {
|
||||||
|
Builder: typeof DropdownMenu | typeof ContextMenu;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function Menu({ Builder }: ContextMenuProps) {
|
||||||
|
const session = useSession();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Builder.Content>
|
||||||
|
<CustomColumn Builder={Builder} column={0} />
|
||||||
|
<CustomColumn Builder={Builder} column={1} />
|
||||||
|
<CustomColumn Builder={Builder} column={2} />
|
||||||
|
<CustomColumn Builder={Builder} column={3} />
|
||||||
|
|
||||||
|
<Builder.Separator />
|
||||||
|
|
||||||
|
<Builder.CheckboxItem
|
||||||
|
checked={session.showTotal}
|
||||||
|
onCheckedChange={(checked) =>
|
||||||
|
useSession.setState({ showTotal: checked })
|
||||||
|
}
|
||||||
|
>
|
||||||
|
Show total
|
||||||
|
</Builder.CheckboxItem>
|
||||||
|
<Builder.CheckboxItem
|
||||||
|
checked={session.showCareer}
|
||||||
|
onCheckedChange={(checked) =>
|
||||||
|
useSession.setState({ showCareer: checked })
|
||||||
|
}
|
||||||
|
>
|
||||||
|
Show career
|
||||||
|
</Builder.CheckboxItem>
|
||||||
|
</Builder.Content>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -28,7 +28,7 @@ import listPlayers, {
|
|||||||
import { useSession } from '../../../stores/session';
|
import { useSession } from '../../../stores/session';
|
||||||
import { NormalizedTankStats, TanksStats } from '../../../types/tanksStats';
|
import { NormalizedTankStats, TanksStats } from '../../../types/tanksStats';
|
||||||
import SessionPage from '../../embeds/session/page';
|
import SessionPage from '../../embeds/session/page';
|
||||||
import { CustomColumn } from './components/CustomColumn';
|
import { Menu } from './components/Menu';
|
||||||
import * as styles from './page.css';
|
import * as styles from './page.css';
|
||||||
|
|
||||||
export default function Page() {
|
export default function Page() {
|
||||||
@@ -231,31 +231,7 @@ export default function Page() {
|
|||||||
</Button>
|
</Button>
|
||||||
</DropdownMenu.Trigger>
|
</DropdownMenu.Trigger>
|
||||||
|
|
||||||
<DropdownMenu.Content>
|
<Menu Builder={DropdownMenu} />
|
||||||
<CustomColumn column={0} />
|
|
||||||
<CustomColumn column={1} />
|
|
||||||
<CustomColumn column={2} />
|
|
||||||
<CustomColumn column={3} />
|
|
||||||
|
|
||||||
<DropdownMenu.Separator />
|
|
||||||
|
|
||||||
<DropdownMenu.CheckboxItem
|
|
||||||
checked={session.showTotal}
|
|
||||||
onCheckedChange={(checked) =>
|
|
||||||
useSession.setState({ showTotal: checked })
|
|
||||||
}
|
|
||||||
>
|
|
||||||
Show total
|
|
||||||
</DropdownMenu.CheckboxItem>
|
|
||||||
<DropdownMenu.CheckboxItem
|
|
||||||
checked={session.showCareer}
|
|
||||||
onCheckedChange={(checked) =>
|
|
||||||
useSession.setState({ showCareer: checked })
|
|
||||||
}
|
|
||||||
>
|
|
||||||
Show career
|
|
||||||
</DropdownMenu.CheckboxItem>
|
|
||||||
</DropdownMenu.Content>
|
|
||||||
</DropdownMenu.Root>
|
</DropdownMenu.Root>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in new issue
Block a user