diff --git a/src/app/(stats)/player/[ign]/_stats/bedwars/table.tsx b/src/app/(stats)/player/[ign]/_stats/bedwars/table.tsx
index 9288fdc..1a85ba9 100644
--- a/src/app/(stats)/player/[ign]/_stats/bedwars/table.tsx
+++ b/src/app/(stats)/player/[ign]/_stats/bedwars/table.tsx
@@ -4,31 +4,111 @@ import { _BedwarsStats, concatBedwarsStats, getBedwarsModeStats, getBestMode } f
import { NonNullStats } from "@/lib/schema/player"
import { cn } from "@/lib/utils"
+type BedwarsModeKey =
+ | "solo"
+ | "doubles"
+ | "3s"
+ | "4s"
+ | "4v4"
+ | "rush_2s"
+ | "rush_4s"
+ | "ultimate_2s"
+ | "ultimate_4s"
+ | "lucky_2s"
+ | "lucky_4s"
+ | "voidless_2s"
+ | "voidless_4s"
+ | "armed_2s"
+ | "armed_4s"
+ | "swap_4s"
+ | "underworld_4s"
+ | "castle"
+
+interface RowConfig {
+ label: string
+ key?: BedwarsModeKey
+ aggregateOf?: BedwarsModeKey[]
+ highlightBest?: boolean
+ bold?: boolean
+}
+
+const SIMPLE_MODE_KEYS: BedwarsModeKey[] = [
+ "solo",
+ "doubles",
+ "3s",
+ "4s",
+ "4v4",
+ "rush_2s",
+ "rush_4s",
+ "ultimate_2s",
+ "ultimate_4s",
+ "lucky_2s",
+ "lucky_4s",
+ "voidless_2s",
+ "voidless_4s",
+ "armed_2s",
+ "armed_4s",
+ "swap_4s",
+ "underworld_4s",
+ "castle"
+]
+
+const ROWS: RowConfig[] = [
+ { label: "Solo", key: "solo", highlightBest: true },
+ { label: "Doubles", key: "doubles", highlightBest: true },
+ { label: "3v3v3v3", key: "3s", highlightBest: true },
+ { label: "4v4v4v4", key: "4s", highlightBest: true },
+ { label: "Core Modes", aggregateOf: ["solo", "doubles", "3s", "4s"], bold: true },
+ { label: "4v4", key: "4v4" },
+ { label: "Rush Doubles", key: "rush_2s" },
+ { label: "Rush 4v4v4v4", key: "rush_4s" },
+ { label: "Ultimate Doubles", key: "ultimate_2s" },
+ { label: "Ultimate 4v4v4v4", key: "ultimate_4s" },
+ { label: "Lucky Doubles", key: "lucky_2s" },
+ { label: "Lucky 4v4v4v4", key: "lucky_4s" },
+ { label: "Voidless Doubles", key: "voidless_2s" },
+ { label: "Voidless 4v4v4v4", key: "voidless_4s" },
+ { label: "Armed Doubles", key: "armed_2s" },
+ { label: "Armed 4v4v4v4", key: "armed_4s" },
+ { label: "Swap 4v4v4v4", key: "swap_4s" },
+ { label: "Underworld 4v4v4v4", key: "underworld_4s" },
+ { label: "Castle", key: "castle" },
+ { label: "All Modes", aggregateOf: SIMPLE_MODE_KEYS, bold: true }
+]
+
+function StatRow({ cfg, stats }: { cfg: RowConfig, stats: NonNullStats["Bedwars"] }) {
+ const bedwars = stats as _BedwarsStats
+
+ let values: (number | string)[] = []
+
+ if (cfg.key) {
+ values = getBedwarsModeStats(cfg.key, bedwars) as (number | string)[]
+ } else if (cfg.aggregateOf) {
+ const rawArrays = cfg.aggregateOf.map(k => getBedwarsModeStats(k, bedwars, true))
+ values = concatBedwarsStats(...rawArrays)
+ }
+
+ const isBest = cfg.highlightBest && cfg.key && getBestMode(bedwars) === cfg.key
+
+ const className = cn(
+ cfg.bold && "font-bold",
+ isBest && "font-bold text-mc-light-purple"
+ )
+
+ return (
+
+ {cfg.label}
+ {values.map((v, i) => {typeof v === "number" ? formatNumber(v) : v})}
+
+ )
+}
+
export default function BedwarsStatTable({ stats }: { stats: NonNullStats["Bedwars"] }) {
return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ {ROWS.map((cfg, i) => )}
)
@@ -60,317 +140,8 @@ function BedwarsTableHeader() {
Finals
- {headerElements.map((v, i) => {
- return {v}
- })}
+ {headerElements.map((v, i) => {v})}
)
}
-
-function SoloStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("solo", stats as _BedwarsStats)
- const isBest = getBestMode(stats as _BedwarsStats) === "solo"
-
- return (
-
- Solo
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function DoublesStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("doubles", stats as _BedwarsStats)
- const isBest = getBestMode(stats as _BedwarsStats) === "doubles"
-
- return (
-
- Doubles
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function ThreesStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("3s", stats as _BedwarsStats)
- const isBest = getBestMode(stats as _BedwarsStats) === "3s"
-
- return (
-
- 3v3v3v3
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function FoursStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("4s", stats as _BedwarsStats)
- const isBest = getBestMode(stats as _BedwarsStats) === "4s"
-
- return (
-
- 4v4v4v4
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function CoreModeStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const soloStats = getBedwarsModeStats("solo", stats as _BedwarsStats, true)
- const doublesStats = getBedwarsModeStats("doubles", stats as _BedwarsStats, true)
- const threesStats = getBedwarsModeStats("3s", stats as _BedwarsStats, true)
- const foursStats = getBedwarsModeStats("4s", stats as _BedwarsStats, true)
-
- const combinedStats = concatBedwarsStats(soloStats, doublesStats, threesStats, foursStats)
-
- return (
-
- Core Modes
- {combinedStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function FourVFourStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("4v4", stats as _BedwarsStats)
-
- return (
-
- 4v4
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function RushDoublesStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("rush_2s", stats as _BedwarsStats)
-
- return (
-
- Rush Doubles
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function Rush4sStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("rush_4s", stats as _BedwarsStats)
-
- return (
-
- Rush 4v4v4v4
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function UltimateDoublesStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("ultimate_2s", stats as _BedwarsStats)
-
- return (
-
- Ultimate Doubles
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function Ultimate4sStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("ultimate_4s", stats as _BedwarsStats)
-
- return (
-
- Ultimate 4v4v4v4
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function LuckyDoublesStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("lucky_2s", stats as _BedwarsStats)
-
- return (
-
- Lucky Doubles
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function Lucky4sStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("lucky_4s", stats as _BedwarsStats)
-
- return (
-
- Lucky 4v4v4v4
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function VoidlessDoublesStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("voidless_2s", stats as _BedwarsStats)
-
- return (
-
- Voidless Doubles
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function Voidless4sStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("voidless_4s", stats as _BedwarsStats)
-
- return (
-
- Voidless 4v4v4v4
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function ArmedDoublesStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("armed_2s", stats as _BedwarsStats)
-
- return (
-
- Armed Doubles
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function Armed4sStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("armed_4s", stats as _BedwarsStats)
-
- return (
-
- Armed 4v4v4v4
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function Swap4sStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("swap_4s", stats as _BedwarsStats)
-
- return (
-
- Swap 4v4v4v4
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function Underworld4sStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("underworld_4s", stats as _BedwarsStats)
-
- return (
-
- Underworld 4v4v4v4
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function CastleStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const modeStats = getBedwarsModeStats("castle", stats as _BedwarsStats)
-
- return (
-
- Castle
- {modeStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}
-
-function AllModeStats({ stats }: { stats: NonNullStats["Bedwars"] }) {
- const soloStats = getBedwarsModeStats("solo", stats as _BedwarsStats, true)
- const doublesStats = getBedwarsModeStats("doubles", stats as _BedwarsStats, true)
- const threesStats = getBedwarsModeStats("3s", stats as _BedwarsStats, true)
- const foursStats = getBedwarsModeStats("4s", stats as _BedwarsStats, true)
- const fourVFourStats = getBedwarsModeStats("4v4", stats as _BedwarsStats, true)
- const rushDoublesStats = getBedwarsModeStats("rush_2s", stats as _BedwarsStats, true)
- const rush4sStats = getBedwarsModeStats("rush_4s", stats as _BedwarsStats, true)
- const ultimateDoublesStats = getBedwarsModeStats("ultimate_2s", stats as _BedwarsStats, true)
- const ultimate4sStats = getBedwarsModeStats("ultimate_4s", stats as _BedwarsStats, true)
- const luckyDoublesStats = getBedwarsModeStats("lucky_2s", stats as _BedwarsStats, true)
- const lucky4sStats = getBedwarsModeStats("lucky_4s", stats as _BedwarsStats, true)
- const voidlessDoublesStats = getBedwarsModeStats("voidless_2s", stats as _BedwarsStats, true)
- const voidless4sStats = getBedwarsModeStats("voidless_4s", stats as _BedwarsStats, true)
- const armedDoublesStats = getBedwarsModeStats("armed_2s", stats as _BedwarsStats, true)
- const armed4sStats = getBedwarsModeStats("armed_4s", stats as _BedwarsStats, true)
- const swap4sStats = getBedwarsModeStats("swap_4s", stats as _BedwarsStats, true)
- const underworld4sStats = getBedwarsModeStats("underworld_4s", stats as _BedwarsStats, true)
- const castleStats = getBedwarsModeStats("castle", stats as _BedwarsStats, true)
-
- const finalStats = concatBedwarsStats(
- soloStats,
- doublesStats,
- threesStats,
- foursStats,
- fourVFourStats,
- rushDoublesStats,
- rush4sStats,
- ultimateDoublesStats,
- ultimate4sStats,
- luckyDoublesStats,
- lucky4sStats,
- voidlessDoublesStats,
- voidless4sStats,
- armedDoublesStats,
- armed4sStats,
- swap4sStats,
- underworld4sStats,
- castleStats
- )
-
- return (
-
- All Modes
- {finalStats.map((v, i) => {
- return {typeof v === "number" ? formatNumber(v) : v}
- })}
-
- )
-}