Updated sidebar to be ok like fr

This commit is contained in:
2025-08-23 22:23:42 +02:00
parent f876ad15fa
commit c505512110
5 changed files with 90 additions and 14 deletions

View File

@@ -14,9 +14,17 @@ type SidebarProps = {
ign: string ign: string
player: Player["player"] player: Player["player"]
guild: Guild["guild"] | undefined guild: Guild["guild"] | undefined
rank: string | undefined
specialRank: string | undefined
eulaCoins: boolean | undefined
} }
export default function Sidebar({ level, ign, player, guild }: SidebarProps) { export default function Sidebar({ level, ign, player, guild, rank, specialRank, eulaCoins }: SidebarProps) {
const levelMultiplier = getCoinMultiplier(level, rank, specialRank, eulaCoins)
const levelMultiplierVal = levelMultiplier.value
const levelMultiplierText = levelMultiplier.level === true ? `(Level ${level.toFixed(1).split(".")[0]})` : `(${levelMultiplier.name})`
return ( return (
<Card className="w-1/4"> <Card className="w-1/4">
<CardContent> <CardContent>
@@ -34,7 +42,7 @@ export default function Sidebar({ level, ign, player, guild }: SidebarProps) {
<div> <div>
<p> <p>
<span className="font-bold">{"Coin multiplier: "}</span> <span className="font-bold">{"Coin multiplier: "}</span>
<span>{`x${getCoinMultiplier(level)} (Level ${level.toFixed(1).split(".")[0]})`}</span> <span>{`x${levelMultiplierVal} ${levelMultiplierText}`}</span>
</p> </p>
<p> <p>
<span className="font-bold">{"Total coins: "}</span> <span className="font-bold">{"Total coins: "}</span>

View File

@@ -52,7 +52,6 @@ async function SuspendedPage({ ign: pign }: { ign: string }) {
} }
const guild = await getGuild(uuid) const guild = await getGuild(uuid)
const level = getExactLevel(player.networkExp) const level = getExactLevel(player.networkExp)
return ( return (
@@ -73,7 +72,15 @@ async function SuspendedPage({ ign: pign }: { ign: string }) {
{player.uuid} {player.uuid}
</h1> </h1>
<div className="flex gap-6 px-6 mt-8 w-full max-w-7xl"> <div className="flex gap-6 px-6 mt-8 w-full max-w-7xl">
<Sidebar level={level} ign={pign} player={player} guild={guild ?? undefined} /> <Sidebar
level={level}
ign={pign}
player={player}
guild={guild ?? undefined}
rank={player.newPackageRank}
specialRank={player.rank}
eulaCoins={player.eulaCoins}
/>
{player.stats !== undefined ? {player.stats !== undefined ?
( (
<div className="pb-4 space-y-4 w-3/4"> <div className="pb-4 space-y-4 w-3/4">

View File

@@ -12,5 +12,14 @@ export const MULTIPLIER = [
{ level: 125, value: 6 }, { level: 125, value: 6 },
{ level: 150, value: 6.5 }, { level: 150, value: 6.5 },
{ level: 200, value: 7 }, { level: 200, value: 7 },
{ level: 250, value: 8 }, { level: 250, value: 8 }
] ]
export const RANKMULTIPLIER = {
VIP: { value: 2, name: "VIP" },
VIP_PLUS: { value: 3, name: "VIP+" },
MVP: { value: 4, name: "MVP" },
MVP_PLUS: { value: 5, name: "MVP+" },
YOUTUBER: { value: 7, name: "YouTuber" }
}

View File

@@ -1,18 +1,69 @@
import { MULTIPLIER } from "@/data/hypixel/general" import { MULTIPLIER, RANKMULTIPLIER } from "@/data/hypixel/general"
import { Player } from "@/lib/schema/player" import { Player } from "@/lib/schema/player"
export function getCoinMultiplier(level: number) { type ReturnType = {
level: true
value: number
} | {
level: false
value: number
name: string
}
export function getCoinMultiplier(level: number, rank?: string, specialRank?: string, eulaCoins?: boolean): ReturnType {
if (level > MULTIPLIER[MULTIPLIER.length - 1].level) { if (level > MULTIPLIER[MULTIPLIER.length - 1].level) {
return MULTIPLIER[MULTIPLIER.length - 1].value return {
value: MULTIPLIER.at(-1)!.value,
level: true
} as const
} }
function getLevelMultiplier() {
for (let i = MULTIPLIER.length - 1; i >= 0; i--) { for (let i = MULTIPLIER.length - 1; i >= 0; i--) {
if (level >= MULTIPLIER[i].level) { if (level >= MULTIPLIER[i].level) {
return MULTIPLIER[i].value return {
value: MULTIPLIER.at(i)!.value,
level: true
} as const
}
}
return {
value: MULTIPLIER.at(0)!.value,
level: true
} as const
}
function getSpecialMultiplier() {
if (specialRank === "YOUTUBER") return RANKMULTIPLIER.YOUTUBER
if (!eulaCoins) return null
switch (rank) {
case "VIP":
return RANKMULTIPLIER.VIP
case "VIP_PLUS":
return RANKMULTIPLIER.VIP_PLUS
case "MVP":
return RANKMULTIPLIER.MVP
case "MVP_PLUS":
return RANKMULTIPLIER.MVP_PLUS
default:
return null
} }
} }
return MULTIPLIER[0].value const specialMulti = getSpecialMultiplier()
const levelMulti = getLevelMultiplier()
if (!specialMulti) {
return levelMulti
}
const max = Math.max(specialMulti.value, levelMulti.value)
if (max === specialMulti.value) {
return { ...specialMulti, level: false }
} else {
return levelMulti
}
} }
export function getTotalCoins(stats: Record<string, Record<"coins", number | undefined>> | undefined) { export function getTotalCoins(stats: Record<string, Record<"coins", number | undefined>> | undefined) {

View File

@@ -48,7 +48,8 @@ export const playerSchema = z.looseObject({
YOUTUBE: z.string().optional() YOUTUBE: z.string().optional()
}).optional() }).optional()
}).optional(), }).optional(),
rank: z.string().optional() rank: z.string().optional(),
eulaCoins: z.boolean().optional()
}) })
}) })