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
player: Player["player"]
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 (
<Card className="w-1/4">
<CardContent>
@@ -34,7 +42,7 @@ export default function Sidebar({ level, ign, player, guild }: SidebarProps) {
<div>
<p>
<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>
<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 level = getExactLevel(player.networkExp)
return (
@@ -73,7 +72,15 @@ async function SuspendedPage({ ign: pign }: { ign: string }) {
{player.uuid}
</h1>
<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 ?
(
<div className="pb-4 space-y-4 w-3/4">

View File

@@ -12,5 +12,14 @@ export const MULTIPLIER = [
{ level: 125, value: 6 },
{ level: 150, value: 6.5 },
{ 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"
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) {
return MULTIPLIER[MULTIPLIER.length - 1].value
return {
value: MULTIPLIER.at(-1)!.value,
level: true
} as const
}
for (let i = MULTIPLIER.length - 1; i >= 0; i--) {
if (level >= MULTIPLIER[i].level) {
return MULTIPLIER[i].value
function getLevelMultiplier() {
for (let i = MULTIPLIER.length - 1; i >= 0; i--) {
if (level >= MULTIPLIER[i].level) {
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) {

View File

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