Finished build battle stats
This commit is contained in:
@@ -7,6 +7,7 @@ import { NonNullStats } from "@/lib/schema/player"
|
|||||||
import CollapsedStats from "../../_components/CollapsedStats"
|
import CollapsedStats from "../../_components/CollapsedStats"
|
||||||
import BuildBattleTitleProgress from "./progress"
|
import BuildBattleTitleProgress from "./progress"
|
||||||
import BuildBattleGeneralStats from "./stats"
|
import BuildBattleGeneralStats from "./stats"
|
||||||
|
import BuildBattleStatsTable from "./table"
|
||||||
|
|
||||||
export default function BuildBattleStats({ stats }: { stats: NonNullStats["BuildBattle"] }) {
|
export default function BuildBattleStats({ stats }: { stats: NonNullStats["BuildBattle"] }) {
|
||||||
if (!stats) return null
|
if (!stats) return null
|
||||||
@@ -40,6 +41,8 @@ export default function BuildBattleStats({ stats }: { stats: NonNullStats["Build
|
|||||||
<Separator className="my-4" />
|
<Separator className="my-4" />
|
||||||
<BuildBattleGeneralStats stats={stats} />
|
<BuildBattleGeneralStats stats={stats} />
|
||||||
<Separator className="my-4" />
|
<Separator className="my-4" />
|
||||||
|
<BuildBattleStatsTable stats={stats} />
|
||||||
|
<Separator className="my-4" />
|
||||||
</AccordionContent>
|
</AccordionContent>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|||||||
46
src/app/(stats)/player/[ign]/_stats/build-battle/table.tsx
Normal file
46
src/app/(stats)/player/[ign]/_stats/build-battle/table.tsx
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
|
||||||
|
import { MODES } from "@/data/hypixel/build-battle"
|
||||||
|
import { formatNumber } from "@/lib/formatters"
|
||||||
|
import { getBuildBattleModeName as getBuildBattleMode } from "@/lib/hypixel/build-battle/general"
|
||||||
|
import { NonNullStats } from "@/lib/schema/player"
|
||||||
|
|
||||||
|
export default function BuildBattleStatsTable({ stats }: { stats: NonNullable<NonNullStats["BuildBattle"]> }) {
|
||||||
|
return (
|
||||||
|
<Table>
|
||||||
|
<TableHeader>
|
||||||
|
<TableRow>
|
||||||
|
<TableHead>Mode</TableHead>
|
||||||
|
<TableHead>Wins</TableHead>
|
||||||
|
</TableRow>
|
||||||
|
</TableHeader>
|
||||||
|
<TableBody>
|
||||||
|
<TableStat modeId="solo_normal" stats={stats} />
|
||||||
|
<TableStat modeId="teams_normal" stats={stats} />
|
||||||
|
<TableStat modeId="guess_the_build" stats={stats} />
|
||||||
|
<TableStat modeId="solo_pro" stats={stats} />
|
||||||
|
<TableStat modeId="speed_builders" stats={stats} />
|
||||||
|
<TableStat modeId="" stats={stats} />
|
||||||
|
</TableBody>
|
||||||
|
</Table>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function TableStat({ modeId, stats }: { modeId: typeof MODES[number]["id"], stats: NonNullable<NonNullStats["BuildBattle"]> }) {
|
||||||
|
const mode = getBuildBattleMode(modeId)
|
||||||
|
|
||||||
|
if (modeId === "") {
|
||||||
|
return (
|
||||||
|
<TableRow className="font-bold">
|
||||||
|
<TableCell>{mode.name}</TableCell>
|
||||||
|
<TableCell>{formatNumber(stats["wins"])}</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TableRow>
|
||||||
|
<TableCell>{mode.name}</TableCell>
|
||||||
|
<TableCell>{formatNumber(stats[`wins_${modeId}`])}</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
export const TITLE = "Build Battle" as const
|
export const TITLE = "Build Battle" as const
|
||||||
export const MODES = [
|
export const MODES = [
|
||||||
{ id: "_solo_normal", name: "Solo" },
|
{ id: "solo_normal", name: "Solo" },
|
||||||
{ id: "_teams_normal", name: "Teams" },
|
{ id: "teams_normal", name: "Teams" },
|
||||||
{ id: "_guess_the_build", name: "Guess the Build" },
|
{ id: "guess_the_build", name: "Guess the Build" },
|
||||||
{ id: "_solo_pro", name: "Pro" },
|
{ id: "solo_pro", name: "Pro" },
|
||||||
{ id: "_speed_builders", name: "Speed Builders" },
|
{ id: "speed_builders", name: "Speed Builders" },
|
||||||
{ id: "", name: "Overall" }
|
{ id: "", name: "Overall" }
|
||||||
] as const
|
] as const
|
||||||
export const STARS = [
|
export const STARS = [
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { STARS } from "@/data/hypixel/build-battle"
|
import { MODES, STARS } from "@/data/hypixel/build-battle"
|
||||||
|
|
||||||
export function getBuildBattleRank(score: number) {
|
export function getBuildBattleRank(score: number) {
|
||||||
for (let i = STARS.length - 1; i >= 0; i--) {
|
for (let i = STARS.length - 1; i >= 0; i--) {
|
||||||
@@ -14,3 +14,7 @@ export function getNextBuildBattleRank(score: number) {
|
|||||||
|
|
||||||
return next > STARS.length - 1 ? null : STARS[next]
|
return next > STARS.length - 1 ? null : STARS[next]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getBuildBattleModeName(id: typeof MODES[number]["id"]) {
|
||||||
|
return MODES.find(m => m.id === id)!
|
||||||
|
}
|
||||||
|
|||||||
@@ -392,5 +392,15 @@ export const buildBattleStatsSchema = z.looseObject({
|
|||||||
coins: z.number().default(0),
|
coins: z.number().default(0),
|
||||||
games_played: z.number().default(0),
|
games_played: z.number().default(0),
|
||||||
correct_guesses: z.number().default(0),
|
correct_guesses: z.number().default(0),
|
||||||
super_votes: z.number().default(0)
|
super_votes: z.number().default(0),
|
||||||
|
wins_solo_normal: z.number().default(0),
|
||||||
|
wins_teams_normal: z.number().default(0),
|
||||||
|
wins_guess_the_build: z.number().default(0),
|
||||||
|
wins_solo_pro: z.number().default(0),
|
||||||
|
wins_speed_builders: z.number().default(0),
|
||||||
|
wins_solo_normal_latest: z.number().default(0),
|
||||||
|
wins_teams_normal_latest: z.number().default(0),
|
||||||
|
wins_guess_the_build_latest: z.number().default(0),
|
||||||
|
wins_solo_pro_latest: z.number().default(0),
|
||||||
|
wins_speed_builders_latest: z.number().default(0)
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user