Finished UHC stats
This commit is contained in:
64
src/app/(stats)/player/[ign]/_stats/uhc/table.tsx
Normal file
64
src/app/(stats)/player/[ign]/_stats/uhc/table.tsx
Normal file
@@ -0,0 +1,64 @@
|
||||
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
|
||||
import { formatNumber } from "@/lib/formatters"
|
||||
import { getUHCModeName, getUHCModeStats } from "@/lib/hypixel/uhc/general"
|
||||
import { NonNullStats } from "@/lib/schema/player"
|
||||
|
||||
export default function UHCStatTable({ stats }: { stats: NonNullable<NonNullStats["UHC"]> }) {
|
||||
return (
|
||||
<Table>
|
||||
<UHCTableHeader />
|
||||
<TableBody>
|
||||
<TableStat modeId="solo" stats={stats} />
|
||||
<TableStat modeId="teams" stats={stats} />
|
||||
<TableStat modeId="vanilla_doubles" stats={stats} />
|
||||
<TableStat modeId="no_diamonds" stats={stats} />
|
||||
<TableStat modeId="red_vs_blue" stats={stats} />
|
||||
<TableStat modeId="solo_brawl" stats={stats} />
|
||||
<TableStat modeId="duo_brawl" stats={stats} />
|
||||
<TableStat modeId="all_modes" stats={stats} />
|
||||
</TableBody>
|
||||
</Table>
|
||||
)
|
||||
}
|
||||
|
||||
function UHCTableHeader() {
|
||||
const headerElements = [
|
||||
"Mode",
|
||||
"Kills",
|
||||
"Deaths",
|
||||
"KD",
|
||||
"Wins",
|
||||
"KW",
|
||||
"Heads Eaten"
|
||||
]
|
||||
|
||||
return (
|
||||
<TableHeader>
|
||||
<TableRow>
|
||||
{headerElements.map((v, i) => {
|
||||
return <TableHead key={i} className="font-bold">{v}</TableHead>
|
||||
})}
|
||||
</TableRow>
|
||||
</TableHeader>
|
||||
)
|
||||
}
|
||||
|
||||
function TableStat(
|
||||
{ modeId, stats }: { modeId: Exclude<Parameters<typeof getUHCModeStats>[0], ""> | "teams" | "all_modes", stats: NonNullable<NonNullStats["UHC"]> }
|
||||
) {
|
||||
const modeStats = getUHCModeStats(modeId === "teams" ? "" : modeId, stats)
|
||||
const modeName = getUHCModeName(modeId === "teams" || modeId === "all_modes" ? "" : modeId)
|
||||
|
||||
return (
|
||||
<TableRow>
|
||||
<TableCell className={modeId === "all_modes" ? "font-bold" : undefined}>{modeId === "all_modes" ? "Overall" : modeName}</TableCell>
|
||||
{modeStats.map((v, i) => {
|
||||
return (
|
||||
<TableCell key={i}>
|
||||
{formatNumber(v)}
|
||||
</TableCell>
|
||||
)
|
||||
})}
|
||||
</TableRow>
|
||||
)
|
||||
}
|
||||
@@ -9,6 +9,7 @@ import { NonNullStats } from "@/lib/schema/player"
|
||||
import CollapsedStats from "../../_components/CollapsedStats"
|
||||
import UHCProgress from "./progress"
|
||||
import UHCGeneralStats from "./stats"
|
||||
import UHCStatTable from "./table"
|
||||
|
||||
export default function UHCStats({ stats }: { stats: NonNullStats["UHC"] }) {
|
||||
if (!stats) return null
|
||||
@@ -47,6 +48,8 @@ export default function UHCStats({ stats }: { stats: NonNullStats["UHC"] }) {
|
||||
<UHCProgress score={stats.score} />
|
||||
<Separator className="my-4" />
|
||||
<UHCGeneralStats stats={stats} kills={combined.kills} deaths={combined.deaths} heads={combined.heads} wins={combined.wins} />
|
||||
<Separator className="my-4" />
|
||||
<UHCStatTable stats={stats} />
|
||||
</AccordionContent>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { MODES } from "@/data/hypixel/uhc"
|
||||
import { NonNullStats } from "@/lib/schema/player"
|
||||
import { devide } from "../general"
|
||||
|
||||
export function getStatsCombined(stats: NonNullable<NonNullStats["UHC"]>) {
|
||||
return {
|
||||
@@ -10,6 +11,44 @@ export function getStatsCombined(stats: NonNullable<NonNullStats["UHC"]>) {
|
||||
}
|
||||
}
|
||||
|
||||
export function getUHCModeName(modeId: typeof MODES[number]["id"]) {
|
||||
return MODES.find(m => m.id === modeId)!.name
|
||||
}
|
||||
|
||||
export function getUHCModeStats(modeId: typeof MODES[number]["id"] | "all_modes", stats: NonNullable<NonNullStats["UHC"]>) {
|
||||
if (modeId === "all_modes") {
|
||||
const statsCombined = getStatsCombined(stats)
|
||||
return [
|
||||
statsCombined.kills,
|
||||
statsCombined.deaths,
|
||||
devide(statsCombined.kills, statsCombined.deaths),
|
||||
statsCombined.wins,
|
||||
devide(statsCombined.kills, statsCombined.kills),
|
||||
statsCombined.heads
|
||||
]
|
||||
}
|
||||
|
||||
if (modeId === "") {
|
||||
return [
|
||||
stats[`kills`],
|
||||
stats[`deaths`],
|
||||
devide(stats[`kills`], stats[`deaths`]),
|
||||
stats[`wins`],
|
||||
devide(stats[`kills`], stats[`wins`]),
|
||||
stats[`heads_eaten`]
|
||||
]
|
||||
}
|
||||
|
||||
return [
|
||||
stats[`kills_${modeId}`],
|
||||
stats[`deaths_${modeId}`],
|
||||
devide(stats[`kills_${modeId}`], stats[`deaths_${modeId}`]),
|
||||
stats[`wins_${modeId}`],
|
||||
devide(stats[`kills_${modeId}`], stats[`wins_${modeId}`]),
|
||||
stats[`heads_eaten_${modeId}`]
|
||||
]
|
||||
}
|
||||
|
||||
function getUHCWins(stats: NonNullable<NonNullStats["UHC"]>) {
|
||||
let wins = 0
|
||||
const ids = MODES.filter(m => m.id !== "").map(m => m.id)
|
||||
|
||||
Reference in New Issue
Block a user